diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index bcbdda6846c..3ed624637e9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -31,6 +31,7 @@ jobs: static_analysis: ${{ steps.filter.outputs.static_analysis }} typecheck: ${{ steps.filter.outputs.typecheck }} git_compatibility: ${{ steps.filter.outputs.git_compatibility }} + codex_index_heal_contract: ${{ steps.filter.outputs.codex_index_heal_contract }} xterm_patch_sync: ${{ steps.filter.outputs.xterm_patch_sync }} shell_contracts: ${{ steps.filter.outputs.shell_contracts }} test: ${{ steps.filter.outputs.test }} @@ -296,6 +297,47 @@ jobs: done exit "$status" + # Why this job: Orca's session index-heal depends on a Codex behavior — a + # `thread/read` of an unindexed rollout performs a read-repair that inserts the + # `threads` row. Every unit test drives a stub app-server and asserts only that the + # call did not error, so if Codex dropped the repair they would all stay green while + # the subsystem went inert. This runs the pinned real binary and fails when the + # repair stops happening. Pinned because the binary is the thing expected to drift. + codex_index_heal_contract: + name: Codex index-heal contract + needs: [code_paths] + if: needs.code_paths.outputs.codex_index_heal_contract == 'true' + runs-on: ubuntu-latest + env: + CODEX_CLI_VERSION: '0.150.1' + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: ./.github/actions/install-node-dependencies + + - name: Install pinned Codex CLI + run: | + set -euo pipefail + npm install --no-audit --no-fund --prefix "$RUNNER_TEMP/codex-cli" \ + "@openai/codex@$CODEX_CLI_VERSION" + + - name: Verify Codex index-heal contract + env: + # Why REQUIRED: without a binary the suite skips, and a job that skips + # reports success. This turns a failed or missing install into a red test + # instead of a green no-op. + ORCA_CODEX_CONTRACT_REQUIRED: '1' + ORCA_CODEX_CONTRACT_VERSION: ${{ env.CODEX_CLI_VERSION }} + run: | + set -euo pipefail + ORCA_CODEX_CONTRACT_BINARY="$RUNNER_TEMP/codex-cli/node_modules/.bin/codex" \ + pnpm exec vitest run --config config/vitest.config.ts \ + src/main/codex/codex-index-heal-binary-contract.test.ts + xterm_patch_sync: name: xterm patch sync needs: [code_paths] @@ -310,9 +352,12 @@ jobs: - uses: ./.github/actions/install-node-dependencies - # Why: the check rebuilds xterm.js from a pinned upstream commit. Caching the - # npm metadata and the shallow clone turns a ~4 min cold run into well under a - # minute; the key is the manifest, so a commit or toolchain bump invalidates it. + # Why: the check rebuilds every package in the manifest from a pinned upstream + # commit — @xterm/xterm and the two addons, each built twice (once unmodified to + # prove the toolchain still reproduces the published bundles, once patched). Caching + # the npm metadata and the shallow clone keeps the repeated cost to the builds + # themselves; the key is the manifest, so a commit, package or toolchain bump + # invalidates it. - name: Restore upstream xterm build inputs uses: actions/cache@v5 with: @@ -845,6 +890,7 @@ jobs: - root_directory_guard - typecheck - git_compatibility + - codex_index_heal_contract - xterm_patch_sync - shell_contracts - test @@ -875,6 +921,8 @@ jobs: TYPECHECK_SHOULD_RUN: ${{ needs.code_paths.outputs.typecheck }} GIT_COMPATIBILITY: ${{ needs.git_compatibility.result }} GIT_COMPATIBILITY_SHOULD_RUN: ${{ needs.code_paths.outputs.git_compatibility }} + CODEX_INDEX_HEAL_CONTRACT: ${{ needs.codex_index_heal_contract.result }} + CODEX_INDEX_HEAL_CONTRACT_SHOULD_RUN: ${{ needs.code_paths.outputs.codex_index_heal_contract }} XTERM_PATCH_SYNC: ${{ needs.xterm_patch_sync.result }} XTERM_PATCH_SYNC_SHOULD_RUN: ${{ needs.code_paths.outputs.xterm_patch_sync }} SHELL_CONTRACTS: ${{ needs.shell_contracts.result }} @@ -920,6 +968,7 @@ jobs: check_job static_analysis "$STATIC_ANALYSIS" "$STATIC_ANALYSIS_SHOULD_RUN" check_job typecheck "$TYPECHECK" "$TYPECHECK_SHOULD_RUN" check_job git_compatibility "$GIT_COMPATIBILITY" "$GIT_COMPATIBILITY_SHOULD_RUN" + check_job codex_index_heal_contract "$CODEX_INDEX_HEAL_CONTRACT" "$CODEX_INDEX_HEAL_CONTRACT_SHOULD_RUN" check_job xterm_patch_sync "$XTERM_PATCH_SYNC" "$XTERM_PATCH_SYNC_SHOULD_RUN" check_job shell_contracts "$SHELL_CONTRACTS" "$SHELL_CONTRACTS_SHOULD_RUN" check_job test "$TEST" "$TEST_SHOULD_RUN" diff --git a/config/patches/@xterm__addon-ligatures@0.11.0-beta.287.patch b/config/patches/@xterm__addon-ligatures@0.11.0-beta.300.patch similarity index 100% rename from config/patches/@xterm__addon-ligatures@0.11.0-beta.287.patch rename to config/patches/@xterm__addon-ligatures@0.11.0-beta.300.patch diff --git a/config/patches/@xterm__addon-serialize@0.15.0-beta.287.patch b/config/patches/@xterm__addon-serialize@0.15.0-beta.287.patch deleted file mode 100644 index 09b126b2120..00000000000 --- a/config/patches/@xterm__addon-serialize@0.15.0-beta.287.patch +++ /dev/null @@ -1,234 +0,0 @@ -diff --git a/lib/addon-serialize.js b/lib/addon-serialize.js -index d669293d06d801ef472d5c2454ce86876e5c321f..625748f1c964a9ba9c5d4e8f87f65a148be1af60 100644 ---- a/lib/addon-serialize.js -+++ b/lib/addon-serialize.js -@@ -1,2 +1,2 @@ --!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t,e,r){return Math.max(e,Math.min(t,r))}class n{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!l(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),a=o.getWidth()>1;let u=!1;(o.getChars()&&a?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||0===i.getWidth())&&l(i,o)&&(u=!0),a&&(n.getChars()||0===n.getWidth())&&l(i,o)&&l(n,o)&&(u=!0)),u||(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0&&(r+="",r+=`[${e.length-this._nullCellCount}C`,r+=`[${this._nullCellCount}X`,r+=`[${e.length-this._nullCellCount}D`,r+=""),this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0)}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(h(t,e))return r;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){if(t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27),t.isBold()!==e.isBold()&&r.push(t.isBold()?1:22),a(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isDim()!==e.isDim()&&r.push(t.isDim()?2:22),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,this._cursorStyle);if(i?!l(this._cursorStyle,t):n.length>0){this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${n.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}i?this._nullCellCount+=t.getWidth():(this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=t.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth())}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,n=void 0===r?s:i(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-n,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new c(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new f(r,t,e),n=e.onlySelection??!1,o=e.range;if(o)return s.serialize({start:{x:o.startCol,y:(o.startLine,o.startLine)},end:{x:t.cols,y:(o.endLine,o.endLine)}});if(!n){const n=r.length,o=e.scrollback,l=void 0===o?n:i(o+t.rows,0,n);return s.serialize({start:{x:0,y:n-l},end:{x:t.cols,y:n-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class f extends n{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(h(t,e))return;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=f})(),s})()); -+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t,e,r){return Math.max(e,Math.min(t,r))}class n{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!l(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),a=o.getWidth()>1;let u=!1;(o.getChars()&&(a?this._nullCellCount<=1:this._nullCellCount<=0))&&((i.getChars()||0===i.getWidth())&&l(i,o)&&(u=!0),a&&(n.getChars()||0===n.getWidth())&&l(i,o)&&l(n,o)&&(u=!0)),u||(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0&&(r+="",e.length-this._nullCellCount>0&&(r+=`[${e.length-this._nullCellCount}C`),r+=`[${this._nullCellCount}X`,e.length-this._nullCellCount>0&&(r+=`[${e.length-this._nullCellCount}D`),r+=""),this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0)}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(h(t,e))return r;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){if(t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27),/* PATCH(orca): bold(1)/dim(2) share reset 22 - clear before re-set, as one group */((b,d)=>{if(b||d){const c=b&&!t.isBold()||d&&!t.isDim();c&&r.push(22),t.isBold()&&(b||c)&&r.push(1),t.isDim()&&(d||c)&&r.push(2)}})(t.isBold()!==e.isBold(),t.isDim()!==e.isDim()),a(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_setOscLink(t){if(t===this._activeOscLinkId)return"";let e=this._activeOscLinkId?"\x1B]8;;\x1B\\":"";if(this._activeOscLinkId=0,!t)return e;const r=this._terminal._core?._oscLinkService?.getLinkData(t);if(!r)return e;this._activeOscLinkId=t;const s=void 0===r.id?"":`id=${r.id}`;return`${e}\x1B]8;${s};${r.uri}\x1B\\`}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),c=i&&t.isInverse()?this._buffer.getLine(r+1):void 0,p=c?.getCell(0,this._nextRowFirstChar),f=s===this._terminal.cols-1&&c?.isWrapped&&(p?.getWidth()??0)>1&&!!p&&h(t,p),a=i&&!!t.isInverse()&&!f,d=a&&(!!t.isUnderline()||!!t.isStrikethrough()||!!t.isOverline()),n=this._diffStyle(t,this._cursorStyle);if(i?a?n.length>0:!l(this._cursorStyle,t):n.length>0){this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${n.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}i&&!a?this._nullCellCount+=t.getWidth():(this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=this._setOscLink(t.extended?.urlId??0),(a?(d&&(this._currentRow+="\x1B[24;29;55m"),this._currentRow+=" ".repeat(t.getWidth()),d&&(this._currentRow+=`\x1B[0m\x1B[${this._diffStyle(t,this._defaultCell).join(";")}m`)):this._currentRow+=t.getChars()),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth())}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,n=void 0===r?s:i(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-n,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new c(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new f(r,t,e),n=e.onlySelection??!1,o=e.range;if(o)return s.serialize({start:{x:o.startCol,y:(o.startLine,o.startLine)},end:{x:t.cols,y:(o.endLine,o.endLine)}});if(!n){const n=r.length,o=e.scrollback,l=void 0===o?n:i(o+t.rows,0,n);return s.serialize({start:{x:0,y:n-l},end:{x:t.cols,y:n-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}_serializeActiveOscLink(t){const e=t._core?._inputHandler?._curAttrData?.extended?.urlId??0;if(!e)return"";const r=t._core?._oscLinkService?.getLinkData(e);if(!r)return"";const s=void 0===r.id?"":`id=${r.id}`;return`\x1B]8;${s};${r.uri}\x1B\\`}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=this._serializeActiveOscLink(this._terminal),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class f extends n{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(h(t,e))return;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"
":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=f})(),s})()); - //# sourceMappingURL=addon-serialize.js.map -\ No newline at end of file -diff --git a/lib/addon-serialize.mjs b/lib/addon-serialize.mjs -index a5c4c4dd05b7efcc23d0e45661ffd4e42da80f21..df320e0d95c0b789c68ac49d8ecc4d6934ee99a8 100644 ---- a/lib/addon-serialize.mjs -+++ b/lib/addon-serialize.mjs -@@ -14,6 +14,6 @@ - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ --var m=0,b=0,_=0,p=0;var g;(t=>{function a(r,l,s,i){return i!==void 0?`#${w(r)}${w(l)}${w(s)}${w(i)}`:`#${w(r)}${w(l)}${w(s)}`}t.toCss=a;function n(r,l,s,i=255){return(r<<24|l<<16|s<<8|i)>>>0}t.toRgba=n;function e(r,l,s,i){return{css:t.toCss(r,l,s,i),rgba:t.toRgba(r,l,s,i)}}t.toColor=e})(g||={});var N;(i=>{function a(o,u){if(p=(u.rgba&255)/255,p===1)return{css:u.css,rgba:u.rgba};let f=u.rgba>>24&255,C=u.rgba>>16&255,c=u.rgba>>8&255,h=o.rgba>>24&255,d=o.rgba>>16&255,I=o.rgba>>8&255;m=h+Math.round((f-h)*p),b=d+Math.round((C-d)*p),_=I+Math.round((c-I)*p);let L=g.toCss(m,b,_),E=g.toRgba(m,b,_);return{css:L,rgba:E}}i.blend=a;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,u,f){let C=B.ensureContrastRatio(o.rgba,u.rgba,f);if(C)return g.toColor(C>>24&255,C>>16&255,C>>8&255)}i.ensureContrastRatio=e;function t(o){let u=(o.rgba|255)>>>0;return[m,b,_]=B.toChannels(u),{css:g.toCss(m,b,_),rgba:u}}i.opaque=t;function r(o,u){return p=Math.round(u*255),[m,b,_]=B.toChannels(o.rgba),{css:g.toCss(m,b,_,p),rgba:g.toRgba(m,b,_,p)}}i.opacity=r;function l(o,u){return p=o.rgba&255,r(o,p*u/255)}i.multiplyOpacity=l;function s(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=s})(N||={});var x;(t=>{let a,n;try{let r=document.createElement("canvas");r.width=1,r.height=1;let l=r.getContext("2d",{willReadFrequently:!0});l&&(a=l,a.globalCompositeOperation="copy",n=a.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),g.toColor(m,b,_);case 5:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),p=parseInt(r.slice(4,5).repeat(2),16),g.toColor(m,b,_,p);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let l=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(l)return m=parseInt(l[1],10),b=parseInt(l[2],10),_=parseInt(l[3],10),p=Math.round((l[5]===void 0?1:parseFloat(l[5]))*255),g.toColor(m,b,_,p);if(r==="transparent")return{css:"transparent",rgba:0};if(!a||!n)throw new Error("css.toColor: Unsupported css format");if(a.fillStyle=n,a.fillStyle=r,typeof a.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(a.fillRect(0,0,1,1),[m,b,_,p]=a.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(m,b,_,p),css:r}}t.toColor=e})(x||={});var v;(e=>{function a(t){return n(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=a;function n(t,r,l){let s=t/255,i=r/255,o=l/255,u=s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),C=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return u*.2126+f*.7152+C*.0722}e.relativeLuminance2=n})(v||={});var B;(l=>{function a(s,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,u=i>>16&255,f=i>>8&255,C=s>>24&255,c=s>>16&255,h=s>>8&255;return m=C+Math.round((o-C)*p),b=c+Math.round((u-c)*p),_=h+Math.round((f-h)*p),g.toRgba(m,b,_)}l.blend=a;function n(s,i,o){let u=v.relativeLuminance(s>>8),f=v.relativeLuminance(i>>8);if(R(u,f)>8));if(I>8));return I>E?d:L}return d}let c=t(s,i,o),h=R(u,v.relativeLuminance(c>>8));if(h>8));return h>I?c:d}return c}}l.ensureContrastRatio=n;function e(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I0||h>0||d>0);)c-=Math.max(0,Math.ceil(c*.1)),h-=Math.max(0,Math.ceil(h*.1)),d-=Math.max(0,Math.ceil(d*.1)),I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));return(c<<24|h<<16|d<<8|255)>>>0}l.reduceLuminance=e;function t(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I>>0}l.increaseLuminance=t;function r(s){return[s>>24&255,s>>16&255,s>>8&255,s&255]}l.toChannels=r})(B||={});function w(a){let n=a.toString(16);return n.length<2?"0"+n:n}function R(a,n){return a{let a=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=n[e/36%6|0],r=n[e/6%6|0],l=n[e%6];a.push({css:g.toCss(t,r,l),rgba:g.toRgba(t,r,l)})}for(let e=0;e<24;e++){let t=8+e*10;a.push({css:g.toCss(t,t,t),rgba:g.toRgba(t,t,t)})}return a})());function A(a,n,e){return Math.max(n,Math.min(a,e))}function z(a){switch(a){case"&":return"&";case"<":return"<"}return a}var S=class{constructor(n){this._buffer=n}serialize(n,e){let t=this._buffer.getNullCell(),r=this._buffer.getNullCell(),l=t,s=n.start.y,i=n.end.y,o=n.start.x,u=n.end.x;this._beforeSerialize(i-s,s,i);for(let f=s;f<=i;f++){let C=this._buffer.getLine(f);if(C){let c=f===n.start.y?o:0,h=f===n.end.y?u:C.length;for(let d=c;d0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let r="";if(!t){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let l=this._buffer.getLine(e),s=this._buffer.getLine(e+1);if(!s.isWrapped)r=`\r --`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{r="";let i=l.getCell(l.length-1,this._thisRowLastChar),o=l.getCell(l.length-2,this._thisRowLastSecondChar),u=s.getCell(0,this._nextRowFirstChar),f=u.getWidth()>1,C=!1;(u.getChars()&&f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&F(i,u)&&(C=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,u)&&F(o,u)&&(C=!0)),C||(r="-".repeat(this._nullCellCount+1),r+="\x1B[1D\x1B[1X",this._nullCellCount>0&&(r+="\x1B[A",r+=`\x1B[${l.length-this._nullCellCount}C`,r+=`\x1B[${this._nullCellCount}X`,r+=`\x1B[${l.length-this._nullCellCount}D`,r+="\x1B[B"),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(e,t){let r=[];if(U(e,t))return r;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i)if(e.isAttributeDefault())t.isAttributeDefault()||r.push(0);else{if(l){let o=e.getFgColor();e.isFgRGB()?r.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?r.push(38,5,o):r.push(o&8?90+(o&7):30+(o&7)):r.push(39)}if(s){let o=e.getBgColor();e.isBgRGB()?r.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?r.push(48,5,o):r.push(o&8?100+(o&7):40+(o&7)):r.push(49)}if(i){if(e.isInverse()!==t.isInverse()&&r.push(e.isInverse()?7:27),e.isBold()!==t.isBold()&&r.push(e.isBold()?1:22),O(e,t))e.isUnderline()!==t.isUnderline()&&r.push(e.isUnderline()?4:24);else{let o=e.getUnderlineStyle();if(o===0)r.push(24);else if(o===1&&e.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+o),!e.isUnderlineColorDefault()){let u=e.getUnderlineColor();e.isUnderlineColorRGB()?r.push("58:2::"+(u>>>16&255)+":"+(u>>>8&255)+":"+(u&255)):r.push("58:5:"+u)}}e.isOverline()!==t.isOverline()&&r.push(e.isOverline()?53:55),e.isBlink()!==t.isBlink()&&r.push(e.isBlink()?5:25),e.isInvisible()!==t.isInvisible()&&r.push(e.isInvisible()?8:28),e.isItalic()!==t.isItalic()&&r.push(e.isItalic()?3:23),e.isDim()!==t.isDim()&&r.push(e.isDim()?2:22),e.isStrikethrough()!==t.isStrikethrough()&&r.push(e.isStrikethrough()?9:29)}}return r}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,this._cursorStyle);if(i?!F(this._cursorStyle,e):o.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l,this._currentRow+=`\x1B[${o.join(";")}m`;let f=this._buffer.getLine(r);f!==void 0&&(f.getCell(l,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=l)}i?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=e.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l+e.getWidth())}_serializeString(e){let t=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(t=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let i=0;i{c>0?r+=`\x1B[${c}C`:c<0&&(r+=`\x1B[${-c}D`)};u&&((c=>{c>0?r+=`\x1B[${c}B`:c<0&&(r+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let l=this._terminal._core._inputHandler._curAttrData,s=this._diffStyle(l,this._cursorStyle);return s.length>0&&(r+=`\x1B[${s.join(";")}m`),r}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,t){let r=e.length,l=t===void 0?r:A(t+n.rows,0,r);return this._serializeBufferByRange(n,e,{start:r-l,end:r-1},!1)}_serializeBufferByRange(n,e,t,r){return new y(e,n).serialize({start:{x:0,y:typeof t.start=="number"?t.start:t.start.line},end:{x:n.cols,y:typeof t.end=="number"?t.end:t.end.line}},r)}_serializeBufferAsHTML(n,e){let t=n.buffer.active,r=new D(t,n,e),l=e.onlySelection??!1,s=e.range;if(s)return r.serialize({start:{x:s.startCol,y:(typeof s.startLine=="number",s.startLine)},end:{x:n.cols,y:(typeof s.endLine=="number",s.endLine)}});if(!l){let o=t.length,u=e.scrollback,f=u===void 0?o:A(u+n.rows,0,o);return r.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?r.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,t=e.scrollTop,r=e.scrollBottom;return t!==0||r!==n.rows-1?`\x1B[${t+1};${r+1}r`:""}_serializeModes(n){let e="",t=n.modes;if(t.applicationCursorKeysMode&&(e+="\x1B[?1h"),t.applicationKeypadMode&&(e+="\x1B[?66h"),t.bracketedPasteMode&&(e+="\x1B[?2004h"),t.insertMode&&(e+="\x1B[4h"),t.originMode&&(e+="\x1B[?6h"),t.reverseWraparoundMode&&(e+="\x1B[?45h"),t.sendFocusMode&&(e+="\x1B[?1004h"),t.wraparoundMode===!1&&(e+="\x1B[?7l"),t.mouseTrackingMode!=="none")switch(t.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return t.showCursor||(e+="\x1B[?25l"),e}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let t=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${t}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},D=class extends S{constructor(e,t,r){super(e);this._terminal=t;this._options=r;this._currentRow="";this._htmlContent="";t._core._themeService?this._ansiColors=t._core._themeService.colors.ansi:this._ansiColors=k}_beforeSerialize(e,t,r){this._htmlContent+="
";let l="#000000",s="#ffffff";(this._options.includeGlobalBackground??!1)&&(l=this._terminal.options.theme?.foreground??"#ffffff",s=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+l+";"),i.push("background-color: "+s+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,t){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,t){let r=t?e.getFgColor():e.getBgColor();if(t?e.isFgRGB():e.isBgRGB())return"#"+[r>>16&255,r>>8&255,r&255].map(s=>s.toString(16).padStart(2,"0")).join("");if(t?e.isFgPalette():e.isBgPalette())return this._ansiColors[r].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let t=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[t>>16&255,t>>8&255,t&255].map(l=>l.toString(16).padStart(2,"0")).join(""):this._ansiColors[t].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,t){let r=[];if(U(e,t))return;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i){let o=this._getHexColor(e,!0);o&&r.push("color: "+o+";");let u=this._getHexColor(e,!1);u&&r.push("background-color: "+u+";"),e.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&r.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&r.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let C=this._getUnderlineColor(e);C&&r.push("text-decoration-color: "+C+";")}return e.isInvisible()&&r.push("visibility: hidden;"),e.isItalic()&&r.push("font-style: italic;"),e.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,t);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=z(e.getChars())}_serializeString(){return this._htmlContent}};export{D as HTMLSerializeHandler,H as SerializeAddon}; -+var m=0,b=0,_=0,p=0;var g;(t=>{function a(r,l,s,i){return i!==void 0?`#${w(r)}${w(l)}${w(s)}${w(i)}`:`#${w(r)}${w(l)}${w(s)}`}t.toCss=a;function n(r,l,s,i=255){return(r<<24|l<<16|s<<8|i)>>>0}t.toRgba=n;function e(r,l,s,i){return{css:t.toCss(r,l,s,i),rgba:t.toRgba(r,l,s,i)}}t.toColor=e})(g||={});var N;(i=>{function a(o,u){if(p=(u.rgba&255)/255,p===1)return{css:u.css,rgba:u.rgba};let f=u.rgba>>24&255,C=u.rgba>>16&255,c=u.rgba>>8&255,h=o.rgba>>24&255,d=o.rgba>>16&255,I=o.rgba>>8&255;m=h+Math.round((f-h)*p),b=d+Math.round((C-d)*p),_=I+Math.round((c-I)*p);let L=g.toCss(m,b,_),E=g.toRgba(m,b,_);return{css:L,rgba:E}}i.blend=a;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,u,f){let C=B.ensureContrastRatio(o.rgba,u.rgba,f);if(C)return g.toColor(C>>24&255,C>>16&255,C>>8&255)}i.ensureContrastRatio=e;function t(o){let u=(o.rgba|255)>>>0;return[m,b,_]=B.toChannels(u),{css:g.toCss(m,b,_),rgba:u}}i.opaque=t;function r(o,u){return p=Math.round(u*255),[m,b,_]=B.toChannels(o.rgba),{css:g.toCss(m,b,_,p),rgba:g.toRgba(m,b,_,p)}}i.opacity=r;function l(o,u){return p=o.rgba&255,r(o,p*u/255)}i.multiplyOpacity=l;function s(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=s})(N||={});var x;(t=>{let a,n;try{let r=document.createElement("canvas");r.width=1,r.height=1;let l=r.getContext("2d",{willReadFrequently:!0});l&&(a=l,a.globalCompositeOperation="copy",n=a.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),g.toColor(m,b,_);case 5:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),p=parseInt(r.slice(4,5).repeat(2),16),g.toColor(m,b,_,p);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let l=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(l)return m=parseInt(l[1],10),b=parseInt(l[2],10),_=parseInt(l[3],10),p=Math.round((l[5]===void 0?1:parseFloat(l[5]))*255),g.toColor(m,b,_,p);if(r==="transparent")return{css:"transparent",rgba:0};if(!a||!n)throw new Error("css.toColor: Unsupported css format");if(a.fillStyle=n,a.fillStyle=r,typeof a.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(a.fillRect(0,0,1,1),[m,b,_,p]=a.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(m,b,_,p),css:r}}t.toColor=e})(x||={});var v;(e=>{function a(t){return n(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=a;function n(t,r,l){let s=t/255,i=r/255,o=l/255,u=s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),C=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return u*.2126+f*.7152+C*.0722}e.relativeLuminance2=n})(v||={});var B;(l=>{function a(s,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,u=i>>16&255,f=i>>8&255,C=s>>24&255,c=s>>16&255,h=s>>8&255;return m=C+Math.round((o-C)*p),b=c+Math.round((u-c)*p),_=h+Math.round((f-h)*p),g.toRgba(m,b,_)}l.blend=a;function n(s,i,o){let u=v.relativeLuminance(s>>8),f=v.relativeLuminance(i>>8);if(R(u,f)>8));if(I>8));return I>E?d:L}return d}let c=t(s,i,o),h=R(u,v.relativeLuminance(c>>8));if(h>8));return h>I?c:d}return c}}l.ensureContrastRatio=n;function e(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I0||h>0||d>0);)c-=Math.max(0,Math.ceil(c*.1)),h-=Math.max(0,Math.ceil(h*.1)),d-=Math.max(0,Math.ceil(d*.1)),I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));return(c<<24|h<<16|d<<8|255)>>>0}l.reduceLuminance=e;function t(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I>>0}l.increaseLuminance=t;function r(s){return[s>>24&255,s>>16&255,s>>8&255,s&255]}l.toChannels=r})(B||={});function w(a){let n=a.toString(16);return n.length<2?"0"+n:n}function R(a,n){return a{let a=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=n[e/36%6|0],r=n[e/6%6|0],l=n[e%6];a.push({css:g.toCss(t,r,l),rgba:g.toRgba(t,r,l)})}for(let e=0;e<24;e++){let t=8+e*10;a.push({css:g.toCss(t,t,t),rgba:g.toRgba(t,t,t)})}return a})());function A(a,n,e){return Math.max(n,Math.min(a,e))}function z(a){switch(a){case"&":return"&";case"<":return"<"}return a}var S=class{constructor(n){this._buffer=n}serialize(n,e){let t=this._buffer.getNullCell(),r=this._buffer.getNullCell(),l=t,s=n.start.y,i=n.end.y,o=n.start.x,u=n.end.x;this._beforeSerialize(i-s,s,i);for(let f=s;f<=i;f++){let C=this._buffer.getLine(f);if(C){let c=f===n.start.y?o:0,h=f===n.end.y?u:C.length;for(let d=c;d0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let r="";if(!t){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let l=this._buffer.getLine(e),s=this._buffer.getLine(e+1);if(!s.isWrapped)r=`\r -+`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{r="";let i=l.getCell(l.length-1,this._thisRowLastChar),o=l.getCell(l.length-2,this._thisRowLastSecondChar),u=s.getCell(0,this._nextRowFirstChar),f=u.getWidth()>1,C=!1;(u.getChars()&&(f?this._nullCellCount<=1:this._nullCellCount<=0))&&((i.getChars()||i.getWidth()===0)&&F(i,u)&&(C=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,u)&&F(o,u)&&(C=!0)),C||(r="-".repeat(this._nullCellCount+1),r+="\x1B[1D\x1B[1X",this._nullCellCount>0&&(r+="\x1B[A",l.length-this._nullCellCount>0&&(r+=`\x1B[${l.length-this._nullCellCount}C`),r+=`\x1B[${this._nullCellCount}X`,l.length-this._nullCellCount>0&&(r+=`\x1B[${l.length-this._nullCellCount}D`),r+="\x1B[B"),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(e,t){let r=[];if(U(e,t))return r;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i)if(e.isAttributeDefault())t.isAttributeDefault()||r.push(0);else{if(l){let o=e.getFgColor();e.isFgRGB()?r.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?r.push(38,5,o):r.push(o&8?90+(o&7):30+(o&7)):r.push(39)}if(s){let o=e.getBgColor();e.isBgRGB()?r.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?r.push(48,5,o):r.push(o&8?100+(o&7):40+(o&7)):r.push(49)}if(i){if(e.isInverse()!==t.isInverse()&&r.push(e.isInverse()?7:27),/* PATCH(orca): bold(1)/dim(2) share reset 22 - clear before re-set, as one group */((b,d)=>{if(b||d){const c=b&&!e.isBold()||d&&!e.isDim();c&&r.push(22),e.isBold()&&(b||c)&&r.push(1),e.isDim()&&(d||c)&&r.push(2)}})(e.isBold()!==t.isBold(),e.isDim()!==t.isDim()),O(e,t))e.isUnderline()!==t.isUnderline()&&r.push(e.isUnderline()?4:24);else{let o=e.getUnderlineStyle();if(o===0)r.push(24);else if(o===1&&e.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+o),!e.isUnderlineColorDefault()){let u=e.getUnderlineColor();e.isUnderlineColorRGB()?r.push("58:2::"+(u>>>16&255)+":"+(u>>>8&255)+":"+(u&255)):r.push("58:5:"+u)}}e.isOverline()!==t.isOverline()&&r.push(e.isOverline()?53:55),e.isBlink()!==t.isBlink()&&r.push(e.isBlink()?5:25),e.isInvisible()!==t.isInvisible()&&r.push(e.isInvisible()?8:28),e.isItalic()!==t.isItalic()&&r.push(e.isItalic()?3:23),e.isStrikethrough()!==t.isStrikethrough()&&r.push(e.isStrikethrough()?9:29)}}return r}_setOscLink(e){if(e===this._activeOscLinkId)return"";let t=this._activeOscLinkId?"\x1B]8;;\x1B\\":"";if(this._activeOscLinkId=0,!e)return t;let r=this._terminal._core?._oscLinkService?.getLinkData(e);if(!r)return t;this._activeOscLinkId=e;let l=r.id===void 0?"":`id=${r.id}`;return`${t}\x1B]8;${l};${r.uri}\x1B\\`}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",f=i&&e.isInverse()?this._buffer.getLine(r+1):void 0,g=f?.getCell(0,this._nextRowFirstChar),C=l===this._terminal.cols-1&&f?.isWrapped&&(g?.getWidth()??0)>1&&!!g&&U(e,g),q=i&&!!e.isInverse()&&!C,d=q&&(!!e.isUnderline()||!!e.isStrikethrough()||!!e.isOverline()),o=this._diffStyle(e,this._cursorStyle);if(i?q?o.length>0:!F(this._cursorStyle,e):o.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l,this._currentRow+=`\x1B[${o.join(";")}m`;let f=this._buffer.getLine(r);f!==void 0&&(f.getCell(l,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=l)}i&&!q?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=this._setOscLink(e.extended?.urlId??0),(q?(d&&(this._currentRow+="\x1B[24;29;55m"),this._currentRow+=" ".repeat(e.getWidth()),d&&(this._currentRow+=`\x1B[0m\x1B[${this._diffStyle(e,this._defaultCell).join(";")}m`)):this._currentRow+=e.getChars()),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l+e.getWidth())}_serializeString(e){let t=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(t=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let i=0;i{c>0?r+=`\x1B[${c}C`:c<0&&(r+=`\x1B[${-c}D`)};u&&((c=>{c>0?r+=`\x1B[${c}B`:c<0&&(r+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let l=this._terminal._core._inputHandler._curAttrData,s=this._diffStyle(l,this._cursorStyle);return s.length>0&&(r+=`\x1B[${s.join(";")}m`),r}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,t){let r=e.length,l=t===void 0?r:A(t+n.rows,0,r);return this._serializeBufferByRange(n,e,{start:r-l,end:r-1},!1)}_serializeBufferByRange(n,e,t,r){return new y(e,n).serialize({start:{x:0,y:typeof t.start=="number"?t.start:t.start.line},end:{x:n.cols,y:typeof t.end=="number"?t.end:t.end.line}},r)}_serializeBufferAsHTML(n,e){let t=n.buffer.active,r=new D(t,n,e),l=e.onlySelection??!1,s=e.range;if(s)return r.serialize({start:{x:s.startCol,y:(typeof s.startLine=="number",s.startLine)},end:{x:n.cols,y:(typeof s.endLine=="number",s.endLine)}});if(!l){let o=t.length,u=e.scrollback,f=u===void 0?o:A(u+n.rows,0,o);return r.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?r.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,t=e.scrollTop,r=e.scrollBottom;return t!==0||r!==n.rows-1?`\x1B[${t+1};${r+1}r`:""}_serializeModes(n){let e="",t=n.modes;if(t.applicationCursorKeysMode&&(e+="\x1B[?1h"),t.applicationKeypadMode&&(e+="\x1B[?66h"),t.bracketedPasteMode&&(e+="\x1B[?2004h"),t.insertMode&&(e+="\x1B[4h"),t.originMode&&(e+="\x1B[?6h"),t.reverseWraparoundMode&&(e+="\x1B[?45h"),t.sendFocusMode&&(e+="\x1B[?1004h"),t.wraparoundMode===!1&&(e+="\x1B[?7l"),t.mouseTrackingMode!=="none")switch(t.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return t.showCursor||(e+="\x1B[?25l"),e}_serializeActiveOscLink(n){let e=n._core?._inputHandler?._curAttrData?.extended?.urlId??0;if(!e)return"";let t=n._core?._oscLinkService?.getLinkData(e);if(!t)return"";let r=t.id===void 0?"":`id=${t.id}`;return`\x1B]8;${r};${t.uri}\x1B\\`}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let t=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${t}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=this._serializeActiveOscLink(this._terminal),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},D=class extends S{constructor(e,t,r){super(e);this._terminal=t;this._options=r;this._currentRow="";this._htmlContent="";t._core._themeService?this._ansiColors=t._core._themeService.colors.ansi:this._ansiColors=k}_beforeSerialize(e,t,r){this._htmlContent+="
";let l="#000000",s="#ffffff";(this._options.includeGlobalBackground??!1)&&(l=this._terminal.options.theme?.foreground??"#ffffff",s=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+l+";"),i.push("background-color: "+s+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,t){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,t){let r=t?e.getFgColor():e.getBgColor();if(t?e.isFgRGB():e.isBgRGB())return"#"+[r>>16&255,r>>8&255,r&255].map(s=>s.toString(16).padStart(2,"0")).join("");if(t?e.isFgPalette():e.isBgPalette())return this._ansiColors[r].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let t=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[t>>16&255,t>>8&255,t&255].map(l=>l.toString(16).padStart(2,"0")).join(""):this._ansiColors[t].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,t){let r=[];if(U(e,t))return;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i){let o=this._getHexColor(e,!0);o&&r.push("color: "+o+";");let u=this._getHexColor(e,!1);u&&r.push("background-color: "+u+";"),e.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&r.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&r.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let C=this._getUnderlineColor(e);C&&r.push("text-decoration-color: "+C+";")}return e.isInvisible()&&r.push("visibility: hidden;"),e.isItalic()&&r.push("font-style: italic;"),e.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,t);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=z(e.getChars())}_serializeString(){return this._htmlContent}};export{D as HTMLSerializeHandler,H as SerializeAddon}; - //# sourceMappingURL=addon-serialize.mjs.map -diff --git a/src/SerializeAddon.ts b/src/SerializeAddon.ts -index e1728feb219c362dfa2ecb602ff99f830d520757..957da98c8b30835cc2d114b4b66b228b01fdff0a 100644 ---- a/src/SerializeAddon.ts -+++ b/src/SerializeAddon.ts -@@ -12,6 +12,36 @@ import { IAttributeData } from 'common/buffer/Types'; - import { DEFAULT_ANSI_COLORS } from 'browser/Types'; - import { UnderlineStyle } from 'common/buffer/Constants'; - -+type OscLinkData = { id?: string; uri: string }; -+type OscLinkedCell = { extended?: { urlId?: number } }; -+type TerminalWithOscLinks = Terminal & { -+ _core?: { -+ _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell }; -+ _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined }; -+ }; -+}; -+ -+function getOscLinkId(cell: IBufferCell | IAttributeData): number { -+ return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0; -+} -+ -+function getOscLinkOpenSequence(terminal: Terminal, linkId: number): string { -+ if (!linkId) { -+ return ''; -+ } -+ const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId); -+ if (!data) { -+ return ''; -+ } -+ const params = data.id === undefined ? '' : `id=${data.id}`; -+ return `\u001b]8;${params};${data.uri}\u001b\\`; -+} -+ -+function getActiveOscLinkSequence(terminal: Terminal): string { -+ const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData; -+ return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : ''; -+} -+ - function constrain(value: number, low: number, high: number): number { - return Math.max(low, Math.min(value, high)); - } -@@ -148,12 +178,14 @@ class StringSerializeHandler extends BaseSerializeHandler { - - // this is a null cell for reference for checking whether background is empty or not - private _backgroundCell: IBufferCell = this._buffer.getNullCell(); -+ private _defaultCell: IBufferCell = this._buffer.getNullCell(); - - private _firstRow: number = 0; - private _lastCursorRow: number = 0; - private _lastCursorCol: number = 0; - private _lastContentCursorRow: number = 0; - private _lastContentCursorCol: number = 0; -+ private _activeOscLinkId: number = 0; - - constructor( - buffer: IBuffer, -@@ -214,7 +246,7 @@ class StringSerializeHandler extends BaseSerializeHandler { - if ( - // you must output character to cause overflow, control sequence can't do this - nextRowFirstChar.getChars() && -- isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0 -+ (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0) - ) { - if ( - // the last character can't be null, -@@ -251,9 +283,14 @@ class StringSerializeHandler extends BaseSerializeHandler { - if (this._nullCellCount > 0) { - // do these because we filled the last several null slot, which we shouldn't - rowSeparator += '\u001b[A'; -- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}C`; -+ const contentCellCount = currentLine.length - this._nullCellCount; -+ if (contentCellCount > 0) { -+ rowSeparator += `\u001b[${contentCellCount}C`; -+ } - rowSeparator += `\u001b[${this._nullCellCount}X`; -- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}D`; -+ if (contentCellCount > 0) { -+ rowSeparator += `\u001b[${contentCellCount}D`; -+ } - rowSeparator += '\u001b[B'; - } - -@@ -310,7 +347,20 @@ class StringSerializeHandler extends BaseSerializeHandler { - } - if (flagsChanged) { - if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); } -- if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); } -+ // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so -+ // they must be diffed as one intensity group with the clearing 22 emitted -+ // BEFORE any re-set. Upstream's independent per-flag diff could emit -+ // "1;22" (bold set, then wiped by dim's clear — \x1b[2mA\x1b[22m\x1b[1mB -+ // loses B's bold on round-trip) or a bare "22" that drops a still-set -+ // bold/dim, garbling Orca's hidden-terminal snapshot restores. -+ const boldChanged = cell.isBold() !== oldCell.isBold(); -+ const dimChanged = cell.isDim() !== oldCell.isDim(); -+ if (boldChanged || dimChanged) { -+ const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim()); -+ if (clearsIntensity) { sgrSeq.push(22); } -+ if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); } -+ if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); } -+ } - if (!equalUnderline(cell, oldCell)) { - const style = cell.getUnderlineStyle(); - if (style === UnderlineStyle.NONE) { -@@ -337,7 +387,7 @@ class StringSerializeHandler extends BaseSerializeHandler { - if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); } - if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); } - if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); } -- if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); } -+ // PATCH(orca): dim handled in the intensity group above. - if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); } - } - } -@@ -346,6 +396,20 @@ class StringSerializeHandler extends BaseSerializeHandler { - return sgrSeq; - } - -+ private _setOscLink(linkId: number): string { -+ if (linkId === this._activeOscLinkId) { -+ return ''; -+ } -+ let sequence = this._activeOscLinkId ? '\u001b]8;;\u001b\\' : ''; -+ this._activeOscLinkId = 0; -+ const openSequence = getOscLinkOpenSequence(this._terminal, linkId); -+ if (openSequence) { -+ this._activeOscLinkId = linkId; -+ sequence += openSequence; -+ } -+ return sequence; -+ } -+ - protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { - // a width 0 cell don't need to be count because it is just a placeholder after a CJK character; - const isPlaceHolderCell = cell.getWidth() === 0; -@@ -356,12 +420,21 @@ class StringSerializeHandler extends BaseSerializeHandler { - - // this cell don't have content - const isEmptyCell = cell.getChars() === ''; -+ const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined; -+ const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar); -+ // A pending wide glyph recreates its own final-column padding during replay. -+ const isWideWrapPadding = col === this._terminal.cols - 1 && -+ nextLine?.isWrapped && -+ (nextRowFirstCell?.getWidth() ?? 0) > 1 && -+ !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell); -+ // Cursor movement cannot reproduce an inverse cell's visible background. -+ const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding; - - const sgrSeq = this._diffStyle(cell, this._cursorStyle); - -- // the empty cell style is only assumed to be changed when background changed, because -- // foreground is always 0. -- const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0; -+ const styleChanged = isEmptyCell -+ ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell) -+ : sgrSeq.length > 0; - - /** - * handles style change -@@ -395,7 +468,7 @@ class StringSerializeHandler extends BaseSerializeHandler { - /** - * handles actual content - */ -- if (isEmptyCell) { -+ if (isEmptyCell && !materializeEmptyCell) { - this._nullCellCount += cell.getWidth(); - } else { - if (this._nullCellCount > 0) { -@@ -411,7 +484,22 @@ class StringSerializeHandler extends BaseSerializeHandler { - this._nullCellCount = 0; - } - -- this._currentRow += cell.getChars(); -+ // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable. -+ this._currentRow += this._setOscLink(getOscLinkId(cell)); -+ -+ if (materializeEmptyCell) { -+ const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline(); -+ if (hasDecoration) { -+ this._currentRow += '\u001b[24;29;55m'; -+ } -+ this._currentRow += ' '.repeat(cell.getWidth()); -+ if (hasDecoration) { -+ const restoreSgrSeq = this._diffStyle(cell, this._defaultCell); -+ this._currentRow += `\u001b[0m\u001b[${restoreSgrSeq.join(';')}m`; -+ } -+ } else { -+ this._currentRow += cell.getChars(); -+ } - - // update cursor - this._lastContentCursorRow = this._lastCursorRow = row; -@@ -439,6 +527,9 @@ class StringSerializeHandler extends BaseSerializeHandler { - } - } - -+ // Each buffer is self-contained so links cannot leak into a following buffer. -+ content += this._setOscLink(0); -+ - // restore the cursor - if (!excludeFinalCursorPosition) { - const realCursorRow = this._buffer.baseY + this._buffer.cursorY; -@@ -616,6 +707,9 @@ export class SerializeAddon implements ITerminalAddon, ISerializeApi { - content += this._serializeScrollRegion(this._terminal); - } - -+ // Restore the source terminal's live OSC pen only after all buffers are complete. -+ content += getActiveOscLinkSequence(this._terminal); -+ - return content; - } - diff --git a/config/patches/@xterm__addon-serialize@0.15.0-beta.300.patch b/config/patches/@xterm__addon-serialize@0.15.0-beta.300.patch new file mode 100644 index 00000000000..1e2c857f931 --- /dev/null +++ b/config/patches/@xterm__addon-serialize@0.15.0-beta.300.patch @@ -0,0 +1,258 @@ +diff --git a/lib/addon-serialize.js b/lib/addon-serialize.js +index d669293d06d801ef472d5c2454ce86876e5c321f..b4f77e4976dbe5179d93a44ef919730a828d3331 100644 +--- a/lib/addon-serialize.js ++++ b/lib/addon-serialize.js +@@ -1,2 +1,2 @@ +-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t,e,r){return Math.max(e,Math.min(t,r))}class n{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!l(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),a=o.getWidth()>1;let u=!1;(o.getChars()&&a?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||0===i.getWidth())&&l(i,o)&&(u=!0),a&&(n.getChars()||0===n.getWidth())&&l(i,o)&&l(n,o)&&(u=!0)),u||(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0&&(r+="",r+=`[${e.length-this._nullCellCount}C`,r+=`[${this._nullCellCount}X`,r+=`[${e.length-this._nullCellCount}D`,r+=""),this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0)}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(h(t,e))return r;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){if(t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27),t.isBold()!==e.isBold()&&r.push(t.isBold()?1:22),a(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isDim()!==e.isDim()&&r.push(t.isDim()?2:22),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,this._cursorStyle);if(i?!l(this._cursorStyle,t):n.length>0){this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${n.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}i?this._nullCellCount+=t.getWidth():(this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=t.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth())}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,n=void 0===r?s:i(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-n,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new c(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new f(r,t,e),n=e.onlySelection??!1,o=e.range;if(o)return s.serialize({start:{x:o.startCol,y:(o.startLine,o.startLine)},end:{x:t.cols,y:(o.endLine,o.endLine)}});if(!n){const n=r.length,o=e.scrollback,l=void 0===o?n:i(o+t.rows,0,n);return s.serialize({start:{x:0,y:n-l},end:{x:t.cols,y:n-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class f extends n{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(h(t,e))return;const s=!o(t,e),i=!l(t,e),n=!u(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"
":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=f})(),s})()); ++!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SerializeAddon=e():t.SerializeAddon=e()}(globalThis,()=>(()=>{"use strict";var t={992(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DEFAULT_ANSI_COLORS=void 0;const s=r(993);e.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const t=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],e=[0,95,135,175,215,255];for(let r=0;r<216;r++){const i=e[r/36%6|0],n=e[r/6%6|0],o=e[r%6];t.push({css:s.channels.toCss(i,n,o),rgba:s.channels.toRgba(i,n,o)})}for(let e=0;e<24;e++){const r=8+10*e;t.push({css:s.channels.toCss(r,r,r),rgba:s.channels.toRgba(r,r,r)})}return t})())},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=c,e.contrastRatio=f;let r=0,s=0,i=0,n=0;var o,l,a,u,h;function c(t){const e=t.toString(16);return e.length<2?"0"+e:e}function f(t,e){return t>>0},t.toColor=function(e,r,s,i){return{css:t.toCss(e,r,s,i),rgba:t.toRgba(e,r,s,i)}}}(o||(e.channels=o={})),function(t){function e(t,e){return n=Math.round(255*e),[r,s,i]=h.toChannels(t.rgba),{css:o.toCss(r,s,i,n),rgba:o.toRgba(r,s,i,n)}}t.blend=function(t,e){if(n=(255&e.rgba)/255,1===n)return{css:e.css,rgba:e.rgba};const l=e.rgba>>24&255,a=e.rgba>>16&255,u=e.rgba>>8&255,h=t.rgba>>24&255,c=t.rgba>>16&255,f=t.rgba>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),{css:o.toCss(r,s,i),rgba:o.toRgba(r,s,i)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,r){const s=h.ensureContrastRatio(t.rgba,e.rgba,r);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[r,s,i]=h.toChannels(e),{css:o.toCss(r,s,i),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,r){return n=255&t.rgba,e(t,n*r/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(l||(e.color=l={})),function(t){let e,l;try{const t=document.createElement("canvas");t.width=1,t.height=1;const r=t.getContext("2d",{willReadFrequently:!0});r&&(e=r,e.globalCompositeOperation="copy",l=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),o.toColor(r,s,i);case 5:return r=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),i=parseInt(t.slice(3,4).repeat(2),16),n=parseInt(t.slice(4,5).repeat(2),16),o.toColor(r,s,i,n);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const a=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return r=parseInt(a[1],10),s=parseInt(a[2],10),i=parseInt(a[3],10),n=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),o.toColor(r,s,i,n);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!l)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=l,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[r,s,i,n]=e.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(r,s,i,n),css:t}}}(a||(e.css=a={})),function(t){function e(t,e,r){const s=t/255,i=e/255,n=r/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(u||(e.rgb=u={})),function(t){function e(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h0||l>0||a>0);)o-=Math.max(0,Math.ceil(.1*o)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));return(o<<24|l<<16|a<<8|255)>>>0}function l(t,e,r){const s=t>>24&255,i=t>>16&255,n=t>>8&255;let o=e>>24&255,l=e>>16&255,a=e>>8&255,h=f(u.relativeLuminance2(o,l,a),u.relativeLuminance2(s,i,n));for(;h>>0}t.blend=function(t,e){if(n=(255&e)/255,1===n)return e;const l=e>>24&255,a=e>>16&255,u=e>>8&255,h=t>>24&255,c=t>>16&255,f=t>>8&255;return r=h+Math.round((l-h)*n),s=c+Math.round((a-c)*n),i=f+Math.round((u-f)*n),o.toRgba(r,s,i)},t.ensureContrastRatio=function(t,r,s){const i=u.relativeLuminance(t>>8),n=u.relativeLuminance(r>>8);if(f(i,n)>8));if(of(i,u.relativeLuminance(e>>8))?n:e}return n}const o=l(t,r,s),a=f(i,u.relativeLuminance(o>>8));if(af(i,u.relativeLuminance(n>>8))?o:n}return o}},t.reduceLuminance=e,t.increaseLuminance=l,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(h||(e.rgba=h={}))}},e={};function r(s){var i=e[s];if(void 0!==i)return i.exports;var n=e[s]={exports:{}};return t[s](n,n.exports,r),n.exports}var s={};return(()=>{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.HTMLSerializeHandler=t.SerializeAddon=void 0;const e=r(992);function i(t){return t.extended?.urlId??0}function n(t,e){if(!e)return"";const r=t._core?._oscLinkService?.getLinkData(e);return r?`]8;${void 0===r.id?"":`id=${r.id}`};${r.uri}\\`:""}function o(t,e,r){return Math.max(e,Math.min(t,r))}class l{constructor(t){this._buffer=t}serialize(t,e){const r=this._buffer.getNullCell(),s=this._buffer.getNullCell();let i=r;const n=t.start.y,o=t.end.y,l=t.start.x,a=t.end.x;this._beforeSerialize(o-n,n,o);for(let e=n;e<=o;e++){const n=this._buffer.getLine(e);if(n){const o=e===t.start.y?l:0,u=e===t.end.y?a:n.length;for(let t=o;t0&&!u(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let r="";if(!e){t-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const e=this._buffer.getLine(t),s=this._buffer.getLine(t+1);if(s.isWrapped){r="";const i=e.getCell(e.length-1,this._thisRowLastChar),n=e.getCell(e.length-2,this._thisRowLastSecondChar),o=s.getCell(0,this._nextRowFirstChar),l=o.getWidth()>1;let a=!1;if(o.getChars()&&(l?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||0===i.getWidth())&&u(i,o)&&(a=!0),l&&(n.getChars()||0===n.getWidth())&&u(i,o)&&u(n,o)&&(a=!0)),!a){if(r="-".repeat(this._nullCellCount+1),r+="",this._nullCellCount>0){r+="";const t=e.length-this._nullCellCount;t>0&&(r+=`[${t}C`),r+=`[${this._nullCellCount}X`,t>0&&(r+=`[${t}D`),r+=""}this._lastContentCursorRow=t+1,this._lastContentCursorCol=0,this._lastCursorRow=t+1,this._lastCursorCol=0}}else r="\r\n",this._lastCursorRow=t+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(t,e){const r=[];if(f(t,e))return r;const s=!a(t,e),i=!u(t,e),n=!c(t,e);if(s||i||n)if(t.isAttributeDefault())e.isAttributeDefault()||r.push(0);else{if(s){const e=t.getFgColor();t.isFgRGB()?r.push(38,2,e>>>16&255,e>>>8&255,255&e):t.isFgPalette()?e>=16?r.push(38,5,e):r.push(8&e?90+(7&e):30+(7&e)):r.push(39)}if(i){const e=t.getBgColor();t.isBgRGB()?r.push(48,2,e>>>16&255,e>>>8&255,255&e):t.isBgPalette()?e>=16?r.push(48,5,e):r.push(8&e?100+(7&e):40+(7&e)):r.push(49)}if(n){t.isInverse()!==e.isInverse()&&r.push(t.isInverse()?7:27);const s=t.isBold()!==e.isBold(),i=t.isDim()!==e.isDim();if(s||i){const e=s&&!t.isBold()||i&&!t.isDim();e&&r.push(22),t.isBold()&&(s||e)&&r.push(1),t.isDim()&&(i||e)&&r.push(2)}if(h(t,e))t.isUnderline()!==e.isUnderline()&&r.push(t.isUnderline()?4:24);else{const e=t.getUnderlineStyle();if(0===e)r.push(24);else if(1===e&&t.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+e),!t.isUnderlineColorDefault()){const e=t.getUnderlineColor();t.isUnderlineColorRGB()?r.push("58:2::"+(e>>>16&255)+":"+(e>>>8&255)+":"+(255&e)):r.push("58:5:"+e)}}t.isOverline()!==e.isOverline()&&r.push(t.isOverline()?53:55),t.isBlink()!==e.isBlink()&&r.push(t.isBlink()?5:25),t.isInvisible()!==e.isInvisible()&&r.push(t.isInvisible()?8:28),t.isItalic()!==e.isItalic()&&r.push(t.isItalic()?3:23),t.isStrikethrough()!==e.isStrikethrough()&&r.push(t.isStrikethrough()?9:29)}}return r}_setOscLink(t){if(t===this._activeOscLinkId)return"";let e=this._activeOscLinkId?"]8;;\\":"";this._activeOscLinkId=0;const r=n(this._terminal,t);return r&&(this._activeOscLinkId=t,e+=r),e}_nextCell(t,e,r,s){if(0===t.getWidth())return;const n=""===t.getChars(),o=n&&t.isInverse()?this._buffer.getLine(r+1):void 0,l=o?.getCell(0,this._nextRowFirstChar),a=s===this._terminal.cols-1&&o?.isWrapped&&(l?.getWidth()??0)>1&&!!l&&f(t,l),h=n&&!!t.isInverse()&&!a,c=this._diffStyle(t,this._cursorStyle);if(n?h?c.length>0:!u(this._cursorStyle,t):c.length>0){this._nullCellCount>0&&(u(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s,this._currentRow+=`[${c.join(";")}m`;const t=this._buffer.getLine(r);void 0!==t&&(t.getCell(s,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=s)}if(n&&!h)this._nullCellCount+=t.getWidth();else{if(this._nullCellCount>0&&(u(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=this._setOscLink(i(t)),h){const e=!!t.isUnderline()||!!t.isStrikethrough()||!!t.isOverline();if(e&&(this._currentRow+=""),this._currentRow+=" ".repeat(t.getWidth()),e){const e=this._diffStyle(t,this._defaultCell);this._currentRow+=`[${e.join(";")}m`}}else this._currentRow+=t.getChars();this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=s+t.getWidth()}}_serializeString(t){let e=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(e=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let t=0;t{t>0?r+=`[${t}C`:t<0&&(r+=`[${-t}D`)};(t!==this._lastCursorRow||e!==this._lastCursorCol)&&((s=t-this._lastCursorRow)>0?r+=`[${s}B`:s<0&&(r+=`[${-s}A`),i(e-this._lastCursorCol))}var s;const i=this._terminal._core._inputHandler._curAttrData,n=this._diffStyle(i,this._cursorStyle);return n.length>0&&(r+=`[${n.join(";")}m`),r}}t.SerializeAddon=class{activate(t){this._terminal=t}_serializeBufferByScrollback(t,e,r){const s=e.length,i=void 0===r?s:o(r+t.rows,0,s);return this._serializeBufferByRange(t,e,{start:s-i,end:s-1},!1)}_serializeBufferByRange(t,e,r,s){return new _(e,t).serialize({start:{x:0,y:"number"==typeof r.start?r.start:r.start.line},end:{x:t.cols,y:"number"==typeof r.end?r.end:r.end.line}},s)}_serializeBufferAsHTML(t,e){const r=t.buffer.active,s=new d(r,t,e),i=e.onlySelection??!1,n=e.range;if(n)return s.serialize({start:{x:n.startCol,y:(n.startLine,n.startLine)},end:{x:t.cols,y:(n.endLine,n.endLine)}});if(!i){const i=r.length,n=e.scrollback,l=void 0===n?i:o(n+t.rows,0,i);return s.serialize({start:{x:0,y:i-l},end:{x:t.cols,y:i-1}})}const l=this._terminal?.getSelectionPosition();return void 0!==l?s.serialize({start:{x:l.start.x,y:l.start.y},end:{x:l.end.x,y:l.end.y}}):""}_serializeScrollRegion(t){const e=t._core.buffer,r=e.scrollTop,s=e.scrollBottom;return 0!==r||s!==t.rows-1?`[${r+1};${s+1}r`:""}_serializeModes(t){let e="";const r=t.modes;if(r.applicationCursorKeysMode&&(e+="[?1h"),r.applicationKeypadMode&&(e+="[?66h"),r.bracketedPasteMode&&(e+="[?2004h"),r.insertMode&&(e+=""),r.originMode&&(e+="[?6h"),r.reverseWraparoundMode&&(e+="[?45h"),r.sendFocusMode&&(e+="[?1004h"),!1===r.wraparoundMode&&(e+="[?7l"),"none"!==r.mouseTrackingMode)switch(r.mouseTrackingMode){case"x10":e+="[?9h";break;case"vt200":e+="[?1000h";break;case"drag":e+="[?1002h";break;case"any":e+="[?1003h"}return r.showCursor||(e+="[?25l"),e}serialize(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=t?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,t.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,t?.scrollback);return t?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(e+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),t?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=function(t){const e=t._core?._inputHandler?._curAttrData;return e?n(t,i(e)):""}(this._terminal),e}serializeAsHTML(t){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,t??{})}dispose(){}};class d extends l{constructor(t,r,s){super(t),this._terminal=r,this._options=s,this._currentRow="",this._htmlContent="",r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=e.DEFAULT_ANSI_COLORS}_beforeSerialize(t,e,r){this._htmlContent+="\x3c!--StartFragment--\x3e
";let s="#000000",i="#ffffff";this._options.includeGlobalBackground&&(s=this._terminal.options.theme?.foreground??"#ffffff",i=this._terminal.options.theme?.background??"#000000");const n=[];n.push("color: "+s+";"),n.push("background-color: "+i+";"),n.push("font-family: "+this._terminal.options.fontFamily+";"),n.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
\x3c!--EndFragment--\x3e"}_rowEnd(t,e){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(t,e){const r=e?t.getFgColor():t.getBgColor();return(e?t.isFgRGB():t.isBgRGB())?"#"+[r>>16&255,r>>8&255,255&r].map(t=>t.toString(16).padStart(2,"0")).join(""):(e?t.isFgPalette():t.isBgPalette())?this._ansiColors[r].css:void 0}_getUnderlineColor(t){if(t.isUnderlineColorDefault())return;const e=t.getUnderlineColor();return t.isUnderlineColorRGB()?"#"+[e>>16&255,e>>8&255,255&e].map(t=>t.toString(16).padStart(2,"0")).join(""):this._ansiColors[e].css}_getUnderlineStyle(t){switch(t.getUnderlineStyle()){case 1:default:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed"}}_diffStyle(t,e){const r=[];if(f(t,e))return;const s=!a(t,e),i=!u(t,e),n=!c(t,e);if(s||i||n){const e=this._getHexColor(t,!0);e&&r.push("color: "+e+";");const s=this._getHexColor(t,!1);s&&r.push("background-color: "+s+";"),t.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),t.isBold()&&r.push("font-weight: bold;");const i=[];if(t.isUnderline()&&i.push(this._getUnderlineStyle(t)),t.isOverline()&&i.push("overline"),t.isStrikethrough()&&i.push("line-through"),t.isBlink()&&i.push("blink"),i.length>0&&r.push("text-decoration: "+i.join(" ")+";"),t.isUnderline()){const e=this._getUnderlineColor(t);e&&r.push("text-decoration-color: "+e+";")}return t.isInvisible()&&r.push("visibility: hidden;"),t.isItalic()&&r.push("font-style: italic;"),t.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(t,e,r,s){if(0===t.getWidth())return;const i=""===t.getChars(),n=this._diffStyle(t,e);n&&(this._currentRow+=0===n.length?"
":""),this._currentRow+=i?" ":function(t){switch(t){case"&":return"&";case"<":return"<"}return t}(t.getChars())}_serializeString(){return this._htmlContent}}t.HTMLSerializeHandler=d})(),s})()); + //# sourceMappingURL=addon-serialize.js.map +\ No newline at end of file +diff --git a/lib/addon-serialize.js.map b/lib/addon-serialize.js.map +index bac96176091146ab7eb07d1d7b280286e047278c..54a78516a87fe7fe3ea2c61bc6d778b1f29acc6c 100644 +--- a/lib/addon-serialize.js.map ++++ b/lib/addon-serialize.js.map +@@ -1 +1 @@ +-{"version":3,"file":"addon-serialize.js","mappings":"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","sources":["webpack://SerializeAddon/webpack/universalModuleDefinition","webpack://SerializeAddon/../src/browser/Types.ts","webpack://SerializeAddon/../src/common/Color.ts","webpack://SerializeAddon/webpack/bootstrap","webpack://SerializeAddon/./src/SerializeAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SerializeAddon\"] = factory();\n\telse\n\t\troot[\"SerializeAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}C`;\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}D`;\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); }\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n // the empty cell style is only assumed to be changed when background changed, because\n // foreground is always 0.\n const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n this._currentRow += cell.getChars();\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","Color_1","__webpack_require__","DEFAULT_ANSI_COLORS","Object","freeze","colors","css","toColor","v","i","r","g","b","push","channels","toCss","rgba","toRgba","c","$r","$g","$b","$a","color","rgb","toPaddedHex","s","toString","length","contrastRatio","l1","l2","NULL_COLOR","a","undefined","color_1","opacity","Math","round","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","Error","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","max","ceil","increaseLuminance","min","bgL","fgL","resultA","resultARatio","resultB","value","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Types_1","constrain","low","high","BaseSerializeHandler","constructor","_buffer","serialize","range","excludeFinalCursorPosition","cell1","this","getNullCell","cell2","oldCell","startRow","start","y","endRow","end","startColumn","x","endColumn","_beforeSerialize","row","line","getLine","startLineColumn","endLineColumn","col","getCell","_nextCell","console","warn","_rowEnd","_afterSerialize","_serializeString","cell","isLastRow","rows","equalFg","getFgColorMode","getFgColor","equalBg","getBgColorMode","getBgColor","equalUnderline","isUnderline","getUnderlineStyle","cell1Default","isUnderlineColorDefault","cell2Default","getUnderlineColor","getUnderlineColorMode","equalFlags","isInverse","isBold","isOverline","isBlink","isInvisible","isItalic","isDim","isStrikethrough","attributesEquals","cell1AsBufferCell","StringSerializeHandler","buffer","_terminal","super","_rowIndex","_allRows","Array","_allRowSeparators","_currentRow","_nullCellCount","_cursorStyle","_cursorStyleRow","_cursorStyleCol","_backgroundCell","_firstRow","_lastCursorRow","_lastCursorCol","_lastContentCursorRow","_lastContentCursorCol","_thisRowLastChar","_thisRowLastSecondChar","_nextRowFirstChar","rowSeparator","currentLine","nextLine","isWrapped","thisRowLastChar","thisRowLastSecondChar","nextRowFirstChar","isNextRowFirstCharDoubleWidth","getWidth","isValid","getChars","_diffStyle","sgrSeq","fgChanged","bgChanged","flagsChanged","isAttributeDefault","isFgRGB","isFgPalette","isBgRGB","isBgPalette","style","isUnderlineColorRGB","isEmptyCell","join","rowEnd","content","realCursorRow","baseY","cursorY","realCursorCol","cursorX","moveRight","offset","curAttrData","_core","_inputHandler","_curAttrData","activate","terminal","_serializeBufferByScrollback","scrollback","maxRows","correctRows","_serializeBufferByRange","cols","_serializeBufferAsHTML","options","active","handler","HTMLSerializeHandler","onlySelection","startCol","startLine","endLine","selection","getSelectionPosition","_serializeScrollRegion","scrollTop","scrollBottom","_serializeModes","modes","applicationCursorKeysMode","applicationKeypadMode","bracketedPasteMode","insertMode","originMode","reverseWraparoundMode","sendFocusMode","wraparoundMode","mouseTrackingMode","showCursor","normal","excludeAltBuffer","type","alternate","excludeModes","serializeAsHTML","dispose","_options","_htmlContent","_themeService","_ansiColors","ansi","foreground","background","includeGlobalBackground","theme","globalStyleDefinitions","fontFamily","fontSize","_getHexColor","isFg","map","padStart","_getUnderlineColor","_getUnderlineStyle","fgHexColor","bgHexColor","decorations","underlineColor","styleDefinitions","escapeHTMLChar"],"sourceRoot":""} +\ No newline at end of file ++{"version":3,"file":"addon-serialize.js","mappings":"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","sources":["webpack://SerializeAddon/webpack/universalModuleDefinition","webpack://SerializeAddon/../src/browser/Types.ts","webpack://SerializeAddon/../src/common/Color.ts","webpack://SerializeAddon/webpack/bootstrap","webpack://SerializeAddon/./src/SerializeAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"SerializeAddon\"] = factory();\n\telse\n\t\troot[\"SerializeAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\ntype OscLinkData = { id?: string; uri: string };\ntype OscLinkedCell = { extended?: { urlId?: number } };\ntype TerminalWithOscLinks = Terminal & {\n _core?: {\n _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell };\n _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined };\n };\n};\n\nfunction getOscLinkId(cell: IBufferCell | IAttributeData): number {\n return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0;\n}\n\nfunction getOscLinkOpenSequence(terminal: Terminal, linkId: number): string {\n if (!linkId) {\n return '';\n }\n const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId);\n if (!data) {\n return '';\n }\n const params = data.id === undefined ? '' : `id=${data.id}`;\n return `\\u001b]8;${params};${data.uri}\\u001b\\\\`;\n}\n\nfunction getActiveOscLinkSequence(terminal: Terminal): string {\n const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData;\n return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : '';\n}\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n private _defaultCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n private _activeOscLinkId: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0)\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n const contentCellCount = currentLine.length - this._nullCellCount;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}C`;\n }\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}D`;\n }\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so\n // they must be diffed as one intensity group with the clearing 22 emitted\n // BEFORE any re-set. Upstream's independent per-flag diff could emit\n // \"1;22\" (bold set, then wiped by dim's clear — \\x1b[2mA\\x1b[22m\\x1b[1mB\n // loses B's bold on round-trip) or a bare \"22\" that drops a still-set\n // bold/dim, garbling Orca's hidden-terminal snapshot restores.\n const boldChanged = cell.isBold() !== oldCell.isBold();\n const dimChanged = cell.isDim() !== oldCell.isDim();\n if (boldChanged || dimChanged) {\n const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim());\n if (clearsIntensity) { sgrSeq.push(22); }\n if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); }\n if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); }\n }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n // PATCH(orca): dim handled in the intensity group above.\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n private _setOscLink(linkId: number): string {\n if (linkId === this._activeOscLinkId) {\n return '';\n }\n let sequence = this._activeOscLinkId ? '\\u001b]8;;\\u001b\\\\' : '';\n this._activeOscLinkId = 0;\n const openSequence = getOscLinkOpenSequence(this._terminal, linkId);\n if (openSequence) {\n this._activeOscLinkId = linkId;\n sequence += openSequence;\n }\n return sequence;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined;\n const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar);\n // A pending wide glyph recreates its own final-column padding during replay.\n const isWideWrapPadding = col === this._terminal.cols - 1 &&\n nextLine?.isWrapped &&\n (nextRowFirstCell?.getWidth() ?? 0) > 1 &&\n !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell);\n // Cursor movement cannot reproduce an inverse cell's visible background.\n const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding;\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n const styleChanged = isEmptyCell\n ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell)\n : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell && !materializeEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable.\n this._currentRow += this._setOscLink(getOscLinkId(cell));\n\n if (materializeEmptyCell) {\n const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline();\n if (hasDecoration) {\n this._currentRow += '\\u001b[24;29;55m';\n }\n this._currentRow += ' '.repeat(cell.getWidth());\n if (hasDecoration) {\n const restoreSgrSeq = this._diffStyle(cell, this._defaultCell);\n this._currentRow += `\\u001b[0m\\u001b[${restoreSgrSeq.join(';')}m`;\n }\n } else {\n this._currentRow += cell.getChars();\n }\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // Each buffer is self-contained so links cannot leak into a following buffer.\n content += this._setOscLink(0);\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n // Restore the source terminal's live OSC pen only after all buffers are complete.\n content += getActiveOscLinkSequence(this._terminal);\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","Color_1","__webpack_require__","DEFAULT_ANSI_COLORS","Object","freeze","colors","css","toColor","v","i","r","g","b","push","channels","toCss","rgba","toRgba","c","$r","$g","$b","$a","color","rgb","toPaddedHex","s","toString","length","contrastRatio","l1","l2","NULL_COLOR","a","undefined","color_1","opacity","Math","round","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","canvas","document","createElement","width","height","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","Error","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","max","ceil","increaseLuminance","min","bgL","fgL","resultA","resultARatio","resultB","value","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","Types_1","getOscLinkId","cell","extended","urlId","getOscLinkOpenSequence","terminal","linkId","_core","_oscLinkService","getLinkData","id","uri","constrain","low","high","BaseSerializeHandler","constructor","_buffer","serialize","range","excludeFinalCursorPosition","cell1","this","getNullCell","cell2","oldCell","startRow","start","y","endRow","end","startColumn","x","endColumn","_beforeSerialize","row","line","getLine","startLineColumn","endLineColumn","col","getCell","_nextCell","console","warn","_rowEnd","_afterSerialize","_serializeString","isLastRow","rows","equalFg","getFgColorMode","getFgColor","equalBg","getBgColorMode","getBgColor","equalUnderline","isUnderline","getUnderlineStyle","cell1Default","isUnderlineColorDefault","cell2Default","getUnderlineColor","getUnderlineColorMode","equalFlags","isInverse","isBold","isOverline","isBlink","isInvisible","isItalic","isDim","isStrikethrough","attributesEquals","cell1AsBufferCell","StringSerializeHandler","buffer","_terminal","super","_rowIndex","_allRows","Array","_allRowSeparators","_currentRow","_nullCellCount","_cursorStyle","_cursorStyleRow","_cursorStyleCol","_backgroundCell","_defaultCell","_firstRow","_lastCursorRow","_lastCursorCol","_lastContentCursorRow","_lastContentCursorCol","_activeOscLinkId","_thisRowLastChar","_thisRowLastSecondChar","_nextRowFirstChar","rowSeparator","currentLine","nextLine","isWrapped","thisRowLastChar","thisRowLastSecondChar","nextRowFirstChar","isNextRowFirstCharDoubleWidth","getWidth","isValid","getChars","contentCellCount","_diffStyle","sgrSeq","fgChanged","bgChanged","flagsChanged","isAttributeDefault","isFgRGB","isFgPalette","isBgRGB","isBgPalette","boldChanged","dimChanged","clearsIntensity","style","isUnderlineColorRGB","_setOscLink","sequence","openSequence","isEmptyCell","nextRowFirstCell","isWideWrapPadding","cols","materializeEmptyCell","join","hasDecoration","restoreSgrSeq","rowEnd","content","realCursorRow","baseY","cursorY","realCursorCol","cursorX","moveRight","offset","curAttrData","_inputHandler","_curAttrData","activate","_serializeBufferByScrollback","scrollback","maxRows","correctRows","_serializeBufferByRange","_serializeBufferAsHTML","options","active","handler","HTMLSerializeHandler","onlySelection","startCol","startLine","endLine","selection","getSelectionPosition","_serializeScrollRegion","scrollTop","scrollBottom","_serializeModes","modes","applicationCursorKeysMode","applicationKeypadMode","bracketedPasteMode","insertMode","originMode","reverseWraparoundMode","sendFocusMode","wraparoundMode","mouseTrackingMode","showCursor","normal","excludeAltBuffer","type","alternate","excludeModes","attrs","getActiveOscLinkSequence","serializeAsHTML","dispose","_options","_htmlContent","_themeService","_ansiColors","ansi","foreground","background","includeGlobalBackground","theme","globalStyleDefinitions","fontFamily","fontSize","_getHexColor","isFg","map","padStart","_getUnderlineColor","_getUnderlineStyle","fgHexColor","bgHexColor","decorations","underlineColor","styleDefinitions","escapeHTMLChar"],"sourceRoot":""} +\ No newline at end of file +diff --git a/lib/addon-serialize.mjs b/lib/addon-serialize.mjs +index a5c4c4dd05b7efcc23d0e45661ffd4e42da80f21..b9bb467ab8a701c6d31a0f7a539010fad828e6da 100644 +--- a/lib/addon-serialize.mjs ++++ b/lib/addon-serialize.mjs +@@ -14,6 +14,6 @@ + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +-var m=0,b=0,_=0,p=0;var g;(t=>{function a(r,l,s,i){return i!==void 0?`#${w(r)}${w(l)}${w(s)}${w(i)}`:`#${w(r)}${w(l)}${w(s)}`}t.toCss=a;function n(r,l,s,i=255){return(r<<24|l<<16|s<<8|i)>>>0}t.toRgba=n;function e(r,l,s,i){return{css:t.toCss(r,l,s,i),rgba:t.toRgba(r,l,s,i)}}t.toColor=e})(g||={});var N;(i=>{function a(o,u){if(p=(u.rgba&255)/255,p===1)return{css:u.css,rgba:u.rgba};let f=u.rgba>>24&255,C=u.rgba>>16&255,c=u.rgba>>8&255,h=o.rgba>>24&255,d=o.rgba>>16&255,I=o.rgba>>8&255;m=h+Math.round((f-h)*p),b=d+Math.round((C-d)*p),_=I+Math.round((c-I)*p);let L=g.toCss(m,b,_),E=g.toRgba(m,b,_);return{css:L,rgba:E}}i.blend=a;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,u,f){let C=B.ensureContrastRatio(o.rgba,u.rgba,f);if(C)return g.toColor(C>>24&255,C>>16&255,C>>8&255)}i.ensureContrastRatio=e;function t(o){let u=(o.rgba|255)>>>0;return[m,b,_]=B.toChannels(u),{css:g.toCss(m,b,_),rgba:u}}i.opaque=t;function r(o,u){return p=Math.round(u*255),[m,b,_]=B.toChannels(o.rgba),{css:g.toCss(m,b,_,p),rgba:g.toRgba(m,b,_,p)}}i.opacity=r;function l(o,u){return p=o.rgba&255,r(o,p*u/255)}i.multiplyOpacity=l;function s(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=s})(N||={});var x;(t=>{let a,n;try{let r=document.createElement("canvas");r.width=1,r.height=1;let l=r.getContext("2d",{willReadFrequently:!0});l&&(a=l,a.globalCompositeOperation="copy",n=a.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),g.toColor(m,b,_);case 5:return m=parseInt(r.slice(1,2).repeat(2),16),b=parseInt(r.slice(2,3).repeat(2),16),_=parseInt(r.slice(3,4).repeat(2),16),p=parseInt(r.slice(4,5).repeat(2),16),g.toColor(m,b,_,p);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let l=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(l)return m=parseInt(l[1],10),b=parseInt(l[2],10),_=parseInt(l[3],10),p=Math.round((l[5]===void 0?1:parseFloat(l[5]))*255),g.toColor(m,b,_,p);if(r==="transparent")return{css:"transparent",rgba:0};if(!a||!n)throw new Error("css.toColor: Unsupported css format");if(a.fillStyle=n,a.fillStyle=r,typeof a.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(a.fillRect(0,0,1,1),[m,b,_,p]=a.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(m,b,_,p),css:r}}t.toColor=e})(x||={});var v;(e=>{function a(t){return n(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=a;function n(t,r,l){let s=t/255,i=r/255,o=l/255,u=s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),C=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return u*.2126+f*.7152+C*.0722}e.relativeLuminance2=n})(v||={});var B;(l=>{function a(s,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,u=i>>16&255,f=i>>8&255,C=s>>24&255,c=s>>16&255,h=s>>8&255;return m=C+Math.round((o-C)*p),b=c+Math.round((u-c)*p),_=h+Math.round((f-h)*p),g.toRgba(m,b,_)}l.blend=a;function n(s,i,o){let u=v.relativeLuminance(s>>8),f=v.relativeLuminance(i>>8);if(R(u,f)>8));if(I>8));return I>E?d:L}return d}let c=t(s,i,o),h=R(u,v.relativeLuminance(c>>8));if(h>8));return h>I?c:d}return c}}l.ensureContrastRatio=n;function e(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I0||h>0||d>0);)c-=Math.max(0,Math.ceil(c*.1)),h-=Math.max(0,Math.ceil(h*.1)),d-=Math.max(0,Math.ceil(d*.1)),I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));return(c<<24|h<<16|d<<8|255)>>>0}l.reduceLuminance=e;function t(s,i,o){let u=s>>24&255,f=s>>16&255,C=s>>8&255,c=i>>24&255,h=i>>16&255,d=i>>8&255,I=R(v.relativeLuminance2(c,h,d),v.relativeLuminance2(u,f,C));for(;I>>0}l.increaseLuminance=t;function r(s){return[s>>24&255,s>>16&255,s>>8&255,s&255]}l.toChannels=r})(B||={});function w(a){let n=a.toString(16);return n.length<2?"0"+n:n}function R(a,n){return a{let a=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=n[e/36%6|0],r=n[e/6%6|0],l=n[e%6];a.push({css:g.toCss(t,r,l),rgba:g.toRgba(t,r,l)})}for(let e=0;e<24;e++){let t=8+e*10;a.push({css:g.toCss(t,t,t),rgba:g.toRgba(t,t,t)})}return a})());function A(a,n,e){return Math.max(n,Math.min(a,e))}function z(a){switch(a){case"&":return"&";case"<":return"<"}return a}var S=class{constructor(n){this._buffer=n}serialize(n,e){let t=this._buffer.getNullCell(),r=this._buffer.getNullCell(),l=t,s=n.start.y,i=n.end.y,o=n.start.x,u=n.end.x;this._beforeSerialize(i-s,s,i);for(let f=s;f<=i;f++){let C=this._buffer.getLine(f);if(C){let c=f===n.start.y?o:0,h=f===n.end.y?u:C.length;for(let d=c;d0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let r="";if(!t){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let l=this._buffer.getLine(e),s=this._buffer.getLine(e+1);if(!s.isWrapped)r=`\r +-`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{r="";let i=l.getCell(l.length-1,this._thisRowLastChar),o=l.getCell(l.length-2,this._thisRowLastSecondChar),u=s.getCell(0,this._nextRowFirstChar),f=u.getWidth()>1,C=!1;(u.getChars()&&f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&F(i,u)&&(C=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,u)&&F(o,u)&&(C=!0)),C||(r="-".repeat(this._nullCellCount+1),r+="\x1B[1D\x1B[1X",this._nullCellCount>0&&(r+="\x1B[A",r+=`\x1B[${l.length-this._nullCellCount}C`,r+=`\x1B[${this._nullCellCount}X`,r+=`\x1B[${l.length-this._nullCellCount}D`,r+="\x1B[B"),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=r,this._currentRow="",this._nullCellCount=0}_diffStyle(e,t){let r=[];if(U(e,t))return r;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i)if(e.isAttributeDefault())t.isAttributeDefault()||r.push(0);else{if(l){let o=e.getFgColor();e.isFgRGB()?r.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?r.push(38,5,o):r.push(o&8?90+(o&7):30+(o&7)):r.push(39)}if(s){let o=e.getBgColor();e.isBgRGB()?r.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?r.push(48,5,o):r.push(o&8?100+(o&7):40+(o&7)):r.push(49)}if(i){if(e.isInverse()!==t.isInverse()&&r.push(e.isInverse()?7:27),e.isBold()!==t.isBold()&&r.push(e.isBold()?1:22),O(e,t))e.isUnderline()!==t.isUnderline()&&r.push(e.isUnderline()?4:24);else{let o=e.getUnderlineStyle();if(o===0)r.push(24);else if(o===1&&e.isUnderlineColorDefault())r.push(4);else if(r.push("4:"+o),!e.isUnderlineColorDefault()){let u=e.getUnderlineColor();e.isUnderlineColorRGB()?r.push("58:2::"+(u>>>16&255)+":"+(u>>>8&255)+":"+(u&255)):r.push("58:5:"+u)}}e.isOverline()!==t.isOverline()&&r.push(e.isOverline()?53:55),e.isBlink()!==t.isBlink()&&r.push(e.isBlink()?5:25),e.isInvisible()!==t.isInvisible()&&r.push(e.isInvisible()?8:28),e.isItalic()!==t.isItalic()&&r.push(e.isItalic()?3:23),e.isDim()!==t.isDim()&&r.push(e.isDim()?2:22),e.isStrikethrough()!==t.isStrikethrough()&&r.push(e.isStrikethrough()?9:29)}}return r}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,this._cursorStyle);if(i?!F(this._cursorStyle,e):o.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l,this._currentRow+=`\x1B[${o.join(";")}m`;let f=this._buffer.getLine(r);f!==void 0&&(f.getCell(l,this._cursorStyle),this._cursorStyleRow=r,this._cursorStyleCol=l)}i?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=e.getChars(),this._lastContentCursorRow=this._lastCursorRow=r,this._lastContentCursorCol=this._lastCursorCol=l+e.getWidth())}_serializeString(e){let t=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(t=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let r="";for(let i=0;i{c>0?r+=`\x1B[${c}C`:c<0&&(r+=`\x1B[${-c}D`)};u&&((c=>{c>0?r+=`\x1B[${c}B`:c<0&&(r+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let l=this._terminal._core._inputHandler._curAttrData,s=this._diffStyle(l,this._cursorStyle);return s.length>0&&(r+=`\x1B[${s.join(";")}m`),r}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,t){let r=e.length,l=t===void 0?r:A(t+n.rows,0,r);return this._serializeBufferByRange(n,e,{start:r-l,end:r-1},!1)}_serializeBufferByRange(n,e,t,r){return new y(e,n).serialize({start:{x:0,y:typeof t.start=="number"?t.start:t.start.line},end:{x:n.cols,y:typeof t.end=="number"?t.end:t.end.line}},r)}_serializeBufferAsHTML(n,e){let t=n.buffer.active,r=new D(t,n,e),l=e.onlySelection??!1,s=e.range;if(s)return r.serialize({start:{x:s.startCol,y:(typeof s.startLine=="number",s.startLine)},end:{x:n.cols,y:(typeof s.endLine=="number",s.endLine)}});if(!l){let o=t.length,u=e.scrollback,f=u===void 0?o:A(u+n.rows,0,o);return r.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?r.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,t=e.scrollTop,r=e.scrollBottom;return t!==0||r!==n.rows-1?`\x1B[${t+1};${r+1}r`:""}_serializeModes(n){let e="",t=n.modes;if(t.applicationCursorKeysMode&&(e+="\x1B[?1h"),t.applicationKeypadMode&&(e+="\x1B[?66h"),t.bracketedPasteMode&&(e+="\x1B[?2004h"),t.insertMode&&(e+="\x1B[4h"),t.originMode&&(e+="\x1B[?6h"),t.reverseWraparoundMode&&(e+="\x1B[?45h"),t.sendFocusMode&&(e+="\x1B[?1004h"),t.wraparoundMode===!1&&(e+="\x1B[?7l"),t.mouseTrackingMode!=="none")switch(t.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return t.showCursor||(e+="\x1B[?25l"),e}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let t=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${t}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},D=class extends S{constructor(e,t,r){super(e);this._terminal=t;this._options=r;this._currentRow="";this._htmlContent="";t._core._themeService?this._ansiColors=t._core._themeService.colors.ansi:this._ansiColors=k}_beforeSerialize(e,t,r){this._htmlContent+="
";let l="#000000",s="#ffffff";(this._options.includeGlobalBackground??!1)&&(l=this._terminal.options.theme?.foreground??"#ffffff",s=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+l+";"),i.push("background-color: "+s+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,t){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,t){let r=t?e.getFgColor():e.getBgColor();if(t?e.isFgRGB():e.isBgRGB())return"#"+[r>>16&255,r>>8&255,r&255].map(s=>s.toString(16).padStart(2,"0")).join("");if(t?e.isFgPalette():e.isBgPalette())return this._ansiColors[r].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let t=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[t>>16&255,t>>8&255,t&255].map(l=>l.toString(16).padStart(2,"0")).join(""):this._ansiColors[t].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,t){let r=[];if(U(e,t))return;let l=!T(e,t),s=!F(e,t),i=!M(e,t);if(l||s||i){let o=this._getHexColor(e,!0);o&&r.push("color: "+o+";");let u=this._getHexColor(e,!1);u&&r.push("background-color: "+u+";"),e.isInverse()&&r.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&r.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&r.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let C=this._getUnderlineColor(e);C&&r.push("text-decoration-color: "+C+";")}return e.isInvisible()&&r.push("visibility: hidden;"),e.isItalic()&&r.push("font-style: italic;"),e.isDim()&&r.push("opacity: 0.5;"),r}}_nextCell(e,t,r,l){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,t);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=z(e.getChars())}_serializeString(){return this._htmlContent}};export{D as HTMLSerializeHandler,H as SerializeAddon}; ++var b=0,_=0,I=0,p=0;var g;(r=>{function s(t,u,a,i){return i!==void 0?`#${L(t)}${L(u)}${L(a)}${L(i)}`:`#${L(t)}${L(u)}${L(a)}`}r.toCss=s;function n(t,u,a,i=255){return(t<<24|u<<16|a<<8|i)>>>0}r.toRgba=n;function e(t,u,a,i){return{css:r.toCss(t,u,a,i),rgba:r.toRgba(t,u,a,i)}}r.toColor=e})(g||={});var W;(i=>{function s(o,l){if(p=(l.rgba&255)/255,p===1)return{css:l.css,rgba:l.rgba};let f=l.rgba>>24&255,d=l.rgba>>16&255,c=l.rgba>>8&255,C=o.rgba>>24&255,h=o.rgba>>16&255,m=o.rgba>>8&255;b=C+Math.round((f-C)*p),_=h+Math.round((d-h)*p),I=m+Math.round((c-m)*p);let w=g.toCss(b,_,I),E=g.toRgba(b,_,I);return{css:w,rgba:E}}i.blend=s;function n(o){return(o.rgba&255)===255}i.isOpaque=n;function e(o,l,f){let d=S.ensureContrastRatio(o.rgba,l.rgba,f);if(d)return g.toColor(d>>24&255,d>>16&255,d>>8&255)}i.ensureContrastRatio=e;function r(o){let l=(o.rgba|255)>>>0;return[b,_,I]=S.toChannels(l),{css:g.toCss(b,_,I),rgba:l}}i.opaque=r;function t(o,l){return p=Math.round(l*255),[b,_,I]=S.toChannels(o.rgba),{css:g.toCss(b,_,I,p),rgba:g.toRgba(b,_,I,p)}}i.opacity=t;function u(o,l){return p=o.rgba&255,t(o,p*l/255)}i.multiplyOpacity=u;function a(o){return[o.rgba>>24&255,o.rgba>>16&255,o.rgba>>8&255]}i.toColorRGB=a})(W||={});var x;(r=>{let s,n;try{let t=document.createElement("canvas");t.width=1,t.height=1;let u=t.getContext("2d",{willReadFrequently:!0});u&&(s=u,s.globalCompositeOperation="copy",n=s.createLinearGradient(0,0,1,1))}catch{}function e(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return b=parseInt(t.slice(1,2).repeat(2),16),_=parseInt(t.slice(2,3).repeat(2),16),I=parseInt(t.slice(3,4).repeat(2),16),g.toColor(b,_,I);case 5:return b=parseInt(t.slice(1,2).repeat(2),16),_=parseInt(t.slice(2,3).repeat(2),16),I=parseInt(t.slice(3,4).repeat(2),16),p=parseInt(t.slice(4,5).repeat(2),16),g.toColor(b,_,I,p);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}let u=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(u)return b=parseInt(u[1],10),_=parseInt(u[2],10),I=parseInt(u[3],10),p=Math.round((u[5]===void 0?1:parseFloat(u[5]))*255),g.toColor(b,_,I,p);if(t==="transparent")return{css:"transparent",rgba:0};if(!s||!n)throw new Error("css.toColor: Unsupported css format");if(s.fillStyle=n,s.fillStyle=t,typeof s.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(s.fillRect(0,0,1,1),[b,_,I,p]=s.getImageData(0,0,1,1).data,p!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:g.toRgba(b,_,I,p),css:t}}r.toColor=e})(x||={});var v;(e=>{function s(r){return n(r>>16&255,r>>8&255,r&255)}e.relativeLuminance=s;function n(r,t,u){let a=r/255,i=t/255,o=u/255,l=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),f=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4),d=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4);return l*.2126+f*.7152+d*.0722}e.relativeLuminance2=n})(v||={});var S;(u=>{function s(a,i){if(p=(i&255)/255,p===1)return i;let o=i>>24&255,l=i>>16&255,f=i>>8&255,d=a>>24&255,c=a>>16&255,C=a>>8&255;return b=d+Math.round((o-d)*p),_=c+Math.round((l-c)*p),I=C+Math.round((f-C)*p),g.toRgba(b,_,I)}u.blend=s;function n(a,i,o){let l=v.relativeLuminance(a>>8),f=v.relativeLuminance(i>>8);if(R(l,f)>8));if(m>8));return m>E?h:w}return h}let c=r(a,i,o),C=R(l,v.relativeLuminance(c>>8));if(C>8));return C>m?c:h}return c}}u.ensureContrastRatio=n;function e(a,i,o){let l=a>>24&255,f=a>>16&255,d=a>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;m0||C>0||h>0);)c-=Math.max(0,Math.ceil(c*.1)),C-=Math.max(0,Math.ceil(C*.1)),h-=Math.max(0,Math.ceil(h*.1)),m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));return(c<<24|C<<16|h<<8|255)>>>0}u.reduceLuminance=e;function r(a,i,o){let l=a>>24&255,f=a>>16&255,d=a>>8&255,c=i>>24&255,C=i>>16&255,h=i>>8&255,m=R(v.relativeLuminance2(c,C,h),v.relativeLuminance2(l,f,d));for(;m>>0}u.increaseLuminance=r;function t(a){return[a>>24&255,a>>16&255,a>>8&255,a&255]}u.toChannels=t})(S||={});function L(s){let n=s.toString(16);return n.length<2?"0"+n:n}function R(s,n){return s{let s=[x.toColor("#2e3436"),x.toColor("#cc0000"),x.toColor("#4e9a06"),x.toColor("#c4a000"),x.toColor("#3465a4"),x.toColor("#75507b"),x.toColor("#06989a"),x.toColor("#d3d7cf"),x.toColor("#555753"),x.toColor("#ef2929"),x.toColor("#8ae234"),x.toColor("#fce94f"),x.toColor("#729fcf"),x.toColor("#ad7fa8"),x.toColor("#34e2e2"),x.toColor("#eeeeec")],n=[0,95,135,175,215,255];for(let e=0;e<216;e++){let r=n[e/36%6|0],t=n[e/6%6|0],u=n[e%6];s.push({css:g.toCss(r,t,u),rgba:g.toRgba(r,t,u)})}for(let e=0;e<24;e++){let r=8+e*10;s.push({css:g.toCss(r,r,r),rgba:g.toRgba(r,r,r)})}return s})());function U(s){return s.extended?.urlId??0}function N(s,n){if(!n)return"";let e=s._core?._oscLinkService?.getLinkData(n);return e?`\x1B]8;${e.id===void 0?"":`id=${e.id}`};${e.uri}\x1B\\`:""}function $(s){let n=s._core?._inputHandler?._curAttrData;return n?N(s,U(n)):""}function A(s,n,e){return Math.max(n,Math.min(s,e))}function P(s){switch(s){case"&":return"&";case"<":return"<"}return s}var B=class{constructor(n){this._buffer=n}serialize(n,e){let r=this._buffer.getNullCell(),t=this._buffer.getNullCell(),u=r,a=n.start.y,i=n.end.y,o=n.start.x,l=n.end.x;this._beforeSerialize(i-a,a,i);for(let f=a;f<=i;f++){let d=this._buffer.getLine(f);if(d){let c=f===n.start.y?o:0,C=f===n.end.y?l:d.length;for(let h=c;h0&&!F(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`\x1B[${this._nullCellCount}X`);let t="";if(!r){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);let u=this._buffer.getLine(e),a=this._buffer.getLine(e+1);if(!a.isWrapped)t=`\r ++`,this._lastCursorRow=e+1,this._lastCursorCol=0;else{t="";let i=u.getCell(u.length-1,this._thisRowLastChar),o=u.getCell(u.length-2,this._thisRowLastSecondChar),l=a.getCell(0,this._nextRowFirstChar),f=l.getWidth()>1,d=!1;if(l.getChars()&&(f?this._nullCellCount<=1:this._nullCellCount<=0)&&((i.getChars()||i.getWidth()===0)&&F(i,l)&&(d=!0),f&&(o.getChars()||o.getWidth()===0)&&F(i,l)&&F(o,l)&&(d=!0)),!d){if(t="-".repeat(this._nullCellCount+1),t+="\x1B[1D\x1B[1X",this._nullCellCount>0){t+="\x1B[A";let c=u.length-this._nullCellCount;c>0&&(t+=`\x1B[${c}C`),t+=`\x1B[${this._nullCellCount}X`,c>0&&(t+=`\x1B[${c}D`),t+="\x1B[B"}this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0}}}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=t,this._currentRow="",this._nullCellCount=0}_diffStyle(e,r){let t=[];if(y(e,r))return t;let u=!T(e,r),a=!F(e,r),i=!M(e,r);if(u||a||i)if(e.isAttributeDefault())r.isAttributeDefault()||t.push(0);else{if(u){let o=e.getFgColor();e.isFgRGB()?t.push(38,2,o>>>16&255,o>>>8&255,o&255):e.isFgPalette()?o>=16?t.push(38,5,o):t.push(o&8?90+(o&7):30+(o&7)):t.push(39)}if(a){let o=e.getBgColor();e.isBgRGB()?t.push(48,2,o>>>16&255,o>>>8&255,o&255):e.isBgPalette()?o>=16?t.push(48,5,o):t.push(o&8?100+(o&7):40+(o&7)):t.push(49)}if(i){e.isInverse()!==r.isInverse()&&t.push(e.isInverse()?7:27);let o=e.isBold()!==r.isBold(),l=e.isDim()!==r.isDim();if(o||l){let f=o&&!e.isBold()||l&&!e.isDim();f&&t.push(22),e.isBold()&&(o||f)&&t.push(1),e.isDim()&&(l||f)&&t.push(2)}if(z(e,r))e.isUnderline()!==r.isUnderline()&&t.push(e.isUnderline()?4:24);else{let f=e.getUnderlineStyle();if(f===0)t.push(24);else if(f===1&&e.isUnderlineColorDefault())t.push(4);else if(t.push("4:"+f),!e.isUnderlineColorDefault()){let d=e.getUnderlineColor();e.isUnderlineColorRGB()?t.push("58:2::"+(d>>>16&255)+":"+(d>>>8&255)+":"+(d&255)):t.push("58:5:"+d)}}e.isOverline()!==r.isOverline()&&t.push(e.isOverline()?53:55),e.isBlink()!==r.isBlink()&&t.push(e.isBlink()?5:25),e.isInvisible()!==r.isInvisible()&&t.push(e.isInvisible()?8:28),e.isItalic()!==r.isItalic()&&t.push(e.isItalic()?3:23),e.isStrikethrough()!==r.isStrikethrough()&&t.push(e.isStrikethrough()?9:29)}}return t}_setOscLink(e){if(e===this._activeOscLinkId)return"";let r=this._activeOscLinkId?"\x1B]8;;\x1B\\":"";this._activeOscLinkId=0;let t=N(this._terminal,e);return t&&(this._activeOscLinkId=e,r+=t),r}_nextCell(e,r,t,u){if(e.getWidth()===0)return;let i=e.getChars()==="",o=i&&e.isInverse()?this._buffer.getLine(t+1):void 0,l=o?.getCell(0,this._nextRowFirstChar),f=u===this._terminal.cols-1&&o?.isWrapped&&(l?.getWidth()??0)>1&&!!l&&y(e,l),d=i&&!!e.isInverse()&&!f,c=this._diffStyle(e,this._cursorStyle);if(i?d?c.length>0:!F(this._cursorStyle,e):c.length>0){this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`\x1B[${this._nullCellCount}X`),this._currentRow+=`\x1B[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=u,this._currentRow+=`\x1B[${c.join(";")}m`;let h=this._buffer.getLine(t);h!==void 0&&(h.getCell(u,this._cursorStyle),this._cursorStyleRow=t,this._cursorStyleCol=u)}if(i&&!d)this._nullCellCount+=e.getWidth();else{if(this._nullCellCount>0&&(F(this._cursorStyle,this._backgroundCell)?this._currentRow+=`\x1B[${this._nullCellCount}C`:(this._currentRow+=`\x1B[${this._nullCellCount}X`,this._currentRow+=`\x1B[${this._nullCellCount}C`),this._nullCellCount=0),this._currentRow+=this._setOscLink(U(e)),d){let h=!!e.isUnderline()||!!e.isStrikethrough()||!!e.isOverline();if(h&&(this._currentRow+="\x1B[24;29;55m"),this._currentRow+=" ".repeat(e.getWidth()),h){let m=this._diffStyle(e,this._defaultCell);this._currentRow+=`\x1B[0m\x1B[${m.join(";")}m`}}else this._currentRow+=e.getChars();this._lastContentCursorRow=this._lastCursorRow=t,this._lastContentCursorCol=this._lastCursorCol=u+e.getWidth()}}_serializeString(e){let r=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(r=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let t="";for(let i=0;i{c>0?t+=`\x1B[${c}C`:c<0&&(t+=`\x1B[${-c}D`)};l&&((c=>{c>0?t+=`\x1B[${c}B`:c<0&&(t+=`\x1B[${-c}A`)})(i-this._lastCursorRow),f(o-this._lastCursorCol))}let u=this._terminal._core._inputHandler._curAttrData,a=this._diffStyle(u,this._cursorStyle);return a.length>0&&(t+=`\x1B[${a.join(";")}m`),t}},H=class{activate(n){this._terminal=n}_serializeBufferByScrollback(n,e,r){let t=e.length,u=r===void 0?t:A(r+n.rows,0,t);return this._serializeBufferByRange(n,e,{start:t-u,end:t-1},!1)}_serializeBufferByRange(n,e,r,t){return new D(e,n).serialize({start:{x:0,y:typeof r.start=="number"?r.start:r.start.line},end:{x:n.cols,y:typeof r.end=="number"?r.end:r.end.line}},t)}_serializeBufferAsHTML(n,e){let r=n.buffer.active,t=new k(r,n,e),u=e.onlySelection??!1,a=e.range;if(a)return t.serialize({start:{x:a.startCol,y:(typeof a.startLine=="number",a.startLine)},end:{x:n.cols,y:(typeof a.endLine=="number",a.endLine)}});if(!u){let o=r.length,l=e.scrollback,f=l===void 0?o:A(l+n.rows,0,o);return t.serialize({start:{x:0,y:o-f},end:{x:n.cols,y:o-1}})}let i=this._terminal?.getSelectionPosition();return i!==void 0?t.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeScrollRegion(n){let e=n._core.buffer,r=e.scrollTop,t=e.scrollBottom;return r!==0||t!==n.rows-1?`\x1B[${r+1};${t+1}r`:""}_serializeModes(n){let e="",r=n.modes;if(r.applicationCursorKeysMode&&(e+="\x1B[?1h"),r.applicationKeypadMode&&(e+="\x1B[?66h"),r.bracketedPasteMode&&(e+="\x1B[?2004h"),r.insertMode&&(e+="\x1B[4h"),r.originMode&&(e+="\x1B[?6h"),r.reverseWraparoundMode&&(e+="\x1B[?45h"),r.sendFocusMode&&(e+="\x1B[?1004h"),r.wraparoundMode===!1&&(e+="\x1B[?7l"),r.mouseTrackingMode!=="none")switch(r.mouseTrackingMode){case"x10":e+="\x1B[?9h";break;case"vt200":e+="\x1B[?1000h";break;case"drag":e+="\x1B[?1002h";break;case"any":e+="\x1B[?1003h";break}return r.showCursor||(e+="\x1B[?25l"),e}serialize(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let e=n?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,n.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,n?.scrollback);if(!n?.excludeAltBuffer&&this._terminal.buffer.active.type==="alternate"){let r=this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0);e+=`\x1B[?1049h\x1B[H${r}`}return n?.excludeModes||(e+=this._serializeModes(this._terminal),e+=this._serializeScrollRegion(this._terminal)),e+=$(this._terminal),e}serializeAsHTML(n){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,n??{})}dispose(){}},k=class extends B{constructor(e,r,t){super(e);this._terminal=r;this._options=t;this._currentRow="";this._htmlContent="";r._core._themeService?this._ansiColors=r._core._themeService.colors.ansi:this._ansiColors=O}_beforeSerialize(e,r,t){this._htmlContent+="
";let u="#000000",a="#ffffff";(this._options.includeGlobalBackground??!1)&&(u=this._terminal.options.theme?.foreground??"#ffffff",a=this._terminal.options.theme?.background??"#000000");let i=[];i.push("color: "+u+";"),i.push("background-color: "+a+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="
"}_afterSerialize(){this._htmlContent+="
",this._htmlContent+="
"}_rowEnd(e,r){this._htmlContent+="
"+this._currentRow+"
",this._currentRow=""}_getHexColor(e,r){let t=r?e.getFgColor():e.getBgColor();if(r?e.isFgRGB():e.isBgRGB())return"#"+[t>>16&255,t>>8&255,t&255].map(a=>a.toString(16).padStart(2,"0")).join("");if(r?e.isFgPalette():e.isBgPalette())return this._ansiColors[t].css}_getUnderlineColor(e){if(e.isUnderlineColorDefault())return;let r=e.getUnderlineColor();return e.isUnderlineColorRGB()?"#"+[r>>16&255,r>>8&255,r&255].map(u=>u.toString(16).padStart(2,"0")).join(""):this._ansiColors[r].css}_getUnderlineStyle(e){switch(e.getUnderlineStyle()){case 1:return"underline";case 2:return"underline double";case 3:return"underline wavy";case 4:return"underline dotted";case 5:return"underline dashed";default:return"underline"}}_diffStyle(e,r){let t=[];if(y(e,r))return;let u=!T(e,r),a=!F(e,r),i=!M(e,r);if(u||a||i){let o=this._getHexColor(e,!0);o&&t.push("color: "+o+";");let l=this._getHexColor(e,!1);l&&t.push("background-color: "+l+";"),e.isInverse()&&t.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&t.push("font-weight: bold;");let f=[];if(e.isUnderline()&&f.push(this._getUnderlineStyle(e)),e.isOverline()&&f.push("overline"),e.isStrikethrough()&&f.push("line-through"),e.isBlink()&&f.push("blink"),f.length>0&&t.push("text-decoration: "+f.join(" ")+";"),e.isUnderline()){let d=this._getUnderlineColor(e);d&&t.push("text-decoration-color: "+d+";")}return e.isInvisible()&&t.push("visibility: hidden;"),e.isItalic()&&t.push("font-style: italic;"),e.isDim()&&t.push("opacity: 0.5;"),t}}_nextCell(e,r,t,u){if(e.getWidth()===0)return;let i=e.getChars()==="",o=this._diffStyle(e,r);o&&(this._currentRow+=o.length===0?"
":""),i?this._currentRow+=" ":this._currentRow+=P(e.getChars())}_serializeString(){return this._htmlContent}};export{k as HTMLSerializeHandler,H as SerializeAddon}; + //# sourceMappingURL=addon-serialize.mjs.map +diff --git a/lib/addon-serialize.mjs.map b/lib/addon-serialize.mjs.map +index e9357c67686de63dd29db518781758345aacdd0f..ea0eb0dac817d0d691fd3b1d5b4a58187430efac 100644 +--- a/lib/addon-serialize.mjs.map ++++ b/lib/addon-serialize.mjs.map +@@ -1,7 +1,7 @@ + { + "version": 3, + "sources": ["../../../src/common/Color.ts", "../../../src/browser/Types.ts", "../src/SerializeAddon.ts"], +- "sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}C`;\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n rowSeparator += `\\u001b[${currentLine.length - this._nullCellCount}D`;\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); }\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n // the empty cell style is only assumed to be changed when background changed, because\n // foreground is always 0.\n const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n this._currentRow += cell.getChars();\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"], +- "mappings": "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", +- "names": ["$r", "$g", "$b", "$a", "channels", "toCss", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "$a", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "$r", "$g", "$b", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "constrain", "value", "low", "high", "escapeHTMLChar", "c", "BaseSerializeHandler", "_buffer", "range", "excludeFinalCursorPosition", "cell1", "cell2", "oldCell", "startRow", "endRow", "startColumn", "endColumn", "row", "line", "startLineColumn", "endLineColumn", "col", "cell", "isLastRow", "rows", "equalFg", "equalBg", "equalUnderline", "cell1Default", "cell2Default", "equalFlags", "attributesEquals", "cell1AsBufferCell", "StringSerializeHandler", "buffer", "_terminal", "start", "end", "rowSeparator", "currentLine", "nextLine", "thisRowLastChar", "thisRowLastSecondChar", "nextRowFirstChar", "isNextRowFirstCharDoubleWidth", "isValid", "sgrSeq", "fgChanged", "bgChanged", "flagsChanged", "color", "style", "isEmptyCell", "rowEnd", "content", "realCursorRow", "realCursorCol", "cursorMoved", "moveRight", "offset", "curAttrData", "SerializeAddon", "terminal", "scrollback", "maxRows", "correctRows", "options", "handler", "HTMLSerializeHandler", "onlySelection", "selection", "scrollTop", "scrollBottom", "modes", "alternativeScreenContent", "_options", "DEFAULT_ANSI_COLORS", "foreground", "background", "globalStyleDefinitions", "isFg", "x", "fgHexColor", "bgHexColor", "decorations", "underlineColor", "styleDefinitions"] ++ "sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * (EXPERIMENTAL) This Addon is still under development\n */\n\nimport type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';\nimport { IColor } from 'common/Types';\nimport { IAttributeData } from 'common/buffer/Types';\nimport { DEFAULT_ANSI_COLORS } from 'browser/Types';\nimport { UnderlineStyle } from 'common/buffer/Constants';\n\ntype OscLinkData = { id?: string; uri: string };\ntype OscLinkedCell = { extended?: { urlId?: number } };\ntype TerminalWithOscLinks = Terminal & {\n _core?: {\n _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell };\n _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined };\n };\n};\n\nfunction getOscLinkId(cell: IBufferCell | IAttributeData): number {\n return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0;\n}\n\nfunction getOscLinkOpenSequence(terminal: Terminal, linkId: number): string {\n if (!linkId) {\n return '';\n }\n const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId);\n if (!data) {\n return '';\n }\n const params = data.id === undefined ? '' : `id=${data.id}`;\n return `\\u001b]8;${params};${data.uri}\\u001b\\\\`;\n}\n\nfunction getActiveOscLinkSequence(terminal: Terminal): string {\n const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData;\n return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : '';\n}\n\nfunction constrain(value: number, low: number, high: number): number {\n return Math.max(low, Math.min(value, high));\n}\n\nfunction escapeHTMLChar(c: string): string {\n switch (c) {\n case '&': return '&';\n case '<': return '<';\n }\n return c;\n}\n\n// TODO: Refine this template class later\nabstract class BaseSerializeHandler {\n constructor(\n protected readonly _buffer: IBuffer\n ) {\n }\n\n public serialize(range: IBufferRange, excludeFinalCursorPosition?: boolean): string {\n // we need two of them to flip between old and new cell\n const cell1 = this._buffer.getNullCell();\n const cell2 = this._buffer.getNullCell();\n let oldCell = cell1;\n\n const startRow = range.start.y;\n const endRow = range.end.y;\n const startColumn = range.start.x;\n const endColumn = range.end.x;\n\n this._beforeSerialize(endRow - startRow, startRow, endRow);\n\n for (let row = startRow; row <= endRow; row++) {\n const line = this._buffer.getLine(row);\n if (line) {\n const startLineColumn = row === range.start.y ? startColumn : 0;\n const endLineColumn = row === range.end.y ? endColumn: line.length;\n for (let col = startLineColumn; col < endLineColumn; col++) {\n const c = line.getCell(col, oldCell === cell1 ? cell2 : cell1);\n if (!c) {\n console.warn(`Can't get cell at row=${row}, col=${col}`);\n continue;\n }\n this._nextCell(c, oldCell, row, col);\n oldCell = c;\n }\n }\n this._rowEnd(row, row === endRow);\n }\n\n this._afterSerialize();\n\n return this._serializeString(excludeFinalCursorPosition);\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { }\n protected _rowEnd(row: number, isLastRow: boolean): void { }\n protected _beforeSerialize(rows: number, startRow: number, endRow: number): void { }\n protected _afterSerialize(): void { }\n protected _serializeString(excludeFinalCursorPosition?: boolean): string { return ''; }\n}\n\nfunction equalFg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getFgColorMode() === cell2.getFgColorMode()\n && cell1.getFgColor() === cell2.getFgColor();\n}\n\nfunction equalBg(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.getBgColorMode() === cell2.getBgColorMode()\n && cell1.getBgColor() === cell2.getBgColor();\n}\n\nfunction equalUnderline(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n // If neither cell has underline, consider them equal regardless of internal underline color\n // values\n if (!cell1.isUnderline() && !cell2.isUnderline()) {\n return true;\n }\n if (cell1.getUnderlineStyle() !== cell2.getUnderlineStyle()) {\n return false;\n }\n const cell1Default = cell1.isUnderlineColorDefault();\n const cell2Default = cell2.isUnderlineColorDefault();\n if (cell1Default && cell2Default) {\n return true;\n }\n if (cell1Default !== cell2Default) {\n return false;\n }\n return cell1.getUnderlineColor() === cell2.getUnderlineColor()\n && cell1.getUnderlineColorMode() === cell2.getUnderlineColorMode();\n}\n\nfunction equalFlags(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n return cell1.isInverse() === cell2.isInverse()\n && cell1.isBold() === cell2.isBold()\n && cell1.isUnderline() === cell2.isUnderline()\n && equalUnderline(cell1, cell2)\n && cell1.isOverline() === cell2.isOverline()\n && cell1.isBlink() === cell2.isBlink()\n && cell1.isInvisible() === cell2.isInvisible()\n && cell1.isItalic() === cell2.isItalic()\n && cell1.isDim() === cell2.isDim()\n && cell1.isStrikethrough() === cell2.isStrikethrough();\n}\n\nfunction attributesEquals(cell1: IBufferCell | IAttributeData, cell2: IBufferCell): boolean {\n const cell1AsBufferCell = cell1 as IBufferCell;\n if (typeof cell1AsBufferCell.attributesEquals === 'function') {\n return cell1AsBufferCell.attributesEquals(cell2);\n }\n return equalFg(cell1, cell2)\n && equalBg(cell1, cell2)\n && equalFlags(cell1, cell2);\n}\n\nclass StringSerializeHandler extends BaseSerializeHandler {\n private _rowIndex: number = 0;\n private _allRows: string[] = new Array();\n private _allRowSeparators: string[] = new Array();\n private _currentRow: string = '';\n private _nullCellCount: number = 0;\n\n // we can see a full colored cell and a null cell that only have background the same style\n // but the information isn't preserved by null cell itself\n // so wee need to record it when required.\n private _cursorStyle: IBufferCell = this._buffer.getNullCell();\n\n // where exact the cursor styles comes from\n // because we can't copy the cell directly\n // so we remember where the content comes from instead\n private _cursorStyleRow: number = 0;\n private _cursorStyleCol: number = 0;\n\n // this is a null cell for reference for checking whether background is empty or not\n private _backgroundCell: IBufferCell = this._buffer.getNullCell();\n private _defaultCell: IBufferCell = this._buffer.getNullCell();\n\n private _firstRow: number = 0;\n private _lastCursorRow: number = 0;\n private _lastCursorCol: number = 0;\n private _lastContentCursorRow: number = 0;\n private _lastContentCursorCol: number = 0;\n private _activeOscLinkId: number = 0;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal\n ) {\n super(buffer);\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._allRows = new Array(rows);\n this._lastContentCursorRow = start;\n this._lastCursorRow = start;\n this._firstRow = start;\n }\n\n private _thisRowLastChar: IBufferCell = this._buffer.getNullCell();\n private _thisRowLastSecondChar: IBufferCell = this._buffer.getNullCell();\n private _nextRowFirstChar: IBufferCell = this._buffer.getNullCell();\n protected _rowEnd(row: number, isLastRow: boolean): void {\n // if there is colorful empty cell at line end, we must pad it back, or the color block\n // will missing\n if (this._nullCellCount > 0 && !equalBg(this._cursorStyle, this._backgroundCell)) {\n // use clear right to set background.\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n\n let rowSeparator = '';\n\n // handle row separator\n if (!isLastRow) {\n // Enable BCE\n if (row - this._firstRow >= this._terminal.rows) {\n this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol, this._backgroundCell);\n }\n\n // Fetch current line\n const currentLine = this._buffer.getLine(row)!;\n // Fetch next line\n const nextLine = this._buffer.getLine(row + 1)!;\n\n if (!nextLine.isWrapped) {\n // just insert the line break\n rowSeparator = '\\r\\n';\n // we sended the enter\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n } else {\n rowSeparator = '';\n const thisRowLastChar = currentLine.getCell(currentLine.length - 1, this._thisRowLastChar)!;\n const thisRowLastSecondChar = currentLine.getCell(currentLine.length - 2, this._thisRowLastSecondChar)!;\n const nextRowFirstChar = nextLine.getCell(0, this._nextRowFirstChar)!;\n const isNextRowFirstCharDoubleWidth = nextRowFirstChar.getWidth() > 1;\n\n // validate whether this line wrap is ever possible\n // which mean whether cursor can placed at a overflow position (x === row) naturally\n let isValid = false;\n\n if (\n // you must output character to cause overflow, control sequence can't do this\n nextRowFirstChar.getChars() &&\n (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0)\n ) {\n if (\n // the last character can't be null,\n // you can't use control sequence to move cursor to (x === row)\n (thisRowLastChar.getChars() || thisRowLastChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n\n if (\n // the second to last character can't be null if the next line starts with CJK,\n // you can't use control sequence to move cursor to (x === row)\n isNextRowFirstCharDoubleWidth &&\n (thisRowLastSecondChar.getChars() || thisRowLastSecondChar.getWidth() === 0) &&\n // change background of the first wrapped cell also affects BCE\n // so we mark it as invalid to simplify the process to determine line separator\n equalBg(thisRowLastChar, nextRowFirstChar) &&\n equalBg(thisRowLastSecondChar, nextRowFirstChar)\n ) {\n isValid = true;\n }\n }\n\n if (!isValid) {\n // force the wrap with magic\n // insert enough character to force the wrap\n rowSeparator = '-'.repeat(this._nullCellCount + 1);\n // move back and erase next line head\n rowSeparator += '\\u001b[1D\\u001b[1X';\n\n if (this._nullCellCount > 0) {\n // do these because we filled the last several null slot, which we shouldn't\n rowSeparator += '\\u001b[A';\n const contentCellCount = currentLine.length - this._nullCellCount;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}C`;\n }\n rowSeparator += `\\u001b[${this._nullCellCount}X`;\n if (contentCellCount > 0) {\n rowSeparator += `\\u001b[${contentCellCount}D`;\n }\n rowSeparator += '\\u001b[B';\n }\n\n // This is content and need the be serialized even it is invisible.\n // without this, wrap will be missing from outputs.\n this._lastContentCursorRow = row + 1;\n this._lastContentCursorCol = 0;\n\n // force commit the cursor position\n this._lastCursorRow = row + 1;\n this._lastCursorCol = 0;\n }\n }\n }\n\n this._allRows[this._rowIndex] = this._currentRow;\n this._allRowSeparators[this._rowIndex++] = rowSeparator;\n this._currentRow = '';\n this._nullCellCount = 0;\n }\n\n private _diffStyle(cell: IBufferCell | IAttributeData, oldCell: IBufferCell): number[] {\n const sgrSeq: number[] = [];\n if (attributesEquals(cell, oldCell)) {\n return sgrSeq;\n }\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n if (cell.isAttributeDefault()) {\n if (!oldCell.isAttributeDefault()) {\n sgrSeq.push(0);\n }\n } else {\n if (fgChanged) {\n const color = cell.getFgColor();\n if (cell.isFgRGB()) { sgrSeq.push(38, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isFgPalette()) {\n if (color >= 16) { sgrSeq.push(38, 5, color); }\n else { sgrSeq.push(color & 8 ? 90 + (color & 7) : 30 + (color & 7)); }\n }\n else { sgrSeq.push(39); }\n }\n if (bgChanged) {\n const color = cell.getBgColor();\n if (cell.isBgRGB()) { sgrSeq.push(48, 2, (color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF); }\n else if (cell.isBgPalette()) {\n if (color >= 16) { sgrSeq.push(48, 5, color); }\n else { sgrSeq.push(color & 8 ? 100 + (color & 7) : 40 + (color & 7)); }\n }\n else { sgrSeq.push(49); }\n }\n if (flagsChanged) {\n if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); }\n // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so\n // they must be diffed as one intensity group with the clearing 22 emitted\n // BEFORE any re-set. Upstream's independent per-flag diff could emit\n // \"1;22\" (bold set, then wiped by dim's clear \u2014 \\x1b[2mA\\x1b[22m\\x1b[1mB\n // loses B's bold on round-trip) or a bare \"22\" that drops a still-set\n // bold/dim, garbling Orca's hidden-terminal snapshot restores.\n const boldChanged = cell.isBold() !== oldCell.isBold();\n const dimChanged = cell.isDim() !== oldCell.isDim();\n if (boldChanged || dimChanged) {\n const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim());\n if (clearsIntensity) { sgrSeq.push(22); }\n if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); }\n if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); }\n }\n if (!equalUnderline(cell, oldCell)) {\n const style = cell.getUnderlineStyle();\n if (style === UnderlineStyle.NONE) {\n sgrSeq.push(24);\n } else if (style === UnderlineStyle.SINGLE && cell.isUnderlineColorDefault()) {\n sgrSeq.push(4);\n } else {\n // Use SGR 4:X format for underline styles\n sgrSeq.push('4:' + style as unknown as number);\n // Handle underline color\n if (!cell.isUnderlineColorDefault()) {\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n sgrSeq.push('58:2::' + ((color >>> 16) & 0xFF) + ':' + ((color >>> 8) & 0xFF) + ':' + (color & 0xFF) as unknown as number);\n } else {\n sgrSeq.push('58:5:' + color as unknown as number);\n }\n }\n }\n } else if (cell.isUnderline() !== oldCell.isUnderline()) {\n sgrSeq.push(cell.isUnderline() ? 4 : 24);\n }\n if (cell.isOverline() !== oldCell.isOverline()) { sgrSeq.push(cell.isOverline() ? 53 : 55); }\n if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); }\n if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); }\n if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); }\n // PATCH(orca): dim handled in the intensity group above.\n if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); }\n }\n }\n }\n\n return sgrSeq;\n }\n\n private _setOscLink(linkId: number): string {\n if (linkId === this._activeOscLinkId) {\n return '';\n }\n let sequence = this._activeOscLinkId ? '\\u001b]8;;\\u001b\\\\' : '';\n this._activeOscLinkId = 0;\n const openSequence = getOscLinkOpenSequence(this._terminal, linkId);\n if (openSequence) {\n this._activeOscLinkId = linkId;\n sequence += openSequence;\n }\n return sequence;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined;\n const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar);\n // A pending wide glyph recreates its own final-column padding during replay.\n const isWideWrapPadding = col === this._terminal.cols - 1 &&\n nextLine?.isWrapped &&\n (nextRowFirstCell?.getWidth() ?? 0) > 1 &&\n !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell);\n // Cursor movement cannot reproduce an inverse cell's visible background.\n const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding;\n\n const sgrSeq = this._diffStyle(cell, this._cursorStyle);\n\n const styleChanged = isEmptyCell\n ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell)\n : sgrSeq.length > 0;\n\n /**\n * handles style change\n */\n if (styleChanged) {\n // before update the style, we need to fill empty cell back\n if (this._nullCellCount > 0) {\n // use clear right to set background.\n if (!equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n }\n // use move right to move cursor.\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n this._nullCellCount = 0;\n }\n\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col;\n\n this._currentRow += `\\u001b[${sgrSeq.join(';')}m`;\n\n // update the last cursor style\n const line = this._buffer.getLine(row);\n if (line !== undefined) {\n line.getCell(col, this._cursorStyle);\n this._cursorStyleRow = row;\n this._cursorStyleCol = col;\n }\n }\n\n /**\n * handles actual content\n */\n if (isEmptyCell && !materializeEmptyCell) {\n this._nullCellCount += cell.getWidth();\n } else {\n if (this._nullCellCount > 0) {\n // we can just assume we have same style with previous one here\n // because style change is handled by previous stage\n // use move right when background is empty, use clear right when there is background.\n if (equalBg(this._cursorStyle, this._backgroundCell)) {\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n } else {\n this._currentRow += `\\u001b[${this._nullCellCount}X`;\n this._currentRow += `\\u001b[${this._nullCellCount}C`;\n }\n this._nullCellCount = 0;\n }\n\n // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable.\n this._currentRow += this._setOscLink(getOscLinkId(cell));\n\n if (materializeEmptyCell) {\n const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline();\n if (hasDecoration) {\n this._currentRow += '\\u001b[24;29;55m';\n }\n this._currentRow += ' '.repeat(cell.getWidth());\n if (hasDecoration) {\n const restoreSgrSeq = this._diffStyle(cell, this._defaultCell);\n this._currentRow += `\\u001b[0m\\u001b[${restoreSgrSeq.join(';')}m`;\n }\n } else {\n this._currentRow += cell.getChars();\n }\n\n // update cursor\n this._lastContentCursorRow = this._lastCursorRow = row;\n this._lastContentCursorCol = this._lastCursorCol = col + cell.getWidth();\n }\n }\n\n protected _serializeString(excludeFinalCursorPosition: boolean): string {\n let rowEnd = this._allRows.length;\n\n // the fixup is only required for data without scrollback\n // because it will always be placed at last line otherwise\n if (this._buffer.length - this._firstRow <= this._terminal.rows) {\n rowEnd = this._lastContentCursorRow + 1 - this._firstRow;\n this._lastCursorCol = this._lastContentCursorCol;\n this._lastCursorRow = this._lastContentCursorRow;\n }\n\n let content = '';\n\n for (let i = 0; i < rowEnd; i++) {\n content += this._allRows[i];\n if (i + 1 < rowEnd) {\n content += this._allRowSeparators[i];\n }\n }\n\n // Each buffer is self-contained so links cannot leak into a following buffer.\n content += this._setOscLink(0);\n\n // restore the cursor\n if (!excludeFinalCursorPosition) {\n const realCursorRow = this._buffer.baseY + this._buffer.cursorY;\n const realCursorCol = this._buffer.cursorX;\n\n const cursorMoved = (realCursorRow !== this._lastCursorRow || realCursorCol !== this._lastCursorCol);\n\n const moveRight = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}C`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}D`;\n }\n };\n const moveDown = (offset: number): void => {\n if (offset > 0) {\n content += `\\u001b[${offset}B`;\n } else if (offset < 0) {\n content += `\\u001b[${-offset}A`;\n }\n };\n\n if (cursorMoved) {\n moveDown(realCursorRow - this._lastCursorRow);\n moveRight(realCursorCol - this._lastCursorCol);\n }\n }\n\n // Restore the cursor's current style, see https://github.com/xtermjs/xterm.js/issues/3677\n // HACK: Internal API access since it's awkward to expose this in the API and serialize will\n // likely be the only consumer\n const curAttrData: IAttributeData = (this._terminal as any)._core._inputHandler._curAttrData;\n const sgrSeq = this._diffStyle(curAttrData, this._cursorStyle);\n if (sgrSeq.length > 0) {\n content += `\\u001b[${sgrSeq.join(';')}m`;\n }\n\n return content;\n }\n}\n\nexport class SerializeAddon implements ITerminalAddon, ISerializeApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n private _serializeBufferByScrollback(terminal: Terminal, buffer: IBuffer, scrollback?: number): string {\n const maxRows = buffer.length;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return this._serializeBufferByRange(terminal, buffer, {\n start: maxRows - correctRows,\n end: maxRows - 1\n }, false);\n }\n\n private _serializeBufferByRange(terminal: Terminal, buffer: IBuffer, range: ISerializeRange, excludeFinalCursorPosition: boolean): string {\n const handler = new StringSerializeHandler(buffer, terminal);\n return handler.serialize({\n start: { x: 0, y: typeof range.start === 'number' ? range.start : range.start.line },\n end: { x: terminal.cols, y: typeof range.end === 'number' ? range.end : range.end.line }\n }, excludeFinalCursorPosition);\n }\n\n private _serializeBufferAsHTML(terminal: Terminal, options: Partial): string {\n const buffer = terminal.buffer.active;\n const handler = new HTMLSerializeHandler(buffer, terminal, options);\n const onlySelection = options.onlySelection ?? false;\n const range = options.range;\n if (range) {\n return handler.serialize({\n start: { x: range.startCol, y: typeof range.startLine === 'number' ? range.startLine : range.startLine },\n end: { x: terminal.cols, y: typeof range.endLine === 'number' ? range.endLine : range.endLine }\n });\n }\n if (!onlySelection) {\n const maxRows = buffer.length;\n const scrollback = options.scrollback;\n const correctRows = (scrollback === undefined) ? maxRows : constrain(scrollback + terminal.rows, 0, maxRows);\n return handler.serialize({\n start: { x: 0, y: maxRows - correctRows },\n end: { x: terminal.cols, y: maxRows - 1 }\n });\n }\n\n const selection = this._terminal?.getSelectionPosition();\n if (selection !== undefined) {\n return handler.serialize({\n start: { x: selection.start.x, y: selection.start.y },\n end: { x: selection.end.x, y: selection.end.y }\n });\n }\n\n return '';\n }\n\n /**\n * Serializes the scroll region (DECSTBM) if it's not set to the full terminal size.\n * Uses internal API access since scroll region is not exposed in the public API.\n */\n private _serializeScrollRegion(terminal: Terminal): string {\n // HACK: Internal API access since scroll region is not exposed in the public API\n const buffer = (terminal as any)._core.buffer;\n const scrollTop: number = buffer.scrollTop;\n const scrollBottom: number = buffer.scrollBottom;\n\n // Only serialize if scroll region is not the default (full terminal size)\n if (scrollTop !== 0 || scrollBottom !== terminal.rows - 1) {\n // DECSTBM uses 1-based indices: CSI Ps ; Ps r\n return `\\x1b[${scrollTop + 1};${scrollBottom + 1}r`;\n }\n\n return '';\n }\n\n private _serializeModes(terminal: Terminal): string {\n let content = '';\n const modes = terminal.modes;\n\n // Default: false\n if (modes.applicationCursorKeysMode) content += '\\x1b[?1h';\n if (modes.applicationKeypadMode) content += '\\x1b[?66h';\n if (modes.bracketedPasteMode) content += '\\x1b[?2004h';\n if (modes.insertMode) content += '\\x1b[4h';\n if (modes.originMode) content += '\\x1b[?6h';\n if (modes.reverseWraparoundMode) content += '\\x1b[?45h';\n if (modes.sendFocusMode) content += '\\x1b[?1004h';\n // synchronizedOutputMode doesn't need to be serialized as it's a temporary mode\n\n // Default: true\n if (modes.wraparoundMode === false) content += '\\x1b[?7l';\n\n // Default: 'none'\n if (modes.mouseTrackingMode !== 'none') {\n switch (modes.mouseTrackingMode) {\n case 'x10': content += '\\x1b[?9h'; break;\n case 'vt200': content += '\\x1b[?1000h'; break;\n case 'drag': content += '\\x1b[?1002h'; break;\n case 'any': content += '\\x1b[?1003h'; break;\n }\n }\n\n // Cursor visibility (DECTCEM)\n // Default: visible\n if (!modes.showCursor) {\n content += '\\x1b[?25l';\n }\n\n return content;\n }\n\n public serialize(options?: ISerializeOptions): string {\n // TODO: Add combinedData support\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n // Normal buffer\n let content = options?.range\n ? this._serializeBufferByRange(this._terminal, this._terminal.buffer.normal, options.range, true)\n : this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.normal, options?.scrollback);\n\n // Alternate buffer\n if (!options?.excludeAltBuffer) {\n if (this._terminal.buffer.active.type === 'alternate') {\n const alternativeScreenContent = this._serializeBufferByScrollback(this._terminal, this._terminal.buffer.alternate, undefined);\n content += `\\u001b[?1049h\\u001b[H${alternativeScreenContent}`;\n }\n }\n\n // Modes and scroll region\n if (!options?.excludeModes) {\n content += this._serializeModes(this._terminal);\n content += this._serializeScrollRegion(this._terminal);\n }\n\n // Restore the source terminal's live OSC pen only after all buffers are complete.\n content += getActiveOscLinkSequence(this._terminal);\n\n return content;\n }\n\n public serializeAsHTML(options?: Partial): string {\n if (!this._terminal) {\n throw new Error('Cannot use addon until it has been loaded');\n }\n\n return this._serializeBufferAsHTML(this._terminal, options ?? {});\n }\n\n public dispose(): void { }\n}\n\nexport class HTMLSerializeHandler extends BaseSerializeHandler {\n private _currentRow: string = '';\n\n private _htmlContent = '';\n\n private _ansiColors: Readonly;\n\n constructor(\n buffer: IBuffer,\n private readonly _terminal: Terminal,\n private readonly _options: Partial\n ) {\n super(buffer);\n\n // For xterm headless: fallback to ansi colors\n if ((_terminal as any)._core._themeService) {\n this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;\n }\n else {\n this._ansiColors = DEFAULT_ANSI_COLORS;\n }\n }\n\n protected _beforeSerialize(rows: number, start: number, end: number): void {\n this._htmlContent += '
';\n\n    let foreground = '#000000';\n    let background = '#ffffff';\n    if (this._options.includeGlobalBackground ?? false) {\n      foreground = this._terminal.options.theme?.foreground ?? '#ffffff';\n      background = this._terminal.options.theme?.background ?? '#000000';\n    }\n\n    const globalStyleDefinitions = [];\n    globalStyleDefinitions.push('color: ' + foreground + ';');\n    globalStyleDefinitions.push('background-color: ' + background + ';');\n    globalStyleDefinitions.push('font-family: ' + this._terminal.options.fontFamily + ';');\n    globalStyleDefinitions.push('font-size: ' + this._terminal.options.fontSize + 'px;');\n    this._htmlContent += '
';\n }\n\n protected _afterSerialize(): void {\n this._htmlContent += '
';\n this._htmlContent += '
';\n }\n\n protected _rowEnd(row: number, isLastRow: boolean): void {\n this._htmlContent += '
' + this._currentRow + '
';\n this._currentRow = '';\n }\n\n private _getHexColor(cell: IBufferCell, isFg: boolean): string | undefined {\n const color = isFg ? cell.getFgColor() : cell.getBgColor();\n if (isFg ? cell.isFgRGB() : cell.isBgRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {\n return this._ansiColors[color].css;\n }\n return undefined;\n }\n\n private _getUnderlineColor(cell: IBufferCell): string | undefined {\n if (cell.isUnderlineColorDefault()) {\n return undefined;\n }\n const color = cell.getUnderlineColor();\n if (cell.isUnderlineColorRGB()) {\n const rgb = [\n (color >> 16) & 255,\n (color >> 8) & 255,\n (color ) & 255\n ];\n return '#' + rgb.map(x => x.toString(16).padStart(2, '0')).join('');\n }\n // Palette color\n return this._ansiColors[color].css;\n }\n\n private _getUnderlineStyle(cell: IBufferCell): string {\n switch (cell.getUnderlineStyle()) {\n case UnderlineStyle.SINGLE:\n return 'underline';\n case UnderlineStyle.DOUBLE:\n return 'underline double';\n case UnderlineStyle.CURLY:\n return 'underline wavy';\n case UnderlineStyle.DOTTED:\n return 'underline dotted';\n case UnderlineStyle.DASHED:\n return 'underline dashed';\n default:\n return 'underline';\n }\n }\n\n private _diffStyle(cell: IBufferCell, oldCell: IBufferCell): string[] | undefined {\n const content: string[] = [];\n\n if (attributesEquals(cell, oldCell)) {\n return undefined;\n }\n\n const fgChanged = !equalFg(cell, oldCell);\n const bgChanged = !equalBg(cell, oldCell);\n const flagsChanged = !equalFlags(cell, oldCell);\n\n if (fgChanged || bgChanged || flagsChanged) {\n const fgHexColor = this._getHexColor(cell, true);\n if (fgHexColor) {\n content.push('color: ' + fgHexColor + ';');\n }\n\n const bgHexColor = this._getHexColor(cell, false);\n if (bgHexColor) {\n content.push('background-color: ' + bgHexColor + ';');\n }\n\n if (cell.isInverse()) { content.push('color: #000000; background-color: #BFBFBF;'); }\n if (cell.isBold()) { content.push('font-weight: bold;'); }\n\n // Handle text-decoration (underline, overline, strikethrough, blink)\n const decorations: string[] = [];\n if (cell.isUnderline()) {\n decorations.push(this._getUnderlineStyle(cell));\n }\n if (cell.isOverline()) {\n decorations.push('overline');\n }\n if (cell.isStrikethrough()) {\n decorations.push('line-through');\n }\n if (cell.isBlink()) {\n decorations.push('blink');\n }\n if (decorations.length > 0) {\n content.push('text-decoration: ' + decorations.join(' ') + ';');\n }\n\n // Handle underline color\n if (cell.isUnderline()) {\n const underlineColor = this._getUnderlineColor(cell);\n if (underlineColor) {\n content.push('text-decoration-color: ' + underlineColor + ';');\n }\n }\n\n if (cell.isInvisible()) { content.push('visibility: hidden;'); }\n if (cell.isItalic()) { content.push('font-style: italic;'); }\n if (cell.isDim()) { content.push('opacity: 0.5;'); }\n\n return content;\n }\n\n return undefined;\n }\n\n protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void {\n // a width 0 cell don't need to be count because it is just a placeholder after a CJK character;\n const isPlaceHolderCell = cell.getWidth() === 0;\n if (isPlaceHolderCell) {\n return;\n }\n\n // this cell don't have content\n const isEmptyCell = cell.getChars() === '';\n\n const styleDefinitions = this._diffStyle(cell, oldCell);\n\n // handles style change\n if (styleDefinitions) {\n this._currentRow += styleDefinitions.length === 0 ?\n '
' :\n '';\n }\n\n // handles actual content\n if (isEmptyCell) {\n this._currentRow += ' ';\n } else {\n this._currentRow += escapeHTMLChar(cell.getChars());\n }\n }\n\n protected _serializeString(): string {\n return this._htmlContent;\n }\n}\n"], ++ "mappings": "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", ++ "names": ["$r", "$g", "$b", "$a", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "$a", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "$r", "$g", "$b", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "g", "b", "channels", "c", "getOscLinkId", "cell", "getOscLinkOpenSequence", "terminal", "linkId", "data", "getActiveOscLinkSequence", "attrs", "constrain", "value", "low", "high", "escapeHTMLChar", "c", "BaseSerializeHandler", "_buffer", "range", "excludeFinalCursorPosition", "cell1", "cell2", "oldCell", "startRow", "endRow", "startColumn", "endColumn", "row", "line", "startLineColumn", "endLineColumn", "col", "isLastRow", "rows", "equalFg", "equalBg", "equalUnderline", "cell1Default", "cell2Default", "equalFlags", "attributesEquals", "cell1AsBufferCell", "StringSerializeHandler", "buffer", "_terminal", "start", "end", "rowSeparator", "currentLine", "nextLine", "thisRowLastChar", "thisRowLastSecondChar", "nextRowFirstChar", "isNextRowFirstCharDoubleWidth", "isValid", "contentCellCount", "sgrSeq", "fgChanged", "bgChanged", "flagsChanged", "color", "boldChanged", "dimChanged", "clearsIntensity", "style", "sequence", "openSequence", "isEmptyCell", "nextRowFirstCell", "isWideWrapPadding", "materializeEmptyCell", "hasDecoration", "restoreSgrSeq", "rowEnd", "content", "realCursorRow", "realCursorCol", "cursorMoved", "moveRight", "offset", "curAttrData", "SerializeAddon", "scrollback", "maxRows", "correctRows", "options", "handler", "HTMLSerializeHandler", "onlySelection", "selection", "scrollTop", "scrollBottom", "modes", "alternativeScreenContent", "_options", "DEFAULT_ANSI_COLORS", "foreground", "background", "globalStyleDefinitions", "isFg", "x", "fgHexColor", "bgHexColor", "decorations", "underlineColor", "styleDefinitions"] + } +diff --git a/src/SerializeAddon.ts b/src/SerializeAddon.ts +index e1728feb219c362dfa2ecb602ff99f830d520757..957da98c8b30835cc2d114b4b66b228b01fdff0a 100644 +--- a/src/SerializeAddon.ts ++++ b/src/SerializeAddon.ts +@@ -12,6 +12,36 @@ import { IAttributeData } from 'common/buffer/Types'; + import { DEFAULT_ANSI_COLORS } from 'browser/Types'; + import { UnderlineStyle } from 'common/buffer/Constants'; + ++type OscLinkData = { id?: string; uri: string }; ++type OscLinkedCell = { extended?: { urlId?: number } }; ++type TerminalWithOscLinks = Terminal & { ++ _core?: { ++ _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell }; ++ _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined }; ++ }; ++}; ++ ++function getOscLinkId(cell: IBufferCell | IAttributeData): number { ++ return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0; ++} ++ ++function getOscLinkOpenSequence(terminal: Terminal, linkId: number): string { ++ if (!linkId) { ++ return ''; ++ } ++ const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId); ++ if (!data) { ++ return ''; ++ } ++ const params = data.id === undefined ? '' : `id=${data.id}`; ++ return `\u001b]8;${params};${data.uri}\u001b\\`; ++} ++ ++function getActiveOscLinkSequence(terminal: Terminal): string { ++ const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData; ++ return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : ''; ++} ++ + function constrain(value: number, low: number, high: number): number { + return Math.max(low, Math.min(value, high)); + } +@@ -148,12 +178,14 @@ class StringSerializeHandler extends BaseSerializeHandler { + + // this is a null cell for reference for checking whether background is empty or not + private _backgroundCell: IBufferCell = this._buffer.getNullCell(); ++ private _defaultCell: IBufferCell = this._buffer.getNullCell(); + + private _firstRow: number = 0; + private _lastCursorRow: number = 0; + private _lastCursorCol: number = 0; + private _lastContentCursorRow: number = 0; + private _lastContentCursorCol: number = 0; ++ private _activeOscLinkId: number = 0; + + constructor( + buffer: IBuffer, +@@ -214,7 +246,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + if ( + // you must output character to cause overflow, control sequence can't do this + nextRowFirstChar.getChars() && +- isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0 ++ (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0) + ) { + if ( + // the last character can't be null, +@@ -251,9 +283,14 @@ class StringSerializeHandler extends BaseSerializeHandler { + if (this._nullCellCount > 0) { + // do these because we filled the last several null slot, which we shouldn't + rowSeparator += '\u001b[A'; +- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}C`; ++ const contentCellCount = currentLine.length - this._nullCellCount; ++ if (contentCellCount > 0) { ++ rowSeparator += `\u001b[${contentCellCount}C`; ++ } + rowSeparator += `\u001b[${this._nullCellCount}X`; +- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}D`; ++ if (contentCellCount > 0) { ++ rowSeparator += `\u001b[${contentCellCount}D`; ++ } + rowSeparator += '\u001b[B'; + } + +@@ -310,7 +347,20 @@ class StringSerializeHandler extends BaseSerializeHandler { + } + if (flagsChanged) { + if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); } +- if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); } ++ // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so ++ // they must be diffed as one intensity group with the clearing 22 emitted ++ // BEFORE any re-set. Upstream's independent per-flag diff could emit ++ // "1;22" (bold set, then wiped by dim's clear — \x1b[2mA\x1b[22m\x1b[1mB ++ // loses B's bold on round-trip) or a bare "22" that drops a still-set ++ // bold/dim, garbling Orca's hidden-terminal snapshot restores. ++ const boldChanged = cell.isBold() !== oldCell.isBold(); ++ const dimChanged = cell.isDim() !== oldCell.isDim(); ++ if (boldChanged || dimChanged) { ++ const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim()); ++ if (clearsIntensity) { sgrSeq.push(22); } ++ if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); } ++ if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); } ++ } + if (!equalUnderline(cell, oldCell)) { + const style = cell.getUnderlineStyle(); + if (style === UnderlineStyle.NONE) { +@@ -337,7 +387,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); } + if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); } + if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); } +- if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); } ++ // PATCH(orca): dim handled in the intensity group above. + if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); } + } + } +@@ -346,6 +396,20 @@ class StringSerializeHandler extends BaseSerializeHandler { + return sgrSeq; + } + ++ private _setOscLink(linkId: number): string { ++ if (linkId === this._activeOscLinkId) { ++ return ''; ++ } ++ let sequence = this._activeOscLinkId ? '\u001b]8;;\u001b\\' : ''; ++ this._activeOscLinkId = 0; ++ const openSequence = getOscLinkOpenSequence(this._terminal, linkId); ++ if (openSequence) { ++ this._activeOscLinkId = linkId; ++ sequence += openSequence; ++ } ++ return sequence; ++ } ++ + protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { + // a width 0 cell don't need to be count because it is just a placeholder after a CJK character; + const isPlaceHolderCell = cell.getWidth() === 0; +@@ -356,12 +420,21 @@ class StringSerializeHandler extends BaseSerializeHandler { + + // this cell don't have content + const isEmptyCell = cell.getChars() === ''; ++ const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined; ++ const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar); ++ // A pending wide glyph recreates its own final-column padding during replay. ++ const isWideWrapPadding = col === this._terminal.cols - 1 && ++ nextLine?.isWrapped && ++ (nextRowFirstCell?.getWidth() ?? 0) > 1 && ++ !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell); ++ // Cursor movement cannot reproduce an inverse cell's visible background. ++ const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding; + + const sgrSeq = this._diffStyle(cell, this._cursorStyle); + +- // the empty cell style is only assumed to be changed when background changed, because +- // foreground is always 0. +- const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0; ++ const styleChanged = isEmptyCell ++ ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell) ++ : sgrSeq.length > 0; + + /** + * handles style change +@@ -395,7 +468,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + /** + * handles actual content + */ +- if (isEmptyCell) { ++ if (isEmptyCell && !materializeEmptyCell) { + this._nullCellCount += cell.getWidth(); + } else { + if (this._nullCellCount > 0) { +@@ -411,7 +484,22 @@ class StringSerializeHandler extends BaseSerializeHandler { + this._nullCellCount = 0; + } + +- this._currentRow += cell.getChars(); ++ // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable. ++ this._currentRow += this._setOscLink(getOscLinkId(cell)); ++ ++ if (materializeEmptyCell) { ++ const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline(); ++ if (hasDecoration) { ++ this._currentRow += '\u001b[24;29;55m'; ++ } ++ this._currentRow += ' '.repeat(cell.getWidth()); ++ if (hasDecoration) { ++ const restoreSgrSeq = this._diffStyle(cell, this._defaultCell); ++ this._currentRow += `\u001b[0m\u001b[${restoreSgrSeq.join(';')}m`; ++ } ++ } else { ++ this._currentRow += cell.getChars(); ++ } + + // update cursor + this._lastContentCursorRow = this._lastCursorRow = row; +@@ -439,6 +527,9 @@ class StringSerializeHandler extends BaseSerializeHandler { + } + } + ++ // Each buffer is self-contained so links cannot leak into a following buffer. ++ content += this._setOscLink(0); ++ + // restore the cursor + if (!excludeFinalCursorPosition) { + const realCursorRow = this._buffer.baseY + this._buffer.cursorY; +@@ -616,6 +707,9 @@ export class SerializeAddon implements ITerminalAddon, ISerializeApi { + content += this._serializeScrollRegion(this._terminal); + } + ++ // Restore the source terminal's live OSC pen only after all buffers are complete. ++ content += getActiveOscLinkSequence(this._terminal); ++ + return content; + } + diff --git a/config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch b/config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch deleted file mode 100644 index de8de45664f..00000000000 --- a/config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch +++ /dev/null @@ -1,329 +0,0 @@ -diff --git a/lib/addon-webgl.js b/lib/addon-webgl.js ---- a/lib/addon-webgl.js -+++ b/lib/addon-webgl.js -@@ -1,2 +1,15 @@ --!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WebglAddon=e():t.WebglAddon=e()}(globalThis,()=>(()=>{"use strict";var t={105(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.WindowIntervalTimer=e.eventType=void 0,e.getWindow=r,e.addDisposableListener=o,e.addStandardDisposableListener=function(t,e,i,s){return o(t,e,i,s)},e.getDomNodePagePosition=function(t){const e=t.getBoundingClientRect(),i=r(t);return{left:e.left+i.scrollX,top:e.top+i.scrollY,width:e.width,height:e.height}},e.scheduleAtNextAnimationFrame=function(t,e,i=0){const s=h(t),r=new n(e,i);return s.next.push(r),s.animFrameRequested||(s.animFrameRequested=!0,t.requestAnimationFrame(()=>function(t){const e=h(t);for(e.animFrameRequested=!1,e.current=e.next,e.next=[],e.inAnimationFrameRunner=!0;e.current.length>0;)e.current.sort(n.sort),e.current.shift().execute();e.inAnimationFrameRunner=!1}(t))),r};const s=i(578);function r(t){const e=t;if(e?.ownerDocument?.defaultView)return e.ownerDocument.defaultView;const i=t;return i?.view?i.view:window}class a{constructor(t,e,i,s){this._node=t,this._type=e,this._handler=i,this._options=s,t.addEventListener(e,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function o(t,e,i,s){return new a(t,e,i,s)}e.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class n{constructor(t,e){this._runner=t,this.priority=e,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(t){console.error(t)}}static sort(t,e){return e.priority-t.priority}}const L=new Map;function h(t){let e=L.get(t);return e||(e={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},L.set(t,e)),e}class T extends s.IntervalTimer{constructor(t){super(),this._defaultTarget=t?r(t):void 0}cancelAndSet(t,e,i){super.cancelAndSet(t,e,i??this._defaultTarget??window)}}e.WindowIntervalTimer=T},814(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.INVERTED_DEFAULT_COLOR=void 0,e.INVERTED_DEFAULT_COLOR=257},959(t,e){function i(t){return 57508<=t&&t<=57558}function s(t){return t>=128512&&t<=128591||t>=127744&&t<=128511||t>=128640&&t<=128767||t>=9728&&t<=9983||t>=9984&&t<=10175||t>=65024&&t<=65039||t>=129280&&t<=129535||t>=127462&&t<=127487}Object.defineProperty(e,"__esModule",{value:!0}),e.throwIfFalsy=function(t){if(!t)throw new Error("value must not be falsy");return t},e.isPowerlineGlyph=i,e.isRestrictedPowerlineGlyph=function(t){return 57520<=t&&t<=57527},e.isEmoji=s,e.allowRescaling=function(t,e,r,a){return 1===e&&r>Math.ceil(1.5*a)&&void 0!==t&&t>255&&!s(t)&&!i(t)&&!function(t){return 57344<=t&&t<=63743}(t)},e.treatGlyphAsBackgroundColor=function(t){return i(t)||function(t){return 9472<=t&&t<=9631}(t)},e.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}}}},e.computeNextVariantOffset=function(t,e,i=0){return(t-(2*Math.round(e)-i))%(2*Math.round(e))}},948(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.createSelectionRenderModel=function(){return new i};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(t,e,i,s=!1){if(this.selectionStart=e,this.selectionEnd=i,!e||!i||e[0]===i[0]&&e[1]===i[1])return void this.clear();const r=t.buffers.active.ydisp,a=e[1]-r,o=i[1]-r,n=Math.max(a,0),L=Math.min(o,t.rows-1);n>=t.rows||L<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=a,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=L,this.startCol=e[0],this.endCol=i[0])}isCellSelected(t,e,i){return!!this.hasSelection&&(i-=t.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&i>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&e=this.startCol)}}},536(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextBlinkStateManager=void 0;const s=i(426);class r extends s.Disposable{constructor(t,e,i){super(),this._renderCallback=t,this._coreBrowserService=e,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",t=>{this.setIntervalDuration(t)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const t=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(t||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}e.TextBlinkStateManager=r},578(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.IntervalTimer=e.MicrotaskTimer=e.TimeoutTimer=void 0,e.timeout=function(t){return new Promise(e=>setTimeout(e,t))},e.disposableTimeout=function(t,e=0,i){const r=setTimeout(()=>{t(),i&&a.dispose()},e),a=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(a),a};const s=i(426);e.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,t()},e)}setIfNotSet(t,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,t()},e))}},e.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(t){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,t())}))}},e.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t,e,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{t()},e);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=l,e.contrastRatio=d;let i=0,s=0,r=0,a=0;var o,n,L,h,T;function l(t){const e=t.toString(16);return e.length<2?"0"+e:e}function d(t,e){return t>>0},t.toColor=function(e,i,s,r){return{css:t.toCss(e,i,s,r),rgba:t.toRgba(e,i,s,r)}}}(o||(e.channels=o={})),function(t){function e(t,e){return a=Math.round(255*e),[i,s,r]=T.toChannels(t.rgba),{css:o.toCss(i,s,r,a),rgba:o.toRgba(i,s,r,a)}}t.blend=function(t,e){if(a=(255&e.rgba)/255,1===a)return{css:e.css,rgba:e.rgba};const n=e.rgba>>24&255,L=e.rgba>>16&255,h=e.rgba>>8&255,T=t.rgba>>24&255,l=t.rgba>>16&255,d=t.rgba>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((L-l)*a),r=d+Math.round((h-d)*a),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,i){const s=T.ensureContrastRatio(t.rgba,e.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[i,s,r]=T.toChannels(e),{css:o.toCss(i,s,r),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,i){return a=255&t.rgba,e(t,a*i/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(n||(e.color=n={})),function(t){let e,n;try{const t=document.createElement("canvas");t.width=1,t.height=1;const i=t.getContext("2d",{willReadFrequently:!0});i&&(e=i,e.globalCompositeOperation="copy",n=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),a=parseInt(t.slice(4,5).repeat(2),16),o.toColor(i,s,r,a);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const L=t.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(L)return i=parseInt(L[1],10),s=parseInt(L[2],10),r=parseInt(L[3],10),a=Math.round(255*(void 0===L[5]?1:parseFloat(L[5]))),o.toColor(i,s,r,a);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!n)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=n,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[i,s,r,a]=e.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i,s,r,a),css:t}}}(L||(e.css=L={})),function(t){function e(t,e,i){const s=t/255,r=e/255,a=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*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(h||(e.rgb=h={})),function(t){function e(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,L=e>>8&255,T=d(h.relativeLuminance2(o,n,L),h.relativeLuminance2(s,r,a));for(;T0||n>0||L>0);)o-=Math.max(0,Math.ceil(.1*o)),n-=Math.max(0,Math.ceil(.1*n)),L-=Math.max(0,Math.ceil(.1*L)),T=d(h.relativeLuminance2(o,n,L),h.relativeLuminance2(s,r,a));return(o<<24|n<<16|L<<8|255)>>>0}function n(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,L=e>>8&255,T=d(h.relativeLuminance2(o,n,L),h.relativeLuminance2(s,r,a));for(;T>>0}t.blend=function(t,e){if(a=(255&e)/255,1===a)return e;const n=e>>24&255,L=e>>16&255,h=e>>8&255,T=t>>24&255,l=t>>16&255,d=t>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((L-l)*a),r=d+Math.round((h-d)*a),o.toRgba(i,s,r)},t.ensureContrastRatio=function(t,i,s){const r=h.relativeLuminance(t>>8),a=h.relativeLuminance(i>>8);if(d(r,a)>8));if(od(r,h.relativeLuminance(e>>8))?a:e}return a}const o=n(t,i,s),L=d(r,h.relativeLuminance(o>>8));if(Ld(r,h.relativeLuminance(a>>8))?o:a}return o}},t.reduceLuminance=e,t.increaseLuminance=n,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(T||(e.rgba=T={}))},414(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.EventUtils=e.Emitter=void 0;const s=i(426);var r;e.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(t,e,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:t,thisArgs:e};this._listeners.push(r);const a=(0,s.toDisposable)(()=>{const t=this._listeners.indexOf(r);-1!==t&&this._listeners.splice(t,1)});return i&&(Array.isArray(i)?i.push(a):i.add(a)),a}),this._event}fire(t){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{const{fn:e,thisArgs:i}=this._listeners[0];return void e.call(i,t)}default:{const e=this._listeners.slice();for(const{fn:i,thisArgs:s}of e)i.call(s,t)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},function(t){t.forward=function(t,e){return t(t=>e.fire(t))},t.map=function(t,e){return(i,s,r)=>t(t=>i.call(s,e(t)),void 0,r)},t.any=function(...t){return(e,i,r)=>{const a=new s.DisposableStore;for(const s of t)a.add(s(t=>e.call(i,t)));return r&&(Array.isArray(r)?r.push(a):r.add(a)),a}},t.runAndSubscribe=function(t,e,i){return e(i),t(t=>e(t))}}(r||(e.EventUtils=r={}))},426(t,e){function i(t){return{dispose:t}}function s(t){if(!t)return t;if(Array.isArray(t)){for(const e of t)e.dispose();return[]}return t.dispose(),t}Object.defineProperty(e,"__esModule",{value:!0}),e.MutableDisposable=e.Disposable=e.DisposableStore=void 0,e.toDisposable=i,e.dispose=s,e.combinedDisposable=function(...t){return i(()=>s(t))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(t){return this._isDisposed?t.dispose():this._disposables.add(t),t}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const t of this._disposables)t.dispose();this._disposables.clear()}}clear(){for(const t of this._disposables)t.dispose();this._disposables.clear()}}e.DisposableStore=r;class a{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(t){return this._store.add(t)}}e.Disposable=a,a.None=Object.freeze({dispose(){}}),e.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(t){this._isDisposed||t===this._value||(this._value?.dispose(),this._value=t)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}},836(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.FourKeyMap=e.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(t,e,i){this._data[t]||(this._data[t]={}),this._data[t][e]=i}get(t,e){return this._data[t]?this._data[t][e]:void 0}clear(){this._data={}}}e.TwoKeyMap=i,e.FourKeyMap=class{constructor(){this._data=new i}set(t,e,s,r,a){this._data.get(t,e)||this._data.set(t,e,new i),this._data.get(t,e).set(s,r,a)}get(t,e,i,s){return this._data.get(t,e)?.get(i,s)}clear(){this._data.clear()}}},95(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.isChromeOS=e.isLinux=e.isWindows=e.isMac=e.isSafari=e.isLegacyEdge=e.isChrome=e.isFirefox=e.isNode=void 0,e.getZoomFactor=function(t){return 1},e.getSafariVersion=function(){if(!e.isSafari)return 0;const t=i.match(/Version\/(\d+)/);return null===t||t.length<2?0:parseInt(t[1],10)},e.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=e.isNode?"node":navigator.userAgent,s=e.isNode?"node":navigator.platform;e.isFirefox=i.includes("Firefox"),e.isChrome=i.includes("Chrome"),e.isLegacyEdge=i.includes("Edge"),e.isSafari=/^((?!chrome|android).)*safari/i.test(i),e.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),e.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),e.isLinux=s.indexOf("Linux")>=0,e.isChromeOS=/\bCrOS\b/.test(i)},930(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DebouncedIdleTask=e.IdleTaskQueue=e.PriorityTaskQueue=void 0;class i{constructor(t){this._tasks=[],this._i=0,this._logService=t}enqueue(t){this._tasks.push(t),this._start()}flush(){for(;this._ii)return r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(t){return setTimeout(()=>t(this._createDeadline(16)))}_cancelCallback(t){clearTimeout(t)}_createDeadline(t){const e=performance.now()+t;return{timeRemaining:()=>Math.max(0,e-performance.now())}}}e.PriorityTaskQueue=s,e.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(t){return requestIdleCallback(t)}_cancelCallback(t){cancelIdleCallback(t)}}:s,e.DebouncedIdleTask=class{constructor(t){this._queue=new e.IdleTaskQueue(t)}set(t){this._queue.clear(),this._queue.enqueue(t)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},917(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ExtendedAttrs=e.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(t){return[t>>>16&255,t>>>8&255,255&t]}static fromColorRGB(t){return(255&t[0])<<16|(255&t[1])<<8|255&t[2]}clone(){const t=new i;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}e.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(t){this._ext&=-67108864,this._ext|=67108863&t}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){const t=(3758096384&this._ext)>>29;return t<0?4294967288^t:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}constructor(t=0,e=0){this._ext=0,this._urlId=0,this._ext=t,this._urlId=e}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}e.ExtendedAttrs=s},721(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellData=void 0;const s=i(348),r=i(564),a=i(917);class o extends a.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new a.ExtendedAttrs,this.combinedData=""}static fromCharData(t){const e=new o;return e.setFromCharData(t),e}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(t){this.fg=t[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let e=!1;if(t[r.CHAR_DATA_CHAR_INDEX].length>2)e=!0;else if(2===t[r.CHAR_DATA_CHAR_INDEX].length){const i=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|t[r.CHAR_DATA_WIDTH_INDEX]<<22:e=!0}else e=!0}else this.content=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[r.CHAR_DATA_WIDTH_INDEX]<<22;e&&(this.combinedData=t[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|t[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor())return!1;if(this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor())return!1;if(this.isInverse()!==t.isInverse())return!1;if(this.isBold()!==t.isBold())return!1;if(this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;const e=this.isUnderlineColorDefault(),i=t.isUnderlineColorDefault();if(!e||!i){if(e!==i)return!1;if(this.getUnderlineColor()!==t.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==t.getUnderlineColorMode())return!1}}return this.isOverline()===t.isOverline()&&this.isBlink()===t.isBlink()&&this.isInvisible()===t.isInvisible()&&this.isItalic()===t.isItalic()&&this.isDim()===t.isDim()&&this.isStrikethrough()===t.isStrikethrough()}}e.CellData=o},564(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WHITESPACE_CELL_CODE=e.WHITESPACE_CELL_WIDTH=e.WHITESPACE_CELL_CHAR=e.NULL_CELL_CODE=e.NULL_CELL_WIDTH=e.NULL_CELL_CHAR=e.CHAR_DATA_CODE_INDEX=e.CHAR_DATA_WIDTH_INDEX=e.CHAR_DATA_CHAR_INDEX=e.CHAR_DATA_ATTR_INDEX=e.DEFAULT_EXT=e.DEFAULT_ATTR=e.DEFAULT_COLOR=void 0,e.DEFAULT_COLOR=0,e.DEFAULT_ATTR=e.DEFAULT_COLOR<<9|256,e.DEFAULT_EXT=0,e.CHAR_DATA_ATTR_INDEX=0,e.CHAR_DATA_CHAR_INDEX=1,e.CHAR_DATA_WIDTH_INDEX=2,e.CHAR_DATA_CODE_INDEX=3,e.NULL_CELL_CHAR="",e.NULL_CELL_WIDTH=1,e.NULL_CELL_CODE=0,e.WHITESPACE_CELL_CHAR=" ",e.WHITESPACE_CELL_WIDTH=1,e.WHITESPACE_CELL_CODE=32},348(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Utf8ToUtf32=e.StringToUtf32=void 0,e.stringFromCodePoint=function(t){return t>65535?(t-=65536,String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):String.fromCharCode(t)},e.utf32ToString=function(t,e=0,i=t.length){let s="";for(let r=e;r65535?(e-=65536,s+=String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):s+=String.fromCharCode(e)}return s},e.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t,e){const i=t.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=t.charCodeAt(r++);56320<=i&&i<=57343?e[s++]=1024*(this._interim-55296)+i-56320+65536:(e[s++]=this._interim,e[s++]=i),this._interim=0}for(let a=r;a=i)return this._interim=r,s;const o=t.charCodeAt(a);56320<=o&&o<=57343?e[s++]=1024*(r-55296)+o-56320+65536:(e[s++]=r,e[s++]=o);continue}65279!==r&&(e[s++]=r)}return s}},e.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t,e){const i=t.length;if(!i)return 0;let s,r,a,o,n,L=0,h=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let a,o=0;for(;(a=this.interim[++o])&&o<4;)r<<=6,r|=63&a;const n=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,T=n-o;for(;h=i)return 0;if(a=t[h++],128!=(192&a)){h--,s=!0;break}this.interim[o++]=a,r<<=6,r|=63&a}s||(2===n?r<128?h--:e[L++]=r:3===n?r<2048||r>=55296&&r<=57343||65279===r||(e[L++]=r):r<65536||r>1114111||(e[L++]=r)),this.interim.fill(0)}const T=i-4;let l=h;for(;l=i)return this.interim[0]=s,L;if(r=t[l++],128!=(192&r)){l--;continue}if(n=(31&s)<<6|63&r,n<128){l--;continue}e[L++]=n}else if(224==(240&s)){if(l>=i)return this.interim[0]=s,L;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,L;if(a=t[l++],128!=(192&a)){l--;continue}if(n=(15&s)<<12|(63&r)<<6|63&a,n<2048||n>=55296&&n<=57343||65279===n)continue;e[L++]=n}else if(240==(248&s)){if(l>=i)return this.interim[0]=s,L;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,L;if(a=t[l++],128!=(192&a)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=a,L;if(o=t[l++],128!=(192&o)){l--;continue}if(n=(7&s)<<18|(63&r)<<12|(63&a)<<6|63&o,n<65536||n>1114111)continue;e[L++]=n}}return L}}},864(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellColorResolver=void 0;const s=i(564),r=i(993),a=i(959),o=i(915);let n,L=0,h=0,T=!1,l=!1,d=!1,c=0;e.CellColorResolver=class{constructor(t,e,i,s,r,a){this._terminal=t,this._optionService=e,this._selectionRenderModel=i,this._decorationService=s,this._coreBrowserService=r,this._themeService=a,this.result={fg:0,bg:0,ext:0}}resolve(t,e,i,_,Q){this.result.bg=t.bg,this.result.fg=t.fg,this.result.ext=268435456&t.bg?t.extended.ext:0,h=0,L=0,l=!1,T=!1,d=!1,n=this._themeService.colors,c=0;const u=t.getCode();if(u!==s.NULL_CELL_CODE&&4===t.extended.underlineStyle){const t=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));c=e*_%(2*Math.round(t))}if(0===c&&o.blockPatternCodepoints.has(u)&&(c=e*_%2*2+i*Q%2),this._decorationService.forEachDecorationAtCell(e,i,"bottom",t=>{t.backgroundColorRGB&&(h=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(L=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),d=this._selectionRenderModel.isCellSelected(this._terminal,e,i),d){if(67108864&this.result.fg||50331648&this.result.bg){if(67108864&this.result.fg)switch(50331648&this.result.fg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:h=(16777215&this.result.fg)<<8|255;break;default:h=this._themeService.colors.foreground.rgba}else switch(50331648&this.result.bg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:h=(16777215&this.result.bg)<<8|255}h=r.rgba.blend(h,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}else h=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(l=!0,n.selectionForeground&&(L=n.selectionForeground.rgba>>8&16777215,T=!0),(0,a.treatGlyphAsBackgroundColor)(t.getCode())){if(67108864&this.result.fg&&!(50331648&this.result.bg))L=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(67108864&this.result.fg)switch(50331648&this.result.bg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:L=(16777215&this.result.bg)<<8|255}else switch(50331648&this.result.fg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:L=(16777215&this.result.fg)<<8|255;break;default:L=this._themeService.colors.foreground.rgba}L=r.rgba.blend(L,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}T=!0}}this._decorationService.forEachDecorationAtCell(e,i,"top",t=>{t.backgroundColorRGB&&(h=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(L=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),l&&(h=d?-16777216&t.bg&-134217729|h|50331648:-16777216&t.bg|h|50331648),T&&(L=-16777216&t.fg&-67108865|L|50331648),67108864&this.result.fg&&(l&&!T&&(L=50331648&this.result.bg?-134217728&this.result.fg|67108863&this.result.bg:-134217728&this.result.fg|16777215&n.background.rgba>>8|50331648,T=!0),!l&&T&&(h=50331648&this.result.fg?-67108864&this.result.bg|67108863&this.result.fg:-67108864&this.result.bg|16777215&n.foreground.rgba>>8|50331648,l=!0)),n=void 0,this.result.bg=l?h:this.result.bg,this.result.fg=T?L:this.result.fg,this.result.ext&=536870911,this.result.ext|=c<<29&3758096384}}},670(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.acquireTextureAtlas=function(t,e,i,o,n,L,h,T,l,d=!0){const c=(0,r.generateConfig)(o,n,L,h,e,i,T,l,d);for(let e=0;e=0){if((0,r.configEquals)(i.config,c))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),a.splice(e,1)):i.ownedBy.splice(s,1);break}}for(let e=0;e{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(t=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0)return void this._restartInterval(t)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(t)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},t)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}}},697(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.observeDevicePixelDimensions=function(t,e,i){let r=new e.ResizeObserver(e=>{const s=e.find(e=>e.target===t);if(!s)return;if(!("devicePixelContentBoxSize"in s))return r?.disconnect(),void(r=void 0);const a=s.devicePixelContentBoxSize[0].inlineSize,o=s.devicePixelContentBoxSize[0].blockSize;a>0&&o>0&&i(a,o)});try{r.observe(t,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return(0,s.toDisposable)(()=>r?.disconnect())};const s=i(426)},28(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphRenderer=void 0;const s=i(115),r=i(564),a=i(426),o=i(719),n=i(959);let L,h=0,T=0,l=0;class d extends a.Disposable{constructor(t,e,i,r,L){super(),this._terminal=t,this._gl=e,this._dimensions=i,this._optionsService=r,this._logService=L,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const h=this._gl;void 0===s.TextureAtlas.maxAtlasPages&&(s.TextureAtlas.maxAtlasPages=Math.min(32,(0,n.throwIfFalsy)(h.getParameter(h.MAX_TEXTURE_IMAGE_UNITS))),s.TextureAtlas.maxTextureSize=(0,n.throwIfFalsy)(h.getParameter(h.MAX_TEXTURE_SIZE))),this._program=(0,n.throwIfFalsy)((0,o.createProgram)(h,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(t){let e="";for(let i=1;ih.deleteProgram(this._program))),this._projectionLocation=(0,n.throwIfFalsy)(h.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,n.throwIfFalsy)(h.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,n.throwIfFalsy)(h.getUniformLocation(this._program,"u_texture"));const T=this._vertexArrayObject=h.createVertexArray();this._register((0,a.toDisposable)(()=>h.deleteVertexArray(T))),h.bindVertexArray(T);const l=new Float32Array([0,0,1,0,0,1,1,1]),d=h.createBuffer();this._register((0,a.toDisposable)(()=>h.deleteBuffer(d))),h.bindBuffer(h.ARRAY_BUFFER,d),h.bufferData(h.ARRAY_BUFFER,l,h.STATIC_DRAW),h.enableVertexAttribArray(0),h.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=h.createBuffer();this._register((0,a.toDisposable)(()=>h.deleteBuffer(_))),h.bindBuffer(h.ELEMENT_ARRAY_BUFFER,_),h.bufferData(h.ELEMENT_ARRAY_BUFFER,c,h.STATIC_DRAW),this._attributesBuffer=(0,n.throwIfFalsy)(h.createBuffer()),this._register((0,a.toDisposable)(()=>h.deleteBuffer(this._attributesBuffer))),h.bindBuffer(h.ARRAY_BUFFER,this._attributesBuffer),h.enableVertexAttribArray(2),h.vertexAttribPointer(2,2,h.FLOAT,!1,44,0),h.vertexAttribDivisor(2,1),h.enableVertexAttribArray(3),h.vertexAttribPointer(3,2,h.FLOAT,!1,44,2*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(3,1),h.enableVertexAttribArray(4),h.vertexAttribPointer(4,1,h.FLOAT,!1,44,4*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(4,1),h.enableVertexAttribArray(5),h.vertexAttribPointer(5,2,h.FLOAT,!1,44,5*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(5,1),h.enableVertexAttribArray(6),h.vertexAttribPointer(6,2,h.FLOAT,!1,44,7*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(6,1),h.enableVertexAttribArray(1),h.vertexAttribPointer(1,2,h.FLOAT,!1,44,9*Float32Array.BYTES_PER_ELEMENT),h.vertexAttribDivisor(1,1),h.useProgram(this._program);const Q=new Int32Array(s.TextureAtlas.maxAtlasPages);for(let t=0;th.deleteTexture(e.texture))),h.activeTexture(h.TEXTURE0+t),h.bindTexture(h.TEXTURE_2D,e.texture),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_S,h.CLAMP_TO_EDGE),h.texParameteri(h.TEXTURE_2D,h.TEXTURE_WRAP_T,h.CLAMP_TO_EDGE),h.texImage2D(h.TEXTURE_2D,0,h.RGBA,1,1,0,h.RGBA,h.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[t]=e}h.enable(h.BLEND),h.blendFunc(h.SRC_ALPHA,h.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.beginFrame()}updateCell(t,e,i,s,r,a,o,n,L){this._updateCell(this._vertices.attributes,t,e,i,s,r,a,o,n,L)}_updateCell(t,e,i,s,a,o,d,c,_,Q){h=11*(i*this._terminal.cols+e),s!==r.NULL_CELL_CODE&&void 0!==s?this._atlas&&(L=c&&c.length>1?this._atlas.getRasterizedGlyphCombinedChar(c,a,o,d,!1,this._terminal.element):this._atlas.getRasterizedGlyph(s,a,o,d,!1,this._terminal.element),T=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),a!==Q&&L.offset.x>T?(l=L.offset.x-T,t[h]=-(L.offset.x-l)+this._dimensions.device.char.left,t[h+1]=-L.offset.y+this._dimensions.device.char.top,t[h+2]=(L.size.x-l)/this._dimensions.device.canvas.width,t[h+3]=L.size.y/this._dimensions.device.canvas.height,t[h+4]=L.texturePage,t[h+5]=L.texturePositionClipSpace.x+l/this._atlas.pages[L.texturePage].canvas.width,t[h+6]=L.texturePositionClipSpace.y,t[h+7]=L.sizeClipSpace.x-l/this._atlas.pages[L.texturePage].canvas.width,t[h+8]=L.sizeClipSpace.y):(t[h]=-L.offset.x+this._dimensions.device.char.left,t[h+1]=-L.offset.y+this._dimensions.device.char.top,t[h+2]=L.size.x/this._dimensions.device.canvas.width,t[h+3]=L.size.y/this._dimensions.device.canvas.height,t[h+4]=L.texturePage,t[h+5]=L.texturePositionClipSpace.x,t[h+6]=L.texturePositionClipSpace.y,t[h+7]=L.sizeClipSpace.x,t[h+8]=L.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&(0,n.allowRescaling)(s,_,L.size.x,this._dimensions.device.cell.width)&&(t[h+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width)):t.fill(0,h,h+11-1-2)}clear(){const t=this._terminal,e=t.cols*t.rows*11;this._vertices.count!==e?this._vertices.attributes=new Float32Array(e):this._vertices.attributes.fill(0);let i=0;for(;iT.deleteProgram(this._program))),this._projectionLocation=(0,a.throwIfFalsy)(T.getUniformLocation(this._program,"u_projection"));const l=this._vertexArrayObject=T.createVertexArray();this._register((0,s.toDisposable)(()=>T.deleteVertexArray(l))),T.bindVertexArray(l);const d=new Float32Array([0,0,1,0,0,1,1,1]),c=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(c))),T.bindBuffer(T.ARRAY_BUFFER,c),T.bufferData(T.ARRAY_BUFFER,d,T.STATIC_DRAW),T.enableVertexAttribArray(3),T.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),Q=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(Q))),T.bindBuffer(T.ELEMENT_ARRAY_BUFFER,Q),T.bufferData(T.ELEMENT_ARRAY_BUFFER,_,T.STATIC_DRAW),this._attributesBuffer=(0,a.throwIfFalsy)(T.createBuffer()),this._register((0,s.toDisposable)(()=>T.deleteBuffer(this._attributesBuffer))),T.bindBuffer(T.ARRAY_BUFFER,this._attributesBuffer),T.enableVertexAttribArray(0),T.vertexAttribPointer(0,2,T.FLOAT,!1,o,0),T.vertexAttribDivisor(0,1),T.enableVertexAttribArray(1),T.vertexAttribPointer(1,2,T.FLOAT,!1,o,2*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(1,1),T.enableVertexAttribArray(2),T.vertexAttribPointer(2,4,T.FLOAT,!1,o,4*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(2,1),this._updateCachedColors(L.colors),this._register(this._themeService.onChangeColors(t=>{this._updateCachedColors(t),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){const e=this._gl;e.useProgram(this._program),e.bindVertexArray(this._vertexArrayObject),e.uniformMatrix4fv(this._projectionLocation,!1,r.PROJECTION_MATRIX),e.bindBuffer(e.ARRAY_BUFFER,this._attributesBuffer),e.bufferData(e.ARRAY_BUFFER,t.attributes,e.DYNAMIC_DRAW),e.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,e.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){const e=this._terminal,i=this._vertices;let s,r,a,o,n,L,h,T,l,d,c,_=1;for(s=0;s>24&255)/255,d=(L>>16&255)/255,c=(L>>8&255)/255,_=1,this._addRectangle(t.attributes,e,h,T,(o-a)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,l,d,c,_)}_addRectangle(t,e,i,s,r,a,o,n,L,h){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o,t[e+5]=n,t[e+6]=L,t[e+7]=h}_addRectangleFloat(t,e,i,s,r,a,o){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o[0],t[e+5]=o[1],t[e+6]=o[2],t[e+7]=o[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(255&t.rgba)/255])}}e.RectangleRenderer=Q},208(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.RenderModel=e.COMBINED_CHAR_BIT_MASK=void 0;const s=i(948);e.COMBINED_CHAR_BIT_MASK=2147483648,e.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(t,e){const i=t*e*4;i!==this.cells.length&&(this.cells=new Uint32Array(i),this.lineLengths=new Uint32Array(e))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},115(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextureAtlas=void 0;const s=i(0),r=i(183),a=i(959),o=i(993),n=i(836),L=i(930),h=i(917),T=i(564),l=i(414),d={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let c;class _{get pages(){return this._pages}constructor(t,e,i,s){this._document=t,this._config=e,this._unicodeService=i,this._logService=s,this._didWarmUp=!1,this._cacheMap=new n.FourKeyMap,this._cacheMapCombined=new n.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new h.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new l.Emitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new l.Emitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=p(t,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,a.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){this._tmpCanvas.remove();for(const t of this.pages)t.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const t=new L.IdleTaskQueue(this._logService);for(let e=33;e<126;e++)t.enqueue(()=>{if(!this._cacheMap.get(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT)){const t=this._drawToCache(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,!1,void 0);this._cacheMap.set(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,t)}})}beginFrame(){const t=this._requestClearModel;return this._requestClearModel=!1,t}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const t of this._pages)t.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(_.maxAtlasPages&&this._pages.length>=Math.max(4,_.maxAtlasPages)){const t=this._pages.filter(t=>2*t.canvas.width<=(_.maxTextureSize||4096)).sort((t,e)=>e.canvas.width!==t.canvas.width?e.canvas.width-t.canvas.width:e.percentageUsed-t.percentageUsed);let e=-1,i=0;for(let s=0;st.canvas.width!==s[0].canvas.width)){const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}const r=s.map(t=>t.glyphs[0].texturePage).sort((t,e)=>t-e),a=this.pages.length-s.length,o=this._mergePages(s,a);o.version=++Q.nextVersion;for(let t=r.length-1;t>=0;t--)this._deletePage(r[t]);this.pages.push(o),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(o.canvas)}const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}_mergePages(t,e){const i=2*t[0].canvas.width,s=new Q(this._document,i,t);for(const[r,a]of t.entries()){const t=r*a.canvas.width%i,o=Math.floor(r/2)*a.canvas.height;s.ctx.drawImage(a.canvas,t,o);for(const s of a.glyphs)s.texturePage=e,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=t,s.texturePosition.y+=o,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(a.canvas);const n=this._activePages.indexOf(a);-1!==n&&this._activePages.splice(n,1)}return s}_deletePage(t){this._pages.splice(t,1);for(let e=t;e=this._config.colors.ansi.length)throw new Error("No color found for idx "+t);return this._config.colors.ansi[t]}_getBackgroundColor(t,e,i,s){if(this._config.allowTransparency)return o.NULL_COLOR;let r;switch(t){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(e);break;case 50331648:const t=h.AttributeData.toColorRGB(e);r=o.channels.toColor(t[0],t[1],t[2]);break;default:r=i?o.color.opaque(this._config.colors.foreground):this._config.colors.background}return this._config.allowTransparency||(r=o.color.opaque(r)),r}_getForegroundColor(t,e,i,r,a,n,L,T,l,d){const c=this._getMinimumContrastColor(t,e,i,r,a,n,L,l,T,d);if(c)return c;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&l&&n<8&&(n+=8),_=this._getColorFromAnsiIndex(n);break;case 50331648:const t=h.AttributeData.toColorRGB(n);_=o.channels.toColor(t[0],t[1],t[2]);break;default:_=L?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(_=o.color.opaque(_)),T&&(_=o.color.multiplyOpacity(_,s.DIM_OPACITY)),_}_resolveBackgroundRgba(t,e,i){switch(t){case 16777216:case 33554432:return this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(t,e,i,s){switch(t){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&e<8&&(e+=8),this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(t,e,i,s,r,a,n,L,h,T){if(1===this._config.minimumContrastRatio||T)return;const l=this._getContrastCache(h),d=l.getColor(t,s);if(void 0!==d)return d??void 0;const c=this._resolveBackgroundRgba(e,i,n),_=this._resolveForegroundRgba(r,a,n,L),Q=o.rgba.ensureContrastRatio(c,_,this._config.minimumContrastRatio/(h?2:1));if(!Q)return void l.setColor(t,s,null);const u=o.channels.toColor(Q>>24&255,Q>>16&255,Q>>8&255);return l.setColor(t,s,u),u}_getContrastCache(t){return t?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(t,e,i,o,n,L){const T="number"==typeof t?String.fromCharCode(t):t;L&&this._tmpCanvas.parentElement!==L&&(this._tmpCanvas.style.display="none",L.append(this._tmpCanvas));const l=Math.min(this._config.deviceCellWidth*Math.max(T.length,2)+4,this._config.deviceMaxTextureSize);this._tmpCanvas.width=t?2*t-o:t-o;!1==!(o>=t)||0===_?(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(h+_,s),this._tmpCtx.lineTo(T,s)):(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(h+_,s),this._tmpCtx.moveTo(h+_+t,s),this._tmpCtx.lineTo(T,s)),o=(0,a.computeNextVariantOffset)(T-h,t,o);break;case 5:const Q=.6,u=.3,p=T-h,g=Math.floor(Q*p),M=Math.floor(u*p),y=p-g-M;this._tmpCtx.setLineDash([g,M,y]),this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(T,s);break;default:this._tmpCtx.moveTo(h,s),this._tmpCtx.lineTo(T,s)}n||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!O&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==T){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const e=this._tmpCtx.measureText(T);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in e&&e.actualBoundingBoxDescent>0){this._tmpCtx.save();const e=new Path2D;e.rect(i,L-Math.ceil(t/2),this._config.deviceCellWidth*I,l-L+Math.ceil(t/2)),this._tmpCtx.clip(e),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=E.css,this._tmpCtx.strokeText(T,S,S+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(C){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),e=t%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+e),this._tmpCtx.stroke()}if(O||this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight),"_"===T&&!this._config.allowTransparency){let t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W);if(t)for(let e=1;e<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=E.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight-e),t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W),t);e++);}if(f){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),e=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.stroke()}this._tmpCtx.restore();const N=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let P;if(P=this._config.allowTransparency?function(t){for(let e=0;e0)return!1;return!0}(N):u(N,E,D,W),P)return d;const B=this._findGlyphBoundingBox(N,this._workBoundingBox,l,Z,O,S);let $,F;for(;;){if(0===this._activePages.length){const t=this._createNewPage();$=t,F=t.currentRow,F.height=B.size.y;break}$=this._activePages[this._activePages.length-1],F=$.currentRow;for(const t of this._activePages)B.size.y<=t.currentRow.height&&($=t,F=t.currentRow);for(let t=this._activePages.length-1;t>=0;t--)for(const e of this._activePages[t].fixedRows)e.height<=F.height&&B.size.y<=e.height&&($=this._activePages[t],F=e);if(B.size.x>this._textureSize){this._overflowSizePage||(this._overflowSizePage=new Q(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),$=this._overflowSizePage,F=this._overflowSizePage.currentRow,F.x+B.size.x>=$.canvas.width&&(F.x=0,F.y+=F.height,F.height=0);break}if(F.y+B.size.y>=$.canvas.height||F.height>B.size.y+2){let t=!1;if($.currentRow.y+$.currentRow.height+B.size.y>=$.canvas.height){let e;for(const t of this._activePages)if(t.currentRow.y+t.currentRow.height+B.size.y=_.maxAtlasPages&&F.y+B.size.y<=$.canvas.height&&F.height>=B.size.y&&F.x+B.size.x<=$.canvas.width)t=!0;else{const e=this._createNewPage();$=e,F=e.currentRow,F.height=B.size.y,t=!0}}t||($.currentRow.height>0&&$.fixedRows.push($.currentRow),F={x:0,y:$.currentRow.y+$.currentRow.height,height:B.size.y},$.fixedRows.push(F),$.currentRow={x:0,y:F.y+F.height,height:0})}if(F.x+B.size.x<=$.canvas.width)break;F===$.currentRow?(F.x=0,F.y+=F.height,F.height=0):$.fixedRows.splice($.fixedRows.indexOf(F),1)}return B.texturePage=this._pages.indexOf($),B.texturePosition.x=F.x,B.texturePosition.y=F.y,B.texturePositionClipSpace.x=F.x/$.canvas.width,B.texturePositionClipSpace.y=F.y/$.canvas.height,B.sizeClipSpace.x/=$.canvas.width,B.sizeClipSpace.y/=$.canvas.height,F.height=Math.max(F.height,B.size.y),F.x+=B.size.x,$.ctx.putImageData(N,B.texturePosition.x-this._workBoundingBox.left,B.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,B.size.x,B.size.y),$.addGlyph(B),$.version=++Q.nextVersion,B}_findGlyphBoundingBox(t,e,i,s,r,a){e.top=0;const o=s?this._config.deviceCellHeight:this._tmpCanvas.height,n=s?this._config.deviceCellWidth:i;let L=!1;for(let i=0;i=a;i--){for(let s=0;s=0;i--){for(let s=0;s>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=i.rgba>>>24,L=i.rgba>>>16&255,h=i.rgba>>>8&255,T=Math.floor((Math.abs(r-n)+Math.abs(a-L)+Math.abs(o-h))/12);let l=!0;for(let e=0;ethis._handleColorChange())),this._cellColorResolver=new s.CellColorResolver(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new _.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,d,this._themeService)],this.dimensions=(0,g.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(d.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new T.TextBlinkStateManager(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextlost",t=>{this._logService.debug("webglcontextlost event received"),t.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(t)},3e3)})),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextrestored",t=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,r.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,(t,e)=>this._setCanvasDevicePixelDimensions(t,e)),this._register(this._coreBrowserService.onWindowChange(t=>{this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,t,(t,e)=>this._setCanvasDevicePixelDimensions(t,e))})),this._register((0,u.addDisposableListener)(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register((0,p.toDisposable)(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(const t of this._renderLayers)t.dispose();this._canvas.parentElement?.removeChild(this._canvas),(0,r.removeTerminalFromCache)(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,e){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(const t of this._renderLayers)t.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(const t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(const t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,e,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,t,e,i);this._model.selection.update(this._core,t,e,i),this._requestRedrawViewport()}handleCursorMove(){for(const t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new d.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new l.GlyphRenderer(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,r.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,p.combinedDisposable)(Q.EventUtils.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),Q.EventUtils.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(const t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,e){if(!this._isAttached){if(!(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,t,e);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,e);let i=!1,s=0;for(;this._charAtlas&&this._glyphRenderer.value.beginFrame()&&s++<32;)i=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);i&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,e){const i=this._core;let s,r,a,o,n,L,T,l,d,_,Q,u,p,g,M,f,C,m=this._workCell;t=v(t,i.rows-1,0),e=v(e,i.rows-1,0);const w=this._coreService.decPrivateModes.cursorStyle??i.options.cursorStyle??"block",x=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,b=x-i.buffer.ydisp,E=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let R=-1;const k=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let A=!1;for(r=t;r<=e;r++){a=r+i.buffer.ydisp;const t=i.buffer.lines.get(a);if(!t){for(this._model.lineLengths[r]=0,f=0;f=T,d=f,n.length>0&&f===n[0][0]&&l){_=n.shift();const t=this._model.selection.isCellSelected(this._terminal,_[0],a);for(M=_[0]+1;M<_[1];M++)l&&=t===this._model.selection.isCellSelected(this._terminal,M,a);l&&=!Q||E<_[0]||E>=_[1],l?(L=!0,m=new y(m,o.translateToString(!0,_[0],_[1]),_[1]-_[0]),d=_[1]-1):T=_[1]}if(u=m.getChars(),p=m.getCode(),M=4*(r*i.cols+f),!e&&m.isBlink()&&(e=!0),this._cellColorResolver.resolve(m,f,a,this.dimensions.device.cell.width,this.dimensions.device.cell.height),k&&a===x&&(f===E&&(this._model.cursor={x:E,y:b,width:m.getWidth(),style:this._coreBrowserService.isFocused?w:i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},R=E+m.getWidth()-1),f>=E&&f<=R&&(this._coreBrowserService.isFocused&&"block"===w||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&m.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),p!==h.NULL_CELL_CODE&&(this._model.lineLengths[r]=f+1),(this._model.cells[M]!==p||this._model.cells[M+1]!==this._cellColorResolver.result.bg||this._model.cells[M+2]!==this._cellColorResolver.result.fg||this._model.cells[M+3]!==this._cellColorResolver.result.ext)&&(A=!0,u.length>1&&(p|=c.COMBINED_CHAR_BIT_MASK),this._model.cells[M]=p,this._model.cells[M+1]=this._cellColorResolver.result.bg,this._model.cells[M+2]=this._cellColorResolver.result.fg,this._model.cells[M+3]=this._cellColorResolver.result.ext,g=m.getWidth(),this._glyphRenderer.value.updateCell(f,r,p,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,u,g,s),L)){for(m=this._workCell,f++;f<=d;f++)C=4*(r*i.cols+f),this._nullModelCell(f,r,C,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);f--}}this._setRowBlinkState(r,e)}A&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,e,i,s,r,a){this._glyphRenderer.value.updateCell(t,e,h.NULL_CELL_CODE,s,r,a,h.NULL_CELL_CHAR,0,0),this._model.cells[i]=h.NULL_CELL_CODE,this._model.cells[i+1]=s,this._model.cells[i+2]=r,this._model.cells[i+3]=a}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,e){this._rowHasBlinkingCells[t]!==e&&(this._rowHasBlinkingCells[t]=e,this._rowHasBlinkingCellsCount+=e?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,e){this._canvas.width===t&&this._canvas.height===e||(this._canvas.width=t,this._canvas.height=e,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}}e.WebglRenderer=M;class y extends n.AttributeData{constructor(t,e,i){super(),this.content=0,this.combinedData="",this.fg=t.fg,this.bg=t.bg,this.combinedData=e,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function v(t,e,i=0){return Math.max(Math.min(t,e),i)}e.JoinedCellData=y},719(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GLTexture=e.PROJECTION_MATRIX=void 0,e.createProgram=function(t,e,i,a){const o=(0,s.throwIfFalsy)(t.createProgram());if(t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.VERTEX_SHADER,e,a))),t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.FRAGMENT_SHADER,i,a))),t.linkProgram(o),t.getProgramParameter(o,t.LINK_STATUS))return o;a.error(t.getProgramInfoLog(o)),t.deleteProgram(o)},e.createShader=r,e.expandFloat32Array=function(t,e){const i=Math.min(2*t.length,e),s=new Float32Array(i);for(let e=0;e{const e=[],i=[3/8,2/8,3/8],s=[0,3/8,5/8];for(let r=0;r<3;r++){const a=t>>2*r&1,o=t>>2*r+1&1;a&&o?e.push(`M0,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):a?e.push(`M0,${s[r]} L0.5,${s[r]} L0.5,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):o&&e.push(`M0.5,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0.5,${s[r]+i[r]} Z`)}return e.join(" ")}}}function r(t){const e=[],i=.15,s=.015,r=.075,a=.0375,o=.95;if(64&t){const t=.175,a=.2125,n=.25,L=.2+s,h=o-i-s;e.push(`M${L},${a} L${L+r},${t} L${h-r},${t} L${h},${a} L${h-r},${n} L${L+r},${n} Z`)}if(32&t){const t=o-i,s=.875,r=o,n=.265,L=.485;e.push(`M${s},${n} L${r},${n+a} L${r},${L-a} L${s},${L} L${t},${L-a} L${t},${n+a} Z`)}if(16&t){const t=o-i,s=.875,r=o,n=.515,L=.735;e.push(`M${s},${n} L${r},${n+a} L${r},${L-a} L${s},${L} L${t},${L-a} L${t},${n+a} Z`)}if(8&t){const t=.75,a=.7875,n=.825,L=.2+s,h=o-i-s;e.push(`M${L},${a} L${L+r},${t} L${h-r},${t} L${h},${a} L${h-r},${n} L${L+r},${n} Z`)}if(4&t){const t=.05,i=.125,s=.2,r=.515,o=.735;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(2&t){const t=.05,i=.125,s=.2,r=.265,o=.485;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(1&t){const t=.4625,a=.5,n=.5375,L=.2+s,h=o-i-s;e.push(`M${L},${a} L${L+r},${t} L${h-r},${t} L${h},${a} L${h-r},${n} L${L+r},${n} Z`)}return e.join(" ")}Object.defineProperty(e,"__esModule",{value:!0}),e.blockPatternCodepoints=e.customGlyphDefinitions=void 0,function(t){t.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),t.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),t.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),t.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),t.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),t.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),t.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.CURVE_UP_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_UP_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),t.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),t.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),t.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),t.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),t.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})}(i||(i={})),e.customGlyphDefinitions={"─":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"━":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"│":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"┃":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"┄":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"┅":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"┆":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"┇":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"┈":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"┉":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"┊":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"┋":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"┌":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"┍":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┎":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┏":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"┐":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"┑":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┒":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┓":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"└":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"┕":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┖":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┗":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"┘":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"┙":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┚":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┛":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"├":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"┝":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┞":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┟":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┠":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┡":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┢":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┣":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"┤":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"┥":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┦":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┧":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┨":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┩":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┪":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┫":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"┬":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"┭":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┮":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┯":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┰":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┱":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┲":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┳":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"┴":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"┵":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┶":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┷":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┸":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┹":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┺":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┻":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"┼":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"┽":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┾":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┿":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"╀":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"╁":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╂":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"╃":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"╄":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"╅":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"╆":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"╇":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"╈":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"╉":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"╊":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"╋":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"╌":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"╍":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"╎":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"╏":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"═":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"║":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╒":{type:2,data:(t,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╓":{type:2,data:(t,e)=>`M${.5-t},1 L${.5-t},.5 L1,.5 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╔":{type:2,data:(t,e)=>`M1,${.5-e} L${.5-t},${.5-e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╕":{type:2,data:(t,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╖":{type:2,data:(t,e)=>`M${.5+t},1 L${.5+t},.5 L0,.5 M${.5-t},.5 L${.5-t},1`,strokeWidth:1},"╗":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5+t},${.5-e} L${.5+t},1`,strokeWidth:1},"╘":{type:2,data:(t,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"╙":{type:2,data:(t,e)=>`M1,.5 L${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╚":{type:2,data:(t,e)=>`M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0 M1,${.5+e} L${.5-t},${.5+e} L${.5-t},0`,strokeWidth:1},"╛":{type:2,data:(t,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"╜":{type:2,data:(t,e)=>`M0,.5 L${.5+t},.5 L${.5+t},0 M${.5-t},.5 L${.5-t},0`,strokeWidth:1},"╝":{type:2,data:(t,e)=>`M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M0,${.5+e} L${.5+t},${.5+e} L${.5+t},0`,strokeWidth:1},"╞":{type:2,data:(t,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╟":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1 M${.5+t},.5 L1,.5`,strokeWidth:1},"╠":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╡":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╢":{type:2,data:(t,e)=>`M0,.5 L${.5-t},.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╣":{type:2,data:(t,e)=>`M${.5+t},0 L${.5+t},1 M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0`,strokeWidth:1},"╤":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"╥":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},1 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╦":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╧":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╨":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╩":{type:2,data:(t,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╪":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╫":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╬":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╭":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╮":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╯":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╰":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╱":{type:2,data:"M1,0 L0,1",strokeWidth:1},"╲":{type:2,data:"M0,0 L1,1",strokeWidth:1},"╳":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"╴":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"╵":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"╶":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"╷":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"╸":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"╹":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"╺":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"╻":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"╼":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"╽":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╾":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"╿":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"▀":{type:0,data:[{x:0,y:0,w:8,h:4}]},"▁":{type:0,data:[{x:0,y:7,w:8,h:1}]},"▂":{type:0,data:[{x:0,y:6,w:8,h:2}]},"▃":{type:0,data:[{x:0,y:5,w:8,h:3}]},"▄":{type:0,data:[{x:0,y:4,w:8,h:4}]},"▅":{type:0,data:[{x:0,y:3,w:8,h:5}]},"▆":{type:0,data:[{x:0,y:2,w:8,h:6}]},"▇":{type:0,data:[{x:0,y:1,w:8,h:7}]},"█":{type:0,data:[{x:0,y:0,w:8,h:8}]},"▉":{type:0,data:[{x:0,y:0,w:7,h:8}]},"▊":{type:0,data:[{x:0,y:0,w:6,h:8}]},"▋":{type:0,data:[{x:0,y:0,w:5,h:8}]},"▌":{type:0,data:[{x:0,y:0,w:4,h:8}]},"▍":{type:0,data:[{x:0,y:0,w:3,h:8}]},"▎":{type:0,data:[{x:0,y:0,w:2,h:8}]},"▏":{type:0,data:[{x:0,y:0,w:1,h:8}]},"▐":{type:0,data:[{x:4,y:0,w:4,h:8}]},"░":{type:1,data:[[1,0],[0,0]]},"▒":{type:1,data:[[1,0],[0,1]]},"▓":{type:1,data:[[1,1],[1,0]]},"▔":{type:0,data:[{x:0,y:0,w:8,h:1}]},"▕":{type:0,data:[{x:7,y:0,w:1,h:8}]},"▖":{type:0,data:[{x:0,y:4,w:4,h:4}]},"▗":{type:0,data:[{x:4,y:4,w:4,h:4}]},"▘":{type:0,data:[{x:0,y:0,w:4,h:4}]},"▙":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"▚":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"▛":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"▜":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"▝":{type:0,data:[{x:4,y:0,w:4,h:4}]},"▞":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"▟":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"":i.LINE_H,"":i.LINE_V,"":i.FADE_RIGHT,"":i.FADE_LEFT,"":i.FADE_DOWN,"":i.FADE_UP,"":i.CURVE_DOWN_RIGHT,"":i.CURVE_DOWN_LEFT,"":i.CURVE_UP_RIGHT,"":i.CURVE_UP_LEFT,"":[i.LINE_V,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT],"":[i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_UP_RIGHT],"":[i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE],"":i.NODE_STROKE,"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"🬀":s(1),"🬁":s(2),"🬂":s(3),"🬃":s(4),"🬄":s(5),"🬅":s(6),"🬆":s(7),"🬇":s(8),"🬈":s(9),"🬉":s(10),"🬊":s(11),"🬋":s(12),"🬌":s(13),"🬍":s(14),"🬎":s(15),"🬏":s(16),"🬐":s(17),"🬑":s(18),"🬒":s(19),"🬓":s(20),"🬔":s(22),"🬕":s(23),"🬖":s(24),"🬗":s(25),"🬘":s(26),"🬙":s(27),"🬚":s(28),"🬛":s(29),"🬜":s(30),"🬝":s(31),"🬞":s(32),"🬟":s(33),"🬠":s(34),"🬡":s(35),"🬢":s(36),"🬣":s(37),"🬤":s(38),"🬥":s(39),"🬦":s(40),"🬧":s(41),"🬨":s(43),"🬩":s(44),"🬪":s(45),"🬫":s(46),"🬬":s(47),"🬭":s(48),"🬮":s(49),"🬯":s(50),"🬰":s(51),"🬱":s(52),"🬲":s(53),"🬳":s(54),"🬴":s(55),"🬵":s(56),"🬶":s(57),"🬷":s(58),"🬸":s(59),"🬹":s(60),"🬺":s(61),"🬻":s(62),"🬼":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"🬽":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"🬾":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"🬿":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"🭀":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"🭁":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭂":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"🭃":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭄":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"🭅":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"🭆":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"🭇":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"🭈":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"🭉":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"🭊":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"🭋":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"🭌":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"🭍":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"🭎":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"🭏":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"🭐":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"🭑":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"🭒":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭓":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"🭔":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭕":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"🭖":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"🭗":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"🭘":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"🭙":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"🭚":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"🭛":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"🭜":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"🭝":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"🭞":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"🭟":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"🭠":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"🭡":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"🭢":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"🭣":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"🭤":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"🭥":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"🭦":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"🭧":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"🭨":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"🭩":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"🭪":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"🭫":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"🭬":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"🭭":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"🭮":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"🭯":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"🭰":{type:0,data:[{x:1,y:0,w:1,h:8}]},"🭱":{type:0,data:[{x:2,y:0,w:1,h:8}]},"🭲":{type:0,data:[{x:3,y:0,w:1,h:8}]},"🭳":{type:0,data:[{x:4,y:0,w:1,h:8}]},"🭴":{type:0,data:[{x:5,y:0,w:1,h:8}]},"🭵":{type:0,data:[{x:6,y:0,w:1,h:8}]},"🭶":{type:0,data:[{x:0,y:1,w:8,h:1}]},"🭷":{type:0,data:[{x:0,y:2,w:8,h:1}]},"🭸":{type:0,data:[{x:0,y:3,w:8,h:1}]},"🭹":{type:0,data:[{x:0,y:4,w:8,h:1}]},"🭺":{type:0,data:[{x:0,y:5,w:8,h:1}]},"🭻":{type:0,data:[{x:0,y:6,w:8,h:1}]},"🭼":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🭽":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭾":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭿":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🮀":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮁":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮂":{type:0,data:[{x:0,y:0,w:8,h:2}]},"🮃":{type:0,data:[{x:0,y:0,w:8,h:3}]},"🮄":{type:0,data:[{x:0,y:0,w:8,h:5}]},"🮅":{type:0,data:[{x:0,y:0,w:8,h:6}]},"🮆":{type:0,data:[{x:0,y:0,w:8,h:7}]},"🮇":{type:0,data:[{x:6,y:0,w:2,h:8}]},"🮈":{type:0,data:[{x:5,y:0,w:3,h:8}]},"🮉":{type:0,data:[{x:3,y:0,w:5,h:8}]},"🮊":{type:0,data:[{x:2,y:0,w:6,h:8}]},"🮋":{type:0,data:[{x:1,y:0,w:7,h:8}]},"🮌":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"🮍":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"🮎":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"🮏":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"🮐":{type:1,data:[[0,1],[1,0]]},"🮑":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"🮒":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"🮔":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"🮕":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"🮖":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"🮗":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"🮘":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"🮙":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"🮚":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"🮛":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"🮜":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"🮝":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"🮞":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"🮟":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"🮠":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"🮡":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"🮢":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"🮣":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"🮤":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"🮥":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"🮦":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"🮧":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"🮨":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"🮩":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"🮪":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"🮫":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"🮬":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"🮭":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"🮮":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"🮯":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"🮰":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"🮱":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"🮲":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"🮳":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"🮴":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"🮵":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮶":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮷":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮸":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮹":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"🮺":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"🮻":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"🮼":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"🮽":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"🮾":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"🮿":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"🯀":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"🯁":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"🯂":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"🯃":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"🯄":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"🯅":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯆":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯇":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯈":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯉":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯊":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"🯋":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"🯌":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"🯍":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"🯎":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"🯏":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"🯐":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"🯑":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"🯒":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"🯓":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"🯔":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"🯕":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"🯖":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"🯗":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"🯘":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"🯙":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"🯚":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"🯛":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"🯜":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"🯝":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"🯞":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"🯟":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"🯠":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"🯡":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"🯢":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"🯣":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"🯤":{type:0,data:[{x:2,y:0,w:4,h:4}]},"🯥":{type:0,data:[{x:2,y:4,w:4,h:4}]},"🯦":{type:0,data:[{x:0,y:2,w:4,h:4}]},"🯧":{type:0,data:[{x:4,y:2,w:4,h:4}]},"🯨":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"🯩":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"🯪":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"🯫":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"🯬":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"🯭":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"🯮":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"🯯":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"🯰":{type:5,data:{d:r(126),type:0},scaleType:1},"🯱":{type:5,data:{d:r(48),type:0},scaleType:1},"🯲":{type:5,data:{d:r(109),type:0},scaleType:1},"🯳":{type:5,data:{d:r(121),type:0},scaleType:1},"🯴":{type:5,data:{d:r(51),type:0},scaleType:1},"🯵":{type:5,data:{d:r(91),type:0},scaleType:1},"🯶":{type:5,data:{d:r(95),type:0},scaleType:1},"🯷":{type:5,data:{d:r(114),type:0},scaleType:1},"🯸":{type:5,data:{d:r(127),type:0},scaleType:1},"🯹":{type:5,data:{d:r(123),type:0},scaleType:1},"🯺":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(t,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},e.blockPatternCodepoints=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951])},183(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.tryDrawCustomGlyph=function(t,e,i,s,o,n,L,h,T,l,d,c,_=0){const Q=r.customGlyphDefinitions[e];if(Q){const e=Array.isArray(Q)?Q:[Q];for(const r of e)a(t,r,i,s,o,n,L,h,T,l,d,c,_);return!0}return!1};const s=i(959),r=i(915);function a(t,e,i,r,a,h,d,c,_,Q,u,p,g=0){let M=a,y=h,v=i,f=r;switch(1===e.scaleType&&(M=d,y=c,v=i+(a-d)/2,f=r+(h-c)/2),e.clipPath&&(t.save(),function(t,e,i,s,r,a){t.beginPath();for(const o of e.split(" ")){const e=o[0];if("Z"===e){t.closePath();continue}const n=o.substring(1).split(",");if(!n[0]||!n[1])continue;const L=i+parseFloat(n[0])*r,h=s+parseFloat(n[1])*a;"M"===e?t.moveTo(L,h):"L"===e&&t.lineTo(L,h)}t.clip()}(t,e.clipPath,v,f,M,y)),e.type){case 0:!function(t,e,i,s,r,a){for(let o=0;o7&&parseInt(T.slice(7,9),16)||1;else{if(!T.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${T}" when drawing pattern glyph`);[L,d,c,_]=T.substring(5,T.length-1).split(",").map(t=>parseFloat(t))}for(let t=0;t>1&1,c=1&n;0!==d||0!==c?l.setTransform((new DOMMatrix).translateSelf(-d,-c)):l.setTransform(new DOMMatrix),t.fillStyle=l,t.fillRect(i,r,a,o)}(t,e.data,v,f,M,y,g);break;case 2:!function(t,e,i,s,r,a,o,n,L){let h;t.save(),t.beginPath(),t.rect(i,s,r,a),t.clip(),t.beginPath(),h="function"==typeof e?e(.15,.15/a*r):e;const d={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const e of h.split(" ")){const L=e[0];if("Z"===L){t.closePath(),d.lastCommand=L;continue}const h=T[L];if(!h){n.error(`Could not find drawing instructions for "${L}"`);continue}const c=e.substring(1).split(",");c[0]&&c[1]&&(h(t,l(c,r,a,i,s,!0,o,0,0,!1),d),d.lastCommand=L)}void 0!==L?(t.strokeStyle=t.fillStyle,t.lineWidth=o*L,t.stroke()):t.fill(),t.closePath(),t.restore()}(t,e.data,v,f,M,y,Q,u,e.strokeWidth);break;case 3:!function(t,e,i,s,r,a,o,L){const h="string"==typeof e?e:e(0,0);t.beginPath();let T=0,l=0,d=0,c=0,_="";for(const e of h.split(" ")){const o=e[0],L=e.substring(1).split(",");if("Z"===o){t.closePath(),_=o;continue}if("V"===o){const e=s+parseFloat(L[0])*a;t.lineTo(T,e),l=e,d=T,c=l,_=o;continue}if("H"===o){const e=i+parseFloat(L[0])*r;t.lineTo(e,l),T=e,d=T,c=l,_=o;continue}if(!L[0]||!L[1])continue;if("A"===o){const e=parseFloat(L[0])*r,o=parseFloat(L[1])*a,h=parseFloat(L[2])*Math.PI/180,d=parseInt(L[3],10),c=parseInt(L[4],10),_=i+parseFloat(L[5])*r,Q=s+parseFloat(L[6])*a;n(t,T,l,e,o,h,d,c,_,Q),T=_,l=Q;continue}const h=L.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});if("M"===o)t.moveTo(h[0],h[1]),T=h[0],l=h[1],d=T,c=l;else if("L"===o)t.lineTo(h[0],h[1]),T=h[0],l=h[1],d=T,c=l;else if("Q"===o)t.quadraticCurveTo(h[0],h[1],h[2],h[3]),d=h[0],c=h[1],T=h[2],l=h[3];else if("T"===o){let e,i;"Q"===_||"T"===_?(e=2*T-d,i=2*l-c):(e=T,i=l),t.quadraticCurveTo(e,i,h[0],h[1]),d=e,c=i,T=h[0],l=h[1]}else"C"===o&&(t.bezierCurveTo(h[0],h[1],h[2],h[3],h[4],h[5]),d=h[2],c=h[3],T=h[4],l=h[5]);_=o}void 0!==L?(t.strokeStyle=t.fillStyle,t.lineWidth=o*L,t.stroke()):t.fill()}(t,e.data,v,f,M,y,Q,e.strokeWidth);break;case 4:!function(t,e,i,s,r,a,o,n){t.save(),t.fillRect(i,s,r,a),n&&(t.fillStyle=n,t.strokeStyle=n),t.lineWidth=o,t.lineCap="square",t.beginPath();for(const o of e.d.split(" ")){const e=o[0],n=o.substring(1).split(",");if(!n[0]||!n[1]){"Z"===e&&t.closePath();continue}const L=n.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});"M"===e?t.moveTo(L[0],L[1]):"L"===e&&t.lineTo(L[0],L[1])}1===e.type?t.stroke():t.fill(),t.restore()}(t,e.data,v,f,M,y,Q,p);break;case 5:!function(t,e,i,s,r,a,o,n,L){const h=new Path2D;h.rect(i,s,r,a),t.clip(h),t.beginPath();const d=o/12;t.lineWidth=n*d;const c={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const o of e.d.split(" ")){const h=o[0];if("Z"===h){t.closePath(),c.lastCommand=h;continue}const _=T[h];if(!_){L.error(`Could not find drawing instructions for "${h}"`);continue}const Q=o.substring(1).split(",");Q[0]&&Q[1]&&(_(t,l(Q,r,a,i,s,!1,n,(e.leftPadding??0)*(d/2),(e.rightPadding??0)*(d/2)),c),c.lastCommand=h)}1===e.type?(t.strokeStyle=t.fillStyle,t.stroke()):t.fill(),t.closePath()}(t,e.data,v,f,M,y,_,Q,u);break;case 6:!function(t,e,i,s,r,a){const n=r/8,L=.1*a,h=.8*a/8,T=Math.min(n,h);for(let r=0;r<8;r++)if(e&1<1){const t=Math.sqrt(y);u=(s*=t)*s,p=(r*=t)*r}let v=(u*p-u*M-p*g)/(u*M+p*g);v<0&&(v=0);const f=(o===n?-1:1)*Math.sqrt(v),C=f*(s*Q/r),m=f*(-r*_/s),w=T*C-l*m+(e+L)/2,x=l*C+T*m+(i+h)/2,b=(_-C)/s,E=(Q-m)/r,R=(-_-C)/s,k=(-Q-m)/r,A=Math.atan2(E,b);let Z=Math.atan2(k,R)-A;0===n&&Z>0?Z-=2*Math.PI:1===n&&Z<0&&(Z+=2*Math.PI);const D=A+Z;t.ellipse(w,x,s,r,a,A,D,0===n)}const L=new Map;function h(t,e,i=0){return Math.max(Math.min(t,e),i)}const T={C:(t,e,i)=>{t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),i.lastControlX=e[2],i.lastControlY=e[3],i.currentX=e[4],i.currentY=e[5]},L:(t,e,i)=>{t.lineTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},M:(t,e,i)=>{t.moveTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},Q:(t,e,i)=>{t.quadraticCurveTo(e[0],e[1],e[2],e[3]),i.lastControlX=e[0],i.lastControlY=e[1],i.currentX=e[2],i.currentY=e[3]},T:(t,e,i)=>{let s,r;"Q"===i.lastCommand||"T"===i.lastCommand?(s=2*i.currentX-i.lastControlX,r=2*i.currentY-i.lastControlY):(s=i.currentX,r=i.currentY),t.quadraticCurveTo(s,r,e[0],e[1]),i.lastControlX=s,i.lastControlY=r,i.currentX=e[0],i.currentY=e[1]}};function l(t,e,i,s,r,a,o,n=0,L=0,T=!0){const l=t.map(t=>parseFloat(t)||parseInt(t));if(l.length<2)throw new Error("Too few arguments for instruction");for(let t=0;t{this._refreshCharAtlas(t,e),this.reset(t)})),this._register((0,r.toDisposable)(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=(0,a.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,e,i){}handleSelectionChanged(t,e,i,s=!1){}_setTransparency(t,e){if(e===this._alpha)return;const i=this._canvas;this._alpha=e,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,e){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(t,this._optionsService.rawOptions,e,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,e){this._deviceCellWidth=e.device.cell.width,this._deviceCellHeight=e.device.cell.height,this._deviceCharWidth=e.device.char.width,this._deviceCharHeight=e.device.char.height,this._deviceCharLeft=e.device.char.left,this._deviceCharTop=e.device.char.top,this._canvas.width=e.device.canvas.width,this._canvas.height=e.device.canvas.height,this._canvas.style.width=`${e.css.canvas.width}px`,this._canvas.style.height=`${e.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,e,i=1){this._ctx.fillRect(t*this._deviceCellWidth,(e+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,e,i,s){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(t,e,i,s){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=o.TEXT_BASELINE,this._clipCell(i,s,e.getWidth()),this._ctx.fillText(e.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,e,i){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,e,i){return`${i?"italic":""} ${e?t.options.fontWeightBold:t.options.fontWeight} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}}e.BaseRenderLayer=n},306(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.LinkRenderLayer=void 0;const s=i(657),r=i(814),a=i(133);class o extends a.BaseRenderLayer{constructor(t,e,i,s,r,a,o){super(i,t,"link",e,!0,r,a,o),this._register(s.onShowLinkUnderline(t=>this._handleShowLinkUnderline(t))),this._register(s.onHideLinkUnderline(t=>this._handleHideLinkUnderline(t)))}resize(t,e){super.resize(t,e),this._state=void 0}reset(t){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const t=this._state.y2-this._state.y1-1;t>0&&this._clearCells(0,this._state.y1+1,this._state.cols,t),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(t){if(t.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==t.fg&&(0,s.is256Color)(t.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[t.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,t.y1===t.y2)this._fillBottomLineAtCells(t.x1,t.y1,t.x2-t.x1);else{this._fillBottomLineAtCells(t.x1,t.y1,t.cols-t.x1);for(let e=t.y1+1;e{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.WebglAddon=void 0;const e=i(426),r=i(95),a=i(399),o=i(414);class n extends e.Disposable{constructor(t){if(r.isSafari&&(0,r.getSafariVersion)()<16){const t={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",t))throw new Error("WebGL2 is only supported on Safari 16 and above")}super(),this._onChangeTextureAtlas=this._register(new o.Emitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this._register(new o.Emitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this._register(new o.Emitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this._register(new o.Emitter),this.onContextLoss=this._onContextLoss.event,this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){const i=t._core;if(!t.element)return void this._register(i.onWillOpen(()=>this.activate(t)));this._terminal=t;const s=i.coreService,r=i.optionsService,n=i,L=n._renderService,h=n._characterJoinerService,T=n._charSizeService,l=n._coreBrowserService,d=n._decorationService,c=n._logService,_=n._themeService;this._renderer=this._register(new a.WebglRenderer(t,h,T,l,s,d,c,r,_,this._customGlyphs,this._preserveDrawingBuffer)),this._register(o.EventUtils.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(o.EventUtils.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(o.EventUtils.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(o.EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),L.setRenderer(this._renderer),this._register((0,e.toDisposable)(()=>{if(this._terminal._core._store._isDisposed)return;const e=this._terminal._core._renderService;e.setRenderer(this._terminal._core._createRenderer()),e.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}}t.WebglAddon=n})(),s})()); --//# sourceMappingURL=addon-webgl.js.map -\ No newline at end of file -+!(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WebglAddon=e():t.WebglAddon=e()})(globalThis,()=>(()=>{"use strict";var t={105(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.WindowIntervalTimer=e2.eventType=void 0,e2.getWindow=r,e2.addDisposableListener=o,e2.addStandardDisposableListener=function(t3,e3,i3,s3){return o(t3,e3,i3,s3)},e2.getDomNodePagePosition=function(t3){const e3=t3.getBoundingClientRect(),i3=r(t3);return{left:e3.left+i3.scrollX,top:e3.top+i3.scrollY,width:e3.width,height:e3.height}},e2.scheduleAtNextAnimationFrame=function(t3,e3,i3=0){const s3=h(t3),r2=new n(e3,i3);return s3.next.push(r2),s3.animFrameRequested||(s3.animFrameRequested=true,t3.requestAnimationFrame(()=>(function(t4){const e4=h(t4);for(e4.animFrameRequested=false,e4.current=e4.next,e4.next=[],e4.inAnimationFrameRunner=true;e4.current.length>0;)e4.current.sort(n.sort),e4.current.shift().execute();e4.inAnimationFrameRunner=false})(t3))),r2};const s2=i2(578);function r(t3){const e3=t3;if(e3?.ownerDocument?.defaultView)return e3.ownerDocument.defaultView;const i3=t3;return i3?.view?i3.view:window}class a{constructor(t3,e3,i3,s3){;this._node=t3,this._type=e3,this._handler=i3,this._options=s3,t3.addEventListener(e3,i3,s3)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function o(t3,e3,i3,s3){return new a(t3,e3,i3,s3)}e2.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class n{constructor(t3,e3){;this._runner=t3,this.priority=e3,this._canceled=false}dispose(){this._canceled=true}execute(){if(!this._canceled)try{this._runner()}catch(t3){console.error(t3)}}static sort(t3,e3){return e3.priority-t3.priority}}const L=new Map;function h(t3){let e3=L.get(t3);return e3||(e3={next:[],current:[],animFrameRequested:false,inAnimationFrameRunner:false},L.set(t3,e3)),e3}class T extends s2.IntervalTimer{constructor(t3){;super(),this._defaultTarget=t3?r(t3):void 0}cancelAndSet(t3,e3,i3){super.cancelAndSet(t3,e3,i3??this._defaultTarget??window)}}e2.WindowIntervalTimer=T},814(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.INVERTED_DEFAULT_COLOR=void 0,e2.INVERTED_DEFAULT_COLOR=257},959(t2,e2){function i2(t3){return 57508<=t3&&t3<=57558}function s2(t3){return t3>=128512&&t3<=128591||t3>=127744&&t3<=128511||t3>=128640&&t3<=128767||t3>=9728&&t3<=9983||t3>=9984&&t3<=10175||t3>=65024&&t3<=65039||t3>=129280&&t3<=129535||t3>=127462&&t3<=127487};Object.defineProperty(e2,"__esModule",{value:true}),e2.throwIfFalsy=function(t3){if(!t3)throw new Error("value must not be falsy");return t3},e2.isPowerlineGlyph=i2,e2.isRestrictedPowerlineGlyph=function(t3){return 57520<=t3&&t3<=57527},e2.isEmoji=s2,e2.allowRescaling=function(t3,e3,r,a){return 1===e3&&r>Math.ceil(1.5*a)&&void 0!==t3&&t3>255&&!s2(t3)&&!i2(t3)&&!(function(t4){return 57344<=t4&&t4<=63743})(t3)},e2.treatGlyphAsBackgroundColor=function(t3){return i2(t3)||(function(t4){return 9472<=t4&&t4<=9631})(t3)},e2.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}}}},e2.computeNextVariantOffset=function(t3,e3,i3=0){return(t3-(2*Math.round(e3)-i3))%(2*Math.round(e3))}},948(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.createSelectionRenderModel=function(){return new i2};class i2{constructor(){this.clear()}clear(){;this.hasSelection=false,this.columnSelectMode=false,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(t3,e3,i3,s2=false){if(this.selectionStart=e3,this.selectionEnd=i3,!e3||!i3||e3[0]===i3[0]&&e3[1]===i3[1])return void this.clear();const r=t3.buffers.active.ydisp,a=e3[1]-r,o=i3[1]-r,n=Math.max(a,0),L=Math.min(o,t3.rows-1);n>=t3.rows||L<0?this.clear():(this.hasSelection=true,this.columnSelectMode=s2,this.viewportStartRow=a,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=L,this.startCol=e3[0],this.endCol=i3[0])}isCellSelected(t3,e3,i3){return!!this.hasSelection&&(i3-=t3.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e3>=this.startCol&&i3>=this.viewportCappedStartRow&&e3=this.viewportCappedStartRow&&e3>=this.endCol&&i3<=this.viewportCappedEndRow:i3>this.viewportStartRow&&i3=this.startCol&&e3=this.startCol)}}},536(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.TextBlinkStateManager=void 0;const s2=i2(426);class r extends s2.Disposable{constructor(t3,e3,i3){;super(),this._renderCallback=t3,this._coreBrowserService=e3,this._optionsService=i3,this._intervalDuration=0,this._blinkOn=true,this._needsBlinkInViewport=false,this._isViewportVisible=true,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",t4=>{this.setIntervalDuration(t4)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s2.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t3){this._needsBlinkInViewport!==t3&&(this._needsBlinkInViewport=t3,this._updateIntervalState())}setViewportVisible(t3){this._isViewportVisible!==t3&&(this._isViewportVisible=t3,this._updateIntervalState())}setIntervalDuration(t3){t3!==this._intervalDuration&&(this._intervalDuration=t3,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const t3=this._blinkOn;return this._blinkOn=true,this._interval=this._coreBrowserService.window.setInterval(()=>{;this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(t3||this._renderCallback())};this._clearInterval(),this._blinkOn||(this._blinkOn=true,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}e2.TextBlinkStateManager=r},578(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.IntervalTimer=e2.MicrotaskTimer=e2.TimeoutTimer=void 0,e2.timeout=function(t3){return new Promise(e3=>setTimeout(e3,t3))},e2.disposableTimeout=function(t3,e3=0,i3){const r=setTimeout(()=>{;t3(),i3&&a.dispose()},e3),a=(0,s2.toDisposable)(()=>{clearTimeout(r)});return i3?.add(a),a};const s2=i2(426);e2.TimeoutTimer=class{constructor(){;this._token=-1,this._isDisposed=false}dispose(){;this.cancel(),this._isDisposed=true}cancel(){;-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t3,e3){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{;this._token=-1,t3()},e3)}setIfNotSet(t3,e3){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{;this._token=-1,t3()},e3))}},e2.MicrotaskTimer=class{constructor(){;this._isScheduled=false,this._isDisposed=false}dispose(){;this.cancel(),this._isDisposed=true}cancel(){this._isScheduled=false}set(t3){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=true,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=false,t3())}))}},e2.IntervalTimer=class{constructor(){this._isDisposed=false}cancel(){;this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t3,e3,i3=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s3=i3.setInterval(()=>{t3()},e3);this._disposable={dispose:()=>{;i3.clearInterval(s3),this._disposable=void 0}}}dispose(){;this.cancel(),this._isDisposed=true}}},993(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.rgba=e2.rgb=e2.css=e2.color=e2.channels=e2.NULL_COLOR=void 0,e2.toPaddedHex=l,e2.contrastRatio=d;let i2=0,s2=0,r=0,a=0;var o,n,L,h,T;function l(t3){const e3=t3.toString(16);return e3.length<2?"0"+e3:e3}function d(t3,e3){return t3>>0},t3.toColor=function(e3,i3,s3,r2){return{css:t3.toCss(e3,i3,s3,r2),rgba:t3.toRgba(e3,i3,s3,r2)}}})(o||(e2.channels=o={})),(function(t3){function e3(t4,e4){return a=Math.round(255*e4),[i2,s2,r]=T.toChannels(t4.rgba),{css:o.toCss(i2,s2,r,a),rgba:o.toRgba(i2,s2,r,a)}};t3.blend=function(t4,e4){if(a=(255&e4.rgba)/255,1===a)return{css:e4.css,rgba:e4.rgba};const n2=e4.rgba>>24&255,L2=e4.rgba>>16&255,h2=e4.rgba>>8&255,T2=t4.rgba>>24&255,l2=t4.rgba>>16&255,d2=t4.rgba>>8&255;return i2=T2+Math.round((n2-T2)*a),s2=l2+Math.round((L2-l2)*a),r=d2+Math.round((h2-d2)*a),{css:o.toCss(i2,s2,r),rgba:o.toRgba(i2,s2,r)}},t3.isOpaque=function(t4){return!(255&~t4.rgba)},t3.ensureContrastRatio=function(t4,e4,i3){const s3=T.ensureContrastRatio(t4.rgba,e4.rgba,i3);if(s3)return o.toColor(s3>>24&255,s3>>16&255,s3>>8&255)},t3.opaque=function(t4){const e4=(255|t4.rgba)>>>0;return[i2,s2,r]=T.toChannels(e4),{css:o.toCss(i2,s2,r),rgba:e4}},t3.opacity=e3,t3.multiplyOpacity=function(t4,i3){return a=255&t4.rgba,e3(t4,a*i3/255)},t3.toColorRGB=function(t4){return[t4.rgba>>24&255,t4.rgba>>16&255,t4.rgba>>8&255]}})(n||(e2.color=n={})),(function(t3){let e3,n2;try{const t4=document.createElement("canvas");t4.width=1,t4.height=1;const i3=t4.getContext("2d",{willReadFrequently:true});i3&&(e3=i3,e3.globalCompositeOperation="copy",n2=e3.createLinearGradient(0,0,1,1))}catch{}t3.toColor=function(t4){if(t4.match(/#[\da-f]{3,8}/i))switch(t4.length){case 4:return i2=parseInt(t4.slice(1,2).repeat(2),16),s2=parseInt(t4.slice(2,3).repeat(2),16),r=parseInt(t4.slice(3,4).repeat(2),16),o.toColor(i2,s2,r);case 5:return i2=parseInt(t4.slice(1,2).repeat(2),16),s2=parseInt(t4.slice(2,3).repeat(2),16),r=parseInt(t4.slice(3,4).repeat(2),16),a=parseInt(t4.slice(4,5).repeat(2),16),o.toColor(i2,s2,r,a);case 7:return{css:t4,rgba:(parseInt(t4.slice(1),16)<<8|255)>>>0};case 9:return{css:t4,rgba:parseInt(t4.slice(1),16)>>>0}}const L2=t4.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(L2)return i2=parseInt(L2[1],10),s2=parseInt(L2[2],10),r=parseInt(L2[3],10),a=Math.round(255*(void 0===L2[5]?1:parseFloat(L2[5]))),o.toColor(i2,s2,r,a);if("transparent"===t4)return{css:"transparent",rgba:0};if(!e3||!n2)throw new Error("css.toColor: Unsupported css format");if(e3.fillStyle=n2,e3.fillStyle=t4,"string"!=typeof e3.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e3.fillRect(0,0,1,1),[i2,s2,r,a]=e3.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i2,s2,r,a),css:t4}}})(L||(e2.css=L={})),(function(t3){function e3(t4,e4,i3){const s3=t4/255,r2=e4/255,a2=i3/255;return .2126*(s3<=.03928?s3/12.92:Math.pow((s3+.055)/1.055,2.4))+.7152*(r2<=.03928?r2/12.92:Math.pow((r2+.055)/1.055,2.4))+.0722*(a2<=.03928?a2/12.92:Math.pow((a2+.055)/1.055,2.4))};t3.relativeLuminance=function(t4){return e3(t4>>16&255,t4>>8&255,255&t4)},t3.relativeLuminance2=e3})(h||(e2.rgb=h={})),(function(t3){function e3(t4,e4,i3){const s3=t4>>24&255,r2=t4>>16&255,a2=t4>>8&255;let o2=e4>>24&255,n3=e4>>16&255,L2=e4>>8&255,T2=d(h.relativeLuminance2(o2,n3,L2),h.relativeLuminance2(s3,r2,a2));for(;T20||n3>0||L2>0);)o2-=Math.max(0,Math.ceil(.1*o2)),n3-=Math.max(0,Math.ceil(.1*n3)),L2-=Math.max(0,Math.ceil(.1*L2)),T2=d(h.relativeLuminance2(o2,n3,L2),h.relativeLuminance2(s3,r2,a2));return(o2<<24|n3<<16|L2<<8|255)>>>0}function n2(t4,e4,i3){const s3=t4>>24&255,r2=t4>>16&255,a2=t4>>8&255;let o2=e4>>24&255,n3=e4>>16&255,L2=e4>>8&255,T2=d(h.relativeLuminance2(o2,n3,L2),h.relativeLuminance2(s3,r2,a2));for(;T2>>0};t3.blend=function(t4,e4){if(a=(255&e4)/255,1===a)return e4;const n3=e4>>24&255,L2=e4>>16&255,h2=e4>>8&255,T2=t4>>24&255,l2=t4>>16&255,d2=t4>>8&255;return i2=T2+Math.round((n3-T2)*a),s2=l2+Math.round((L2-l2)*a),r=d2+Math.round((h2-d2)*a),o.toRgba(i2,s2,r)},t3.ensureContrastRatio=function(t4,i3,s3){const r2=h.relativeLuminance(t4>>8),a2=h.relativeLuminance(i3>>8);if(d(r2,a2)>8));if(o3d(r2,h.relativeLuminance(e4>>8))?a3:e4}return a3}const o2=n2(t4,i3,s3),L2=d(r2,h.relativeLuminance(o2>>8));if(L2d(r2,h.relativeLuminance(a3>>8))?o2:a3}return o2}},t3.reduceLuminance=e3,t3.increaseLuminance=n2,t3.toChannels=function(t4){return[t4>>24&255,t4>>16&255,t4>>8&255,255&t4]}})(T||(e2.rgba=T={}))},414(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.EventUtils=e2.Emitter=void 0;const s2=i2(426);var r;e2.Emitter=class{constructor(){;this._listeners=[],this._disposed=false}get event(){return this._event||(this._event=(t3,e3,i3)=>{if(this._disposed)return(0,s2.toDisposable)(()=>{});const r2={fn:t3,thisArgs:e3};this._listeners.push(r2);const a=(0,s2.toDisposable)(()=>{const t4=this._listeners.indexOf(r2);-1!==t4&&this._listeners.splice(t4,1)});return i3&&(Array.isArray(i3)?i3.push(a):i3.add(a)),a}),this._event}fire(t3){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{const{fn:e3,thisArgs:i3}=this._listeners[0];return void e3.call(i3,t3)}default:{const e3=this._listeners.slice();for(const{fn:i3,thisArgs:s3}of e3)i3.call(s3,t3)}}}dispose(){this._disposed||(this._disposed=true,this._listeners.length=0)}},(function(t3){;t3.forward=function(t4,e3){return t4(t5=>e3.fire(t5))},t3.map=function(t4,e3){return(i3,s3,r2)=>t4(t5=>i3.call(s3,e3(t5)),void 0,r2)},t3.any=function(...t4){return(e3,i3,r2)=>{const a=new s2.DisposableStore;for(const s3 of t4)a.add(s3(t5=>e3.call(i3,t5)));return r2&&(Array.isArray(r2)?r2.push(a):r2.add(a)),a}},t3.runAndSubscribe=function(t4,e3,i3){return e3(i3),t4(t5=>e3(t5))}})(r||(e2.EventUtils=r={}))},426(t2,e2){function i2(t3){return{dispose:t3}}function s2(t3){if(!t3)return t3;if(Array.isArray(t3)){for(const e3 of t3)e3.dispose();return[]}return t3.dispose(),t3};Object.defineProperty(e2,"__esModule",{value:true}),e2.MutableDisposable=e2.Disposable=e2.DisposableStore=void 0,e2.toDisposable=i2,e2.dispose=s2,e2.combinedDisposable=function(...t3){return i2(()=>s2(t3))};class r{constructor(){;this._disposables=new Set,this._isDisposed=false}get isDisposed(){return this._isDisposed}add(t3){return this._isDisposed?t3.dispose():this._disposables.add(t3),t3}dispose(){if(!this._isDisposed){this._isDisposed=true;for(const t3 of this._disposables)t3.dispose();this._disposables.clear()}}clear(){for(const t3 of this._disposables)t3.dispose();this._disposables.clear()}}e2.DisposableStore=r;class a{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(t3){return this._store.add(t3)}};e2.Disposable=a,a.None=Object.freeze({dispose(){}}),e2.MutableDisposable=class{constructor(){this._isDisposed=false}get value(){return this._isDisposed?void 0:this._value}set value(t3){this._isDisposed||t3===this._value||(this._value?.dispose(),this._value=t3)}clear(){this.value=void 0}dispose(){;this._isDisposed=true,this._value?.dispose(),this._value=void 0}}},836(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.FourKeyMap=e2.TwoKeyMap=void 0;class i2{constructor(){this._data={}}set(t3,e3,i3){;this._data[t3]||(this._data[t3]={}),this._data[t3][e3]=i3}get(t3,e3){return this._data[t3]?this._data[t3][e3]:void 0}clear(){this._data={}}};e2.TwoKeyMap=i2,e2.FourKeyMap=class{constructor(){this._data=new i2}set(t3,e3,s2,r,a){;this._data.get(t3,e3)||this._data.set(t3,e3,new i2),this._data.get(t3,e3).set(s2,r,a)}get(t3,e3,i3,s2){return this._data.get(t3,e3)?.get(i3,s2)}clear(){this._data.clear()}}},95(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.isChromeOS=e2.isLinux=e2.isWindows=e2.isMac=e2.isSafari=e2.isLegacyEdge=e2.isChrome=e2.isFirefox=e2.isNode=void 0,e2.getZoomFactor=function(t3){return 1},e2.getSafariVersion=function(){if(!e2.isSafari)return 0;const t3=i2.match(/Version\/(\d+)/);return null===t3||t3.length<2?0:parseInt(t3[1],10)},e2.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i2=e2.isNode?"node":navigator.userAgent,s2=e2.isNode?"node":navigator.platform;e2.isFirefox=i2.includes("Firefox"),e2.isChrome=i2.includes("Chrome"),e2.isLegacyEdge=i2.includes("Edge"),e2.isSafari=/^((?!chrome|android).)*safari/i.test(i2),e2.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s2),e2.isWindows=["Windows","Win16","Win32","WinCE"].includes(s2),e2.isLinux=s2.indexOf("Linux")>=0,e2.isChromeOS=/\bCrOS\b/.test(i2)},930(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.DebouncedIdleTask=e2.IdleTaskQueue=e2.PriorityTaskQueue=void 0;class i2{constructor(t3){;this._tasks=[],this._i=0,this._logService=t3}enqueue(t3){;this._tasks.push(t3),this._start()}flush(){for(;this._ii3)return r-e3<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e3))}ms`),void this._start();r=i3}this.clear()}}class s2 extends i2{_requestCallback(t3){return setTimeout(()=>t3(this._createDeadline(16)))}_cancelCallback(t3){clearTimeout(t3)}_createDeadline(t3){const e3=performance.now()+t3;return{timeRemaining:()=>Math.max(0,e3-performance.now())}}};e2.PriorityTaskQueue=s2,e2.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i2{_requestCallback(t3){return requestIdleCallback(t3)}_cancelCallback(t3){cancelIdleCallback(t3)}}:s2,e2.DebouncedIdleTask=class{constructor(t3){this._queue=new e2.IdleTaskQueue(t3)}set(t3){;this._queue.clear(),this._queue.enqueue(t3)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},917(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.ExtendedAttrs=e2.AttributeData=void 0;class i2{constructor(){;this.fg=0,this.bg=0,this.extended=new s2}static toColorRGB(t3){return[t3>>>16&255,t3>>>8&255,255&t3]}static fromColorRGB(t3){return(255&t3[0])<<16|(255&t3[1])<<8|255&t3[2]}clone(){const t3=new i2;return t3.fg=this.fg,t3.bg=this.bg,t3.extended=this.extended.clone(),t3}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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}e2.AttributeData=i2;class s2{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(t3){this._ext=t3}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(t3){;this._ext&=-469762049,this._ext|=t3<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(t3){;this._ext&=-67108864,this._ext|=67108863&t3}get urlId(){return this._urlId}set urlId(t3){this._urlId=t3}get underlineVariantOffset(){const t3=(3758096384&this._ext)>>29;return t3<0?4294967288^t3:t3}set underlineVariantOffset(t3){;this._ext&=536870911,this._ext|=t3<<29&3758096384}constructor(t3=0,e3=0){;this._ext=0,this._urlId=0,this._ext=t3,this._urlId=e3}clone(){return new s2(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}e2.ExtendedAttrs=s2},721(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.CellData=void 0;const s2=i2(348),r=i2(564),a=i2(917);class o extends a.AttributeData{constructor(){;super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new a.ExtendedAttrs,this.combinedData=""}static fromCharData(t3){const e3=new o;return e3.setFromCharData(t3),e3}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s2.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(t3){;this.fg=t3[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let e3=false;if(t3[r.CHAR_DATA_CHAR_INDEX].length>2)e3=true;else if(2===t3[r.CHAR_DATA_CHAR_INDEX].length){const i3=t3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i3&&i3<=56319){const s3=t3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s3&&s3<=57343?this.content=1024*(i3-55296)+s3-56320+65536|t3[r.CHAR_DATA_WIDTH_INDEX]<<22:e3=true}else e3=true}else this.content=t3[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t3[r.CHAR_DATA_WIDTH_INDEX]<<22;e3&&(this.combinedData=t3[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|t3[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t3){if(this.getFgColorMode()!==t3.getFgColorMode()||this.getFgColor()!==t3.getFgColor())return false;if(this.getBgColorMode()!==t3.getBgColorMode()||this.getBgColor()!==t3.getBgColor())return false;if(this.isInverse()!==t3.isInverse())return false;if(this.isBold()!==t3.isBold())return false;if(this.isUnderline()!==t3.isUnderline())return false;if(this.isUnderline()){if(this.getUnderlineStyle()!==t3.getUnderlineStyle())return false;const e3=this.isUnderlineColorDefault(),i3=t3.isUnderlineColorDefault();if(!e3||!i3){if(e3!==i3)return false;if(this.getUnderlineColor()!==t3.getUnderlineColor())return false;if(this.getUnderlineColorMode()!==t3.getUnderlineColorMode())return false}}return this.isOverline()===t3.isOverline()&&this.isBlink()===t3.isBlink()&&this.isInvisible()===t3.isInvisible()&&this.isItalic()===t3.isItalic()&&this.isDim()===t3.isDim()&&this.isStrikethrough()===t3.isStrikethrough()}}e2.CellData=o},564(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.WHITESPACE_CELL_CODE=e2.WHITESPACE_CELL_WIDTH=e2.WHITESPACE_CELL_CHAR=e2.NULL_CELL_CODE=e2.NULL_CELL_WIDTH=e2.NULL_CELL_CHAR=e2.CHAR_DATA_CODE_INDEX=e2.CHAR_DATA_WIDTH_INDEX=e2.CHAR_DATA_CHAR_INDEX=e2.CHAR_DATA_ATTR_INDEX=e2.DEFAULT_EXT=e2.DEFAULT_ATTR=e2.DEFAULT_COLOR=void 0,e2.DEFAULT_COLOR=0,e2.DEFAULT_ATTR=e2.DEFAULT_COLOR<<9|256,e2.DEFAULT_EXT=0,e2.CHAR_DATA_ATTR_INDEX=0,e2.CHAR_DATA_CHAR_INDEX=1,e2.CHAR_DATA_WIDTH_INDEX=2,e2.CHAR_DATA_CODE_INDEX=3,e2.NULL_CELL_CHAR="",e2.NULL_CELL_WIDTH=1,e2.NULL_CELL_CODE=0,e2.WHITESPACE_CELL_CHAR=" ",e2.WHITESPACE_CELL_WIDTH=1,e2.WHITESPACE_CELL_CODE=32},348(t2,e2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.Utf8ToUtf32=e2.StringToUtf32=void 0,e2.stringFromCodePoint=function(t3){return t3>65535?(t3-=65536,String.fromCharCode(55296+(t3>>10))+String.fromCharCode(t3%1024+56320)):String.fromCharCode(t3)},e2.utf32ToString=function(t3,e3=0,i2=t3.length){let s2="";for(let r=e3;r65535?(e4-=65536,s2+=String.fromCharCode(55296+(e4>>10))+String.fromCharCode(e4%1024+56320)):s2+=String.fromCharCode(e4)}return s2},e2.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t3,e3){const i2=t3.length;if(!i2)return 0;let s2=0,r=0;if(this._interim){const i3=t3.charCodeAt(r++);56320<=i3&&i3<=57343?e3[s2++]=1024*(this._interim-55296)+i3-56320+65536:(e3[s2++]=this._interim,e3[s2++]=i3),this._interim=0}for(let a=r;a=i2)return this._interim=r2,s2;const o=t3.charCodeAt(a);56320<=o&&o<=57343?e3[s2++]=1024*(r2-55296)+o-56320+65536:(e3[s2++]=r2,e3[s2++]=o);continue}65279!==r2&&(e3[s2++]=r2)}return s2}},e2.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t3,e3){const i2=t3.length;if(!i2)return 0;let s2,r,a,o,n,L=0,h=0;if(this.interim[0]){let s3=false,r2=this.interim[0];r2&=192==(224&r2)?31:224==(240&r2)?15:7;let a2,o2=0;for(;(a2=this.interim[++o2])&&o2<4;)r2<<=6,r2|=63&a2;const n2=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,T2=n2-o2;for(;h=i2)return 0;if(a2=t3[h++],128!=(192&a2)){;h--,s3=true;break};this.interim[o2++]=a2,r2<<=6,r2|=63&a2};s3||(2===n2?r2<128?h--:e3[L++]=r2:3===n2?r2<2048||r2>=55296&&r2<=57343||65279===r2||(e3[L++]=r2):r2<65536||r2>1114111||(e3[L++]=r2)),this.interim.fill(0)}const T=i2-4;let l=h;for(;l=i2)return this.interim[0]=s2,L;if(r=t3[l++],128!=(192&r)){l--;continue}if(n=(31&s2)<<6|63&r,n<128){l--;continue}e3[L++]=n}else if(224==(240&s2)){if(l>=i2)return this.interim[0]=s2,L;if(r=t3[l++],128!=(192&r)){l--;continue}if(l>=i2)return this.interim[0]=s2,this.interim[1]=r,L;if(a=t3[l++],128!=(192&a)){l--;continue}if(n=(15&s2)<<12|(63&r)<<6|63&a,n<2048||n>=55296&&n<=57343||65279===n)continue;e3[L++]=n}else if(240==(248&s2)){if(l>=i2)return this.interim[0]=s2,L;if(r=t3[l++],128!=(192&r)){l--;continue}if(l>=i2)return this.interim[0]=s2,this.interim[1]=r,L;if(a=t3[l++],128!=(192&a)){l--;continue}if(l>=i2)return this.interim[0]=s2,this.interim[1]=r,this.interim[2]=a,L;if(o=t3[l++],128!=(192&o)){l--;continue}if(n=(7&s2)<<18|(63&r)<<12|(63&a)<<6|63&o,n<65536||n>1114111)continue;e3[L++]=n}}return L}}},864(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.CellColorResolver=void 0;const s2=i2(564),r=i2(993),a=i2(959),o=i2(915);let n,L=0,h=0,T=false,l=false,d=false,c=0;e2.CellColorResolver=class{constructor(t3,e3,i3,s3,r2,a2){;this._terminal=t3,this._optionService=e3,this._selectionRenderModel=i3,this._decorationService=s3,this._coreBrowserService=r2,this._themeService=a2,this.result={fg:0,bg:0,ext:0}}resolve(t3,e3,i3,_,Q){;this.result.bg=t3.bg,this.result.fg=t3.fg,this.result.ext=268435456&t3.bg?t3.extended.ext:0,h=0,L=0,l=false,T=false,d=false,n=this._themeService.colors,c=0;const u=t3.getCode();if(u!==s2.NULL_CELL_CODE&&4===t3.extended.underlineStyle){const t4=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));c=e3*_%(2*Math.round(t4))}if(0===c&&o.blockPatternCodepoints.has(u)&&(c=e3*_%2*2+i3*Q%2),this._decorationService.forEachDecorationAtCell(e3,i3,"bottom",t4=>{;t4.backgroundColorRGB&&(h=t4.backgroundColorRGB.rgba>>8&16777215,l=true),t4.foregroundColorRGB&&(L=t4.foregroundColorRGB.rgba>>8&16777215,T=true)}),d=this._selectionRenderModel.isCellSelected(this._terminal,e3,i3),d){if(67108864&this.result.fg||50331648&this.result.bg){if(67108864&this.result.fg)switch(50331648&this.result.fg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:h=(16777215&this.result.fg)<<8|255;break;default:h=this._themeService.colors.foreground.rgba}else switch(50331648&this.result.bg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:h=(16777215&this.result.bg)<<8|255}h=r.rgba.blend(h,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}else h=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(l=true,n.selectionForeground&&(L=n.selectionForeground.rgba>>8&16777215,T=true),(0,a.treatGlyphAsBackgroundColor)(t3.getCode())){if(67108864&this.result.fg&&!(50331648&this.result.bg))L=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(67108864&this.result.fg)switch(50331648&this.result.bg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:L=(16777215&this.result.bg)<<8|255}else switch(50331648&this.result.fg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:L=(16777215&this.result.fg)<<8|255;break;default:L=this._themeService.colors.foreground.rgba}L=r.rgba.blend(L,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}T=true}};this._decorationService.forEachDecorationAtCell(e3,i3,"top",t4=>{;t4.backgroundColorRGB&&(h=t4.backgroundColorRGB.rgba>>8&16777215,l=true),t4.foregroundColorRGB&&(L=t4.foregroundColorRGB.rgba>>8&16777215,T=true)}),l&&(h=d?-16777216&t3.bg&-134217729|h|50331648:-16777216&t3.bg|h|50331648),T&&(L=-16777216&t3.fg&-67108865|L|50331648),67108864&this.result.fg&&(l&&!T&&(L=50331648&this.result.bg?-134217728&this.result.fg|67108863&this.result.bg:-134217728&this.result.fg|16777215&n.background.rgba>>8|50331648,T=true),!l&&T&&(h=50331648&this.result.fg?-67108864&this.result.bg|67108863&this.result.fg:-67108864&this.result.bg|16777215&n.foreground.rgba>>8|50331648,l=true)),n=void 0,this.result.bg=l?h:this.result.bg,this.result.fg=T?L:this.result.fg,this.result.ext&=536870911,this.result.ext|=c<<29&3758096384}}},670(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.acquireTextureAtlas=function(t3,e3,i3,o,n,L,h,T,l,d=true){const c=(0,r.generateConfig)(o,n,L,h,e3,i3,T,l,d);for(let e4=0;e4=0){if((0,r.configEquals)(i4.config,c))return i4.atlas;1===i4.ownedBy.length?(i4.atlas.dispose(),a.splice(e4,1)):i4.ownedBy.splice(s3,1);break}}for(let e4=0;e4{;this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(t3=600){;this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){const t4=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t4>0)return void this._restartInterval(t4)};this.isCursorVisible=false,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{;this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){const t4=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(t4)};this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{;this._renderCallback(),this._animationFrame=void 0})},600)},t3)}pause(){;this.isCursorVisible=true,this._isIdlePaused=false,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){;this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){;this._isIdlePaused=false,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){;this.isCursorVisible=true,this._isIdlePaused=true,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}}},697(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.observeDevicePixelDimensions=function(t3,e3,i3){let r=new e3.ResizeObserver(e4=>{const s3=e4.find(e5=>e5.target===t3);if(!s3)return;if(!("devicePixelContentBoxSize"in s3))return r?.disconnect(),void(r=void 0);const a=s3.devicePixelContentBoxSize[0].inlineSize,o=s3.devicePixelContentBoxSize[0].blockSize;a>0&&o>0&&i3(a,o)});try{r.observe(t3,{box:["device-pixel-content-box"]})}catch{;r.disconnect(),r=void 0}return(0,s2.toDisposable)(()=>r?.disconnect())};const s2=i2(426)},28(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.GlyphRenderer=void 0;const s2=i2(115),r=i2(564),a=i2(426),o=i2(719),n=i2(959);let L,h=0,T=0,l=0;class d extends a.Disposable{constructor(t3,e3,i3,r2,L2){;super(),this._terminal=t3,this._gl=e3,this._dimensions=i3,this._optionsService=r2,this._logService=L2,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const h2=this._gl;void 0===s2.TextureAtlas.maxAtlasPages&&(s2.TextureAtlas.maxAtlasPages=Math.min(32,(0,n.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_IMAGE_UNITS))),s2.TextureAtlas.maxTextureSize=(0,n.throwIfFalsy)(h2.getParameter(h2.MAX_TEXTURE_SIZE))),this._program=(0,n.throwIfFalsy)((0,o.createProgram)(h2,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",(function(t4){let e4="";for(let i4=1;i4h2.deleteProgram(this._program))),this._projectionLocation=(0,n.throwIfFalsy)(h2.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,n.throwIfFalsy)(h2.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,n.throwIfFalsy)(h2.getUniformLocation(this._program,"u_texture"));const T2=this._vertexArrayObject=h2.createVertexArray();this._register((0,a.toDisposable)(()=>h2.deleteVertexArray(T2))),h2.bindVertexArray(T2);const l2=new Float32Array([0,0,1,0,0,1,1,1]),d2=h2.createBuffer();this._register((0,a.toDisposable)(()=>h2.deleteBuffer(d2))),h2.bindBuffer(h2.ARRAY_BUFFER,d2),h2.bufferData(h2.ARRAY_BUFFER,l2,h2.STATIC_DRAW),h2.enableVertexAttribArray(0),h2.vertexAttribPointer(0,2,this._gl.FLOAT,false,0,0);const c=new Uint8Array([0,1,2,3]),_=h2.createBuffer();this._register((0,a.toDisposable)(()=>h2.deleteBuffer(_))),h2.bindBuffer(h2.ELEMENT_ARRAY_BUFFER,_),h2.bufferData(h2.ELEMENT_ARRAY_BUFFER,c,h2.STATIC_DRAW),this._attributesBuffer=(0,n.throwIfFalsy)(h2.createBuffer()),this._register((0,a.toDisposable)(()=>h2.deleteBuffer(this._attributesBuffer))),h2.bindBuffer(h2.ARRAY_BUFFER,this._attributesBuffer),h2.enableVertexAttribArray(2),h2.vertexAttribPointer(2,2,h2.FLOAT,false,44,0),h2.vertexAttribDivisor(2,1),h2.enableVertexAttribArray(3),h2.vertexAttribPointer(3,2,h2.FLOAT,false,44,2*Float32Array.BYTES_PER_ELEMENT),h2.vertexAttribDivisor(3,1),h2.enableVertexAttribArray(4),h2.vertexAttribPointer(4,1,h2.FLOAT,false,44,4*Float32Array.BYTES_PER_ELEMENT),h2.vertexAttribDivisor(4,1),h2.enableVertexAttribArray(5),h2.vertexAttribPointer(5,2,h2.FLOAT,false,44,5*Float32Array.BYTES_PER_ELEMENT),h2.vertexAttribDivisor(5,1),h2.enableVertexAttribArray(6),h2.vertexAttribPointer(6,2,h2.FLOAT,false,44,7*Float32Array.BYTES_PER_ELEMENT),h2.vertexAttribDivisor(6,1),h2.enableVertexAttribArray(1),h2.vertexAttribPointer(1,2,h2.FLOAT,false,44,9*Float32Array.BYTES_PER_ELEMENT),h2.vertexAttribDivisor(1,1),h2.useProgram(this._program);const Q=new Int32Array(s2.TextureAtlas.maxAtlasPages);for(let t4=0;t4h2.deleteTexture(e4.texture))),h2.activeTexture(h2.TEXTURE0+t4),h2.bindTexture(h2.TEXTURE_2D,e4.texture),h2.texParameteri(h2.TEXTURE_2D,h2.TEXTURE_WRAP_S,h2.CLAMP_TO_EDGE),h2.texParameteri(h2.TEXTURE_2D,h2.TEXTURE_WRAP_T,h2.CLAMP_TO_EDGE),h2.texImage2D(h2.TEXTURE_2D,0,h2.RGBA,1,1,0,h2.RGBA,h2.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[t4]=e4};h2.enable(h2.BLEND),h2.blendFunc(h2.SRC_ALPHA,h2.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){if(!this._atlas)return true;const _g=this._atlas._clearModelGeneration||0;return this._lastSeenClearModelGeneration!==_g&&(this._lastSeenClearModelGeneration=_g,true)}updateCell(t3,e3,i3,s3,r2,a2,o2,n2,L2){this._updateCell(this._vertices.attributes,t3,e3,i3,s3,r2,a2,o2,n2,L2)}_updateCell(t3,e3,i3,s3,a2,o2,d2,c,_,Q){;h=11*(i3*this._terminal.cols+e3),s3!==r.NULL_CELL_CODE&&void 0!==s3?this._atlas&&(L=c&&c.length>1?this._atlas.getRasterizedGlyphCombinedChar(c,a2,o2,d2,false,this._terminal.element):this._atlas.getRasterizedGlyph(s3,a2,o2,d2,false,this._terminal.element),T=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),a2!==Q&&L.offset.x>T?(l=L.offset.x-T,t3[h]=-(L.offset.x-l)+this._dimensions.device.char.left,t3[h+1]=-L.offset.y+this._dimensions.device.char.top,t3[h+2]=(L.size.x-l)/this._dimensions.device.canvas.width,t3[h+3]=L.size.y/this._dimensions.device.canvas.height,t3[h+4]=L.texturePage,t3[h+5]=L.texturePositionClipSpace.x+l/this._atlas.pages[L.texturePage].canvas.width,t3[h+6]=L.texturePositionClipSpace.y,t3[h+7]=L.sizeClipSpace.x-l/this._atlas.pages[L.texturePage].canvas.width,t3[h+8]=L.sizeClipSpace.y):(t3[h]=-L.offset.x+this._dimensions.device.char.left,t3[h+1]=-L.offset.y+this._dimensions.device.char.top,t3[h+2]=L.size.x/this._dimensions.device.canvas.width,t3[h+3]=L.size.y/this._dimensions.device.canvas.height,t3[h+4]=L.texturePage,t3[h+5]=L.texturePositionClipSpace.x,t3[h+6]=L.texturePositionClipSpace.y,t3[h+7]=L.sizeClipSpace.x,t3[h+8]=L.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&(0,n.allowRescaling)(s3,_,L.size.x,this._dimensions.device.cell.width)&&(t3[h+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width)):t3.fill(0,h,h+11-1-2)}clear(){const t3=this._terminal,e3=t3.cols*t3.rows*11;this._vertices.count!==e3?this._vertices.attributes=new Float32Array(e3):this._vertices.attributes.fill(0);let i3=0;for(;i3this._atlasTextures.length&&!this._pageOverflowWarned&&(this._pageOverflowWarned=true,console.warn("xterm webgl: atlas page count ("+this._atlas.pages.length+") exceeds the renderer texture capacity ("+this._atlasTextures.length+"), some glyphs will not render correctly"));for(let t4=0;t4T2.deleteProgram(this._program))),this._projectionLocation=(0,a.throwIfFalsy)(T2.getUniformLocation(this._program,"u_projection"));const l2=this._vertexArrayObject=T2.createVertexArray();this._register((0,s2.toDisposable)(()=>T2.deleteVertexArray(l2))),T2.bindVertexArray(l2);const d2=new Float32Array([0,0,1,0,0,1,1,1]),c2=T2.createBuffer();this._register((0,s2.toDisposable)(()=>T2.deleteBuffer(c2))),T2.bindBuffer(T2.ARRAY_BUFFER,c2),T2.bufferData(T2.ARRAY_BUFFER,d2,T2.STATIC_DRAW),T2.enableVertexAttribArray(3),T2.vertexAttribPointer(3,2,this._gl.FLOAT,false,0,0);const _2=new Uint8Array([0,1,2,3]),Q2=T2.createBuffer();this._register((0,s2.toDisposable)(()=>T2.deleteBuffer(Q2))),T2.bindBuffer(T2.ELEMENT_ARRAY_BUFFER,Q2),T2.bufferData(T2.ELEMENT_ARRAY_BUFFER,_2,T2.STATIC_DRAW),this._attributesBuffer=(0,a.throwIfFalsy)(T2.createBuffer()),this._register((0,s2.toDisposable)(()=>T2.deleteBuffer(this._attributesBuffer))),T2.bindBuffer(T2.ARRAY_BUFFER,this._attributesBuffer),T2.enableVertexAttribArray(0),T2.vertexAttribPointer(0,2,T2.FLOAT,false,o,0),T2.vertexAttribDivisor(0,1),T2.enableVertexAttribArray(1),T2.vertexAttribPointer(1,2,T2.FLOAT,false,o,2*Float32Array.BYTES_PER_ELEMENT),T2.vertexAttribDivisor(1,1),T2.enableVertexAttribArray(2),T2.vertexAttribPointer(2,4,T2.FLOAT,false,o,4*Float32Array.BYTES_PER_ELEMENT),T2.vertexAttribDivisor(2,1),this._updateCachedColors(L2.colors),this._register(this._themeService.onChangeColors(t4=>{;this._updateCachedColors(t4),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t3){const e3=this._gl;e3.useProgram(this._program),e3.bindVertexArray(this._vertexArrayObject),e3.uniformMatrix4fv(this._projectionLocation,false,r.PROJECTION_MATRIX),e3.bindBuffer(e3.ARRAY_BUFFER,this._attributesBuffer),e3.bufferData(e3.ARRAY_BUFFER,t3.attributes,e3.DYNAMIC_DRAW),e3.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,e3.UNSIGNED_BYTE,0,t3.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t3){this._dimensions=t3}_updateCachedColors(t3){;this._bgFloat=this._colorToFloat32Array(t3.background),this._cursorFloat=this._colorToFloat32Array(t3.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t3){const e3=this._terminal,i3=this._vertices;let s3,r2,a2,o2,n2,L2,h2,T2,l2,d2,c2,_2=1;for(s3=0;s3>24&255)/255,d=(L>>16&255)/255,c=(L>>8&255)/255,_=1,this._addRectangle(t3.attributes,e3,h,T,(o2-a2)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,l,d,c,_)}_addRectangle(t3,e3,i3,s3,r2,a2,o2,n2,L2,h2){;t3[e3]=i3/this._dimensions.device.canvas.width,t3[e3+1]=s3/this._dimensions.device.canvas.height,t3[e3+2]=r2/this._dimensions.device.canvas.width,t3[e3+3]=a2/this._dimensions.device.canvas.height,t3[e3+4]=o2,t3[e3+5]=n2,t3[e3+6]=L2,t3[e3+7]=h2}_addRectangleFloat(t3,e3,i3,s3,r2,a2,o2){;t3[e3]=i3/this._dimensions.device.canvas.width,t3[e3+1]=s3/this._dimensions.device.canvas.height,t3[e3+2]=r2/this._dimensions.device.canvas.width,t3[e3+3]=a2/this._dimensions.device.canvas.height,t3[e3+4]=o2[0],t3[e3+5]=o2[1],t3[e3+6]=o2[2],t3[e3+7]=o2[3]}_colorToFloat32Array(t3){return new Float32Array([(t3.rgba>>24&255)/255,(t3.rgba>>16&255)/255,(t3.rgba>>8&255)/255,(255&t3.rgba)/255])}}e2.RectangleRenderer=Q},208(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.RenderModel=e2.COMBINED_CHAR_BIT_MASK=void 0;const s2=i2(948);e2.COMBINED_CHAR_BIT_MASK=2147483648,e2.RenderModel=class{constructor(){;this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s2.createSelectionRenderModel)()}resize(t3,e3){const i3=t3*e3*4;i3!==this.cells.length&&(this.cells=new Uint32Array(i3),this.lineLengths=new Uint32Array(e3))}clear(){;this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},115(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.TextureAtlas=void 0;const s2=i2(0),r=i2(183),a=i2(959),o=i2(993),n=i2(836),L=i2(930),h=i2(917),T=i2(564),l=i2(414),d={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let c;class _{get pages(){return this._pages}constructor(t3,e3,i3,s3){;this._document=t3,this._config=e3,this._unicodeService=i3,this._logService=s3,this._didWarmUp=false,this._cacheMap=new n.FourKeyMap,this._cacheMapCombined=new n.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new h.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new l.Emitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new l.Emitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=false,this._clearModelGeneration=0,this._createNewPage(),this._tmpCanvas=p(t3,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,a.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:true}))}dispose(){this._tmpCanvas.remove();for(const t3 of this.pages)t3.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=true)}_doWarmUp(){const t3=new L.IdleTaskQueue(this._logService);for(let e3=33;e3<126;e3++)t3.enqueue(()=>{if(!this._cacheMap.get(e3,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT)){const t4=this._drawToCache(e3,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,false,void 0);this._cacheMap.set(e3,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,t4)}})}beginFrame(){const t3=this._requestClearModel;return this._requestClearModel=false,t3}clearTexture(){if(this._pages.some(t3=>t3._glyphs.length>0||0!==t3.currentRow.x||0!==t3.currentRow.y)){this._evictAllPages();this._createNewPage()}}_evictAllPages(){for(const t3 of this._pages)this._onRemoveTextureAtlasCanvas.fire(t3.canvas),t3.canvas.remove();this._pages.length=0,this._activePages.length=0,this._overflowSizePage=void 0,this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=false,this._requestClearModel=true,this._clearModelGeneration++}_createNewPage(){if(_.maxAtlasPages&&this._pages.length>=_.maxAtlasPages){const t4=this._pages.filter(t5=>2*t5.canvas.width<=(_.maxTextureSize||4096)).sort((t5,e4)=>e4.canvas.width!==t5.canvas.width?e4.canvas.width-t5.canvas.width:e4.percentageUsed-t5.percentageUsed);let e3=-1,i3=0;for(let s4=0;s4t5.canvas.width!==s3[0].canvas.width))this._evictAllPages();else{const r2=s3.map(t5=>t5.glyphs[0].texturePage).sort((t5,e4)=>t5-e4),a2=this.pages.length-s3.length,o2=this._mergePages(s3,a2);o2.version=++Q.nextVersion;for(let t5=r2.length-1;t5>=0;t5--)this._deletePage(r2[t5]);this.pages.push(o2),this._requestClearModel=true,this._clearModelGeneration++,this._onAddTextureAtlasCanvas.fire(o2.canvas)}}const t3=new Q(this._document,this._textureSize);return this._pages.push(t3),this._activePages.push(t3),this._onAddTextureAtlasCanvas.fire(t3.canvas),t3}_mergePages(t3,e3){const i3=2*t3[0].canvas.width,s3=new Q(this._document,i3,t3);for(const[r2,a2]of t3.entries()){const t4=r2*a2.canvas.width%i3,o2=Math.floor(r2/2)*a2.canvas.height;s3.ctx.drawImage(a2.canvas,t4,o2);for(const s4 of a2.glyphs)s4.texturePage=e3,s4.sizeClipSpace.x=s4.size.x/i3,s4.sizeClipSpace.y=s4.size.y/i3,s4.texturePosition.x+=t4,s4.texturePosition.y+=o2,s4.texturePositionClipSpace.x=s4.texturePosition.x/i3,s4.texturePositionClipSpace.y=s4.texturePosition.y/i3;this._onRemoveTextureAtlasCanvas.fire(a2.canvas);const n2=this._activePages.indexOf(a2);-1!==n2&&this._activePages.splice(n2,1)}return s3}_deletePage(t3){this._pages.splice(t3,1);for(let e3=t3;e3=this._config.colors.ansi.length)throw new Error("No color found for idx "+t3);return this._config.colors.ansi[t3]}_getBackgroundColor(t3,e3,i3,s3){if(this._config.allowTransparency)return o.NULL_COLOR;let r2;switch(t3){case 16777216:case 33554432:r2=this._getColorFromAnsiIndex(e3);break;case 50331648:const t4=h.AttributeData.toColorRGB(e3);r2=o.channels.toColor(t4[0],t4[1],t4[2]);break;default:r2=i3?o.color.opaque(this._config.colors.foreground):this._config.colors.background}return this._config.allowTransparency||(r2=o.color.opaque(r2)),r2}_getForegroundColor(t3,e3,i3,r2,a2,n2,L2,T2,l2,d2){const c2=this._getMinimumContrastColor(t3,e3,i3,r2,a2,n2,L2,l2,T2,d2);if(c2)return c2;let _2;switch(a2){case 16777216:case 33554432:;this._config.drawBoldTextInBrightColors&&l2&&n2<8&&(n2+=8),_2=this._getColorFromAnsiIndex(n2);break;case 50331648:const t4=h.AttributeData.toColorRGB(n2);_2=o.channels.toColor(t4[0],t4[1],t4[2]);break;default:_2=L2?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(_2=o.color.opaque(_2)),T2&&(_2=o.color.multiplyOpacity(_2,s2.DIM_OPACITY)),_2}_resolveBackgroundRgba(t3,e3,i3){switch(t3){case 16777216:case 33554432:return this._getColorFromAnsiIndex(e3).rgba;case 50331648:return e3<<8;default:return i3?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(t3,e3,i3,s3){switch(t3){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s3&&e3<8&&(e3+=8),this._getColorFromAnsiIndex(e3).rgba;case 50331648:return e3<<8;default:return i3?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(t3,e3,i3,s3,r2,a2,n2,L2,h2,T2){if(1===this._config.minimumContrastRatio||T2)return;const l2=this._getContrastCache(h2),d2=l2.getColor(t3,s3);if(void 0!==d2)return d2??void 0;const c2=this._resolveBackgroundRgba(e3,i3,n2),_2=this._resolveForegroundRgba(r2,a2,n2,L2),Q2=o.rgba.ensureContrastRatio(c2,_2,this._config.minimumContrastRatio/(h2?2:1));if(!Q2)return void l2.setColor(t3,s3,null);const u2=o.channels.toColor(Q2>>24&255,Q2>>16&255,Q2>>8&255);return l2.setColor(t3,s3,u2),u2}_getContrastCache(t3){return t3?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(t3,e3,i3,o2,n2,L2){const T2="number"==typeof t3?String.fromCharCode(t3):t3;L2&&this._tmpCanvas.parentElement!==L2&&(this._tmpCanvas.style.display="none",L2.append(this._tmpCanvas));const l2=Math.min(this._config.deviceCellWidth*Math.max(T2.length,2)+4,this._config.deviceMaxTextureSize);this._tmpCanvas.width{orcaProbeWeight=String(orcaProbeWeight);let orcaActualWeightToken=this._tmpCtx.font.match(/(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/)?.[1]??"400",orcaActualWeight=orcaActualWeightToken==="normal"?"400":orcaActualWeightToken==="bold"?"700":orcaActualWeightToken;if(/^(?:[1-8]\d{2}|900)$/.test(orcaProbeWeight)&&orcaActualWeight!==orcaProbeWeight){this.fontProbeMismatchCount=(this.fontProbeMismatchCount||0)+1;this.fontProbeLastMismatch={desired:orcaProbeWeight,actual:this._tmpCtx.font};try{globalThis.__orcaAtlasFontProbe&&globalThis.__orcaAtlasFontProbe(this.fontProbeLastMismatch)}catch(orcaFontProbeError){}}})(R),this._tmpCtx.textBaseline=s2.TEXT_BASELINE;const A=1===T2.length&&(0,a.isPowerlineGlyph)(T2.charCodeAt(0)),Z=1===T2.length&&(0,a.isRestrictedPowerlineGlyph)(T2.charCodeAt(0)),D=this._getForegroundColor(e3,b,x,i3,w,m,g,M,p2,(0,a.treatGlyphAsBackgroundColor)(T2.charCodeAt(0)));this._tmpCtx.fillStyle=D.css;const S=Z?0:4;let O=false;if(false!==this._config.customGlyphs){const t4=this._workAttributeData.getUnderlineVariantOffset();O=(0,r.tryDrawCustomGlyph)(this._tmpCtx,T2,S,S,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.deviceCharWidth,this._config.deviceCharHeight,this._config.fontSize,this._config.devicePixelRatio,this._logService,E.css,t4)}let I,W=!A;if(I="number"==typeof t3?this._unicodeService.wcwidth(t3):this._unicodeService.getStringCellWidth(t3),v){this._tmpCtx.save();const t4=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),e4=t4%2==1?.5:0;if(this._tmpCtx.lineWidth=t4,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())W=false,this._tmpCtx.strokeStyle=`rgb(${h.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{W=false;let t5=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&t5<8&&(t5+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(t5).css};this._tmpCtx.fillStyle=this._tmpCtx.strokeStyle,this._tmpCtx.beginPath();const i4=S,s3=Math.ceil(S+this._config.deviceCharHeight)-e4-(n2?2*t4:0),r2=s3+2*t4;let o3=this._workAttributeData.getUnderlineVariantOffset(),L3=0,l3=0;for(let e5=0;e5=t4?2*t4-o3:t4-o3;false==!(o3>=t4)||0===_2?(this._tmpCtx.setLineDash([Math.round(t4),Math.round(t4)]),this._tmpCtx.moveTo(h2+_2,s3),this._tmpCtx.lineTo(T3,s3)):(this._tmpCtx.setLineDash([Math.round(t4),Math.round(t4)]),this._tmpCtx.moveTo(h2,s3),this._tmpCtx.lineTo(h2+_2,s3),this._tmpCtx.moveTo(h2+_2+t4,s3),this._tmpCtx.lineTo(T3,s3)),o3=(0,a.computeNextVariantOffset)(T3-h2,t4,o3);break;case 5:const Q2=.6,u2=.3,p3=T3-h2,g2=Math.floor(Q2*p3),M2=Math.floor(u2*p3),y2=p3-g2-M2;this._tmpCtx.setLineDash([g2,M2,y2]),this._tmpCtx.moveTo(h2,s3),this._tmpCtx.lineTo(T3,s3);break;default:;this._tmpCtx.moveTo(h2,s3),this._tmpCtx.lineTo(T3,s3)};n3||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!O&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==T2){;this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const e5=this._tmpCtx.measureText(T2);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in e5&&e5.actualBoundingBoxDescent>0){this._tmpCtx.save();const e6=new Path2D;e6.rect(i4,L3-Math.ceil(t4/2),this._config.deviceCellWidth*I,l3-L3+Math.ceil(t4/2)),this._tmpCtx.clip(e6),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=E.css,this._tmpCtx.strokeText(T2,S,S+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(C){const t4=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),e4=t4%2==1?.5:0;this._tmpCtx.lineWidth=t4,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+e4),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+e4),this._tmpCtx.stroke()}if(O||this._tmpCtx.fillText(T2,S,S+this._config.deviceCharHeight),"_"===T2&&!this._config.allowTransparency){let t4=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W);if(t4)for(let e4=1;e4<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=E.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(T2,S,S+this._config.deviceCharHeight-e4),t4=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W),t4);e4++);}if(f){const t4=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),e4=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=t4,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+Math.floor(this._config.deviceCharHeight/2)-e4),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+Math.floor(this._config.deviceCharHeight/2)-e4),this._tmpCtx.stroke()}this._tmpCtx.restore();const N=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let P;if(P=this._config.allowTransparency?(function(t4){for(let e4=0;e40)return false;return true})(N):u(N,E,D,W),P)return d;const B=this._findGlyphBoundingBox(N,this._workBoundingBox,l2,Z,O,S);let $,F;for(;;){if(0===this._activePages.length){const t4=this._createNewPage();$=t4,F=t4.currentRow,F.height=B.size.y;break};$=this._activePages[this._activePages.length-1],F=$.currentRow;for(const t4 of this._activePages)B.size.y<=t4.currentRow.height&&($=t4,F=t4.currentRow);for(let t4=this._activePages.length-1;t4>=0;t4--)for(const e4 of this._activePages[t4].fixedRows)e4.height<=F.height&&B.size.y<=e4.height&&($=this._activePages[t4],F=e4);if(B.size.x>this._textureSize){;this._overflowSizePage||(_.maxAtlasPages&&this._pages.length>=_.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new Q(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._requestClearModel=true,this._clearModelGeneration++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),$=this._overflowSizePage,F=this._overflowSizePage.currentRow,F.x+B.size.x>=$.canvas.width&&(F.x=0,F.y+=F.height,F.height=0);break}if(F.y+B.size.y>=$.canvas.height||F.height>B.size.y+2){let t4=false;if($.currentRow.y+$.currentRow.height+B.size.y>=$.canvas.height){let e4;for(const t5 of this._activePages)if(t5.currentRow.y+t5.currentRow.height+B.size.y=_.maxAtlasPages&&F.y+B.size.y<=$.canvas.height&&F.height>=B.size.y&&F.x+B.size.x<=$.canvas.width)t4=true;else{const e5=this._createNewPage();$=e5,F=e5.currentRow,F.height=B.size.y,t4=true}}t4||($.currentRow.height>0&&$.fixedRows.push($.currentRow),F={x:0,y:$.currentRow.y+$.currentRow.height,height:B.size.y},$.fixedRows.push(F),$.currentRow={x:0,y:F.y+F.height,height:0})}if(F.x+B.size.x<=$.canvas.width)break;F===$.currentRow?(F.x=0,F.y+=F.height,F.height=0):$.fixedRows.splice($.fixedRows.indexOf(F),1)}return B.texturePage=this._pages.indexOf($),B.texturePosition.x=F.x,B.texturePosition.y=F.y,B.texturePositionClipSpace.x=F.x/$.canvas.width,B.texturePositionClipSpace.y=F.y/$.canvas.height,B.sizeClipSpace.x/=$.canvas.width,B.sizeClipSpace.y/=$.canvas.height,F.height=Math.max(F.height,B.size.y),F.x+=B.size.x,$.ctx.putImageData(N,B.texturePosition.x-this._workBoundingBox.left,B.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,B.size.x,B.size.y),$.addGlyph(B),$.version=++Q.nextVersion,B}_findGlyphBoundingBox(t3,e3,i3,s3,r2,a2){e3.top=0;const o2=s3?this._config.deviceCellHeight:this._tmpCanvas.height,n2=s3?this._config.deviceCellWidth:i3;let L2=false;for(let i4=0;i4=a2;i4--){for(let s4=0;s4=0;i4--){for(let s4=0;s4>>24,a2=e3.rgba>>>16&255,o2=e3.rgba>>>8&255,n2=i3.rgba>>>24,L2=i3.rgba>>>16&255,h2=i3.rgba>>>8&255,T2=Math.floor((Math.abs(r2-n2)+Math.abs(a2-L2)+Math.abs(o2-h2))/12);let l2=true;for(let e4=0;e4this._handleColorChange())),this._cellColorResolver=new s2.CellColorResolver(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new _.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,d2,this._themeService)],this.dimensions=(0,g.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(d2.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new T.TextBlinkStateManager(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextlost",t4=>{;this._logService.debug("webglcontextlost event received"),t4.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{;this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(t4)},3e3)})),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextrestored",t4=>{;this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,r.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,(t4,e4)=>this._setCanvasDevicePixelDimensions(t4,e4)),this._register(this._coreBrowserService.onWindowChange(t4=>{this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,t4,(t5,e4)=>this._setCanvasDevicePixelDimensions(t5,e4))})),this._register((0,u.addDisposableListener)(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register((0,p.toDisposable)(()=>{;clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(const t4 of this._renderLayers)t4.dispose();this._canvas.parentElement?.removeChild(this._canvas),(0,r.removeTerminalFromCache)(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){;this._refreshCharAtlas(),this._clearModel(true)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t3,e3){;this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(const t4 of this._renderLayers)t4.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(false),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:true})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(const t3 of this._renderLayers)t3.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(const t3 of this._renderLayers)t3.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t3){this._textBlinkStateManager.setViewportVisible(t3)}handleSelectionChanged(t3,e3,i3){for(const s3 of this._renderLayers)s3.handleSelectionChanged(this._terminal,t3,e3,i3);this._model.selection.update(this._core,t3,e3,i3),this._requestRedrawViewport()}handleCursorMove(){for(const t3 of this._renderLayers)t3.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){;this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new d.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new l.GlyphRenderer(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=false);const t3=(0,r.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t3&&(this._onChangeTextureAtlas.fire(t3.pages[0].canvas),this._charAtlasDisposable.value=(0,p.combinedDisposable)(Q.EventUtils.forward(t3.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),Q.EventUtils.forward(t3.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t3,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t3){;this._model.clear(),t3&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){;this._charAtlas?.clearTexture(),this._clearModel(true),this._requestRedrawViewport()}clear(){this._clearModel(true);for(const t3 of this._renderLayers)t3.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(false),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t3,e3){if(!this._isAttached){if(!(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=true}for(const i4 of this._renderLayers)i4.handleGridChanged(this._terminal,t3,e3);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(true),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t3,e3);let i3=false,s3=0;for(;this._charAtlas&&s3++<32&&this._glyphRenderer.value.beginFrame();)i3=true,this._clearModel(true),this._updateModel(0,this._terminal.rows-1);i3&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){;this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t3,e3){const i3=this._core;let s3,r2,a2,o2,n2,L2,T2,l2,d2,_2,Q2,u2,p2,g2,M2,f,C,m=this._workCell;t3=v(t3,i3.rows-1,0),e3=v(e3,i3.rows-1,0);const w=this._coreService.decPrivateModes.cursorStyle??i3.options.cursorStyle??"block",x=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,b=x-i3.buffer.ydisp,E=Math.min(this._terminal.buffer.active.cursorX,i3.cols-1);let R=-1;const k=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let A=false;for(r2=t3;r2<=e3;r2++){a2=r2+i3.buffer.ydisp;const t4=i3.buffer.lines.get(a2);if(!t4){for(this._model.lineLengths[r2]=0,f=0;f=T2,d2=f,n2.length>0&&f===n2[0][0]&&l2){_2=n2.shift();const t5=this._model.selection.isCellSelected(this._terminal,_2[0],a2);for(M2=_2[0]+1;M2<_2[1];M2++)l2&&=t5===this._model.selection.isCellSelected(this._terminal,M2,a2);l2&&=!Q2||E<_2[0]||E>=_2[1],l2?(L2=true,m=new y(m,o2.translateToString(true,_2[0],_2[1]),_2[1]-_2[0]),d2=_2[1]-1):T2=_2[1]}if(u2=m.getChars(),p2=m.getCode(),M2=4*(r2*i3.cols+f),!e4&&m.isBlink()&&(e4=true),this._cellColorResolver.resolve(m,f,a2,this.dimensions.device.cell.width,this.dimensions.device.cell.height),k&&a2===x&&(f===E&&(this._model.cursor={x:E,y:b,width:m.getWidth(),style:this._coreBrowserService.isFocused?w:i3.options.cursorInactiveStyle,cursorWidth:i3.options.cursorWidth,dpr:this._devicePixelRatio},R=E+m.getWidth()-1),f>=E&&f<=R&&(this._coreBrowserService.isFocused&&"block"===w||false===this._coreBrowserService.isFocused&&"block"===i3.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&m.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),p2!==h.NULL_CELL_CODE&&(this._model.lineLengths[r2]=f+1),(this._model.cells[M2]!==p2||this._model.cells[M2+1]!==this._cellColorResolver.result.bg||this._model.cells[M2+2]!==this._cellColorResolver.result.fg||this._model.cells[M2+3]!==this._cellColorResolver.result.ext)&&(A=true,u2.length>1&&(p2|=c.COMBINED_CHAR_BIT_MASK),this._model.cells[M2]=p2,this._model.cells[M2+1]=this._cellColorResolver.result.bg,this._model.cells[M2+2]=this._cellColorResolver.result.fg,this._model.cells[M2+3]=this._cellColorResolver.result.ext,g2=m.getWidth(),this._glyphRenderer.value.updateCell(f,r2,p2,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,u2,g2,s3),L2)){for(m=this._workCell,f++;f<=d2;f++)C=4*(r2*i3.cols+f),this._nullModelCell(f,r2,C,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);f--}}this._setRowBlinkState(r2,e4)};A&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t3,e3,i3,s3,r2,a2){;this._glyphRenderer.value.updateCell(t3,e3,h.NULL_CELL_CODE,s3,r2,a2,h.NULL_CELL_CHAR,0,0),this._model.cells[i3]=h.NULL_CELL_CODE,this._model.cells[i3+1]=s3,this._model.cells[i3+2]=r2,this._model.cells[i3+3]=a2}_resetBlinkingRowState(){;this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(false),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t3,e3){this._rowHasBlinkingCells[t3]!==e3&&(this._rowHasBlinkingCells[t3]=e3,this._rowHasBlinkingCellsCount+=e3?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t3,e3){;this._canvas.width===t3&&this._canvas.height===e3||(this._canvas.width=t3,this._canvas.height=e3,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:true}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const t3=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t3,end:t3})}}e2.WebglRenderer=M;class y extends n.AttributeData{constructor(t3,e3,i3){;super(),this.content=0,this.combinedData="",this.fg=t3.fg,this.bg=t3.bg,this.combinedData=e3,this._width=i3}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t3){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function v(t3,e3,i3=0){return Math.max(Math.min(t3,e3),i3)}e2.JoinedCellData=y},719(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.GLTexture=e2.PROJECTION_MATRIX=void 0,e2.createProgram=function(t3,e3,i3,a){const o=(0,s2.throwIfFalsy)(t3.createProgram());if(t3.attachShader(o,(0,s2.throwIfFalsy)(r(t3,t3.VERTEX_SHADER,e3,a))),t3.attachShader(o,(0,s2.throwIfFalsy)(r(t3,t3.FRAGMENT_SHADER,i3,a))),t3.linkProgram(o),t3.getProgramParameter(o,t3.LINK_STATUS))return o;a.error(t3.getProgramInfoLog(o)),t3.deleteProgram(o)},e2.createShader=r,e2.expandFloat32Array=function(t3,e3){const i3=Math.min(2*t3.length,e3),s3=new Float32Array(i3);for(let e4=0;e4{const e3=[],i3=[3/8,2/8,3/8],s3=[0,3/8,5/8];for(let r2=0;r2<3;r2++){const a=t3>>2*r2&1,o=t3>>2*r2+1&1;a&&o?e3.push(`M0,${s3[r2]} L1,${s3[r2]} L1,${s3[r2]+i3[r2]} L0,${s3[r2]+i3[r2]} Z`):a?e3.push(`M0,${s3[r2]} L0.5,${s3[r2]} L0.5,${s3[r2]+i3[r2]} L0,${s3[r2]+i3[r2]} Z`):o&&e3.push(`M0.5,${s3[r2]} L1,${s3[r2]} L1,${s3[r2]+i3[r2]} L0.5,${s3[r2]+i3[r2]} Z`)}return e3.join(" ")}}}function r(t3){const e3=[],i3=.15,s3=.015,r2=.075,a=.0375,o=.95;if(64&t3){const t4=.175,a2=.2125,n=.25,L=.2+s3,h=o-i3-s3;e3.push(`M${L},${a2} L${L+r2},${t4} L${h-r2},${t4} L${h},${a2} L${h-r2},${n} L${L+r2},${n} Z`)}if(32&t3){const t4=o-i3,s4=.875,r3=o,n=.265,L=.485;e3.push(`M${s4},${n} L${r3},${n+a} L${r3},${L-a} L${s4},${L} L${t4},${L-a} L${t4},${n+a} Z`)}if(16&t3){const t4=o-i3,s4=.875,r3=o,n=.515,L=.735;e3.push(`M${s4},${n} L${r3},${n+a} L${r3},${L-a} L${s4},${L} L${t4},${L-a} L${t4},${n+a} Z`)}if(8&t3){const t4=.75,a2=.7875,n=.825,L=.2+s3,h=o-i3-s3;e3.push(`M${L},${a2} L${L+r2},${t4} L${h-r2},${t4} L${h},${a2} L${h-r2},${n} L${L+r2},${n} Z`)}if(4&t3){const t4=.05,i4=.125,s4=.2,r3=.515,o2=.735;e3.push(`M${i4},${r3} L${s4},${r3+a} L${s4},${o2-a} L${i4},${o2} L${t4},${o2-a} L${t4},${r3+a} Z`)}if(2&t3){const t4=.05,i4=.125,s4=.2,r3=.265,o2=.485;e3.push(`M${i4},${r3} L${s4},${r3+a} L${s4},${o2-a} L${i4},${o2} L${t4},${o2-a} L${t4},${r3+a} Z`)}if(1&t3){const t4=.4625,a2=.5,n=.5375,L=.2+s3,h=o-i3-s3;e3.push(`M${L},${a2} L${L+r2},${t4} L${h-r2},${t4} L${h},${a2} L${h-r2},${n} L${L+r2},${n} Z`)}return e3.join(" ")};Object.defineProperty(e2,"__esModule",{value:true}),e2.blockPatternCodepoints=e2.customGlyphDefinitions=void 0,(function(t3){;t3.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),t3.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),t3.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),t3.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),t3.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),t3.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),t3.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(t4,e3)=>`M.5,1 L.5,${.5+e3/.15*.5} C.5,${.5+e3/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t3.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(t4,e3)=>`M.5,1 L.5,${.5+e3/.15*.5} C.5,${.5+e3/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t3.CURVE_UP_RIGHT=Object.freeze({type:2,data:(t4,e3)=>`M.5,0 L.5,${.5-e3/.15*.5} C.5,${.5-e3/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t3.CURVE_UP_LEFT=Object.freeze({type:2,data:(t4,e3)=>`M.5,0 L.5,${.5-e3/.15*.5} C.5,${.5-e3/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t3.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),t3.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),t3.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),t3.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),t3.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),t3.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})})(i2||(i2={})),e2.customGlyphDefinitions={"\u2500":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"\u2501":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"\u2502":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"\u2503":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"\u2504":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"\u2505":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"\u2506":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"\u2507":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"\u2508":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"\u2509":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"\u250A":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"\u250B":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"\u250C":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"\u250D":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u250E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u250F":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"\u2510":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"\u2511":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2512":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2513":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"\u2514":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"\u2515":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2516":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2517":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"\u2518":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"\u2519":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u251A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251B":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"\u251C":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"\u251D":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u251E":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251F":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2520":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2521":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2522":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2523":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"\u2524":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"\u2525":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2526":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2527":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2528":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2529":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u252A":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u252B":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"\u252C":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"\u252D":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u252E":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u252F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2530":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2531":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2532":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2533":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"\u2534":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"\u2535":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2536":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2537":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2538":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2539":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u253A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u253B":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"\u253C":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"\u253D":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u253E":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u253F":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2540":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2541":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2542":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2543":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u2544":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2545":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2546":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2547":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"\u2548":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"\u2549":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"\u254A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"\u254B":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"\u254C":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"\u254D":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"\u254E":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"\u254F":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"\u2550":{type:2,data:(t3,e3)=>`M0,${.5-e3} L1,${.5-e3} M0,${.5+e3} L1,${.5+e3}`,strokeWidth:1},"\u2551":{type:2,data:(t3,e3)=>`M${.5-t3},0 L${.5-t3},1 M${.5+t3},0 L${.5+t3},1`,strokeWidth:1},"\u2552":{type:2,data:(t3,e3)=>`M.5,1 L.5,${.5-e3} L1,${.5-e3} M.5,${.5+e3} L1,${.5+e3}`,strokeWidth:1},"\u2553":{type:2,data:(t3,e3)=>`M${.5-t3},1 L${.5-t3},.5 L1,.5 M${.5+t3},.5 L${.5+t3},1`,strokeWidth:1},"\u2554":{type:2,data:(t3,e3)=>`M1,${.5-e3} L${.5-t3},${.5-e3} L${.5-t3},1 M1,${.5+e3} L${.5+t3},${.5+e3} L${.5+t3},1`,strokeWidth:1},"\u2555":{type:2,data:(t3,e3)=>`M0,${.5-e3} L.5,${.5-e3} L.5,1 M0,${.5+e3} L.5,${.5+e3}`,strokeWidth:1},"\u2556":{type:2,data:(t3,e3)=>`M${.5+t3},1 L${.5+t3},.5 L0,.5 M${.5-t3},.5 L${.5-t3},1`,strokeWidth:1},"\u2557":{type:2,data:(t3,e3)=>`M0,${.5+e3} L${.5-t3},${.5+e3} L${.5-t3},1 M0,${.5-e3} L${.5+t3},${.5-e3} L${.5+t3},1`,strokeWidth:1},"\u2558":{type:2,data:(t3,e3)=>`M.5,0 L.5,${.5+e3} L1,${.5+e3} M.5,${.5-e3} L1,${.5-e3}`,strokeWidth:1},"\u2559":{type:2,data:(t3,e3)=>`M1,.5 L${.5-t3},.5 L${.5-t3},0 M${.5+t3},.5 L${.5+t3},0`,strokeWidth:1},"\u255A":{type:2,data:(t3,e3)=>`M1,${.5-e3} L${.5+t3},${.5-e3} L${.5+t3},0 M1,${.5+e3} L${.5-t3},${.5+e3} L${.5-t3},0`,strokeWidth:1},"\u255B":{type:2,data:(t3,e3)=>`M0,${.5+e3} L.5,${.5+e3} L.5,0 M0,${.5-e3} L.5,${.5-e3}`,strokeWidth:1},"\u255C":{type:2,data:(t3,e3)=>`M0,.5 L${.5+t3},.5 L${.5+t3},0 M${.5-t3},.5 L${.5-t3},0`,strokeWidth:1},"\u255D":{type:2,data:(t3,e3)=>`M0,${.5-e3} L${.5-t3},${.5-e3} L${.5-t3},0 M0,${.5+e3} L${.5+t3},${.5+e3} L${.5+t3},0`,strokeWidth:1},"\u255E":{type:2,data:(t3,e3)=>`M.5,0 L.5,1 M.5,${.5-e3} L1,${.5-e3} M.5,${.5+e3} L1,${.5+e3}`,strokeWidth:1},"\u255F":{type:2,data:(t3,e3)=>`M${.5-t3},0 L${.5-t3},1 M${.5+t3},0 L${.5+t3},1 M${.5+t3},.5 L1,.5`,strokeWidth:1},"\u2560":{type:2,data:(t3,e3)=>`M${.5-t3},0 L${.5-t3},1 M1,${.5+e3} L${.5+t3},${.5+e3} L${.5+t3},1 M1,${.5-e3} L${.5+t3},${.5-e3} L${.5+t3},0`,strokeWidth:1},"\u2561":{type:2,data:(t3,e3)=>`M.5,0 L.5,1 M0,${.5-e3} L.5,${.5-e3} M0,${.5+e3} L.5,${.5+e3}`,strokeWidth:1},"\u2562":{type:2,data:(t3,e3)=>`M0,.5 L${.5-t3},.5 M${.5-t3},0 L${.5-t3},1 M${.5+t3},0 L${.5+t3},1`,strokeWidth:1},"\u2563":{type:2,data:(t3,e3)=>`M${.5+t3},0 L${.5+t3},1 M0,${.5+e3} L${.5-t3},${.5+e3} L${.5-t3},1 M0,${.5-e3} L${.5-t3},${.5-e3} L${.5-t3},0`,strokeWidth:1},"\u2564":{type:2,data:(t3,e3)=>`M0,${.5-e3} L1,${.5-e3} M0,${.5+e3} L1,${.5+e3} M.5,${.5+e3} L.5,1`,strokeWidth:1},"\u2565":{type:2,data:(t3,e3)=>`M0,.5 L1,.5 M${.5-t3},.5 L${.5-t3},1 M${.5+t3},.5 L${.5+t3},1`,strokeWidth:1},"\u2566":{type:2,data:(t3,e3)=>`M0,${.5-e3} L1,${.5-e3} M0,${.5+e3} L${.5-t3},${.5+e3} L${.5-t3},1 M1,${.5+e3} L${.5+t3},${.5+e3} L${.5+t3},1`,strokeWidth:1},"\u2567":{type:2,data:(t3,e3)=>`M.5,0 L.5,${.5-e3} M0,${.5-e3} L1,${.5-e3} M0,${.5+e3} L1,${.5+e3}`,strokeWidth:1},"\u2568":{type:2,data:(t3,e3)=>`M0,.5 L1,.5 M${.5-t3},.5 L${.5-t3},0 M${.5+t3},.5 L${.5+t3},0`,strokeWidth:1},"\u2569":{type:2,data:(t3,e3)=>`M0,${.5+e3} L1,${.5+e3} M0,${.5-e3} L${.5-t3},${.5-e3} L${.5-t3},0 M1,${.5-e3} L${.5+t3},${.5-e3} L${.5+t3},0`,strokeWidth:1},"\u256A":{type:2,data:(t3,e3)=>`M.5,0 L.5,1 M0,${.5-e3} L1,${.5-e3} M0,${.5+e3} L1,${.5+e3}`,strokeWidth:1},"\u256B":{type:2,data:(t3,e3)=>`M0,.5 L1,.5 M${.5-t3},0 L${.5-t3},1 M${.5+t3},0 L${.5+t3},1`,strokeWidth:1},"\u256C":{type:2,data:(t3,e3)=>`M0,${.5+e3} L${.5-t3},${.5+e3} L${.5-t3},1 M1,${.5+e3} L${.5+t3},${.5+e3} L${.5+t3},1 M0,${.5-e3} L${.5-t3},${.5-e3} L${.5-t3},0 M1,${.5-e3} L${.5+t3},${.5-e3} L${.5+t3},0`,strokeWidth:1},"\u256D":{type:2,data:(t3,e3)=>`M.5,1 L.5,${.5+e3/.15*.5} C.5,${.5+e3/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u256E":{type:2,data:(t3,e3)=>`M.5,1 L.5,${.5+e3/.15*.5} C.5,${.5+e3/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u256F":{type:2,data:(t3,e3)=>`M.5,0 L.5,${.5-e3/.15*.5} C.5,${.5-e3/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u2570":{type:2,data:(t3,e3)=>`M.5,0 L.5,${.5-e3/.15*.5} C.5,${.5-e3/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u2571":{type:2,data:"M1,0 L0,1",strokeWidth:1},"\u2572":{type:2,data:"M0,0 L1,1",strokeWidth:1},"\u2573":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"\u2574":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"\u2575":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"\u2576":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"\u2577":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"\u2578":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"\u2579":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"\u257A":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"\u257B":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"\u257C":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u257D":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u257E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u257F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2580":{type:0,data:[{x:0,y:0,w:8,h:4}]},"\u2581":{type:0,data:[{x:0,y:7,w:8,h:1}]},"\u2582":{type:0,data:[{x:0,y:6,w:8,h:2}]},"\u2583":{type:0,data:[{x:0,y:5,w:8,h:3}]},"\u2584":{type:0,data:[{x:0,y:4,w:8,h:4}]},"\u2585":{type:0,data:[{x:0,y:3,w:8,h:5}]},"\u2586":{type:0,data:[{x:0,y:2,w:8,h:6}]},"\u2587":{type:0,data:[{x:0,y:1,w:8,h:7}]},"\u2588":{type:0,data:[{x:0,y:0,w:8,h:8}]},"\u2589":{type:0,data:[{x:0,y:0,w:7,h:8}]},"\u258A":{type:0,data:[{x:0,y:0,w:6,h:8}]},"\u258B":{type:0,data:[{x:0,y:0,w:5,h:8}]},"\u258C":{type:0,data:[{x:0,y:0,w:4,h:8}]},"\u258D":{type:0,data:[{x:0,y:0,w:3,h:8}]},"\u258E":{type:0,data:[{x:0,y:0,w:2,h:8}]},"\u258F":{type:0,data:[{x:0,y:0,w:1,h:8}]},"\u2590":{type:0,data:[{x:4,y:0,w:4,h:8}]},"\u2591":{type:1,data:[[1,0],[0,0]]},"\u2592":{type:1,data:[[1,0],[0,1]]},"\u2593":{type:1,data:[[1,1],[1,0]]},"\u2594":{type:0,data:[{x:0,y:0,w:8,h:1}]},"\u2595":{type:0,data:[{x:7,y:0,w:1,h:8}]},"\u2596":{type:0,data:[{x:0,y:4,w:4,h:4}]},"\u2597":{type:0,data:[{x:4,y:4,w:4,h:4}]},"\u2598":{type:0,data:[{x:0,y:0,w:4,h:4}]},"\u2599":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\u259A":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"\u259B":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"\u259C":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"\u259D":{type:0,data:[{x:4,y:0,w:4,h:4}]},"\u259E":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"\u259F":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\uE0A0":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"\uE0A1":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0A2":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"\uE0A3":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0B0":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"\uE0B1":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B2":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"\uE0B3":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B4":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"\uE0B5":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"\uE0B6":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"\uE0B7":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"\uE0B8":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"\uE0B9":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BA":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"\uE0BB":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BC":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"\uE0BD":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BE":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"\uE0BF":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0C0":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"\uE0C1":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"\uE0C2":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"\uE0C3":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"\uE0C4":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"\uE0C5":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"\uE0C6":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"\uE0C7":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"\uE0C8":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"\uE0CA":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"\uE0CC":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"\uE0CD":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"\uE0CE":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"\uE0CF":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"\uE0D0":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"\uE0D1":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"\uE0D2":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"\uE0D4":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"\uEE00":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"\uEE01":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"\uEE02":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"\uEE03":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"\uEE04":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"\uEE05":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"\uEE06":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"\uEE07":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"\uEE08":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE09":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0A":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0B":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"\uF5D0":i2.LINE_H,"\uF5D1":i2.LINE_V,"\uF5D2":i2.FADE_RIGHT,"\uF5D3":i2.FADE_LEFT,"\uF5D4":i2.FADE_DOWN,"\uF5D5":i2.FADE_UP,"\uF5D6":i2.CURVE_DOWN_RIGHT,"\uF5D7":i2.CURVE_DOWN_LEFT,"\uF5D8":i2.CURVE_UP_RIGHT,"\uF5D9":i2.CURVE_UP_LEFT,"\uF5DA":[i2.LINE_V,i2.CURVE_UP_RIGHT],"\uF5DB":[i2.LINE_V,i2.CURVE_DOWN_RIGHT],"\uF5DC":[i2.CURVE_DOWN_RIGHT,i2.CURVE_UP_RIGHT],"\uF5DD":[i2.LINE_V,i2.CURVE_UP_LEFT],"\uF5DE":[i2.LINE_V,i2.CURVE_DOWN_LEFT],"\uF5DF":[i2.CURVE_DOWN_LEFT,i2.CURVE_UP_LEFT],"\uF5E0":[i2.LINE_H,i2.CURVE_DOWN_LEFT],"\uF5E1":[i2.LINE_H,i2.CURVE_DOWN_RIGHT],"\uF5E2":[i2.CURVE_DOWN_LEFT,i2.CURVE_DOWN_RIGHT],"\uF5E3":[i2.LINE_H,i2.CURVE_UP_LEFT],"\uF5E4":[i2.LINE_H,i2.CURVE_UP_RIGHT],"\uF5E5":[i2.CURVE_UP_LEFT,i2.CURVE_UP_RIGHT],"\uF5E6":[i2.LINE_V,i2.CURVE_UP_LEFT,i2.CURVE_UP_RIGHT],"\uF5E7":[i2.LINE_V,i2.CURVE_DOWN_LEFT,i2.CURVE_DOWN_RIGHT],"\uF5E8":[i2.LINE_H,i2.CURVE_DOWN_LEFT,i2.CURVE_UP_LEFT],"\uF5E9":[i2.LINE_H,i2.CURVE_DOWN_RIGHT,i2.CURVE_UP_RIGHT],"\uF5EA":[i2.LINE_V,i2.CURVE_DOWN_RIGHT,i2.CURVE_UP_LEFT],"\uF5EB":[i2.LINE_V,i2.CURVE_DOWN_LEFT,i2.CURVE_UP_RIGHT],"\uF5EC":[i2.LINE_H,i2.CURVE_DOWN_RIGHT,i2.CURVE_UP_LEFT],"\uF5ED":[i2.LINE_H,i2.CURVE_DOWN_LEFT,i2.CURVE_UP_RIGHT],"\uF5EE":[i2.NODE_FILL,i2.NODE_STROKE],"\uF5EF":i2.NODE_STROKE,"\uF5F0":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_RIGHT],"\uF5F1":[i2.NODE_STROKE,i2.NODE_LINE_RIGHT],"\uF5F2":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_LEFT],"\uF5F3":[i2.NODE_STROKE,i2.NODE_LINE_LEFT],"\uF5F4":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF5F5":[i2.NODE_STROKE,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF5F6":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_DOWN],"\uF5F7":[i2.NODE_STROKE,i2.NODE_LINE_DOWN],"\uF5F8":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP],"\uF5F9":[i2.NODE_STROKE,i2.NODE_LINE_UP],"\uF5FA":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_UP],"\uF5FB":[i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_UP],"\uF5FC":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_RIGHT],"\uF5FD":[i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_RIGHT],"\uF5FE":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT],"\uF5FF":[i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT],"\uF600":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_RIGHT],"\uF601":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_RIGHT],"\uF602":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_LEFT],"\uF603":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_LEFT],"\uF604":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_RIGHT],"\uF605":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_RIGHT],"\uF606":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT],"\uF607":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT],"\uF608":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF609":[i2.NODE_STROKE,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF60A":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF60B":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF60C":[i2.NODE_FILL,i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\uF60D":[i2.NODE_STROKE,i2.NODE_LINE_UP,i2.NODE_LINE_DOWN,i2.NODE_LINE_LEFT,i2.NODE_LINE_RIGHT],"\u{1FB00}":s2(1),"\u{1FB01}":s2(2),"\u{1FB02}":s2(3),"\u{1FB03}":s2(4),"\u{1FB04}":s2(5),"\u{1FB05}":s2(6),"\u{1FB06}":s2(7),"\u{1FB07}":s2(8),"\u{1FB08}":s2(9),"\u{1FB09}":s2(10),"\u{1FB0A}":s2(11),"\u{1FB0B}":s2(12),"\u{1FB0C}":s2(13),"\u{1FB0D}":s2(14),"\u{1FB0E}":s2(15),"\u{1FB0F}":s2(16),"\u{1FB10}":s2(17),"\u{1FB11}":s2(18),"\u{1FB12}":s2(19),"\u{1FB13}":s2(20),"\u{1FB14}":s2(22),"\u{1FB15}":s2(23),"\u{1FB16}":s2(24),"\u{1FB17}":s2(25),"\u{1FB18}":s2(26),"\u{1FB19}":s2(27),"\u{1FB1A}":s2(28),"\u{1FB1B}":s2(29),"\u{1FB1C}":s2(30),"\u{1FB1D}":s2(31),"\u{1FB1E}":s2(32),"\u{1FB1F}":s2(33),"\u{1FB20}":s2(34),"\u{1FB21}":s2(35),"\u{1FB22}":s2(36),"\u{1FB23}":s2(37),"\u{1FB24}":s2(38),"\u{1FB25}":s2(39),"\u{1FB26}":s2(40),"\u{1FB27}":s2(41),"\u{1FB28}":s2(43),"\u{1FB29}":s2(44),"\u{1FB2A}":s2(45),"\u{1FB2B}":s2(46),"\u{1FB2C}":s2(47),"\u{1FB2D}":s2(48),"\u{1FB2E}":s2(49),"\u{1FB2F}":s2(50),"\u{1FB30}":s2(51),"\u{1FB31}":s2(52),"\u{1FB32}":s2(53),"\u{1FB33}":s2(54),"\u{1FB34}":s2(55),"\u{1FB35}":s2(56),"\u{1FB36}":s2(57),"\u{1FB37}":s2(58),"\u{1FB38}":s2(59),"\u{1FB39}":s2(60),"\u{1FB3A}":s2(61),"\u{1FB3B}":s2(62),"\u{1FB3C}":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"\u{1FB3D}":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"\u{1FB3E}":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"\u{1FB3F}":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"\u{1FB40}":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"\u{1FB41}":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB42}":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"\u{1FB43}":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB44}":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"\u{1FB45}":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"\u{1FB46}":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"\u{1FB47}":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"\u{1FB48}":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"\u{1FB49}":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"\u{1FB4A}":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"\u{1FB4B}":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"\u{1FB4C}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4D}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4E}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB4F}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB50}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"\u{1FB51}":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB52}":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB53}":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"\u{1FB54}":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB55}":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"\u{1FB56}":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"\u{1FB57}":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"\u{1FB58}":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"\u{1FB59}":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"\u{1FB5A}":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"\u{1FB5B}":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"\u{1FB5C}":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB5D}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5E}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5F}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB60}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB61}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"\u{1FB62}":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"\u{1FB63}":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"\u{1FB64}":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"\u{1FB65}":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"\u{1FB66}":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"\u{1FB67}":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"\u{1FB68}":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"\u{1FB69}":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"\u{1FB6A}":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"\u{1FB6B}":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"\u{1FB6C}":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"\u{1FB6D}":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"\u{1FB6E}":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"\u{1FB6F}":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"\u{1FB70}":{type:0,data:[{x:1,y:0,w:1,h:8}]},"\u{1FB71}":{type:0,data:[{x:2,y:0,w:1,h:8}]},"\u{1FB72}":{type:0,data:[{x:3,y:0,w:1,h:8}]},"\u{1FB73}":{type:0,data:[{x:4,y:0,w:1,h:8}]},"\u{1FB74}":{type:0,data:[{x:5,y:0,w:1,h:8}]},"\u{1FB75}":{type:0,data:[{x:6,y:0,w:1,h:8}]},"\u{1FB76}":{type:0,data:[{x:0,y:1,w:8,h:1}]},"\u{1FB77}":{type:0,data:[{x:0,y:2,w:8,h:1}]},"\u{1FB78}":{type:0,data:[{x:0,y:3,w:8,h:1}]},"\u{1FB79}":{type:0,data:[{x:0,y:4,w:8,h:1}]},"\u{1FB7A}":{type:0,data:[{x:0,y:5,w:8,h:1}]},"\u{1FB7B}":{type:0,data:[{x:0,y:6,w:8,h:1}]},"\u{1FB7C}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB7D}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7E}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7F}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB80}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB81}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB82}":{type:0,data:[{x:0,y:0,w:8,h:2}]},"\u{1FB83}":{type:0,data:[{x:0,y:0,w:8,h:3}]},"\u{1FB84}":{type:0,data:[{x:0,y:0,w:8,h:5}]},"\u{1FB85}":{type:0,data:[{x:0,y:0,w:8,h:6}]},"\u{1FB86}":{type:0,data:[{x:0,y:0,w:8,h:7}]},"\u{1FB87}":{type:0,data:[{x:6,y:0,w:2,h:8}]},"\u{1FB88}":{type:0,data:[{x:5,y:0,w:3,h:8}]},"\u{1FB89}":{type:0,data:[{x:3,y:0,w:5,h:8}]},"\u{1FB8A}":{type:0,data:[{x:2,y:0,w:6,h:8}]},"\u{1FB8B}":{type:0,data:[{x:1,y:0,w:7,h:8}]},"\u{1FB8C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"\u{1FB8D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"\u{1FB8E}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"\u{1FB8F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"\u{1FB90}":{type:1,data:[[0,1],[1,0]]},"\u{1FB91}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"\u{1FB92}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"\u{1FB94}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"\u{1FB95}":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"\u{1FB96}":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"\u{1FB97}":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"\u{1FB98}":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"\u{1FB99}":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"\u{1FB9A}":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"\u{1FB9B}":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"\u{1FB9C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"\u{1FB9D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"\u{1FB9E}":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"\u{1FB9F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"\u{1FBA0}":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"\u{1FBA1}":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"\u{1FBA2}":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"\u{1FBA3}":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"\u{1FBA4}":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBA5}":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBA6}":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBA7}":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"\u{1FBA8}":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"\u{1FBA9}":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"\u{1FBAA}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"\u{1FBAB}":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBAC}":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBAD}":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBAE}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"\u{1FBAF}":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"\u{1FBB0}":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"\u{1FBB1}":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"\u{1FBB2}":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"\u{1FBB3}":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"\u{1FBB4}":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"\u{1FBB5}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB6}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB7}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB8}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB9}":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"\u{1FBBA}":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"\u{1FBBB}":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"\u{1FBBC}":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"\u{1FBBD}":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"\u{1FBBE}":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"\u{1FBBF}":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"\u{1FBC0}":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"\u{1FBC1}":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"\u{1FBC2}":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"\u{1FBC3}":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"\u{1FBC4}":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"\u{1FBC5}":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC6}":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC7}":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC8}":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC9}":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBCA}":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"\u{1FBCB}":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"\u{1FBCC}":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"\u{1FBCD}":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"\u{1FBCE}":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"\u{1FBCF}":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"\u{1FBD0}":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"\u{1FBD1}":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"\u{1FBD2}":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"\u{1FBD3}":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"\u{1FBD4}":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"\u{1FBD5}":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"\u{1FBD6}":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"\u{1FBD7}":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"\u{1FBD8}":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"\u{1FBD9}":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDA}":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDB}":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"\u{1FBDC}":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"\u{1FBDD}":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"\u{1FBDE}":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"\u{1FBDF}":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"\u{1FBE0}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"\u{1FBE1}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"\u{1FBE2}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"\u{1FBE3}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"\u{1FBE4}":{type:0,data:[{x:2,y:0,w:4,h:4}]},"\u{1FBE5}":{type:0,data:[{x:2,y:4,w:4,h:4}]},"\u{1FBE6}":{type:0,data:[{x:0,y:2,w:4,h:4}]},"\u{1FBE7}":{type:0,data:[{x:4,y:2,w:4,h:4}]},"\u{1FBE8}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"\u{1FBE9}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"\u{1FBEA}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"\u{1FBEB}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"\u{1FBEC}":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"\u{1FBED}":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"\u{1FBEE}":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"\u{1FBEF}":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"\u{1FBF0}":{type:5,data:{d:r(126),type:0},scaleType:1},"\u{1FBF1}":{type:5,data:{d:r(48),type:0},scaleType:1},"\u{1FBF2}":{type:5,data:{d:r(109),type:0},scaleType:1},"\u{1FBF3}":{type:5,data:{d:r(121),type:0},scaleType:1},"\u{1FBF4}":{type:5,data:{d:r(51),type:0},scaleType:1},"\u{1FBF5}":{type:5,data:{d:r(91),type:0},scaleType:1},"\u{1FBF6}":{type:5,data:{d:r(95),type:0},scaleType:1},"\u{1FBF7}":{type:5,data:{d:r(114),type:0},scaleType:1},"\u{1FBF8}":{type:5,data:{d:r(127),type:0},scaleType:1},"\u{1FBF9}":{type:5,data:{d:r(123),type:0},scaleType:1},"\u{1FBFA}":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(t3,e3)=>[String.fromCodePoint(10240+e3),{type:6,data:e3}]))},e2.blockPatternCodepoints=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951])},183(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.tryDrawCustomGlyph=function(t3,e3,i3,s3,o2,n2,L2,h2,T2,l2,d,c,_=0){const Q=r.customGlyphDefinitions[e3];if(Q){const e4=Array.isArray(Q)?Q:[Q];for(const r2 of e4)a(t3,r2,i3,s3,o2,n2,L2,h2,T2,l2,d,c,_);return true}return false};const s2=i2(959),r=i2(915);function a(t3,e3,i3,r2,a2,h2,d,c,_,Q,u,p,g=0){let M=a2,y=h2,v=i3,f=r2;switch(1===e3.scaleType&&(M=d,y=c,v=i3+(a2-d)/2,f=r2+(h2-c)/2),e3.clipPath&&(t3.save(),(function(t4,e4,i4,s3,r3,a3){t4.beginPath();for(const o2 of e4.split(" ")){const e5=o2[0];if("Z"===e5){t4.closePath();continue}const n2=o2.substring(1).split(",");if(!n2[0]||!n2[1])continue;const L2=i4+parseFloat(n2[0])*r3,h3=s3+parseFloat(n2[1])*a3;"M"===e5?t4.moveTo(L2,h3):"L"===e5&&t4.lineTo(L2,h3)}t4.clip()})(t3,e3.clipPath,v,f,M,y)),e3.type){case 0:!(function(t4,e4,i4,s3,r3,a3){for(let o2=0;o27&&parseInt(T2.slice(7,9),16)||1;else{if(!T2.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${T2}" when drawing pattern glyph`);[L2,d3,c3,_2]=T2.substring(5,T2.length-1).split(",").map(t5=>parseFloat(t5))}for(let t5=0;t5>1&1,c2=1&n2;0!==d2||0!==c2?l2.setTransform(new DOMMatrix().translateSelf(-d2,-c2)):l2.setTransform(new DOMMatrix),t4.fillStyle=l2,t4.fillRect(i4,r3,a3,o2)})(t3,e3.data,v,f,M,y,g);break;case 2:!(function(t4,e4,i4,s3,r3,a3,o2,n2,L2){let h3;t4.save(),t4.beginPath(),t4.rect(i4,s3,r3,a3),t4.clip(),t4.beginPath(),h3="function"==typeof e4?e4(.15,.15/a3*r3):e4;const d2={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const e5 of h3.split(" ")){const L3=e5[0];if("Z"===L3){;t4.closePath(),d2.lastCommand=L3;continue}const h4=T[L3];if(!h4){n2.error(`Could not find drawing instructions for "${L3}"`);continue}const c2=e5.substring(1).split(",");c2[0]&&c2[1]&&(h4(t4,l(c2,r3,a3,i4,s3,true,o2,0,0,false),d2),d2.lastCommand=L3)};void 0!==L2?(t4.strokeStyle=t4.fillStyle,t4.lineWidth=o2*L2,t4.stroke()):t4.fill(),t4.closePath(),t4.restore()})(t3,e3.data,v,f,M,y,Q,u,e3.strokeWidth);break;case 3:!(function(t4,e4,i4,s3,r3,a3,o2,L2){const h3="string"==typeof e4?e4:e4(0,0);t4.beginPath();let T2=0,l2=0,d2=0,c2=0,_2="";for(const e5 of h3.split(" ")){const o3=e5[0],L3=e5.substring(1).split(",");if("Z"===o3){;t4.closePath(),_2=o3;continue}if("V"===o3){const e6=s3+parseFloat(L3[0])*a3;t4.lineTo(T2,e6),l2=e6,d2=T2,c2=l2,_2=o3;continue}if("H"===o3){const e6=i4+parseFloat(L3[0])*r3;t4.lineTo(e6,l2),T2=e6,d2=T2,c2=l2,_2=o3;continue}if(!L3[0]||!L3[1])continue;if("A"===o3){const e6=parseFloat(L3[0])*r3,o4=parseFloat(L3[1])*a3,h5=parseFloat(L3[2])*Math.PI/180,d3=parseInt(L3[3],10),c3=parseInt(L3[4],10),_3=i4+parseFloat(L3[5])*r3,Q2=s3+parseFloat(L3[6])*a3;n(t4,T2,l2,e6,o4,h5,d3,c3,_3,Q2),T2=_3,l2=Q2;continue}const h4=L3.map((t5,e6)=>{const o4=parseFloat(t5);return e6%2==0?i4+o4*r3:s3+o4*a3});if("M"===o3)t4.moveTo(h4[0],h4[1]),T2=h4[0],l2=h4[1],d2=T2,c2=l2;else if("L"===o3)t4.lineTo(h4[0],h4[1]),T2=h4[0],l2=h4[1],d2=T2,c2=l2;else if("Q"===o3)t4.quadraticCurveTo(h4[0],h4[1],h4[2],h4[3]),d2=h4[0],c2=h4[1],T2=h4[2],l2=h4[3];else if("T"===o3){let e6,i5;"Q"===_2||"T"===_2?(e6=2*T2-d2,i5=2*l2-c2):(e6=T2,i5=l2),t4.quadraticCurveTo(e6,i5,h4[0],h4[1]),d2=e6,c2=i5,T2=h4[0],l2=h4[1]}else"C"===o3&&(t4.bezierCurveTo(h4[0],h4[1],h4[2],h4[3],h4[4],h4[5]),d2=h4[2],c2=h4[3],T2=h4[4],l2=h4[5]);_2=o3}void 0!==L2?(t4.strokeStyle=t4.fillStyle,t4.lineWidth=o2*L2,t4.stroke()):t4.fill()})(t3,e3.data,v,f,M,y,Q,e3.strokeWidth);break;case 4:!(function(t4,e4,i4,s3,r3,a3,o2,n2){;t4.save(),t4.fillRect(i4,s3,r3,a3),n2&&(t4.fillStyle=n2,t4.strokeStyle=n2),t4.lineWidth=o2,t4.lineCap="square",t4.beginPath();for(const o3 of e4.d.split(" ")){const e5=o3[0],n3=o3.substring(1).split(",");if(!n3[0]||!n3[1]){"Z"===e5&&t4.closePath();continue}const L2=n3.map((t5,e6)=>{const o4=parseFloat(t5);return e6%2==0?i4+o4*r3:s3+o4*a3});"M"===e5?t4.moveTo(L2[0],L2[1]):"L"===e5&&t4.lineTo(L2[0],L2[1])};1===e4.type?t4.stroke():t4.fill(),t4.restore()})(t3,e3.data,v,f,M,y,Q,p);break;case 5:!(function(t4,e4,i4,s3,r3,a3,o2,n2,L2){const h3=new Path2D;h3.rect(i4,s3,r3,a3),t4.clip(h3),t4.beginPath();const d2=o2/12;t4.lineWidth=n2*d2;const c2={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const o3 of e4.d.split(" ")){const h4=o3[0];if("Z"===h4){;t4.closePath(),c2.lastCommand=h4;continue}const _2=T[h4];if(!_2){L2.error(`Could not find drawing instructions for "${h4}"`);continue}const Q2=o3.substring(1).split(",");Q2[0]&&Q2[1]&&(_2(t4,l(Q2,r3,a3,i4,s3,false,n2,(e4.leftPadding??0)*(d2/2),(e4.rightPadding??0)*(d2/2)),c2),c2.lastCommand=h4)};1===e4.type?(t4.strokeStyle=t4.fillStyle,t4.stroke()):t4.fill(),t4.closePath()})(t3,e3.data,v,f,M,y,_,Q,u);break;case 6:!(function(t4,e4,i4,s3,r3,a3){const n2=r3/8,L2=.1*a3,h3=.8*a3/8,T2=Math.min(n2,h3);for(let r4=0;r4<8;r4++)if(e4&1<1){const t4=Math.sqrt(y);u=(s3*=t4)*s3,p=(r2*=t4)*r2}let v=(u*p-u*M-p*g)/(u*M+p*g);v<0&&(v=0);const f=(o2===n2?-1:1)*Math.sqrt(v),C=f*(s3*Q/r2),m=f*(-r2*_/s3),w=T2*C-l2*m+(e3+L2)/2,x=l2*C+T2*m+(i3+h2)/2,b=(_-C)/s3,E=(Q-m)/r2,R=(-_-C)/s3,k=(-Q-m)/r2,A=Math.atan2(E,b);let Z=Math.atan2(k,R)-A;0===n2&&Z>0?Z-=2*Math.PI:1===n2&&Z<0&&(Z+=2*Math.PI);const D=A+Z;t3.ellipse(w,x,s3,r2,a2,A,D,0===n2)}const L=new Map;function h(t3,e3,i3=0){return Math.max(Math.min(t3,e3),i3)}const T={C:(t3,e3,i3)=>{;t3.bezierCurveTo(e3[0],e3[1],e3[2],e3[3],e3[4],e3[5]),i3.lastControlX=e3[2],i3.lastControlY=e3[3],i3.currentX=e3[4],i3.currentY=e3[5]},L:(t3,e3,i3)=>{;t3.lineTo(e3[0],e3[1]),i3.lastControlX=i3.currentX=e3[0],i3.lastControlY=i3.currentY=e3[1]},M:(t3,e3,i3)=>{;t3.moveTo(e3[0],e3[1]),i3.lastControlX=i3.currentX=e3[0],i3.lastControlY=i3.currentY=e3[1]},Q:(t3,e3,i3)=>{;t3.quadraticCurveTo(e3[0],e3[1],e3[2],e3[3]),i3.lastControlX=e3[0],i3.lastControlY=e3[1],i3.currentX=e3[2],i3.currentY=e3[3]},T:(t3,e3,i3)=>{let s3,r2;"Q"===i3.lastCommand||"T"===i3.lastCommand?(s3=2*i3.currentX-i3.lastControlX,r2=2*i3.currentY-i3.lastControlY):(s3=i3.currentX,r2=i3.currentY),t3.quadraticCurveTo(s3,r2,e3[0],e3[1]),i3.lastControlX=s3,i3.lastControlY=r2,i3.currentX=e3[0],i3.currentY=e3[1]}};function l(t3,e3,i3,s3,r2,a2,o2,n2=0,L2=0,T2=true){const l2=t3.map(t4=>parseFloat(t4)||parseInt(t4));if(l2.length<2)throw new Error("Too few arguments for instruction");for(let t4=0;t4{;this._refreshCharAtlas(t3,e4),this.reset(t3)})),this._register((0,r.toDisposable)(()=>{this._canvas.remove()}))}_initCanvas(){;this._ctx=(0,a.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t3){}handleFocus(t3){}handleCursorMove(t3){}handleGridChanged(t3,e3,i3){}handleSelectionChanged(t3,e3,i3,s3=false){}_setTransparency(t3,e3){if(e3===this._alpha)return;const i3=this._canvas;this._alpha=e3,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i3),this._refreshCharAtlas(t3,this._themeService.colors),this.handleGridChanged(t3,0,t3.rows-1)}_refreshCharAtlas(t3,e3){;this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s2.acquireTextureAtlas)(t3,this._optionsService.rawOptions,e3,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t3,e3){;this._deviceCellWidth=e3.device.cell.width,this._deviceCellHeight=e3.device.cell.height,this._deviceCharWidth=e3.device.char.width,this._deviceCharHeight=e3.device.char.height,this._deviceCharLeft=e3.device.char.left,this._deviceCharTop=e3.device.char.top,this._canvas.width=e3.device.canvas.width,this._canvas.height=e3.device.canvas.height,this._canvas.style.width=`${e3.css.canvas.width}px`,this._canvas.style.height=`${e3.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t3,this._themeService.colors)}_fillBottomLineAtCells(t3,e3,i3=1){this._ctx.fillRect(t3*this._deviceCellWidth,(e3+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i3*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t3,e3,i3,s3){this._alpha?this._ctx.clearRect(t3*this._deviceCellWidth,e3*this._deviceCellHeight,i3*this._deviceCellWidth,s3*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t3*this._deviceCellWidth,e3*this._deviceCellHeight,i3*this._deviceCellWidth,s3*this._deviceCellHeight))}_fillCharTrueColor(t3,e3,i3,s3){;this._ctx.font=this._getFont(t3,false,false),this._ctx.textBaseline=o.TEXT_BASELINE,this._clipCell(i3,s3,e3.getWidth()),this._ctx.fillText(e3.getChars(),i3*this._deviceCellWidth+this._deviceCharLeft,s3*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t3,e3,i3){;this._ctx.beginPath(),this._ctx.rect(t3*this._deviceCellWidth,e3*this._deviceCellHeight,i3*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t3,e3,i3){return`${i3?"italic":""} ${e3?t3.options.fontWeightBold:t3.options.fontWeight} ${t3.options.fontSize*this._coreBrowserService.dpr}px ${t3.options.fontFamily}`}}e2.BaseRenderLayer=n},306(t2,e2,i2){;Object.defineProperty(e2,"__esModule",{value:true}),e2.LinkRenderLayer=void 0;const s2=i2(657),r=i2(814),a=i2(133);class o extends a.BaseRenderLayer{constructor(t3,e3,i3,s3,r2,a2,o2){;super(i3,t3,"link",e3,true,r2,a2,o2),this._register(s3.onShowLinkUnderline(t4=>this._handleShowLinkUnderline(t4))),this._register(s3.onHideLinkUnderline(t4=>this._handleHideLinkUnderline(t4)))}resize(t3,e3){;super.resize(t3,e3),this._state=void 0}reset(t3){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const t3=this._state.y2-this._state.y1-1;t3>0&&this._clearCells(0,this._state.y1+1,this._state.cols,t3),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(t3){if(t3.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==t3.fg&&(0,s2.is256Color)(t3.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[t3.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,t3.y1===t3.y2)this._fillBottomLineAtCells(t3.x1,t3.y1,t3.x2-t3.x1);else{this._fillBottomLineAtCells(t3.x1,t3.y1,t3.cols-t3.x1);for(let e3=t3.y1+1;e3{var t2=s;Object.defineProperty(t2,"__esModule",{value:true}),t2.WebglAddon=void 0;const e2=i(426),r=i(95),a=i(399),o=i(414);class n extends e2.Disposable{constructor(t3){if(r.isSafari&&(0,r.getSafariVersion)()<16){const t4={antialias:false,depth:false,preserveDrawingBuffer:true};if(!document.createElement("canvas").getContext("webgl2",t4))throw new Error("WebGL2 is only supported on Safari 16 and above")};super(),this._onChangeTextureAtlas=this._register(new o.Emitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this._register(new o.Emitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this._register(new o.Emitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this._register(new o.Emitter),this.onContextLoss=this._onContextLoss.event,this._customGlyphs=t3?.customGlyphs??true,this._preserveDrawingBuffer=t3?.preserveDrawingBuffer}activate(t3){const i2=t3._core;if(!t3.element)return void this._register(i2.onWillOpen(()=>this.activate(t3)));this._terminal=t3;const s2=i2.coreService,r2=i2.optionsService,n2=i2,L=n2._renderService,h=n2._characterJoinerService,T=n2._charSizeService,l=n2._coreBrowserService,d=n2._decorationService,c=n2._logService,_=n2._themeService;this._renderer=this._register(new a.WebglRenderer(t3,h,T,l,s2,d,c,r2,_,this._customGlyphs,this._preserveDrawingBuffer)),this._register(o.EventUtils.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(o.EventUtils.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(o.EventUtils.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(o.EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),L.setRenderer(this._renderer),this._register((0,e2.toDisposable)(()=>{if(this._terminal._core._store._isDisposed)return;const e3=this._terminal._core._renderService;e3.setRenderer(this._terminal._core._createRenderer()),e3.handleResize(t3.cols,t3.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}}t2.WebglAddon=n})(),s})()); -diff --git a/lib/addon-webgl.mjs b/lib/addon-webgl.mjs ---- a/lib/addon-webgl.mjs -+++ b/lib/addon-webgl.mjs -@@ -9,12 +9,7 @@ - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard -- */ --/*--------------------------------------------------------------------------------------------- -- * Copyright (c) Microsoft Corporation. All rights reserved. -- * Licensed under the MIT License. See License.txt in the project root for license information. -- *--------------------------------------------------------------------------------------------*/ --function M(i){return{dispose:i}}function Ft(i){if(!i)return i;if(Array.isArray(i)){for(let e of i)e.dispose();return[]}return i.dispose(),i}function De(...i){return M(()=>Ft(i))}var R0=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},W=class{constructor(){this._store=new R0}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};W.None=Object.freeze({dispose(){}});var m0=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}};var Pe=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),O0=Pe?"node":navigator.userAgent,ce=Pe?"node":navigator.platform,Be=O0.includes("Firefox"),n1=O0.includes("Chrome"),we=O0.includes("Edge"),ue=/^((?!chrome|android).)*safari/i.test(O0);function He(){if(!ue)return 0;let i=O0.match(/Version\/(\d+)/);return i===null||i.length<2?0:parseInt(i[1],10)}var a1=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(ce),o1=["Windows","Win16","Win32","WinCE"].includes(ce),T1=ce.indexOf("Linux")>=0,l1=/\bCrOS\b/.test(O0);var P=0,B=0,w=0,x=0,K={css:"#00000000",rgba:0},Z;(r=>{function i(s,a,o,n){return n!==void 0?`#${E0(s)}${E0(a)}${E0(o)}${E0(n)}`:`#${E0(s)}${E0(a)}${E0(o)}`}r.toCss=i;function e(s,a,o,n=255){return(s<<24|a<<16|o<<8|n)>>>0}r.toRgba=e;function t(s,a,o,n){return{css:r.toCss(s,a,o,n),rgba:r.toRgba(s,a,o,n)}}r.toColor=t})(Z||={});var I0;(n=>{function i(L,T){if(x=(T.rgba&255)/255,x===1)return{css:T.css,rgba:T.rgba};let h=T.rgba>>24&255,d=T.rgba>>16&255,_=T.rgba>>8&255,p=L.rgba>>24&255,c=L.rgba>>16&255,u=L.rgba>>8&255;P=p+Math.round((h-p)*x),B=c+Math.round((d-c)*x),w=u+Math.round((_-u)*x);let C=Z.toCss(P,B,w),Q=Z.toRgba(P,B,w);return{css:C,rgba:Q}}n.blend=i;function e(L){return(L.rgba&255)===255}n.isOpaque=e;function t(L,T,h){let d=d0.ensureContrastRatio(L.rgba,T.rgba,h);if(d)return Z.toColor(d>>24&255,d>>16&255,d>>8&255)}n.ensureContrastRatio=t;function r(L){let T=(L.rgba|255)>>>0;return[P,B,w]=d0.toChannels(T),{css:Z.toCss(P,B,w),rgba:T}}n.opaque=r;function s(L,T){return x=Math.round(T*255),[P,B,w]=d0.toChannels(L.rgba),{css:Z.toCss(P,B,w,x),rgba:Z.toRgba(P,B,w,x)}}n.opacity=s;function a(L,T){return x=L.rgba&255,s(L,x*T/255)}n.multiplyOpacity=a;function o(L){return[L.rgba>>24&255,L.rgba>>16&255,L.rgba>>8&255]}n.toColorRGB=o})(I0||={});var Mt;(r=>{let i,e;try{let s=document.createElement("canvas");s.width=1,s.height=1;let a=s.getContext("2d",{willReadFrequently:!0});a&&(i=a,i.globalCompositeOperation="copy",e=i.createLinearGradient(0,0,1,1))}catch{}function t(s){if(s.match(/#[\da-f]{3,8}/i))switch(s.length){case 4:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),Z.toColor(P,B,w);case 5:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),x=parseInt(s.slice(4,5).repeat(2),16),Z.toColor(P,B,w,x);case 7:return{css:s,rgba:(parseInt(s.slice(1),16)<<8|255)>>>0};case 9:return{css:s,rgba:parseInt(s.slice(1),16)>>>0}}let a=s.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return P=parseInt(a[1],10),B=parseInt(a[2],10),w=parseInt(a[3],10),x=Math.round((a[5]===void 0?1:parseFloat(a[5]))*255),Z.toColor(P,B,w,x);if(s==="transparent")return{css:"transparent",rgba:0};if(!i||!e)throw new Error("css.toColor: Unsupported css format");if(i.fillStyle=e,i.fillStyle=s,typeof i.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(i.fillRect(0,0,1,1),[P,B,w,x]=i.getImageData(0,0,1,1).data,x!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:Z.toRgba(P,B,w,x),css:s}}r.toColor=t})(Mt||={});var V;(t=>{function i(r){return e(r>>16&255,r>>8&255,r&255)}t.relativeLuminance=i;function e(r,s,a){let o=r/255,n=s/255,L=a/255,T=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),h=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4),d=L<=.03928?L/12.92:Math.pow((L+.055)/1.055,2.4);return T*.2126+h*.7152+d*.0722}t.relativeLuminance2=e})(V||={});var d0;(a=>{function i(o,n){if(x=(n&255)/255,x===1)return n;let L=n>>24&255,T=n>>16&255,h=n>>8&255,d=o>>24&255,_=o>>16&255,p=o>>8&255;return P=d+Math.round((L-d)*x),B=_+Math.round((T-_)*x),w=p+Math.round((h-p)*x),Z.toRgba(P,B,w)}a.blend=i;function e(o,n,L){let T=V.relativeLuminance(o>>8),h=V.relativeLuminance(n>>8);if(h0(T,h)>8));if(u>8));return u>Q?c:C}return c}let _=r(o,n,L),p=h0(T,V.relativeLuminance(_>>8));if(p>8));return p>u?_:c}return _}}a.ensureContrastRatio=e;function t(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u0||p>0||c>0);)_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),c-=Math.max(0,Math.ceil(c*.1)),u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));return(_<<24|p<<16|c<<8|255)>>>0}a.reduceLuminance=t;function r(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u>>0}a.increaseLuminance=r;function s(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}a.toChannels=s})(d0||={});function E0(i){let e=i.toString(16);return e.length<2?"0"+e:e}function h0(i,e){return i=128512&&i<=128591||i>=127744&&i<=128511||i>=128640&&i<=128767||i>=9728&&i<=9983||i>=9984&&i<=10175||i>=65024&&i<=65039||i>=129280&&i<=129535||i>=127462&&i<=127487}function Ze(i,e,t,r){return e===1&&t>Math.ceil(r*1.5)&&i!==void 0&&i>255&&!yt(i)&&!W0(i)&&!At(i)}function V0(i){return W0(i)||gt(i)}function Ue(){return{css:{canvas:U0(),cell:U0()},device:{canvas:U0(),cell:U0(),char:{width:0,height:0,left:0,top:0}}}}function U0(){return{width:0,height:0}}function We(i,e,t=0){return(i-(Math.round(e)*2-t))%(Math.round(e)*2)}var l;(C=>(C.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),C.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),C.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),C.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),C.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),C.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),C.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.CURVE_UP_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_UP_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),C.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),C.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),C.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),C.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),C.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})))(l||={});var Ve={"\u2500":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"\u2501":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"\u2502":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"\u2503":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"\u2504":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"\u2505":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"\u2506":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"\u2507":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"\u2508":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"\u2509":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"\u250A":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"\u250B":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"\u250C":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"\u250D":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u250E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u250F":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"\u2510":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"\u2511":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2512":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2513":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"\u2514":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"\u2515":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2516":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2517":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"\u2518":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"\u2519":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u251A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251B":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"\u251C":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"\u251D":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u251E":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251F":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2520":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2521":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2522":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2523":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"\u2524":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"\u2525":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2526":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2527":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2528":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2529":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u252A":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u252B":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"\u252C":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"\u252D":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u252E":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u252F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2530":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2531":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2532":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2533":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"\u2534":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"\u2535":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2536":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2537":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2538":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2539":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u253A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u253B":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"\u253C":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"\u253D":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u253E":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u253F":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2540":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2541":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2542":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2543":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u2544":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2545":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2546":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2547":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"\u2548":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"\u2549":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"\u254A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"\u254B":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"\u254C":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"\u254D":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"\u254E":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"\u254F":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"\u2550":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2551":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2552":{type:2,data:(i,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2553":{type:2,data:(i,e)=>`M${.5-i},1 L${.5-i},.5 L1,.5 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2554":{type:2,data:(i,e)=>`M1,${.5-e} L${.5-i},${.5-e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2555":{type:2,data:(i,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2556":{type:2,data:(i,e)=>`M${.5+i},1 L${.5+i},.5 L0,.5 M${.5-i},.5 L${.5-i},1`,strokeWidth:1},"\u2557":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5+i},${.5-e} L${.5+i},1`,strokeWidth:1},"\u2558":{type:2,data:(i,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"\u2559":{type:2,data:(i,e)=>`M1,.5 L${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u255A":{type:2,data:(i,e)=>`M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0 M1,${.5+e} L${.5-i},${.5+e} L${.5-i},0`,strokeWidth:1},"\u255B":{type:2,data:(i,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"\u255C":{type:2,data:(i,e)=>`M0,.5 L${.5+i},.5 L${.5+i},0 M${.5-i},.5 L${.5-i},0`,strokeWidth:1},"\u255D":{type:2,data:(i,e)=>`M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M0,${.5+e} L${.5+i},${.5+e} L${.5+i},0`,strokeWidth:1},"\u255E":{type:2,data:(i,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u255F":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1 M${.5+i},.5 L1,.5`,strokeWidth:1},"\u2560":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u2561":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2562":{type:2,data:(i,e)=>`M0,.5 L${.5-i},.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2563":{type:2,data:(i,e)=>`M${.5+i},0 L${.5+i},1 M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0`,strokeWidth:1},"\u2564":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"\u2565":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},1 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2566":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2567":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2568":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u2569":{type:2,data:(i,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256A":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u256B":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u256C":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256D":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u256E":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u256F":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u2570":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u2571":{type:2,data:"M1,0 L0,1",strokeWidth:1},"\u2572":{type:2,data:"M0,0 L1,1",strokeWidth:1},"\u2573":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"\u2574":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"\u2575":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"\u2576":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"\u2577":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"\u2578":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"\u2579":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"\u257A":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"\u257B":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"\u257C":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u257D":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u257E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u257F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2580":{type:0,data:[{x:0,y:0,w:8,h:4}]},"\u2581":{type:0,data:[{x:0,y:7,w:8,h:1}]},"\u2582":{type:0,data:[{x:0,y:6,w:8,h:2}]},"\u2583":{type:0,data:[{x:0,y:5,w:8,h:3}]},"\u2584":{type:0,data:[{x:0,y:4,w:8,h:4}]},"\u2585":{type:0,data:[{x:0,y:3,w:8,h:5}]},"\u2586":{type:0,data:[{x:0,y:2,w:8,h:6}]},"\u2587":{type:0,data:[{x:0,y:1,w:8,h:7}]},"\u2588":{type:0,data:[{x:0,y:0,w:8,h:8}]},"\u2589":{type:0,data:[{x:0,y:0,w:7,h:8}]},"\u258A":{type:0,data:[{x:0,y:0,w:6,h:8}]},"\u258B":{type:0,data:[{x:0,y:0,w:5,h:8}]},"\u258C":{type:0,data:[{x:0,y:0,w:4,h:8}]},"\u258D":{type:0,data:[{x:0,y:0,w:3,h:8}]},"\u258E":{type:0,data:[{x:0,y:0,w:2,h:8}]},"\u258F":{type:0,data:[{x:0,y:0,w:1,h:8}]},"\u2590":{type:0,data:[{x:4,y:0,w:4,h:8}]},"\u2591":{type:1,data:[[1,0],[0,0]]},"\u2592":{type:1,data:[[1,0],[0,1]]},"\u2593":{type:1,data:[[1,1],[1,0]]},"\u2594":{type:0,data:[{x:0,y:0,w:8,h:1}]},"\u2595":{type:0,data:[{x:7,y:0,w:1,h:8}]},"\u2596":{type:0,data:[{x:0,y:4,w:4,h:4}]},"\u2597":{type:0,data:[{x:4,y:4,w:4,h:4}]},"\u2598":{type:0,data:[{x:0,y:0,w:4,h:4}]},"\u2599":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\u259A":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"\u259B":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"\u259C":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"\u259D":{type:0,data:[{x:4,y:0,w:4,h:4}]},"\u259E":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"\u259F":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\uE0A0":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"\uE0A1":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0A2":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"\uE0A3":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0B0":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"\uE0B1":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B2":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"\uE0B3":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B4":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"\uE0B5":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"\uE0B6":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"\uE0B7":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"\uE0B8":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"\uE0B9":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BA":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"\uE0BB":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BC":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"\uE0BD":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BE":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"\uE0BF":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0C0":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"\uE0C1":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"\uE0C2":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"\uE0C3":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"\uE0C4":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"\uE0C5":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"\uE0C6":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"\uE0C7":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"\uE0C8":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"\uE0CA":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"\uE0CC":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"\uE0CD":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"\uE0CE":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"\uE0CF":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"\uE0D0":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"\uE0D1":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"\uE0D2":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"\uE0D4":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"\uEE00":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"\uEE01":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"\uEE02":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"\uEE03":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"\uEE04":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"\uEE05":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"\uEE06":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"\uEE07":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"\uEE08":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE09":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0A":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0B":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"\uF5D0":l.LINE_H,"\uF5D1":l.LINE_V,"\uF5D2":l.FADE_RIGHT,"\uF5D3":l.FADE_LEFT,"\uF5D4":l.FADE_DOWN,"\uF5D5":l.FADE_UP,"\uF5D6":l.CURVE_DOWN_RIGHT,"\uF5D7":l.CURVE_DOWN_LEFT,"\uF5D8":l.CURVE_UP_RIGHT,"\uF5D9":l.CURVE_UP_LEFT,"\uF5DA":[l.LINE_V,l.CURVE_UP_RIGHT],"\uF5DB":[l.LINE_V,l.CURVE_DOWN_RIGHT],"\uF5DC":[l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5DD":[l.LINE_V,l.CURVE_UP_LEFT],"\uF5DE":[l.LINE_V,l.CURVE_DOWN_LEFT],"\uF5DF":[l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E0":[l.LINE_H,l.CURVE_DOWN_LEFT],"\uF5E1":[l.LINE_H,l.CURVE_DOWN_RIGHT],"\uF5E2":[l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E3":[l.LINE_H,l.CURVE_UP_LEFT],"\uF5E4":[l.LINE_H,l.CURVE_UP_RIGHT],"\uF5E5":[l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E6":[l.LINE_V,l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E7":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E8":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E9":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5EA":[l.LINE_V,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5EB":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EC":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5ED":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EE":[l.NODE_FILL,l.NODE_STROKE],"\uF5EF":l.NODE_STROKE,"\uF5F0":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F1":[l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F2":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F3":[l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F4":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F5":[l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F6":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F7":[l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F8":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP],"\uF5F9":[l.NODE_STROKE,l.NODE_LINE_UP],"\uF5FA":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FB":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FC":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FD":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FE":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF5FF":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF600":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF601":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF602":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF603":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF604":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF605":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF606":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF607":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF608":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF609":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60A":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60B":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60C":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60D":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\u{1FB00}":f(1),"\u{1FB01}":f(2),"\u{1FB02}":f(3),"\u{1FB03}":f(4),"\u{1FB04}":f(5),"\u{1FB05}":f(6),"\u{1FB06}":f(7),"\u{1FB07}":f(8),"\u{1FB08}":f(9),"\u{1FB09}":f(10),"\u{1FB0A}":f(11),"\u{1FB0B}":f(12),"\u{1FB0C}":f(13),"\u{1FB0D}":f(14),"\u{1FB0E}":f(15),"\u{1FB0F}":f(16),"\u{1FB10}":f(17),"\u{1FB11}":f(18),"\u{1FB12}":f(19),"\u{1FB13}":f(20),"\u{1FB14}":f(22),"\u{1FB15}":f(23),"\u{1FB16}":f(24),"\u{1FB17}":f(25),"\u{1FB18}":f(26),"\u{1FB19}":f(27),"\u{1FB1A}":f(28),"\u{1FB1B}":f(29),"\u{1FB1C}":f(30),"\u{1FB1D}":f(31),"\u{1FB1E}":f(32),"\u{1FB1F}":f(33),"\u{1FB20}":f(34),"\u{1FB21}":f(35),"\u{1FB22}":f(36),"\u{1FB23}":f(37),"\u{1FB24}":f(38),"\u{1FB25}":f(39),"\u{1FB26}":f(40),"\u{1FB27}":f(41),"\u{1FB28}":f(43),"\u{1FB29}":f(44),"\u{1FB2A}":f(45),"\u{1FB2B}":f(46),"\u{1FB2C}":f(47),"\u{1FB2D}":f(48),"\u{1FB2E}":f(49),"\u{1FB2F}":f(50),"\u{1FB30}":f(51),"\u{1FB31}":f(52),"\u{1FB32}":f(53),"\u{1FB33}":f(54),"\u{1FB34}":f(55),"\u{1FB35}":f(56),"\u{1FB36}":f(57),"\u{1FB37}":f(58),"\u{1FB38}":f(59),"\u{1FB39}":f(60),"\u{1FB3A}":f(61),"\u{1FB3B}":f(62),"\u{1FB3C}":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"\u{1FB3D}":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"\u{1FB3E}":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"\u{1FB3F}":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"\u{1FB40}":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"\u{1FB41}":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB42}":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"\u{1FB43}":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB44}":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"\u{1FB45}":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"\u{1FB46}":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"\u{1FB47}":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"\u{1FB48}":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"\u{1FB49}":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"\u{1FB4A}":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"\u{1FB4B}":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"\u{1FB4C}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4D}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4E}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB4F}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB50}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"\u{1FB51}":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB52}":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB53}":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"\u{1FB54}":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB55}":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"\u{1FB56}":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"\u{1FB57}":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"\u{1FB58}":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"\u{1FB59}":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"\u{1FB5A}":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"\u{1FB5B}":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"\u{1FB5C}":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB5D}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5E}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5F}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB60}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB61}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"\u{1FB62}":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"\u{1FB63}":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"\u{1FB64}":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"\u{1FB65}":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"\u{1FB66}":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"\u{1FB67}":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"\u{1FB68}":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"\u{1FB69}":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"\u{1FB6A}":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"\u{1FB6B}":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"\u{1FB6C}":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"\u{1FB6D}":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"\u{1FB6E}":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"\u{1FB6F}":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"\u{1FB70}":{type:0,data:[{x:1,y:0,w:1,h:8}]},"\u{1FB71}":{type:0,data:[{x:2,y:0,w:1,h:8}]},"\u{1FB72}":{type:0,data:[{x:3,y:0,w:1,h:8}]},"\u{1FB73}":{type:0,data:[{x:4,y:0,w:1,h:8}]},"\u{1FB74}":{type:0,data:[{x:5,y:0,w:1,h:8}]},"\u{1FB75}":{type:0,data:[{x:6,y:0,w:1,h:8}]},"\u{1FB76}":{type:0,data:[{x:0,y:1,w:8,h:1}]},"\u{1FB77}":{type:0,data:[{x:0,y:2,w:8,h:1}]},"\u{1FB78}":{type:0,data:[{x:0,y:3,w:8,h:1}]},"\u{1FB79}":{type:0,data:[{x:0,y:4,w:8,h:1}]},"\u{1FB7A}":{type:0,data:[{x:0,y:5,w:8,h:1}]},"\u{1FB7B}":{type:0,data:[{x:0,y:6,w:8,h:1}]},"\u{1FB7C}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB7D}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7E}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7F}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB80}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB81}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB82}":{type:0,data:[{x:0,y:0,w:8,h:2}]},"\u{1FB83}":{type:0,data:[{x:0,y:0,w:8,h:3}]},"\u{1FB84}":{type:0,data:[{x:0,y:0,w:8,h:5}]},"\u{1FB85}":{type:0,data:[{x:0,y:0,w:8,h:6}]},"\u{1FB86}":{type:0,data:[{x:0,y:0,w:8,h:7}]},"\u{1FB87}":{type:0,data:[{x:6,y:0,w:2,h:8}]},"\u{1FB88}":{type:0,data:[{x:5,y:0,w:3,h:8}]},"\u{1FB89}":{type:0,data:[{x:3,y:0,w:5,h:8}]},"\u{1FB8A}":{type:0,data:[{x:2,y:0,w:6,h:8}]},"\u{1FB8B}":{type:0,data:[{x:1,y:0,w:7,h:8}]},"\u{1FB8C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"\u{1FB8D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"\u{1FB8E}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"\u{1FB8F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"\u{1FB90}":{type:1,data:[[0,1],[1,0]]},"\u{1FB91}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"\u{1FB92}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"\u{1FB94}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"\u{1FB95}":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"\u{1FB96}":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"\u{1FB97}":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"\u{1FB98}":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"\u{1FB99}":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"\u{1FB9A}":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"\u{1FB9B}":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"\u{1FB9C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"\u{1FB9D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"\u{1FB9E}":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"\u{1FB9F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"\u{1FBA0}":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"\u{1FBA1}":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"\u{1FBA2}":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"\u{1FBA3}":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"\u{1FBA4}":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBA5}":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBA6}":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBA7}":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"\u{1FBA8}":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"\u{1FBA9}":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"\u{1FBAA}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"\u{1FBAB}":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBAC}":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBAD}":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBAE}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"\u{1FBAF}":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"\u{1FBB0}":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"\u{1FBB1}":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"\u{1FBB2}":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"\u{1FBB3}":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"\u{1FBB4}":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"\u{1FBB5}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB6}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB7}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB8}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB9}":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"\u{1FBBA}":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"\u{1FBBB}":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"\u{1FBBC}":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"\u{1FBBD}":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"\u{1FBBE}":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"\u{1FBBF}":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"\u{1FBC0}":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"\u{1FBC1}":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"\u{1FBC2}":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"\u{1FBC3}":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"\u{1FBC4}":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"\u{1FBC5}":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC6}":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC7}":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC8}":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC9}":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBCA}":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"\u{1FBCB}":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"\u{1FBCC}":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"\u{1FBCD}":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"\u{1FBCE}":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"\u{1FBCF}":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"\u{1FBD0}":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"\u{1FBD1}":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"\u{1FBD2}":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"\u{1FBD3}":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"\u{1FBD4}":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"\u{1FBD5}":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"\u{1FBD6}":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"\u{1FBD7}":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"\u{1FBD8}":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"\u{1FBD9}":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDA}":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDB}":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"\u{1FBDC}":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"\u{1FBDD}":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"\u{1FBDE}":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"\u{1FBDF}":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"\u{1FBE0}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"\u{1FBE1}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"\u{1FBE2}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"\u{1FBE3}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"\u{1FBE4}":{type:0,data:[{x:2,y:0,w:4,h:4}]},"\u{1FBE5}":{type:0,data:[{x:2,y:4,w:4,h:4}]},"\u{1FBE6}":{type:0,data:[{x:0,y:2,w:4,h:4}]},"\u{1FBE7}":{type:0,data:[{x:4,y:2,w:4,h:4}]},"\u{1FBE8}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"\u{1FBE9}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"\u{1FBEA}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"\u{1FBEB}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"\u{1FBEC}":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"\u{1FBED}":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"\u{1FBEE}":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"\u{1FBEF}":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"\u{1FBF0}":{type:5,data:{d:o0(126),type:0},scaleType:1},"\u{1FBF1}":{type:5,data:{d:o0(48),type:0},scaleType:1},"\u{1FBF2}":{type:5,data:{d:o0(109),type:0},scaleType:1},"\u{1FBF3}":{type:5,data:{d:o0(121),type:0},scaleType:1},"\u{1FBF4}":{type:5,data:{d:o0(51),type:0},scaleType:1},"\u{1FBF5}":{type:5,data:{d:o0(91),type:0},scaleType:1},"\u{1FBF6}":{type:5,data:{d:o0(95),type:0},scaleType:1},"\u{1FBF7}":{type:5,data:{d:o0(114),type:0},scaleType:1},"\u{1FBF8}":{type:5,data:{d:o0(127),type:0},scaleType:1},"\u{1FBF9}":{type:5,data:{d:o0(123),type:0},scaleType:1},"\u{1FBFA}":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(i,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},$e=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951]);function f(i){return{type:2,data:()=>{let e=[],r=[.375,.25,.375],s=[0,3/8,5/8];for(let a=0;a<3;a++){let o=i>>a*2&1,n=i>>a*2+1&1;o&&n?e.push(`M0,${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L0,${s[a]+r[a]} Z`):o?e.push(`M0,${s[a]} L${.5},${s[a]} L${.5},${s[a]+r[a]} L0,${s[a]+r[a]} Z`):n&&e.push(`M${.5},${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L${.5},${s[a]+r[a]} Z`)}return e.join(" ")}}}function o0(i){let e=[];if(i&64){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.2125} L${Q+.075},${.175} L${m-.075},${.175} L${m},${.2125} L${m-.075},${.25} L${Q+.075},${.25} Z`)}if(i&32){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.175+.075+.015,m=.5-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&16){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.5+.015,m=.825-.075-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&8){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.7875} L${Q+.075},${.75} L${m-.075},${.75} L${m},${.7875} L${m-.075},${.825} L${Q+.075},${.825} Z`)}if(i&4&&e.push(`M${.125},${.515} L${.2},${.515+.0375} L${.2},${.735-.0375} L${.125},${.735} L${.05},${.735-.0375} L${.05},${.515+.0375} Z`),i&2&&e.push(`M${.125},${.265} L${.2},${.265+.0375} L${.2},${.485-.0375} L${.125},${.485} L${.05},${.485-.0375} L${.05},${.265+.0375} Z`),i&1){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.5} L${Q+.075},${.4625} L${m-.075},${.4625} L${m},${.5} L${m-.075},${.5375} L${Q+.075},${.5375} Z`)}return e.join(" ")}var k=0,H=0,T0=!1,_0=!1,$0=!1,z,x0=0,G0=class{constructor(e,t,r,s,a,o){this._terminal=e;this._optionService=t;this._selectionRenderModel=r;this._decorationService=s;this._coreBrowserService=a;this._themeService=o;this.result={fg:0,bg:0,ext:0}}resolve(e,t,r,s,a){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=e.bg&268435456?e.extended.ext:0,H=0,k=0,_0=!1,T0=!1,$0=!1,z=this._themeService.colors,x0=0;let o=e.getCode();if(o!==0&&e.extended.underlineStyle===4){let n=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));x0=t*s%(Math.round(n)*2)}if(x0===0&&$e.has(o)&&(x0=t*s%2*2+r*a%2),this._decorationService.forEachDecorationAtCell(t,r,"bottom",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),$0=this._selectionRenderModel.isCellSelected(this._terminal,t,r),$0){if(this.result.fg&67108864||(this.result.bg&50331648)!==0){if(this.result.fg&67108864)switch(this.result.fg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:H=(this.result.fg&16777215)<<8|255;break;case 0:default:H=this._themeService.colors.foreground.rgba}else switch(this.result.bg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:H=(this.result.bg&16777215)<<8|255;break}H=d0.blend(H,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}else H=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(_0=!0,z.selectionForeground&&(k=z.selectionForeground.rgba>>8&16777215,T0=!0),V0(e.getCode())){if(this.result.fg&67108864&&(this.result.bg&50331648)===0)k=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(this.result.fg&67108864)switch(this.result.bg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:k=(this.result.bg&16777215)<<8|255;break}else switch(this.result.fg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:k=(this.result.fg&16777215)<<8|255;break;case 0:default:k=this._themeService.colors.foreground.rgba}k=d0.blend(k,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}T0=!0}}this._decorationService.forEachDecorationAtCell(t,r,"top",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),_0&&($0?H=e.bg&-16777216&-134217729|H|50331648:H=e.bg&-16777216|H|50331648),T0&&(k=e.fg&-16777216&-67108865|k|50331648),this.result.fg&67108864&&(_0&&!T0&&((this.result.bg&50331648)===0?k=this.result.fg&-134217728|z.background.rgba>>8&16777215&16777215|50331648:k=this.result.fg&-134217728|this.result.bg&67108863,T0=!0),!_0&&T0&&((this.result.fg&50331648)===0?H=this.result.bg&-67108864|z.foreground.rgba>>8&16777215&16777215|50331648:H=this.result.bg&-67108864|this.result.fg&67108863,_0=!0)),z=void 0,this.result.bg=_0?H:this.result.bg,this.result.fg=T0?k:this.result.fg,this.result.ext&=536870911,this.result.ext|=x0<<29&3758096384}};var Ke=.5,K0=Be||we?"bottom":"ideographic";function qe(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=Ve[e];if(p){let c=Array.isArray(p)?p:[p];for(let u of c)Pt(i,u,t,r,s,a,o,n,L,T,h,d,_);return!0}return!1}function Pt(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=s,c=a,u=t,C=r;switch(e.scaleType===1&&(p=o,c=n,u=t+(s-o)/2,C=r+(a-n)/2),e.clipPath&&(i.save(),Vt(i,e.clipPath,u,C,p,c)),e.type){case 0:Bt(i,e.data,u,C,p,c);break;case 1:Ut(i,e.data,u,C,p,c,_);break;case 2:Wt(i,e.data,u,C,p,c,T,h,e.strokeWidth);break;case 3:Ht(i,e.data,u,C,p,c,T,e.strokeWidth);break;case 4:Zt(i,e.data,u,C,p,c,T,d);break;case 5:$t(i,e.data,u,C,p,c,L,T,h);break;case 6:wt(i,e.data,u,C,p,c);break}e.clipPath&&i.restore()}function Bt(i,e,t,r,s,a){for(let o=0;o{let F=parseFloat(m);return R%2===0?t+F*s:r+F*a});if(u==="M")i.moveTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="L")i.lineTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="Q")i.quadraticCurveTo(Q[0],Q[1],Q[2],Q[3]),d=Q[0],_=Q[1],T=Q[2],h=Q[3];else if(u==="T"){let m,R;p==="Q"||p==="T"?(m=2*T-d,R=2*h-_):(m=T,R=h),i.quadraticCurveTo(m,R,Q[0],Q[1]),d=m,_=R,T=Q[0],h=Q[1]}else u==="C"&&(i.bezierCurveTo(Q[0],Q[1],Q[2],Q[3],Q[4],Q[5]),d=Q[2],_=Q[3],T=Q[4],h=Q[5]);p=u}n!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*n,i.stroke()):i.fill()}function kt(i,e,t,r,s,a,o,n,L,T){if(r===0||s===0){i.lineTo(L,T);return}r=Math.abs(r),s=Math.abs(s);let h=Math.cos(a),d=Math.sin(a),_=(e-L)/2,p=(t-T)/2,c=h*_+d*p,u=-d*_+h*p,C=r*r,Q=s*s,m=c*c,R=u*u,F=m/C+R/Q;if(F>1){let I=Math.sqrt(F);r*=I,s*=I,C=r*r,Q=s*s}let E=(C*Q-C*R-Q*m)/(C*R+Q*m);E<0&&(E=0);let y=(o===n?-1:1)*Math.sqrt(E),Y=y*(r*u/s),X=y*-(s*c/r),A0=h*Y-d*X+(e+L)/2,t0=d*Y+h*X+(t+T)/2,L0=(c-Y)/r,A=(u-X)/s,n0=(-c-Y)/r,a0=(-u-X)/s,$=Math.atan2(A,L0),q=Math.atan2(a0,n0)-$;n===0&&q>0?q-=2*Math.PI:n===1&&q<0&&(q+=2*Math.PI);let g0=$+q;i.ellipse(A0,t0,r,s,a,$,g0,n===0)}function Zt(i,e,t,r,s,a,o,n){i.save(),i.fillRect(t,r,s,a),n&&(i.fillStyle=n,i.strokeStyle=n),i.lineWidth=o,i.lineCap="square",i.beginPath();for(let L of e.d.split(" ")){let T=L[0],h=L.substring(1).split(",");if(!h[0]||!h[1]){T==="Z"&&i.closePath();continue}let d=h.map((_,p)=>{let c=parseFloat(_);return p%2===0?t+c*s:r+c*a});T==="M"?i.moveTo(d[0],d[1]):T==="L"&&i.lineTo(d[0],d[1])}e.type===1?i.stroke():i.fill(),i.restore()}var Xe=new Map;function Ut(i,e,t,r,s,a,o=0){let n=Xe.get(e);n||(n=new Map,Xe.set(e,n));let L=i.fillStyle;if(typeof L!="string")throw new Error(`Unexpected fillStyle type "${L}"`);let T=n.get(L);if(!T){let _=e[0].length,p=e.length,c=i.canvas.ownerDocument.createElement("canvas");c.width=_,c.height=p;let u=g(c.getContext("2d")),C=new ImageData(_,p),Q,m,R,F;if(L.startsWith("#"))Q=parseInt(L.slice(1,3),16),m=parseInt(L.slice(3,5),16),R=parseInt(L.slice(5,7),16),F=L.length>7&&parseInt(L.slice(7,9),16)||1;else if(L.startsWith("rgba"))[Q,m,R,F]=L.substring(5,L.length-1).split(",").map(E=>parseFloat(E));else throw new Error(`Unexpected fillStyle color format "${L}" when drawing pattern glyph`);for(let E=0;E>1&1,d=o&1;h!==0||d!==0?T.setTransform(new DOMMatrix().translateSelf(-h,-d)):T.setTransform(new DOMMatrix),i.fillStyle=T,i.fillRect(t,r,s,a)}function Wt(i,e,t,r,s,a,o,n,L){i.save(),i.beginPath(),i.rect(t,r,s,a),i.clip(),i.beginPath();let T;if(typeof e=="function"){let _=.15/a*s;T=e(.15,_)}else T=e;let h={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let d of T.split(" ")){let _=d[0];if(_==="Z"){i.closePath(),h.lastCommand=_;continue}let p=je[_];if(!p){n.error(`Could not find drawing instructions for "${_}"`);continue}let c=d.substring(1).split(",");!c[0]||!c[1]||(p(i,Je(c,s,a,t,r,!0,o,0,0,!1),h),h.lastCommand=_)}L!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*L,i.stroke()):i.fill(),i.closePath(),i.restore()}function Vt(i,e,t,r,s,a){i.beginPath();for(let o of e.split(" ")){let n=o[0];if(n==="Z"){i.closePath();continue}let L=o.substring(1).split(",");if(!L[0]||!L[1])continue;let T=t+parseFloat(L[0])*s,h=r+parseFloat(L[1])*a;n==="M"?i.moveTo(T,h):n==="L"&&i.lineTo(T,h)}i.clip()}function $t(i,e,t,r,s,a,o,n,L){let T=new Path2D;T.rect(t,r,s,a),i.clip(T),i.beginPath();let h=o/12;i.lineWidth=n*h;let d={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let _ of e.d.split(" ")){let p=_[0];if(p==="Z"){i.closePath(),d.lastCommand=p;continue}let c=je[p];if(!c){L.error(`Could not find drawing instructions for "${p}"`);continue}let u=_.substring(1).split(",");!u[0]||!u[1]||(c(i,Je(u,s,a,t,r,!1,n,(e.leftPadding??0)*(h/2),(e.rightPadding??0)*(h/2)),d),d.lastCommand=p)}e.type===1?(i.strokeStyle=i.fillStyle,i.stroke()):i.fill(),i.closePath()}function Ye(i,e,t=0){return Math.max(Math.min(i,e),t)}var je={C:(i,e,t)=>{i.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),t.lastControlX=e[2],t.lastControlY=e[3],t.currentX=e[4],t.currentY=e[5]},L:(i,e,t)=>{i.lineTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},M:(i,e,t)=>{i.moveTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},Q:(i,e,t)=>{i.quadraticCurveTo(e[0],e[1],e[2],e[3]),t.lastControlX=e[0],t.lastControlY=e[1],t.currentX=e[2],t.currentY=e[3]},T:(i,e,t)=>{let r,s;t.lastCommand==="Q"||t.lastCommand==="T"?(r=2*t.currentX-t.lastControlX,s=2*t.currentY-t.lastControlY):(r=t.currentX,s=t.currentY),i.quadraticCurveTo(r,s,e[0],e[1]),t.lastControlX=r,t.lastControlY=s,t.currentX=e[0],t.currentY=e[1]}};function Je(i,e,t,r,s,a,o,n=0,L=0,T=!0){let h=i.map(d=>parseFloat(d)||parseInt(d));if(h.length<2)throw new Error("Too few arguments for instruction");for(let d=0;da){s-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),this._start();return}s=a}this.clear()}},Ce=class extends X0{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){let t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}},Qe=class extends X0{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}},et="requestIdleCallback"in globalThis?Qe:Ce;var s0=class i{constructor(){this.fg=0;this.bg=0;this.extended=new P0}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},P0=class i{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new i(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var U=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(e,t,r)=>{if(this._disposed)return M(()=>{});let s={fn:e,thisArgs:t};this._listeners.push(s);let a=M(()=>{let o=this._listeners.indexOf(s);o!==-1&&this._listeners.splice(o,1)});return r&&(Array.isArray(r)?r.push(a):r.add(a)),a},this._event)}fire(e){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{let{fn:t,thisArgs:r}=this._listeners[0];t.call(r,e);return}default:{let t=this._listeners.slice();for(let{fn:r,thisArgs:s}of t)r.call(s,e)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},c0;(s=>{function i(a,o){return a(n=>o.fire(n))}s.forward=i;function e(a,o){return(n,L,T)=>a(h=>n.call(L,o(h)),void 0,T)}s.map=e;function t(...a){return(o,n,L)=>{let T=new R0;for(let h of a)T.add(h(d=>o.call(n,d)));return L&&(Array.isArray(L)?L.push(T):L.add(T)),T}}s.any=t;function r(a,o,n){return o(n),a(L=>o(L))}s.runAndSubscribe=r})(c0||={});var tt={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},B0=2;var w0,J=class i{constructor(e,t,r,s){this._document=e;this._config=t;this._unicodeService=r;this._logService=s;this._didWarmUp=!1;this._cacheMap=new D0;this._cacheMapCombined=new D0;this._pages=[];this._activePages=[];this._workBoundingBox={top:0,left:0,bottom:0,right:0};this._workAttributeData=new s0;this._textureSize=512;this._onAddTextureAtlasCanvas=new U;this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=new U;this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._requestClearModel=!1;this._createNewPage(),this._tmpCanvas=it(e,this._config.deviceCellWidth*4+B0*2,this._config.deviceCellHeight+B0*2),this._tmpCtx=g(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new et(this._logService);for(let t=33;t<126;t++)e.enqueue(()=>{if(!this._cacheMap.get(t,0,0,0)){let r=this._drawToCache(t,0,0,0,!1,void 0);this._cacheMap.set(t,0,0,0,r)}})}beginFrame(){let e=this._requestClearModel;return this._requestClearModel=!1,e}clearTexture(){if(!(this._pages[0].currentRow.x===0&&this._pages[0].currentRow.y===0)){for(let e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(i.maxAtlasPages&&this._pages.length>=Math.max(4,i.maxAtlasPages)){let t=this._pages.filter(T=>T.canvas.width*2<=(i.maxTextureSize||4096)).sort((T,h)=>h.canvas.width!==T.canvas.width?h.canvas.width-T.canvas.width:h.percentageUsed-T.percentageUsed),r=-1,s=0;for(let T=0;TT.canvas.width!==a[0].canvas.width)){let T=new u0(this._document,this._textureSize);return this._pages.push(T),this._activePages.push(T),this._onAddTextureAtlasCanvas.fire(T.canvas),T}let o=a.map(T=>T.glyphs[0].texturePage).sort((T,h)=>T-h),n=this.pages.length-a.length,L=this._mergePages(a,n);L.version=++u0.nextVersion;for(let T=o.length-1;T>=0;T--)this._deletePage(o[T]);this.pages.push(L),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(L.canvas)}let e=new u0(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){let r=e[0].canvas.width*2,s=new u0(this._document,r,e);for(let[a,o]of e.entries()){let n=a*o.canvas.width%r,L=Math.floor(a/2)*o.canvas.height;s.ctx.drawImage(o.canvas,n,L);for(let h of o.glyphs)h.texturePage=t,h.sizeClipSpace.x=h.size.x/r,h.sizeClipSpace.y=h.size.y/r,h.texturePosition.x+=n,h.texturePosition.y+=L,h.texturePositionClipSpace.x=h.texturePosition.x/r,h.texturePositionClipSpace.y=h.texturePosition.y/r;this._onRemoveTextureAtlasCanvas.fire(o.canvas);let T=this._activePages.indexOf(o);T!==-1&&this._activePages.splice(T,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,r,s){if(this._config.allowTransparency)return K;let a;switch(e){case 16777216:case 33554432:a=this._getColorFromAnsiIndex(t);break;case 50331648:let o=s0.toColorRGB(t);a=Z.toColor(o[0],o[1],o[2]);break;case 0:default:r?a=I0.opaque(this._config.colors.foreground):a=this._config.colors.background;break}return this._config.allowTransparency||(a=I0.opaque(a)),a}_getForegroundColor(e,t,r,s,a,o,n,L,T,h){let d=this._getMinimumContrastColor(e,t,r,s,a,o,n,T,L,h);if(d)return d;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&T&&o<8&&(o+=8),_=this._getColorFromAnsiIndex(o);break;case 50331648:let p=s0.toColorRGB(o);_=Z.toColor(p[0],p[1],p[2]);break;case 0:default:n?_=this._config.colors.background:_=this._config.colors.foreground}return this._config.allowTransparency&&(_=I0.opaque(_)),L&&(_=I0.multiplyOpacity(_,Ke)),_}_resolveBackgroundRgba(e,t,r){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,r,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,r,s,a,o,n,L,T,h){if(this._config.minimumContrastRatio===1||h)return;let d=this._getContrastCache(T),_=d.getColor(e,s);if(_!==void 0)return _??void 0;let p=this._resolveBackgroundRgba(t,r,n),c=this._resolveForegroundRgba(a,o,n,L),u=d0.ensureContrastRatio(p,c,this._config.minimumContrastRatio/(T?2:1));if(!u){d.setColor(e,s,null);return}let C=Z.toColor(u>>24&255,u>>16&255,u>>8&255);return d.setColor(e,s,C),C}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,r,s,a,o){let n=typeof e=="number"?String.fromCharCode(e):e;o&&this._tmpCanvas.parentElement!==o&&(this._tmpCanvas.style.display="none",o.append(this._tmpCanvas));let L=Math.min(this._config.deviceCellWidth*Math.max(n.length,2)+B0*2,this._config.deviceMaxTextureSize);this._tmpCanvas.width=b?b*2-f0:b-f0;!(f0>=b)===!1||Z0===0?(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j+Z0,G),this._tmpCtx.lineTo(Q0,G)):(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(j+Z0,G),this._tmpCtx.moveTo(j+Z0+b,G),this._tmpCtx.lineTo(Q0,G)),f0=We(Q0-j,b,f0);break;case 5:let vt=.6,Ot=.3,de=Q0-j,Se=Math.floor(vt*de),Re=Math.floor(Ot*de),It=de-Se-Re;this._tmpCtx.setLineDash([Se,Re,It]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break;case 1:default:this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break}y0||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!n0&&this._config.fontSize>=12&&!this._config.allowTransparency&&n!==" "){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";let r0=this._tmpCtx.measureText(n);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in r0&&r0.actualBoundingBoxDescent>0){this._tmpCtx.save();let y0=new Path2D;y0.rect(i0,C0-Math.ceil(b/2),this._config.deviceCellWidth*$,v0-C0+Math.ceil(b/2)),this._tmpCtx.clip(y0),this._tmpCtx.lineWidth=this._config.devicePixelRatio*3,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(n,A,A+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(Q){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),D=b%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+D),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*$,A+D),this._tmpCtx.stroke()}if(n0||this._tmpCtx.fillText(n,A,A+this._config.deviceCharHeight),n==="_"&&!this._config.allowTransparency){let b=fe(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0);if(b)for(let D=1;D<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(n,A,A+this._config.deviceCharHeight-D),b=fe(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0),!!b);D++);}if(C){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),D=this._tmpCtx.lineWidth%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*$,A+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.stroke()}this._tmpCtx.restore();let q=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height),g0;if(this._config.allowTransparency?g0=Gt(q):g0=fe(q,y,L0,a0),g0)return tt;let I=this._findGlyphBoundingBox(q,this._workBoundingBox,L,t0,n0,A),O,v;for(;;){if(this._activePages.length===0){let b=this._createNewPage();O=b,v=b.currentRow,v.height=I.size.y;break}O=this._activePages[this._activePages.length-1],v=O.currentRow;for(let b of this._activePages)I.size.y<=b.currentRow.height&&(O=b,v=b.currentRow);for(let b=this._activePages.length-1;b>=0;b--)for(let D of this._activePages[b].fixedRows)D.height<=v.height&&I.size.y<=D.height&&(O=this._activePages[b],v=D);if(I.size.x>this._textureSize){this._overflowSizePage||(this._overflowSizePage=new u0(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),O=this._overflowSizePage,v=this._overflowSizePage.currentRow,v.x+I.size.x>=O.canvas.width&&(v.x=0,v.y+=v.height,v.height=0);break}if(v.y+I.size.y>=O.canvas.height||v.height>I.size.y+2){let b=!1;if(O.currentRow.y+O.currentRow.height+I.size.y>=O.canvas.height){let D;for(let i0 of this._activePages)if(i0.currentRow.y+i0.currentRow.height+I.size.y=i.maxAtlasPages&&v.y+I.size.y<=O.canvas.height&&v.height>=I.size.y&&v.x+I.size.x<=O.canvas.width)b=!0;else{let i0=this._createNewPage();O=i0,v=i0.currentRow,v.height=I.size.y,b=!0}}b||(O.currentRow.height>0&&O.fixedRows.push(O.currentRow),v={x:0,y:O.currentRow.y+O.currentRow.height,height:I.size.y},O.fixedRows.push(v),O.currentRow={x:0,y:v.y+v.height,height:0})}if(v.x+I.size.x<=O.canvas.width)break;v===O.currentRow?(v.x=0,v.y+=v.height,v.height=0):O.fixedRows.splice(O.fixedRows.indexOf(v),1)}return I.texturePage=this._pages.indexOf(O),I.texturePosition.x=v.x,I.texturePosition.y=v.y,I.texturePositionClipSpace.x=v.x/O.canvas.width,I.texturePositionClipSpace.y=v.y/O.canvas.height,I.sizeClipSpace.x/=O.canvas.width,I.sizeClipSpace.y/=O.canvas.height,v.height=Math.max(v.height,I.size.y),v.x+=I.size.x,O.ctx.putImageData(q,I.texturePosition.x-this._workBoundingBox.left,I.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,I.size.x,I.size.y),O.addGlyph(I),O.version=++u0.nextVersion,I}_findGlyphBoundingBox(e,t,r,s,a,o){t.top=0;let n=s?this._config.deviceCellHeight:this._tmpCanvas.height,L=s?this._config.deviceCellWidth:r,T=!1;for(let h=0;h=o;h--){for(let d=0;d=0;h--){for(let d=0;d>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=t.rgba>>>24,L=t.rgba>>>16&255,T=t.rgba>>>8&255,h=Math.floor((Math.abs(s-n)+Math.abs(a-L)+Math.abs(o-T))/12),d=!0;for(let _=0;_0)return!1;return!0}function it(i,e,t){let r=i.createElement("canvas");return r.width=e,r.height=t,r}function rt(i,e,t,r,s,a,o,n,L=!0){let T={foreground:a.foreground,background:a.background,cursor:K,cursorAccent:K,selectionForeground:K,selectionBackgroundTransparent:K,selectionBackgroundOpaque:K,selectionInactiveBackgroundTransparent:K,selectionInactiveBackgroundOpaque:K,overviewRulerBorder:K,scrollbarSliderBackground:K,scrollbarSliderHoverBackground:K,scrollbarSliderActiveBackground:K,ansi:a.ansi.slice(),contrastCache:a.contrastCache,halfContrastCache:a.halfContrastCache};return{customGlyphs:L,devicePixelRatio:o,deviceMaxTextureSize:n,letterSpacing:s.letterSpacing,lineHeight:s.lineHeight,deviceCellWidth:i,deviceCellHeight:e,deviceCharWidth:t,deviceCharHeight:r,fontFamily:s.fontFamily,fontSize:s.fontSize,fontWeight:s.fontWeight,fontWeightBold:s.fontWeightBold,allowTransparency:s.allowTransparency,drawBoldTextInBrightColors:s.drawBoldTextInBrightColors,minimumContrastRatio:s.minimumContrastRatio,colors:T}}function Ee(i,e){for(let t=0;t=0){if(Ee(u.config,h))return u.atlas;u.ownedBy.length===1?(u.atlas.dispose(),e0.splice(c,1)):u.ownedBy.splice(C,1);break}}for(let c=0;c{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0){this._restartInterval(t);return}}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);this._animationTimeRestarted=void 0,this._restartInterval(t);return}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},e)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}};function ve(i,e,t){let r=new e.ResizeObserver(s=>{let a=s.find(L=>L.target===i);if(!a)return;if(!("devicePixelContentBoxSize"in a)){r?.disconnect(),r=void 0;return}let o=a.devicePixelContentBoxSize[0].inlineSize,n=a.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&t(o,n)});try{r.observe(i,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return M(()=>r?.disconnect())}function nt(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}var j0=class i extends s0{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new P0;this.combinedData=""}static fromCharData(t){let r=new i;return r.setFromCharData(t),r}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?nt(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let r=!1;if(t[1].length>2)r=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let a=t[1].charCodeAt(1);56320<=a&&a<=57343?this.content=(s-55296)*1024+a-56320+65536|t[2]<<22:r=!0}else r=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;r&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;let r=this.isUnderlineColorDefault(),s=t.isUnderlineColorDefault();if(!(r&&s)&&(r!==s||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return!1}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var J0=class extends W{constructor(t,r,s){super();this._renderCallback=t;this._coreBrowserService=r;this._optionsService=s;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",a=>{this.setIntervalDuration(a)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(M(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let r=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),r||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var te=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]);function ie(i,e,t,r){let s=g(i.createProgram());if(i.attachShader(s,g(at(i,i.VERTEX_SHADER,e,r))),i.attachShader(s,g(at(i,i.FRAGMENT_SHADER,t,r))),i.linkProgram(s),i.getProgramParameter(s,i.LINK_STATUS))return s;r.error(i.getProgramInfoLog(s)),i.deleteProgram(s)}function at(i,e,t,r){let s=g(i.createShader(e));if(i.shaderSource(s,t),i.compileShader(s),i.getShaderParameter(s,i.COMPILE_STATUS))return s;r.error(i.getShaderInfoLog(s)),i.deleteShader(s)}function ot(i,e){let t=Math.min(i.length*2,e),r=new Float32Array(t);for(let s=0;sFt(i5))}var R0=class{constructor(){this._disposables=new Set;this._isDisposed=false}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=true;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},W=class{constructor(){this._store=new R0}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};W.None=Object.freeze({dispose(){}});var m0=class{constructor(){this._isDisposed=false}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=true,this._value?.dispose(),this._value=void 0}};var Pe=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),O0=Pe?"node":navigator.userAgent,ce=Pe?"node":navigator.platform,Be=O0.includes("Firefox"),n1=O0.includes("Chrome"),we=O0.includes("Edge"),ue=/^((?!chrome|android).)*safari/i.test(O0);function He(){if(!ue)return 0;let i5=O0.match(/Version\/(\d+)/);return i5===null||i5.length<2?0:parseInt(i5[1],10)}var a1=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(ce),o1=["Windows","Win16","Win32","WinCE"].includes(ce),T1=ce.indexOf("Linux")>=0,l1=/\bCrOS\b/.test(O0);var P=0,B=0,w=0,x=0,K={css:"#00000000",rgba:0},Z;(r=>{function i5(s,a,o,n){return n!==void 0?`#${E0(s)}${E0(a)}${E0(o)}${E0(n)}`:`#${E0(s)}${E0(a)}${E0(o)}`}r.toCss=i5;function e(s,a,o,n=255){return(s<<24|a<<16|o<<8|n)>>>0}r.toRgba=e;function t(s,a,o,n){return{css:r.toCss(s,a,o,n),rgba:r.toRgba(s,a,o,n)}}r.toColor=t})(Z||={});var I0;(n=>{function i5(L,T){if(x=(T.rgba&255)/255,x===1)return{css:T.css,rgba:T.rgba};let h=T.rgba>>24&255,d=T.rgba>>16&255,_=T.rgba>>8&255,p=L.rgba>>24&255,c=L.rgba>>16&255,u=L.rgba>>8&255;P=p+Math.round((h-p)*x),B=c+Math.round((d-c)*x),w=u+Math.round((_-u)*x);let C=Z.toCss(P,B,w),Q=Z.toRgba(P,B,w);return{css:C,rgba:Q}}n.blend=i5;function e(L){return(L.rgba&255)===255}n.isOpaque=e;function t(L,T,h){let d=d0.ensureContrastRatio(L.rgba,T.rgba,h);if(d)return Z.toColor(d>>24&255,d>>16&255,d>>8&255)}n.ensureContrastRatio=t;function r(L){let T=(L.rgba|255)>>>0;return[P,B,w]=d0.toChannels(T),{css:Z.toCss(P,B,w),rgba:T}}n.opaque=r;function s(L,T){return x=Math.round(T*255),[P,B,w]=d0.toChannels(L.rgba),{css:Z.toCss(P,B,w,x),rgba:Z.toRgba(P,B,w,x)}}n.opacity=s;function a(L,T){return x=L.rgba&255,s(L,x*T/255)}n.multiplyOpacity=a;function o(L){return[L.rgba>>24&255,L.rgba>>16&255,L.rgba>>8&255]}n.toColorRGB=o})(I0||={});var Mt;(r=>{let i5,e;try{let s=document.createElement("canvas");s.width=1,s.height=1;let a=s.getContext("2d",{willReadFrequently:true});a&&(i5=a,i5.globalCompositeOperation="copy",e=i5.createLinearGradient(0,0,1,1))}catch{}function t(s){if(s.match(/#[\da-f]{3,8}/i))switch(s.length){case 4:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),Z.toColor(P,B,w);case 5:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),x=parseInt(s.slice(4,5).repeat(2),16),Z.toColor(P,B,w,x);case 7:return{css:s,rgba:(parseInt(s.slice(1),16)<<8|255)>>>0};case 9:return{css:s,rgba:parseInt(s.slice(1),16)>>>0}}let a=s.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return P=parseInt(a[1],10),B=parseInt(a[2],10),w=parseInt(a[3],10),x=Math.round((a[5]===void 0?1:parseFloat(a[5]))*255),Z.toColor(P,B,w,x);if(s==="transparent")return{css:"transparent",rgba:0};if(!i5||!e)throw new Error("css.toColor: Unsupported css format");if(i5.fillStyle=e,i5.fillStyle=s,typeof i5.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(i5.fillRect(0,0,1,1),[P,B,w,x]=i5.getImageData(0,0,1,1).data,x!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:Z.toRgba(P,B,w,x),css:s}}r.toColor=t})(Mt||={});var V;(t=>{function i5(r){return e(r>>16&255,r>>8&255,r&255)}t.relativeLuminance=i5;function e(r,s,a){let o=r/255,n=s/255,L=a/255,T=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),h=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4),d=L<=.03928?L/12.92:Math.pow((L+.055)/1.055,2.4);return T*.2126+h*.7152+d*.0722}t.relativeLuminance2=e})(V||={});var d0;(a=>{function i5(o,n){if(x=(n&255)/255,x===1)return n;let L=n>>24&255,T=n>>16&255,h=n>>8&255,d=o>>24&255,_=o>>16&255,p=o>>8&255;return P=d+Math.round((L-d)*x),B=_+Math.round((T-_)*x),w=p+Math.round((h-p)*x),Z.toRgba(P,B,w)}a.blend=i5;function e(o,n,L){let T=V.relativeLuminance(o>>8),h=V.relativeLuminance(n>>8);if(h0(T,h)>8));if(u>8));return u>Q?c:C}return c}let _=r(o,n,L),p=h0(T,V.relativeLuminance(_>>8));if(p>8));return p>u?_:c}return _}}a.ensureContrastRatio=e;function t(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u0||p>0||c>0);)_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),c-=Math.max(0,Math.ceil(c*.1)),u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));return(_<<24|p<<16|c<<8|255)>>>0}a.reduceLuminance=t;function r(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u>>0}a.increaseLuminance=r;function s(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}a.toChannels=s})(d0||={});function E0(i5){let e=i5.toString(16);return e.length<2?"0"+e:e}function h0(i5,e){return i5=128512&&i5<=128591||i5>=127744&&i5<=128511||i5>=128640&&i5<=128767||i5>=9728&&i5<=9983||i5>=9984&&i5<=10175||i5>=65024&&i5<=65039||i5>=129280&&i5<=129535||i5>=127462&&i5<=127487}function Ze(i5,e,t,r){return e===1&&t>Math.ceil(r*1.5)&&i5!==void 0&&i5>255&&!yt(i5)&&!W0(i5)&&!At(i5)}function V0(i5){return W0(i5)||gt(i5)}function Ue(){return{css:{canvas:U0(),cell:U0()},device:{canvas:U0(),cell:U0(),char:{width:0,height:0,left:0,top:0}}}}function U0(){return{width:0,height:0}}function We(i5,e,t=0){return(i5-(Math.round(e)*2-t))%(Math.round(e)*2)}var l;(C=>(C.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),C.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),C.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),C.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),C.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),C.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),C.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.CURVE_UP_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_UP_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),C.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),C.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),C.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),C.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),C.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})))(l||={});var Ve={"\u2500":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"\u2501":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"\u2502":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"\u2503":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"\u2504":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"\u2505":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"\u2506":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"\u2507":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"\u2508":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"\u2509":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"\u250A":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"\u250B":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"\u250C":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"\u250D":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u250E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u250F":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"\u2510":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"\u2511":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2512":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2513":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"\u2514":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"\u2515":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2516":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2517":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"\u2518":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"\u2519":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u251A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251B":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"\u251C":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"\u251D":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u251E":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251F":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2520":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2521":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2522":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2523":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"\u2524":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"\u2525":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2526":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2527":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2528":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2529":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u252A":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u252B":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"\u252C":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"\u252D":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u252E":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u252F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2530":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2531":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2532":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2533":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"\u2534":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"\u2535":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2536":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2537":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2538":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2539":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u253A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u253B":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"\u253C":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"\u253D":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u253E":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u253F":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2540":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2541":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2542":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2543":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u2544":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2545":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2546":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2547":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"\u2548":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"\u2549":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"\u254A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"\u254B":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"\u254C":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"\u254D":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"\u254E":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"\u254F":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"\u2550":{type:2,data:(i5,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2551":{type:2,data:(i5,e)=>`M${.5-i5},0 L${.5-i5},1 M${.5+i5},0 L${.5+i5},1`,strokeWidth:1},"\u2552":{type:2,data:(i5,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2553":{type:2,data:(i5,e)=>`M${.5-i5},1 L${.5-i5},.5 L1,.5 M${.5+i5},.5 L${.5+i5},1`,strokeWidth:1},"\u2554":{type:2,data:(i5,e)=>`M1,${.5-e} L${.5-i5},${.5-e} L${.5-i5},1 M1,${.5+e} L${.5+i5},${.5+e} L${.5+i5},1`,strokeWidth:1},"\u2555":{type:2,data:(i5,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2556":{type:2,data:(i5,e)=>`M${.5+i5},1 L${.5+i5},.5 L0,.5 M${.5-i5},.5 L${.5-i5},1`,strokeWidth:1},"\u2557":{type:2,data:(i5,e)=>`M0,${.5+e} L${.5-i5},${.5+e} L${.5-i5},1 M0,${.5-e} L${.5+i5},${.5-e} L${.5+i5},1`,strokeWidth:1},"\u2558":{type:2,data:(i5,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"\u2559":{type:2,data:(i5,e)=>`M1,.5 L${.5-i5},.5 L${.5-i5},0 M${.5+i5},.5 L${.5+i5},0`,strokeWidth:1},"\u255A":{type:2,data:(i5,e)=>`M1,${.5-e} L${.5+i5},${.5-e} L${.5+i5},0 M1,${.5+e} L${.5-i5},${.5+e} L${.5-i5},0`,strokeWidth:1},"\u255B":{type:2,data:(i5,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"\u255C":{type:2,data:(i5,e)=>`M0,.5 L${.5+i5},.5 L${.5+i5},0 M${.5-i5},.5 L${.5-i5},0`,strokeWidth:1},"\u255D":{type:2,data:(i5,e)=>`M0,${.5-e} L${.5-i5},${.5-e} L${.5-i5},0 M0,${.5+e} L${.5+i5},${.5+e} L${.5+i5},0`,strokeWidth:1},"\u255E":{type:2,data:(i5,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u255F":{type:2,data:(i5,e)=>`M${.5-i5},0 L${.5-i5},1 M${.5+i5},0 L${.5+i5},1 M${.5+i5},.5 L1,.5`,strokeWidth:1},"\u2560":{type:2,data:(i5,e)=>`M${.5-i5},0 L${.5-i5},1 M1,${.5+e} L${.5+i5},${.5+e} L${.5+i5},1 M1,${.5-e} L${.5+i5},${.5-e} L${.5+i5},0`,strokeWidth:1},"\u2561":{type:2,data:(i5,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2562":{type:2,data:(i5,e)=>`M0,.5 L${.5-i5},.5 M${.5-i5},0 L${.5-i5},1 M${.5+i5},0 L${.5+i5},1`,strokeWidth:1},"\u2563":{type:2,data:(i5,e)=>`M${.5+i5},0 L${.5+i5},1 M0,${.5+e} L${.5-i5},${.5+e} L${.5-i5},1 M0,${.5-e} L${.5-i5},${.5-e} L${.5-i5},0`,strokeWidth:1},"\u2564":{type:2,data:(i5,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"\u2565":{type:2,data:(i5,e)=>`M0,.5 L1,.5 M${.5-i5},.5 L${.5-i5},1 M${.5+i5},.5 L${.5+i5},1`,strokeWidth:1},"\u2566":{type:2,data:(i5,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-i5},${.5+e} L${.5-i5},1 M1,${.5+e} L${.5+i5},${.5+e} L${.5+i5},1`,strokeWidth:1},"\u2567":{type:2,data:(i5,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2568":{type:2,data:(i5,e)=>`M0,.5 L1,.5 M${.5-i5},.5 L${.5-i5},0 M${.5+i5},.5 L${.5+i5},0`,strokeWidth:1},"\u2569":{type:2,data:(i5,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-i5},${.5-e} L${.5-i5},0 M1,${.5-e} L${.5+i5},${.5-e} L${.5+i5},0`,strokeWidth:1},"\u256A":{type:2,data:(i5,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u256B":{type:2,data:(i5,e)=>`M0,.5 L1,.5 M${.5-i5},0 L${.5-i5},1 M${.5+i5},0 L${.5+i5},1`,strokeWidth:1},"\u256C":{type:2,data:(i5,e)=>`M0,${.5+e} L${.5-i5},${.5+e} L${.5-i5},1 M1,${.5+e} L${.5+i5},${.5+e} L${.5+i5},1 M0,${.5-e} L${.5-i5},${.5-e} L${.5-i5},0 M1,${.5-e} L${.5+i5},${.5-e} L${.5+i5},0`,strokeWidth:1},"\u256D":{type:2,data:(i5,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u256E":{type:2,data:(i5,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u256F":{type:2,data:(i5,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u2570":{type:2,data:(i5,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u2571":{type:2,data:"M1,0 L0,1",strokeWidth:1},"\u2572":{type:2,data:"M0,0 L1,1",strokeWidth:1},"\u2573":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"\u2574":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"\u2575":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"\u2576":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"\u2577":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"\u2578":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"\u2579":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"\u257A":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"\u257B":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"\u257C":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u257D":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u257E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u257F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2580":{type:0,data:[{x:0,y:0,w:8,h:4}]},"\u2581":{type:0,data:[{x:0,y:7,w:8,h:1}]},"\u2582":{type:0,data:[{x:0,y:6,w:8,h:2}]},"\u2583":{type:0,data:[{x:0,y:5,w:8,h:3}]},"\u2584":{type:0,data:[{x:0,y:4,w:8,h:4}]},"\u2585":{type:0,data:[{x:0,y:3,w:8,h:5}]},"\u2586":{type:0,data:[{x:0,y:2,w:8,h:6}]},"\u2587":{type:0,data:[{x:0,y:1,w:8,h:7}]},"\u2588":{type:0,data:[{x:0,y:0,w:8,h:8}]},"\u2589":{type:0,data:[{x:0,y:0,w:7,h:8}]},"\u258A":{type:0,data:[{x:0,y:0,w:6,h:8}]},"\u258B":{type:0,data:[{x:0,y:0,w:5,h:8}]},"\u258C":{type:0,data:[{x:0,y:0,w:4,h:8}]},"\u258D":{type:0,data:[{x:0,y:0,w:3,h:8}]},"\u258E":{type:0,data:[{x:0,y:0,w:2,h:8}]},"\u258F":{type:0,data:[{x:0,y:0,w:1,h:8}]},"\u2590":{type:0,data:[{x:4,y:0,w:4,h:8}]},"\u2591":{type:1,data:[[1,0],[0,0]]},"\u2592":{type:1,data:[[1,0],[0,1]]},"\u2593":{type:1,data:[[1,1],[1,0]]},"\u2594":{type:0,data:[{x:0,y:0,w:8,h:1}]},"\u2595":{type:0,data:[{x:7,y:0,w:1,h:8}]},"\u2596":{type:0,data:[{x:0,y:4,w:4,h:4}]},"\u2597":{type:0,data:[{x:4,y:4,w:4,h:4}]},"\u2598":{type:0,data:[{x:0,y:0,w:4,h:4}]},"\u2599":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\u259A":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"\u259B":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"\u259C":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"\u259D":{type:0,data:[{x:4,y:0,w:4,h:4}]},"\u259E":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"\u259F":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\uE0A0":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"\uE0A1":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0A2":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"\uE0A3":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0B0":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"\uE0B1":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B2":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"\uE0B3":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B4":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"\uE0B5":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"\uE0B6":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"\uE0B7":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"\uE0B8":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"\uE0B9":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BA":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"\uE0BB":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BC":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"\uE0BD":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BE":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"\uE0BF":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0C0":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"\uE0C1":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"\uE0C2":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"\uE0C3":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"\uE0C4":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"\uE0C5":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"\uE0C6":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"\uE0C7":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"\uE0C8":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"\uE0CA":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"\uE0CC":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"\uE0CD":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"\uE0CE":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"\uE0CF":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"\uE0D0":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"\uE0D1":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"\uE0D2":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"\uE0D4":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"\uEE00":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"\uEE01":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"\uEE02":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"\uEE03":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"\uEE04":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"\uEE05":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"\uEE06":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"\uEE07":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"\uEE08":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE09":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0A":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0B":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"\uF5D0":l.LINE_H,"\uF5D1":l.LINE_V,"\uF5D2":l.FADE_RIGHT,"\uF5D3":l.FADE_LEFT,"\uF5D4":l.FADE_DOWN,"\uF5D5":l.FADE_UP,"\uF5D6":l.CURVE_DOWN_RIGHT,"\uF5D7":l.CURVE_DOWN_LEFT,"\uF5D8":l.CURVE_UP_RIGHT,"\uF5D9":l.CURVE_UP_LEFT,"\uF5DA":[l.LINE_V,l.CURVE_UP_RIGHT],"\uF5DB":[l.LINE_V,l.CURVE_DOWN_RIGHT],"\uF5DC":[l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5DD":[l.LINE_V,l.CURVE_UP_LEFT],"\uF5DE":[l.LINE_V,l.CURVE_DOWN_LEFT],"\uF5DF":[l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E0":[l.LINE_H,l.CURVE_DOWN_LEFT],"\uF5E1":[l.LINE_H,l.CURVE_DOWN_RIGHT],"\uF5E2":[l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E3":[l.LINE_H,l.CURVE_UP_LEFT],"\uF5E4":[l.LINE_H,l.CURVE_UP_RIGHT],"\uF5E5":[l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E6":[l.LINE_V,l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E7":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E8":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E9":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5EA":[l.LINE_V,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5EB":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EC":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5ED":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EE":[l.NODE_FILL,l.NODE_STROKE],"\uF5EF":l.NODE_STROKE,"\uF5F0":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F1":[l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F2":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F3":[l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F4":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F5":[l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F6":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F7":[l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F8":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP],"\uF5F9":[l.NODE_STROKE,l.NODE_LINE_UP],"\uF5FA":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FB":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FC":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FD":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FE":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF5FF":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF600":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF601":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF602":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF603":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF604":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF605":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF606":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF607":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF608":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF609":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60A":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60B":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60C":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60D":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\u{1FB00}":f(1),"\u{1FB01}":f(2),"\u{1FB02}":f(3),"\u{1FB03}":f(4),"\u{1FB04}":f(5),"\u{1FB05}":f(6),"\u{1FB06}":f(7),"\u{1FB07}":f(8),"\u{1FB08}":f(9),"\u{1FB09}":f(10),"\u{1FB0A}":f(11),"\u{1FB0B}":f(12),"\u{1FB0C}":f(13),"\u{1FB0D}":f(14),"\u{1FB0E}":f(15),"\u{1FB0F}":f(16),"\u{1FB10}":f(17),"\u{1FB11}":f(18),"\u{1FB12}":f(19),"\u{1FB13}":f(20),"\u{1FB14}":f(22),"\u{1FB15}":f(23),"\u{1FB16}":f(24),"\u{1FB17}":f(25),"\u{1FB18}":f(26),"\u{1FB19}":f(27),"\u{1FB1A}":f(28),"\u{1FB1B}":f(29),"\u{1FB1C}":f(30),"\u{1FB1D}":f(31),"\u{1FB1E}":f(32),"\u{1FB1F}":f(33),"\u{1FB20}":f(34),"\u{1FB21}":f(35),"\u{1FB22}":f(36),"\u{1FB23}":f(37),"\u{1FB24}":f(38),"\u{1FB25}":f(39),"\u{1FB26}":f(40),"\u{1FB27}":f(41),"\u{1FB28}":f(43),"\u{1FB29}":f(44),"\u{1FB2A}":f(45),"\u{1FB2B}":f(46),"\u{1FB2C}":f(47),"\u{1FB2D}":f(48),"\u{1FB2E}":f(49),"\u{1FB2F}":f(50),"\u{1FB30}":f(51),"\u{1FB31}":f(52),"\u{1FB32}":f(53),"\u{1FB33}":f(54),"\u{1FB34}":f(55),"\u{1FB35}":f(56),"\u{1FB36}":f(57),"\u{1FB37}":f(58),"\u{1FB38}":f(59),"\u{1FB39}":f(60),"\u{1FB3A}":f(61),"\u{1FB3B}":f(62),"\u{1FB3C}":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"\u{1FB3D}":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"\u{1FB3E}":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"\u{1FB3F}":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"\u{1FB40}":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"\u{1FB41}":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB42}":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"\u{1FB43}":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB44}":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"\u{1FB45}":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"\u{1FB46}":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"\u{1FB47}":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"\u{1FB48}":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"\u{1FB49}":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"\u{1FB4A}":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"\u{1FB4B}":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"\u{1FB4C}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4D}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4E}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB4F}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB50}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"\u{1FB51}":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB52}":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB53}":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"\u{1FB54}":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB55}":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"\u{1FB56}":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"\u{1FB57}":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"\u{1FB58}":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"\u{1FB59}":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"\u{1FB5A}":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"\u{1FB5B}":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"\u{1FB5C}":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB5D}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5E}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5F}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB60}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB61}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"\u{1FB62}":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"\u{1FB63}":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"\u{1FB64}":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"\u{1FB65}":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"\u{1FB66}":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"\u{1FB67}":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"\u{1FB68}":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"\u{1FB69}":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"\u{1FB6A}":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"\u{1FB6B}":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"\u{1FB6C}":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"\u{1FB6D}":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"\u{1FB6E}":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"\u{1FB6F}":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"\u{1FB70}":{type:0,data:[{x:1,y:0,w:1,h:8}]},"\u{1FB71}":{type:0,data:[{x:2,y:0,w:1,h:8}]},"\u{1FB72}":{type:0,data:[{x:3,y:0,w:1,h:8}]},"\u{1FB73}":{type:0,data:[{x:4,y:0,w:1,h:8}]},"\u{1FB74}":{type:0,data:[{x:5,y:0,w:1,h:8}]},"\u{1FB75}":{type:0,data:[{x:6,y:0,w:1,h:8}]},"\u{1FB76}":{type:0,data:[{x:0,y:1,w:8,h:1}]},"\u{1FB77}":{type:0,data:[{x:0,y:2,w:8,h:1}]},"\u{1FB78}":{type:0,data:[{x:0,y:3,w:8,h:1}]},"\u{1FB79}":{type:0,data:[{x:0,y:4,w:8,h:1}]},"\u{1FB7A}":{type:0,data:[{x:0,y:5,w:8,h:1}]},"\u{1FB7B}":{type:0,data:[{x:0,y:6,w:8,h:1}]},"\u{1FB7C}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB7D}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7E}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7F}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB80}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB81}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB82}":{type:0,data:[{x:0,y:0,w:8,h:2}]},"\u{1FB83}":{type:0,data:[{x:0,y:0,w:8,h:3}]},"\u{1FB84}":{type:0,data:[{x:0,y:0,w:8,h:5}]},"\u{1FB85}":{type:0,data:[{x:0,y:0,w:8,h:6}]},"\u{1FB86}":{type:0,data:[{x:0,y:0,w:8,h:7}]},"\u{1FB87}":{type:0,data:[{x:6,y:0,w:2,h:8}]},"\u{1FB88}":{type:0,data:[{x:5,y:0,w:3,h:8}]},"\u{1FB89}":{type:0,data:[{x:3,y:0,w:5,h:8}]},"\u{1FB8A}":{type:0,data:[{x:2,y:0,w:6,h:8}]},"\u{1FB8B}":{type:0,data:[{x:1,y:0,w:7,h:8}]},"\u{1FB8C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"\u{1FB8D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"\u{1FB8E}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"\u{1FB8F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"\u{1FB90}":{type:1,data:[[0,1],[1,0]]},"\u{1FB91}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"\u{1FB92}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"\u{1FB94}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"\u{1FB95}":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"\u{1FB96}":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"\u{1FB97}":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"\u{1FB98}":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"\u{1FB99}":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"\u{1FB9A}":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"\u{1FB9B}":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"\u{1FB9C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"\u{1FB9D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"\u{1FB9E}":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"\u{1FB9F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"\u{1FBA0}":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"\u{1FBA1}":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"\u{1FBA2}":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"\u{1FBA3}":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"\u{1FBA4}":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBA5}":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBA6}":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBA7}":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"\u{1FBA8}":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"\u{1FBA9}":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"\u{1FBAA}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"\u{1FBAB}":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBAC}":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBAD}":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBAE}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"\u{1FBAF}":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"\u{1FBB0}":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"\u{1FBB1}":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"\u{1FBB2}":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"\u{1FBB3}":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"\u{1FBB4}":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"\u{1FBB5}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB6}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB7}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB8}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB9}":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"\u{1FBBA}":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"\u{1FBBB}":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"\u{1FBBC}":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"\u{1FBBD}":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"\u{1FBBE}":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"\u{1FBBF}":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"\u{1FBC0}":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"\u{1FBC1}":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"\u{1FBC2}":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"\u{1FBC3}":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"\u{1FBC4}":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"\u{1FBC5}":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC6}":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC7}":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC8}":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC9}":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBCA}":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"\u{1FBCB}":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"\u{1FBCC}":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"\u{1FBCD}":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"\u{1FBCE}":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"\u{1FBCF}":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"\u{1FBD0}":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"\u{1FBD1}":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"\u{1FBD2}":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"\u{1FBD3}":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"\u{1FBD4}":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"\u{1FBD5}":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"\u{1FBD6}":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"\u{1FBD7}":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"\u{1FBD8}":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"\u{1FBD9}":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDA}":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDB}":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"\u{1FBDC}":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"\u{1FBDD}":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"\u{1FBDE}":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"\u{1FBDF}":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"\u{1FBE0}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"\u{1FBE1}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"\u{1FBE2}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"\u{1FBE3}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"\u{1FBE4}":{type:0,data:[{x:2,y:0,w:4,h:4}]},"\u{1FBE5}":{type:0,data:[{x:2,y:4,w:4,h:4}]},"\u{1FBE6}":{type:0,data:[{x:0,y:2,w:4,h:4}]},"\u{1FBE7}":{type:0,data:[{x:4,y:2,w:4,h:4}]},"\u{1FBE8}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"\u{1FBE9}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"\u{1FBEA}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"\u{1FBEB}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"\u{1FBEC}":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"\u{1FBED}":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"\u{1FBEE}":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"\u{1FBEF}":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"\u{1FBF0}":{type:5,data:{d:o0(126),type:0},scaleType:1},"\u{1FBF1}":{type:5,data:{d:o0(48),type:0},scaleType:1},"\u{1FBF2}":{type:5,data:{d:o0(109),type:0},scaleType:1},"\u{1FBF3}":{type:5,data:{d:o0(121),type:0},scaleType:1},"\u{1FBF4}":{type:5,data:{d:o0(51),type:0},scaleType:1},"\u{1FBF5}":{type:5,data:{d:o0(91),type:0},scaleType:1},"\u{1FBF6}":{type:5,data:{d:o0(95),type:0},scaleType:1},"\u{1FBF7}":{type:5,data:{d:o0(114),type:0},scaleType:1},"\u{1FBF8}":{type:5,data:{d:o0(127),type:0},scaleType:1},"\u{1FBF9}":{type:5,data:{d:o0(123),type:0},scaleType:1},"\u{1FBFA}":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(i5,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},$e=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951]);function f(i5){return{type:2,data:()=>{let e=[],r=[.375,.25,.375],s=[0,3/8,5/8];for(let a=0;a<3;a++){let o=i5>>a*2&1,n=i5>>a*2+1&1;o&&n?e.push(`M0,${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L0,${s[a]+r[a]} Z`):o?e.push(`M0,${s[a]} L${.5},${s[a]} L${.5},${s[a]+r[a]} L0,${s[a]+r[a]} Z`):n&&e.push(`M${.5},${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L${.5},${s[a]+r[a]} Z`)}return e.join(" ")}}}function o0(i5){let e=[];if(i5&64){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.2125} L${Q+.075},${.175} L${m-.075},${.175} L${m},${.2125} L${m-.075},${.25} L${Q+.075},${.25} Z`)}if(i5&32){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.175+.075+.015,m=.5-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i5&16){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.5+.015,m=.825-.075-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i5&8){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.7875} L${Q+.075},${.75} L${m-.075},${.75} L${m},${.7875} L${m-.075},${.825} L${Q+.075},${.825} Z`)}if(i5&4&&e.push(`M${.125},${.515} L${.2},${.515+.0375} L${.2},${.735-.0375} L${.125},${.735} L${.05},${.735-.0375} L${.05},${.515+.0375} Z`),i5&2&&e.push(`M${.125},${.265} L${.2},${.265+.0375} L${.2},${.485-.0375} L${.125},${.485} L${.05},${.485-.0375} L${.05},${.265+.0375} Z`),i5&1){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.5} L${Q+.075},${.4625} L${m-.075},${.4625} L${m},${.5} L${m-.075},${.5375} L${Q+.075},${.5375} Z`)}return e.join(" ")}var k=0,H=0,T0=false,_0=false,$0=false,z,x0=0,G0=class{constructor(e,t,r,s,a,o){this._terminal=e;this._optionService=t;this._selectionRenderModel=r;this._decorationService=s;this._coreBrowserService=a;this._themeService=o;this.result={fg:0,bg:0,ext:0}}resolve(e,t,r,s,a){;this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=e.bg&268435456?e.extended.ext:0,H=0,k=0,_0=false,T0=false,$0=false,z=this._themeService.colors,x0=0;let o=e.getCode();if(o!==0&&e.extended.underlineStyle===4){let n=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));x0=t*s%(Math.round(n)*2)}if(x0===0&&$e.has(o)&&(x0=t*s%2*2+r*a%2),this._decorationService.forEachDecorationAtCell(t,r,"bottom",n=>{;n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=true),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=true)}),$0=this._selectionRenderModel.isCellSelected(this._terminal,t,r),$0){if(this.result.fg&67108864||(this.result.bg&50331648)!==0){if(this.result.fg&67108864)switch(this.result.fg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:H=(this.result.fg&16777215)<<8|255;break;case 0:default:H=this._themeService.colors.foreground.rgba}else switch(this.result.bg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:H=(this.result.bg&16777215)<<8|255;break}H=d0.blend(H,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}else H=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(_0=true,z.selectionForeground&&(k=z.selectionForeground.rgba>>8&16777215,T0=true),V0(e.getCode())){if(this.result.fg&67108864&&(this.result.bg&50331648)===0)k=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(this.result.fg&67108864)switch(this.result.bg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:k=(this.result.bg&16777215)<<8|255;break}else switch(this.result.fg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:k=(this.result.fg&16777215)<<8|255;break;case 0:default:k=this._themeService.colors.foreground.rgba}k=d0.blend(k,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}T0=true}};this._decorationService.forEachDecorationAtCell(t,r,"top",n=>{;n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=true),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=true)}),_0&&($0?H=e.bg&-16777216&-134217729|H|50331648:H=e.bg&-16777216|H|50331648),T0&&(k=e.fg&-16777216&-67108865|k|50331648),this.result.fg&67108864&&(_0&&!T0&&((this.result.bg&50331648)===0?k=this.result.fg&-134217728|z.background.rgba>>8&16777215&16777215|50331648:k=this.result.fg&-134217728|this.result.bg&67108863,T0=true),!_0&&T0&&((this.result.fg&50331648)===0?H=this.result.bg&-67108864|z.foreground.rgba>>8&16777215&16777215|50331648:H=this.result.bg&-67108864|this.result.fg&67108863,_0=true)),z=void 0,this.result.bg=_0?H:this.result.bg,this.result.fg=T0?k:this.result.fg,this.result.ext&=536870911,this.result.ext|=x0<<29&3758096384}};var Ke=.5,K0=Be||we?"bottom":"ideographic";function qe(i5,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=Ve[e];if(p){let c=Array.isArray(p)?p:[p];for(let u of c)Pt(i5,u,t,r,s,a,o,n,L,T,h,d,_);return true}return false}function Pt(i5,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=s,c=a,u=t,C=r;switch(e.scaleType===1&&(p=o,c=n,u=t+(s-o)/2,C=r+(a-n)/2),e.clipPath&&(i5.save(),Vt(i5,e.clipPath,u,C,p,c)),e.type){case 0:Bt(i5,e.data,u,C,p,c);break;case 1:Ut(i5,e.data,u,C,p,c,_);break;case 2:Wt(i5,e.data,u,C,p,c,T,h,e.strokeWidth);break;case 3:Ht(i5,e.data,u,C,p,c,T,e.strokeWidth);break;case 4:Zt(i5,e.data,u,C,p,c,T,d);break;case 5:$t(i5,e.data,u,C,p,c,L,T,h);break;case 6:wt(i5,e.data,u,C,p,c);break}e.clipPath&&i5.restore()}function Bt(i5,e,t,r,s,a){for(let o=0;o{let F=parseFloat(m);return R%2===0?t+F*s:r+F*a});if(u==="M")i5.moveTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="L")i5.lineTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="Q")i5.quadraticCurveTo(Q[0],Q[1],Q[2],Q[3]),d=Q[0],_=Q[1],T=Q[2],h=Q[3];else if(u==="T"){let m,R;p==="Q"||p==="T"?(m=2*T-d,R=2*h-_):(m=T,R=h),i5.quadraticCurveTo(m,R,Q[0],Q[1]),d=m,_=R,T=Q[0],h=Q[1]}else u==="C"&&(i5.bezierCurveTo(Q[0],Q[1],Q[2],Q[3],Q[4],Q[5]),d=Q[2],_=Q[3],T=Q[4],h=Q[5]);p=u}n!==void 0?(i5.strokeStyle=i5.fillStyle,i5.lineWidth=o*n,i5.stroke()):i5.fill()}function kt(i5,e,t,r,s,a,o,n,L,T){if(r===0||s===0){i5.lineTo(L,T);return};r=Math.abs(r),s=Math.abs(s);let h=Math.cos(a),d=Math.sin(a),_=(e-L)/2,p=(t-T)/2,c=h*_+d*p,u=-d*_+h*p,C=r*r,Q=s*s,m=c*c,R=u*u,F=m/C+R/Q;if(F>1){let I=Math.sqrt(F);r*=I,s*=I,C=r*r,Q=s*s}let E=(C*Q-C*R-Q*m)/(C*R+Q*m);E<0&&(E=0);let y=(o===n?-1:1)*Math.sqrt(E),Y=y*(r*u/s),X=y*-(s*c/r),A0=h*Y-d*X+(e+L)/2,t0=d*Y+h*X+(t+T)/2,L0=(c-Y)/r,A=(u-X)/s,n0=(-c-Y)/r,a0=(-u-X)/s,$=Math.atan2(A,L0),q=Math.atan2(a0,n0)-$;n===0&&q>0?q-=2*Math.PI:n===1&&q<0&&(q+=2*Math.PI);let g0=$+q;i5.ellipse(A0,t0,r,s,a,$,g0,n===0)}function Zt(i5,e,t,r,s,a,o,n){;i5.save(),i5.fillRect(t,r,s,a),n&&(i5.fillStyle=n,i5.strokeStyle=n),i5.lineWidth=o,i5.lineCap="square",i5.beginPath();for(let L of e.d.split(" ")){let T=L[0],h=L.substring(1).split(",");if(!h[0]||!h[1]){T==="Z"&&i5.closePath();continue}let d=h.map((_,p)=>{let c=parseFloat(_);return p%2===0?t+c*s:r+c*a});T==="M"?i5.moveTo(d[0],d[1]):T==="L"&&i5.lineTo(d[0],d[1])};e.type===1?i5.stroke():i5.fill(),i5.restore()}var Xe=new Map;function Ut(i5,e,t,r,s,a,o=0){let n=Xe.get(e);n||(n=new Map,Xe.set(e,n));let L=i5.fillStyle;if(typeof L!="string")throw new Error(`Unexpected fillStyle type "${L}"`);let T=n.get(L);if(!T){let _=e[0].length,p=e.length,c=i5.canvas.ownerDocument.createElement("canvas");c.width=_,c.height=p;let u=g(c.getContext("2d")),C=new ImageData(_,p),Q,m,R,F;if(L.startsWith("#"))Q=parseInt(L.slice(1,3),16),m=parseInt(L.slice(3,5),16),R=parseInt(L.slice(5,7),16),F=L.length>7&&parseInt(L.slice(7,9),16)||1;else if(L.startsWith("rgba"))[Q,m,R,F]=L.substring(5,L.length-1).split(",").map(E=>parseFloat(E));else throw new Error(`Unexpected fillStyle color format "${L}" when drawing pattern glyph`);for(let E=0;E>1&1,d=o&1;h!==0||d!==0?T.setTransform(new DOMMatrix().translateSelf(-h,-d)):T.setTransform(new DOMMatrix),i5.fillStyle=T,i5.fillRect(t,r,s,a)}function Wt(i5,e,t,r,s,a,o,n,L){;i5.save(),i5.beginPath(),i5.rect(t,r,s,a),i5.clip(),i5.beginPath();let T;if(typeof e=="function"){let _=.15/a*s;T=e(.15,_)}else T=e;let h={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let d of T.split(" ")){let _=d[0];if(_==="Z"){;i5.closePath(),h.lastCommand=_;continue}let p=je[_];if(!p){n.error(`Could not find drawing instructions for "${_}"`);continue}let c=d.substring(1).split(",");!c[0]||!c[1]||(p(i5,Je(c,s,a,t,r,true,o,0,0,false),h),h.lastCommand=_)};L!==void 0?(i5.strokeStyle=i5.fillStyle,i5.lineWidth=o*L,i5.stroke()):i5.fill(),i5.closePath(),i5.restore()}function Vt(i5,e,t,r,s,a){i5.beginPath();for(let o of e.split(" ")){let n=o[0];if(n==="Z"){i5.closePath();continue}let L=o.substring(1).split(",");if(!L[0]||!L[1])continue;let T=t+parseFloat(L[0])*s,h=r+parseFloat(L[1])*a;n==="M"?i5.moveTo(T,h):n==="L"&&i5.lineTo(T,h)}i5.clip()}function $t(i5,e,t,r,s,a,o,n,L){let T=new Path2D;T.rect(t,r,s,a),i5.clip(T),i5.beginPath();let h=o/12;i5.lineWidth=n*h;let d={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let _ of e.d.split(" ")){let p=_[0];if(p==="Z"){;i5.closePath(),d.lastCommand=p;continue}let c=je[p];if(!c){L.error(`Could not find drawing instructions for "${p}"`);continue}let u=_.substring(1).split(",");!u[0]||!u[1]||(c(i5,Je(u,s,a,t,r,false,n,(e.leftPadding??0)*(h/2),(e.rightPadding??0)*(h/2)),d),d.lastCommand=p)};e.type===1?(i5.strokeStyle=i5.fillStyle,i5.stroke()):i5.fill(),i5.closePath()}function Ye(i5,e,t=0){return Math.max(Math.min(i5,e),t)}var je={C:(i5,e,t)=>{;i5.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),t.lastControlX=e[2],t.lastControlY=e[3],t.currentX=e[4],t.currentY=e[5]},L:(i5,e,t)=>{;i5.lineTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},M:(i5,e,t)=>{;i5.moveTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},Q:(i5,e,t)=>{;i5.quadraticCurveTo(e[0],e[1],e[2],e[3]),t.lastControlX=e[0],t.lastControlY=e[1],t.currentX=e[2],t.currentY=e[3]},T:(i5,e,t)=>{let r,s;t.lastCommand==="Q"||t.lastCommand==="T"?(r=2*t.currentX-t.lastControlX,s=2*t.currentY-t.lastControlY):(r=t.currentX,s=t.currentY),i5.quadraticCurveTo(r,s,e[0],e[1]),t.lastControlX=r,t.lastControlY=s,t.currentX=e[0],t.currentY=e[1]}};function Je(i5,e,t,r,s,a,o,n=0,L=0,T=true){let h=i5.map(d=>parseFloat(d)||parseInt(d));if(h.length<2)throw new Error("Too few arguments for instruction");for(let d=0;da){;s-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),this._start();return}s=a}this.clear()}},Ce=class extends X0{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){let t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}},Qe=class extends X0{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}},et="requestIdleCallback"in globalThis?Qe:Ce;var s0=class i{constructor(){this.fg=0;this.bg=0;this.extended=new P0}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},P0=class i2{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){;this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){;this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){;this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new i2(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var U=class{constructor(){this._listeners=[];this._disposed=false}get event(){return this._event?this._event:(this._event=(e,t,r)=>{if(this._disposed)return M(()=>{});let s={fn:e,thisArgs:t};this._listeners.push(s);let a=M(()=>{let o=this._listeners.indexOf(s);o!==-1&&this._listeners.splice(o,1)});return r&&(Array.isArray(r)?r.push(a):r.add(a)),a},this._event)}fire(e){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{let{fn:t,thisArgs:r}=this._listeners[0];t.call(r,e);return}default:{let t=this._listeners.slice();for(let{fn:r,thisArgs:s}of t)r.call(s,e)}}}dispose(){this._disposed||(this._disposed=true,this._listeners.length=0)}},c0;(s=>{function i5(a,o){return a(n=>o.fire(n))}s.forward=i5;function e(a,o){return(n,L,T)=>a(h=>n.call(L,o(h)),void 0,T)}s.map=e;function t(...a){return(o,n,L)=>{let T=new R0;for(let h of a)T.add(h(d=>o.call(n,d)));return L&&(Array.isArray(L)?L.push(T):L.add(T)),T}}s.any=t;function r(a,o,n){return o(n),a(L=>o(L))}s.runAndSubscribe=r})(c0||={});var tt={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},B0=2;var w0,J=class i3{constructor(e,t,r,s){this._document=e;this._config=t;this._unicodeService=r;this._logService=s;this._didWarmUp=false;this._cacheMap=new D0;this._cacheMapCombined=new D0;this._pages=[];this._activePages=[];this._workBoundingBox={top:0,left:0,bottom:0,right:0};this._workAttributeData=new s0;this._textureSize=512;this._onAddTextureAtlasCanvas=new U;this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=new U;this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._requestClearModel=false;this._clearModelGeneration=0;this._createNewPage(),this._tmpCanvas=it(e,this._config.deviceCellWidth*4+B0*2,this._config.deviceCellHeight+B0*2),this._tmpCtx=g(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:true}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=true)}_doWarmUp(){let e=new et(this._logService);for(let t=33;t<126;t++)e.enqueue(()=>{if(!this._cacheMap.get(t,0,0,0)){let r=this._drawToCache(t,0,0,0,false,void 0);this._cacheMap.set(t,0,0,0,r)}})}beginFrame(){let e=this._requestClearModel;return this._requestClearModel=false,e}clearTexture(){if(this._pages.some(e=>e._glyphs.length>0||e.currentRow.x!==0||e.currentRow.y!==0)){this._evictAllPages();this._createNewPage()}}_evictAllPages(){for(let e of this._pages)this._onRemoveTextureAtlasCanvas.fire(e.canvas),e.canvas.remove();this._pages.length=0,this._activePages.length=0,this._overflowSizePage=void 0,this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=false,this._requestClearModel=true,this._clearModelGeneration++}_createNewPage(){if(i3.maxAtlasPages&&this._pages.length>=i3.maxAtlasPages){let t=this._pages.filter(T=>T.canvas.width*2<=(i3.maxTextureSize||4096)).sort((T,h)=>h.canvas.width!==T.canvas.width?h.canvas.width-T.canvas.width:h.percentageUsed-T.percentageUsed),r=-1,s=0;for(let T=0;TT.canvas.width!==a[0].canvas.width))this._evictAllPages();else{let o=a.map(T=>T.glyphs[0].texturePage).sort((T,h)=>T-h),n=this.pages.length-a.length,L=this._mergePages(a,n);L.version=++u0.nextVersion;for(let T=o.length-1;T>=0;T--)this._deletePage(o[T]);this.pages.push(L),this._requestClearModel=true,this._clearModelGeneration++,this._onAddTextureAtlasCanvas.fire(L.canvas)}}let e=new u0(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){let r=e[0].canvas.width*2,s=new u0(this._document,r,e);for(let[a,o]of e.entries()){let n=a*o.canvas.width%r,L=Math.floor(a/2)*o.canvas.height;s.ctx.drawImage(o.canvas,n,L);for(let h of o.glyphs)h.texturePage=t,h.sizeClipSpace.x=h.size.x/r,h.sizeClipSpace.y=h.size.y/r,h.texturePosition.x+=n,h.texturePosition.y+=L,h.texturePositionClipSpace.x=h.texturePosition.x/r,h.texturePositionClipSpace.y=h.texturePosition.y/r;this._onRemoveTextureAtlasCanvas.fire(o.canvas);let T=this._activePages.indexOf(o);T!==-1&&this._activePages.splice(T,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,r,s){if(this._config.allowTransparency)return K;let a;switch(e){case 16777216:case 33554432:a=this._getColorFromAnsiIndex(t);break;case 50331648:let o=s0.toColorRGB(t);a=Z.toColor(o[0],o[1],o[2]);break;case 0:default:r?a=I0.opaque(this._config.colors.foreground):a=this._config.colors.background;break}return this._config.allowTransparency||(a=I0.opaque(a)),a}_getForegroundColor(e,t,r,s,a,o,n,L,T,h){let d=this._getMinimumContrastColor(e,t,r,s,a,o,n,T,L,h);if(d)return d;let _;switch(a){case 16777216:case 33554432:;this._config.drawBoldTextInBrightColors&&T&&o<8&&(o+=8),_=this._getColorFromAnsiIndex(o);break;case 50331648:let p=s0.toColorRGB(o);_=Z.toColor(p[0],p[1],p[2]);break;case 0:default:n?_=this._config.colors.background:_=this._config.colors.foreground}return this._config.allowTransparency&&(_=I0.opaque(_)),L&&(_=I0.multiplyOpacity(_,Ke)),_}_resolveBackgroundRgba(e,t,r){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,r,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,r,s,a,o,n,L,T,h){if(this._config.minimumContrastRatio===1||h)return;let d=this._getContrastCache(T),_=d.getColor(e,s);if(_!==void 0)return _??void 0;let p=this._resolveBackgroundRgba(t,r,n),c=this._resolveForegroundRgba(a,o,n,L),u=d0.ensureContrastRatio(p,c,this._config.minimumContrastRatio/(T?2:1));if(!u){d.setColor(e,s,null);return}let C=Z.toColor(u>>24&255,u>>16&255,u>>8&255);return d.setColor(e,s,C),C}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,r,s,a,o){let n=typeof e=="number"?String.fromCharCode(e):e;o&&this._tmpCanvas.parentElement!==o&&(this._tmpCanvas.style.display="none",o.append(this._tmpCanvas));let L=Math.min(this._config.deviceCellWidth*Math.max(n.length,2)+B0*2,this._config.deviceMaxTextureSize);this._tmpCanvas.width{orcaProbeWeight=String(orcaProbeWeight);let orcaActualWeightToken=this._tmpCtx.font.match(/(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/)?.[1]??"400",orcaActualWeight=orcaActualWeightToken==="normal"?"400":orcaActualWeightToken==="bold"?"700":orcaActualWeightToken;if(/^(?:[1-8]\d{2}|900)$/.test(orcaProbeWeight)&&orcaActualWeight!==orcaProbeWeight){this.fontProbeMismatchCount=(this.fontProbeMismatchCount||0)+1;this.fontProbeLastMismatch={desired:orcaProbeWeight,actual:this._tmpCtx.font};try{globalThis.__orcaAtlasFontProbe&&globalThis.__orcaAtlasFontProbe(this.fontProbeLastMismatch)}catch(orcaFontProbeError){}}})(Y),this._tmpCtx.textBaseline=K0;let A0=n.length===1&&W0(n.charCodeAt(0)),t0=n.length===1&&ke(n.charCodeAt(0)),L0=this._getForegroundColor(t,E,F,r,R,m,_,p,d,V0(n.charCodeAt(0)));this._tmpCtx.fillStyle=L0.css;let A=t0?0:B0*2,n0=false;if(this._config.customGlyphs!==false){let b=this._workAttributeData.getUnderlineVariantOffset();n0=qe(this._tmpCtx,n,A,A,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.deviceCharWidth,this._config.deviceCharHeight,this._config.fontSize,this._config.devicePixelRatio,this._logService,y.css,b)}let a0=!A0,$;if(typeof e=="number"?$=this._unicodeService.wcwidth(e):$=this._unicodeService.getStringCellWidth(e),u){this._tmpCtx.save();let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),D=b%2===1?.5:0;if(this._tmpCtx.lineWidth=b,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())a0=false,this._tmpCtx.strokeStyle=`rgb(${s0.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{a0=false;let r0=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&r0<8&&(r0+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(r0).css};this._tmpCtx.fillStyle=this._tmpCtx.strokeStyle,this._tmpCtx.beginPath();let i0=A,G=Math.ceil(A+this._config.deviceCharHeight)-D-(a?b*2:0),he=G+b*2,f0=this._workAttributeData.getUnderlineVariantOffset(),C0=0,v0=0;for(let r0=0;r0<$;r0++){let y0=false;this._tmpCtx.save(),C0=G,v0=he;let j=i0+r0*this._config.deviceCellWidth,Q0=i0+(r0+1)*this._config.deviceCellWidth;switch(this._workAttributeData.extended.underlineStyle){case 2:;this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G),this._tmpCtx.moveTo(j,he),this._tmpCtx.lineTo(Q0,he);break;case 3:;C0=this._config.deviceCharHeight+1,v0=C0+3*this._config.devicePixelRatio;let ye=new Path2D;ye.rect(j,C0,this._config.deviceCellWidth,v0-C0),this._tmpCtx.clip(ye);let Qt=this._config.deviceCellWidth,mt=v0-C0,ft=Qt/6,Et=mt/3,bt=[[0,2,1,3,2.4,3,0,.6],[5.5,0,2.5,3,1.1,3,4.1,0],[4,0,6,2,6,.6,5.4,0]];for(let _e of bt){this._tmpCtx.beginPath();for(let S0=0;S0<_e.length;S0+=2){let xe=j+_e[S0]*ft,Ne=v0-_e[S0+1]*Et;S0===0?this._tmpCtx.moveTo(xe,Ne):this._tmpCtx.lineTo(xe,Ne)};this._tmpCtx.closePath(),this._tmpCtx.fill()}y0=true;break;case 4:let Z0=f0===0?0:f0>=b?b*2-f0:b-f0;!(f0>=b)===false||Z0===0?(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j+Z0,G),this._tmpCtx.lineTo(Q0,G)):(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(j+Z0,G),this._tmpCtx.moveTo(j+Z0+b,G),this._tmpCtx.lineTo(Q0,G)),f0=We(Q0-j,b,f0);break;case 5:let vt=.6,Ot=.3,de=Q0-j,Se=Math.floor(vt*de),Re=Math.floor(Ot*de),It=de-Se-Re;this._tmpCtx.setLineDash([Se,Re,It]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break;case 1:default:;this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break};y0||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!n0&&this._config.fontSize>=12&&!this._config.allowTransparency&&n!==" "){;this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";let r0=this._tmpCtx.measureText(n);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in r0&&r0.actualBoundingBoxDescent>0){this._tmpCtx.save();let y0=new Path2D;y0.rect(i0,C0-Math.ceil(b/2),this._config.deviceCellWidth*$,v0-C0+Math.ceil(b/2)),this._tmpCtx.clip(y0),this._tmpCtx.lineWidth=this._config.devicePixelRatio*3,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(n,A,A+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(Q){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),D=b%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+D),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*$,A+D),this._tmpCtx.stroke()}if(n0||this._tmpCtx.fillText(n,A,A+this._config.deviceCharHeight),n==="_"&&!this._config.allowTransparency){let b=fe(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0);if(b)for(let D=1;D<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(n,A,A+this._config.deviceCharHeight-D),b=fe(this._tmpCtx.getImageData(A,A,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0),!!b);D++);}if(C){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),D=this._tmpCtx.lineWidth%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(A,A+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.lineTo(A+this._config.deviceCharWidth*$,A+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.stroke()}this._tmpCtx.restore();let q=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height),g0;if(this._config.allowTransparency?g0=Gt(q):g0=fe(q,y,L0,a0),g0)return tt;let I=this._findGlyphBoundingBox(q,this._workBoundingBox,L,t0,n0,A),O,v;for(;;){if(this._activePages.length===0){let b=this._createNewPage();O=b,v=b.currentRow,v.height=I.size.y;break};O=this._activePages[this._activePages.length-1],v=O.currentRow;for(let b of this._activePages)I.size.y<=b.currentRow.height&&(O=b,v=b.currentRow);for(let b=this._activePages.length-1;b>=0;b--)for(let D of this._activePages[b].fixedRows)D.height<=v.height&&I.size.y<=D.height&&(O=this._activePages[b],v=D);if(I.size.x>this._textureSize){;this._overflowSizePage||(i3.maxAtlasPages&&this._pages.length>=i3.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new u0(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._requestClearModel=true,this._clearModelGeneration++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),O=this._overflowSizePage,v=this._overflowSizePage.currentRow,v.x+I.size.x>=O.canvas.width&&(v.x=0,v.y+=v.height,v.height=0);break}if(v.y+I.size.y>=O.canvas.height||v.height>I.size.y+2){let b=false;if(O.currentRow.y+O.currentRow.height+I.size.y>=O.canvas.height){let D;for(let i0 of this._activePages)if(i0.currentRow.y+i0.currentRow.height+I.size.y=i3.maxAtlasPages&&v.y+I.size.y<=O.canvas.height&&v.height>=I.size.y&&v.x+I.size.x<=O.canvas.width)b=true;else{let i0=this._createNewPage();O=i0,v=i0.currentRow,v.height=I.size.y,b=true}}b||(O.currentRow.height>0&&O.fixedRows.push(O.currentRow),v={x:0,y:O.currentRow.y+O.currentRow.height,height:I.size.y},O.fixedRows.push(v),O.currentRow={x:0,y:v.y+v.height,height:0})}if(v.x+I.size.x<=O.canvas.width)break;v===O.currentRow?(v.x=0,v.y+=v.height,v.height=0):O.fixedRows.splice(O.fixedRows.indexOf(v),1)}return I.texturePage=this._pages.indexOf(O),I.texturePosition.x=v.x,I.texturePosition.y=v.y,I.texturePositionClipSpace.x=v.x/O.canvas.width,I.texturePositionClipSpace.y=v.y/O.canvas.height,I.sizeClipSpace.x/=O.canvas.width,I.sizeClipSpace.y/=O.canvas.height,v.height=Math.max(v.height,I.size.y),v.x+=I.size.x,O.ctx.putImageData(q,I.texturePosition.x-this._workBoundingBox.left,I.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,I.size.x,I.size.y),O.addGlyph(I),O.version=++u0.nextVersion,I}_findGlyphBoundingBox(e,t,r,s,a,o){t.top=0;let n=s?this._config.deviceCellHeight:this._tmpCanvas.height,L=s?this._config.deviceCellWidth:r,T=false;for(let h=0;h=o;h--){for(let d=0;d=0;h--){for(let d=0;d>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=t.rgba>>>24,L=t.rgba>>>16&255,T=t.rgba>>>8&255,h=Math.floor((Math.abs(s-n)+Math.abs(a-L)+Math.abs(o-T))/12),d=true;for(let _=0;_0)return false;return true}function it(i5,e,t){let r=i5.createElement("canvas");return r.width=e,r.height=t,r}function rt(i5,e,t,r,s,a,o,n,L=true){let T={foreground:a.foreground,background:a.background,cursor:K,cursorAccent:K,selectionForeground:K,selectionBackgroundTransparent:K,selectionBackgroundOpaque:K,selectionInactiveBackgroundTransparent:K,selectionInactiveBackgroundOpaque:K,overviewRulerBorder:K,scrollbarSliderBackground:K,scrollbarSliderHoverBackground:K,scrollbarSliderActiveBackground:K,ansi:a.ansi.slice(),contrastCache:a.contrastCache,halfContrastCache:a.halfContrastCache};return{customGlyphs:L,devicePixelRatio:o,deviceMaxTextureSize:n,letterSpacing:s.letterSpacing,lineHeight:s.lineHeight,deviceCellWidth:i5,deviceCellHeight:e,deviceCharWidth:t,deviceCharHeight:r,fontFamily:s.fontFamily,fontSize:s.fontSize,fontWeight:s.fontWeight,fontWeightBold:s.fontWeightBold,allowTransparency:s.allowTransparency,drawBoldTextInBrightColors:s.drawBoldTextInBrightColors,minimumContrastRatio:s.minimumContrastRatio,colors:T}}function Ee(i5,e){for(let t=0;t=0){if(Ee(u.config,h))return u.atlas;u.ownedBy.length===1?(u.atlas.dispose(),e0.splice(c,1)):u.ownedBy.splice(C,1);break}}for(let c=0;c{;this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(e=600){;this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0){this._restartInterval(t);return}};this.isCursorVisible=false,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{;this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);this._animationTimeRestarted=void 0,this._restartInterval(t);return};this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{;this._renderCallback(),this._animationFrame=void 0})},600)},e)}pause(){;this.isCursorVisible=true,this._isIdlePaused=false,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){;this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){;this._isIdlePaused=false,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){;this.isCursorVisible=true,this._isIdlePaused=true,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}};function ve(i5,e,t){let r=new e.ResizeObserver(s=>{let a=s.find(L=>L.target===i5);if(!a)return;if(!("devicePixelContentBoxSize"in a)){;r?.disconnect(),r=void 0;return}let o=a.devicePixelContentBoxSize[0].inlineSize,n=a.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&t(o,n)});try{r.observe(i5,{box:["device-pixel-content-box"]})}catch{;r.disconnect(),r=void 0}return M(()=>r?.disconnect())}function nt(i5){return i5>65535?(i5-=65536,String.fromCharCode((i5>>10)+55296)+String.fromCharCode(i5%1024+56320)):String.fromCharCode(i5)}var j0=class i4 extends s0{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new P0;this.combinedData=""}static fromCharData(t){let r=new i4;return r.setFromCharData(t),r}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?nt(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){;this.fg=t[0],this.bg=0;let r=false;if(t[1].length>2)r=true;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let a=t[1].charCodeAt(1);56320<=a&&a<=57343?this.content=(s-55296)*1024+a-56320+65536|t[2]<<22:r=true}else r=true}else this.content=t[1].charCodeAt(0)|t[2]<<22;r&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return false;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return false;let r=this.isUnderlineColorDefault(),s=t.isUnderlineColorDefault();if(!(r&&s)&&(r!==s||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return false}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var J0=class extends W{constructor(t,r,s){super();this._renderCallback=t;this._coreBrowserService=r;this._optionsService=s;this._intervalDuration=0;this._blinkOn=true;this._needsBlinkInViewport=false;this._isViewportVisible=true;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",a=>{this.setIntervalDuration(a)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(M(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let r=this._blinkOn;this._blinkOn=true,this._interval=this._coreBrowserService.window.setInterval(()=>{;this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),r||this._renderCallback();return};this._clearInterval(),this._blinkOn||(this._blinkOn=true,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var te=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]);function ie(i5,e,t,r){let s=g(i5.createProgram());if(i5.attachShader(s,g(at(i5,i5.VERTEX_SHADER,e,r))),i5.attachShader(s,g(at(i5,i5.FRAGMENT_SHADER,t,r))),i5.linkProgram(s),i5.getProgramParameter(s,i5.LINK_STATUS))return s;r.error(i5.getProgramInfoLog(s)),i5.deleteProgram(s)}function at(i5,e,t,r){let s=g(i5.createShader(e));if(i5.shaderSource(s,t),i5.compileShader(s),i5.getShaderParameter(s,i5.COMPILE_STATUS))return s;r.error(i5.getShaderInfoLog(s)),i5.deleteShader(s)}function ot(i5,e){let t=Math.min(i5.length*2,e),r=new Float32Array(t);for(let s=0;sn.deleteProgram(this._program))),this._projectionLocation=g(n.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=g(n.getUniformLocation(this._program,"u_resolution")),this._textureLocation=g(n.getUniformLocation(this._program,"u_texture"));let L=this._vertexArrayObject=n.createVertexArray();this._register(M(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(M(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(M(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=g(n.createBuffer()),this._register(M(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,2,n.FLOAT,!1,44,0),n.vertexAttribDivisor(2,1),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,n.FLOAT,!1,44,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(3,1),n.enableVertexAttribArray(4),n.vertexAttribPointer(4,1,n.FLOAT,!1,44,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(4,1),n.enableVertexAttribArray(5),n.vertexAttribPointer(5,2,n.FLOAT,!1,44,5*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(5,1),n.enableVertexAttribArray(6),n.vertexAttribPointer(6,2,n.FLOAT,!1,44,7*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(6,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,44,9*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.useProgram(this._program);let p=new Int32Array(J.maxAtlasPages);for(let c=0;cn.deleteTexture(u.texture))),n.activeTexture(n.TEXTURE0+c),n.bindTexture(n.TEXTURE_2D,u.texture),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,1,1,0,n.RGBA,n.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[c]=u}n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return this._atlas?this._atlas.beginFrame():!0}updateCell(t,r,s,a,o,n,L,T,h){this._updateCell(this._vertices.attributes,t,r,s,a,o,n,L,T,h)}_updateCell(t,r,s,a,o,n,L,T,h,d){if(N=(s*this._terminal.cols+r)*11,a===0||a===void 0){t.fill(0,N,N+11-1-2);return}this._atlas&&(T&&T.length>1?S=this._atlas.getRasterizedGlyphCombinedChar(T,o,n,L,!1,this._terminal.element):S=this._atlas.getRasterizedGlyph(a,o,n,L,!1,this._terminal.element),Ie=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),o!==d&&S.offset.x>Ie?(k0=S.offset.x-Ie,t[N]=-(S.offset.x-k0)+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=(S.size.x-k0)/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x+k0/this._atlas.pages[S.texturePage].canvas.width,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x-k0/this._atlas.pages[S.texturePage].canvas.width,t[N+8]=S.sizeClipSpace.y):(t[N]=-S.offset.x+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=S.size.x/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x,t[N+8]=S.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&Ze(a,h,S.size.x,this._dimensions.device.cell.width)&&(t[N+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let t=this._terminal,r=t.cols*t.rows*11;this._vertices.count!==r?this._vertices.attributes=new Float32Array(r):this._vertices.attributes.fill(0);let s=0;for(;s=e.rows||T<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,this.viewportCappedStartRow=L,this.viewportCappedEndRow=T,this.startCol=t[0],this.endCol=r[0]}isCellSelected(e,t,r){return this.hasSelection?(r-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&r>=this.viewportCappedStartRow&&t=this.viewportCappedStartRow&&t>=this.endCol&&r<=this.viewportCappedEndRow:r>this.viewportStartRow&&r=this.startCol&&t=this.startCol):!1}};function Tt(){return new Fe}var lt=2147483648,se=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=Tt()}resize(e,t){let r=e*t*4;r!==this.cells.length&&(this.cells=new Uint32Array(r),this.lineLengths=new Uint32Array(t))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}};var jt=`#version 300 es -+ } ${e} else { outColor = vec4(0.0, 0.0, 0.0, 0.0); } -+}`}var N=0,S,Ie=0,k0=0,re=class extends W{constructor(t,r,s,a,o){super();this._terminal=t;this._gl=r;this._dimensions=s;this._optionsService=a;this._logService=o;this._activeBuffer=0;this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};let n=this._gl;J.maxAtlasPages===void 0&&(J.maxAtlasPages=Math.min(32,g(n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS))),J.maxTextureSize=g(n.getParameter(n.MAX_TEXTURE_SIZE))),this._program=g(ie(n,Xt,Yt(J.maxAtlasPages),this._logService)),this._register(M(()=>n.deleteProgram(this._program))),this._projectionLocation=g(n.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=g(n.getUniformLocation(this._program,"u_resolution")),this._textureLocation=g(n.getUniformLocation(this._program,"u_texture"));let L=this._vertexArrayObject=n.createVertexArray();this._register(M(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(M(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,this._gl.FLOAT,false,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(M(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=g(n.createBuffer()),this._register(M(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,2,n.FLOAT,false,44,0),n.vertexAttribDivisor(2,1),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,n.FLOAT,false,44,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(3,1),n.enableVertexAttribArray(4),n.vertexAttribPointer(4,1,n.FLOAT,false,44,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(4,1),n.enableVertexAttribArray(5),n.vertexAttribPointer(5,2,n.FLOAT,false,44,5*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(5,1),n.enableVertexAttribArray(6),n.vertexAttribPointer(6,2,n.FLOAT,false,44,7*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(6,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,false,44,9*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.useProgram(this._program);let p=new Int32Array(J.maxAtlasPages);for(let c=0;cn.deleteTexture(u.texture))),n.activeTexture(n.TEXTURE0+c),n.bindTexture(n.TEXTURE_2D,u.texture),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,1,1,0,n.RGBA,n.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[c]=u};n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){if(!this._atlas)return true;let _g=this._atlas._clearModelGeneration||0;return this._lastSeenClearModelGeneration!==_g?(this._lastSeenClearModelGeneration=_g,true):false}updateCell(t,r,s,a,o,n,L,T,h){this._updateCell(this._vertices.attributes,t,r,s,a,o,n,L,T,h)}_updateCell(t,r,s,a,o,n,L,T,h,d){if(N=(s*this._terminal.cols+r)*11,a===0||a===void 0){t.fill(0,N,N+11-1-2);return}this._atlas&&(T&&T.length>1?S=this._atlas.getRasterizedGlyphCombinedChar(T,o,n,L,false,this._terminal.element):S=this._atlas.getRasterizedGlyph(a,o,n,L,false,this._terminal.element),Ie=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),o!==d&&S.offset.x>Ie?(k0=S.offset.x-Ie,t[N]=-(S.offset.x-k0)+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=(S.size.x-k0)/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x+k0/this._atlas.pages[S.texturePage].canvas.width,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x-k0/this._atlas.pages[S.texturePage].canvas.width,t[N+8]=S.sizeClipSpace.y):(t[N]=-S.offset.x+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=S.size.x/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x,t[N+8]=S.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&Ze(a,h,S.size.x,this._dimensions.device.cell.width)&&(t[N+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let t=this._terminal,r=t.cols*t.rows*11;this._vertices.count!==r?this._vertices.attributes=new Float32Array(r):this._vertices.attributes.fill(0);let s=0;for(;sthis._atlasTextures.length&&!this._pageOverflowWarned&&(this._pageOverflowWarned=true,console.warn("xterm webgl: atlas page count ("+this._atlas.pages.length+") exceeds the renderer texture capacity ("+this._atlasTextures.length+"), some glyphs will not render correctly"));for(let o=0;o=e.rows||T<0){this.clear();return};this.hasSelection=true,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,this.viewportCappedStartRow=L,this.viewportCappedEndRow=T,this.startCol=t[0],this.endCol=r[0]}isCellSelected(e,t,r){return this.hasSelection?(r-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&r>=this.viewportCappedStartRow&&t=this.viewportCappedStartRow&&t>=this.endCol&&r<=this.viewportCappedEndRow:r>this.viewportStartRow&&r=this.startCol&&t=this.startCol):false}};function Tt(){return new Fe}var lt=2147483648,se=class{constructor(){;this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=Tt()}resize(e,t){let r=e*t*4;r!==this.cells.length&&(this.cells=new Uint32Array(r),this.lineLengths=new Uint32Array(t))}clear(){;this.cells.fill(0,0),this.lineLengths.fill(0,0)}};var jt=`#version 300 es - layout (location = 0) in vec2 a_position; - layout (location = 1) in vec2 a_size; - layout (location = 2) in vec4 a_color; -@@ -71,5 +66,4 @@ - - void main() { - outColor = v_color; --}`,l0=8,Me=l0*Float32Array.BYTES_PER_ELEMENT,e1=20*l0,ne=class{constructor(){this.attributes=new Float32Array(e1),this.count=0}},p0=0,Lt=0,ht=0,dt=0,_t=0,ct=0,ut=0,ae=class extends W{constructor(t,r,s,a,o){super();this._terminal=t;this._gl=r;this._dimensions=s;this._themeService=a;this._logService=o;this._vertices=new ne;this._verticesCursor=new ne;let n=this._gl;this._program=g(ie(n,jt,Jt,this._logService)),this._register(M(()=>n.deleteProgram(this._program))),this._projectionLocation=g(n.getUniformLocation(this._program,"u_projection"));let L=this._vertexArrayObject=n.createVertexArray();this._register(M(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(M(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(M(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=g(n.createBuffer()),this._register(M(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,Me,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,Me,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,!1,Me,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(a.colors),this._register(this._themeService.onChangeColors(p=>{this._updateCachedColors(p),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){let r=this._gl;r.useProgram(this._program),r.bindVertexArray(this._vertexArrayObject),r.uniformMatrix4fv(this._projectionLocation,!1,te),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.bufferData(r.ARRAY_BUFFER,t.attributes,r.DYNAMIC_DRAW),r.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,r.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){let r=this._terminal,s=this._vertices,a=1,o,n,L,T,h,d,_,p,c,u,C;for(o=0;o>24&255)/255,_t=(p0>>16&255)/255,ct=(p0>>8&255)/255,ut=1,this._addRectangle(t.attributes,r,Lt,ht,(n-o)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,dt,_t,ct,ut)}_addRectangle(t,r,s,a,o,n,L,T,h,d){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L,t[r+5]=T,t[r+6]=h,t[r+7]=d}_addRectangleFloat(t,r,s,a,o,n,L){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L[0],t[r+5]=L[1],t[r+6]=L[2],t[r+7]=L[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(t.rgba&255)/255])}};var oe=class extends W{constructor(t,r,s,a,o,n,L,T){super();this._container=r;this._alpha=o;this._coreBrowserService=n;this._optionsService=L;this._themeService=T;this._deviceCharWidth=0;this._deviceCharHeight=0;this._deviceCellWidth=0;this._deviceCellHeight=0;this._deviceCharLeft=0;this._deviceCharTop=0;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${s}-layer`),this._canvas.style.zIndex=a.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this._register(this._themeService.onChangeColors(h=>{this._refreshCharAtlas(t,h),this.reset(t)})),this._register(M(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=g(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,r,s){}handleSelectionChanged(t,r,s,a=!1){}_setTransparency(t,r){if(r===this._alpha)return;let s=this._canvas;this._alpha=r,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,s),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,r){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=Y0(t,this._optionsService.rawOptions,r,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,r){this._deviceCellWidth=r.device.cell.width,this._deviceCellHeight=r.device.cell.height,this._deviceCharWidth=r.device.char.width,this._deviceCharHeight=r.device.char.height,this._deviceCharLeft=r.device.char.left,this._deviceCharTop=r.device.char.top,this._canvas.width=r.device.canvas.width,this._canvas.height=r.device.canvas.height,this._canvas.style.width=`${r.css.canvas.width}px`,this._canvas.style.height=`${r.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,r,s=1){this._ctx.fillRect(t*this._deviceCellWidth,(r+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,s*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,r,s,a){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight))}_fillCharTrueColor(t,r,s,a){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=K0,this._clipCell(s,a,r.getWidth()),this._ctx.fillText(r.getChars(),s*this._deviceCellWidth+this._deviceCharLeft,a*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,r,s){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,r,s){let a=r?t.options.fontWeightBold:t.options.fontWeight;return`${s?"italic":""} ${a} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}};var Te=class extends oe{constructor(e,t,r,s,a,o,n){super(r,e,"link",t,!0,a,o,n),this._register(s.onShowLinkUnderline(L=>this._handleShowLinkUnderline(L))),this._register(s.onHideLinkUnderline(L=>this._handleHideLinkUnderline(L)))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);let e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===257?this._ctx.fillStyle=this._themeService.colors.background.css:e.fg!==void 0&&st(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;tthis._handleColorChange())),this._cellColorResolver=new G0(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new Te(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,T,this._themeService)],this.dimensions=Ue(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(T.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new J0(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register(le(this._canvas,"webglcontextlost",c=>{this._logService.debug("webglcontextlost event received"),c.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(c)},3e3)})),this._register(le(this._canvas,"webglcontextrestored",c=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,be(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=ve(this._canvas,this._coreBrowserService.window,(c,u)=>this._setCanvasDevicePixelDimensions(c,u)),this._register(this._coreBrowserService.onWindowChange(c=>{this._observerDisposable.value=ve(this._canvas,c,(u,C)=>this._setCanvasDevicePixelDimensions(u,C))})),this._register(le(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register(M(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(let c of this._renderLayers)c.dispose();this._canvas.parentElement?.removeChild(this._canvas),be(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,r){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(let s of this._renderLayers)s.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(let t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(let t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,r,s){for(let a of this._renderLayers)a.handleSelectionChanged(this._terminal,t,r,s);this._model.selection.update(this._core,t,r,s),this._requestRedrawViewport()}handleCursorMove(){for(let t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new ae(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new re(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0){this._isAttached=!1;return}let t=Y0(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=De(c0.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),c0.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(let t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,r){if(!this._isAttached)if(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height)this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0;else return;for(let o of this._renderLayers)o.handleGridChanged(this._terminal,t,r);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,r);let s=!1,a=0;for(;this._charAtlas&&this._glyphRenderer.value.beginFrame()&&a++<32;)s=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);s&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible)&&this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new q0(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,r){let s=this._core,a=this._workCell,o,n,L,T,h,d,_,p,c,u,C,Q,m,R,F,E,y;t=pt(t,s.rows-1,0),r=pt(r,s.rows-1,0);let Y=this._coreService.decPrivateModes.cursorStyle??s.options.cursorStyle??"block",X=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,A0=X-s.buffer.ydisp,t0=Math.min(this._terminal.buffer.active.cursorX,s.cols-1),L0=-1,A=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let n0=!1;for(n=t;n<=r;n++){L=n+s.buffer.ydisp;let a0=s.buffer.lines.get(L);if(!a0){for(this._model.lineLengths[n]=0,E=0;E=_,c=E,h.length>0&&E===h[0][0]&&p){u=h.shift();let q=this._model.selection.isCellSelected(this._terminal,u[0],L);for(F=u[0]+1;F=u[1],p?(d=!0,a=new ge(a,T.translateToString(!0,u[0],u[1]),u[1]-u[0]),c=u[1]-1):_=u[1]}if(Q=a.getChars(),m=a.getCode(),F=(n*s.cols+E)*4,!$&&a.isBlink()&&($=!0),this._cellColorResolver.resolve(a,E,L,this.dimensions.device.cell.width,this.dimensions.device.cell.height),A&&L===X&&(E===t0&&(this._model.cursor={x:t0,y:A0,width:a.getWidth(),style:this._coreBrowserService.isFocused?Y:s.options.cursorInactiveStyle,cursorWidth:s.options.cursorWidth,dpr:this._devicePixelRatio},L0=t0+a.getWidth()-1),E>=t0&&E<=L0&&(this._coreBrowserService.isFocused&&Y==="block"||this._coreBrowserService.isFocused===!1&&s.options.cursorInactiveStyle==="block")&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&a.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),m!==0&&(this._model.lineLengths[n]=E+1),!(this._model.cells[F]===m&&this._model.cells[F+1]===this._cellColorResolver.result.bg&&this._model.cells[F+2]===this._cellColorResolver.result.fg&&this._model.cells[F+3]===this._cellColorResolver.result.ext)&&(n0=!0,Q.length>1&&(m|=lt),this._model.cells[F]=m,this._model.cells[F+1]=this._cellColorResolver.result.bg,this._model.cells[F+2]=this._cellColorResolver.result.fg,this._model.cells[F+3]=this._cellColorResolver.result.ext,R=a.getWidth(),this._glyphRenderer.value.updateCell(E,n,m,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,Q,R,o),d)){for(a=this._workCell,E++;E<=c;E++)y=(n*s.cols+E)*4,this._nullModelCell(E,n,y,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);E--}}this._setRowBlinkState(n,$)}n0&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,r,s,a,o,n){this._glyphRenderer.value.updateCell(t,r,0,a,o,n,"",0,0),this._model.cells[s]=0,this._model.cells[s+1]=a,this._model.cells[s+2]=o,this._model.cells[s+3]=n}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,r){this._rowHasBlinkingCells[t]!==r&&(this._rowHasBlinkingCells[t]=r,this._rowHasBlinkingCellsCount+=r?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){!this._charSizeService.width||!this._charSizeService.height||(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=this._optionsService.rawOptions.lineHeight===1?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,r){this._canvas.width===t&&this._canvas.height===r||(this._canvas.width=t,this._canvas.height=r,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){let t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}},ge=class extends s0{constructor(t,r,s){super();this.content=0;this.combinedData="";this.fg=t.fg,this.bg=t.bg,this.combinedData=r,this._width=s}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};function pt(i,e,t=0){return Math.max(Math.min(i,e),t)}var Ct=class extends W{constructor(t){if(ue&&He()<16){let r={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",r))throw new Error("WebGL2 is only supported on Safari 16 and above")}super();this._onChangeTextureAtlas=this._register(new U);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new U);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new U);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onContextLoss=this._register(new U);this.onContextLoss=this._onContextLoss.event;this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){let r=t._core;if(!t.element){this._register(r.onWillOpen(()=>this.activate(t)));return}this._terminal=t;let s=r.coreService,a=r.optionsService,o=r,n=o._renderService,L=o._characterJoinerService,T=o._charSizeService,h=o._coreBrowserService,d=o._decorationService,_=o._logService,p=o._themeService;this._renderer=this._register(new Le(t,L,T,h,s,d,_,a,p,this._customGlyphs,this._preserveDrawingBuffer)),this._register(c0.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(c0.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(c0.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(c0.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),n.setRenderer(this._renderer),this._register(M(()=>{if(this._terminal._core._store._isDisposed)return;let c=this._terminal._core._renderService;c.setRenderer(this._terminal._core._createRenderer()),c.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}};export{Ct as WebglAddon}; --//# sourceMappingURL=addon-webgl.mjs.map -+}`,l0=8,Me=l0*Float32Array.BYTES_PER_ELEMENT,e1=20*l0,ne=class{constructor(){;this.attributes=new Float32Array(e1),this.count=0}},p0=0,Lt=0,ht=0,dt=0,_t=0,ct=0,ut=0,ae=class extends W{constructor(t,r,s,a,o){super();this._terminal=t;this._gl=r;this._dimensions=s;this._themeService=a;this._logService=o;this._vertices=new ne;this._verticesCursor=new ne;let n=this._gl;this._program=g(ie(n,jt,Jt,this._logService)),this._register(M(()=>n.deleteProgram(this._program))),this._projectionLocation=g(n.getUniformLocation(this._program,"u_projection"));let L=this._vertexArrayObject=n.createVertexArray();this._register(M(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(M(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,false,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(M(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=g(n.createBuffer()),this._register(M(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,false,Me,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,false,Me,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,false,Me,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(a.colors),this._register(this._themeService.onChangeColors(p=>{;this._updateCachedColors(p),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){let r=this._gl;r.useProgram(this._program),r.bindVertexArray(this._vertexArrayObject),r.uniformMatrix4fv(this._projectionLocation,false,te),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.bufferData(r.ARRAY_BUFFER,t.attributes,r.DYNAMIC_DRAW),r.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,r.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){;this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){let r=this._terminal,s=this._vertices,a=1,o,n,L,T,h,d,_,p,c,u,C;for(o=0;o>24&255)/255,_t=(p0>>16&255)/255,ct=(p0>>8&255)/255,ut=1,this._addRectangle(t.attributes,r,Lt,ht,(n-o)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,dt,_t,ct,ut)}_addRectangle(t,r,s,a,o,n,L,T,h,d){;t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L,t[r+5]=T,t[r+6]=h,t[r+7]=d}_addRectangleFloat(t,r,s,a,o,n,L){;t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L[0],t[r+5]=L[1],t[r+6]=L[2],t[r+7]=L[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(t.rgba&255)/255])}};var oe=class extends W{constructor(t,r,s,a,o,n,L,T){super();this._container=r;this._alpha=o;this._coreBrowserService=n;this._optionsService=L;this._themeService=T;this._deviceCharWidth=0;this._deviceCharHeight=0;this._deviceCellWidth=0;this._deviceCellHeight=0;this._deviceCharLeft=0;this._deviceCharTop=0;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${s}-layer`),this._canvas.style.zIndex=a.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this._register(this._themeService.onChangeColors(h=>{;this._refreshCharAtlas(t,h),this.reset(t)})),this._register(M(()=>{this._canvas.remove()}))}_initCanvas(){;this._ctx=g(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,r,s){}handleSelectionChanged(t,r,s,a=false){}_setTransparency(t,r){if(r===this._alpha)return;let s=this._canvas;this._alpha=r,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,s),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,r){;this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=Y0(t,this._optionsService.rawOptions,r,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,r){;this._deviceCellWidth=r.device.cell.width,this._deviceCellHeight=r.device.cell.height,this._deviceCharWidth=r.device.char.width,this._deviceCharHeight=r.device.char.height,this._deviceCharLeft=r.device.char.left,this._deviceCharTop=r.device.char.top,this._canvas.width=r.device.canvas.width,this._canvas.height=r.device.canvas.height,this._canvas.style.width=`${r.css.canvas.width}px`,this._canvas.style.height=`${r.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,r,s=1){this._ctx.fillRect(t*this._deviceCellWidth,(r+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,s*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,r,s,a){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight))}_fillCharTrueColor(t,r,s,a){;this._ctx.font=this._getFont(t,false,false),this._ctx.textBaseline=K0,this._clipCell(s,a,r.getWidth()),this._ctx.fillText(r.getChars(),s*this._deviceCellWidth+this._deviceCharLeft,a*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,r,s){;this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,r,s){let a=r?t.options.fontWeightBold:t.options.fontWeight;return`${s?"italic":""} ${a} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}};var Te=class extends oe{constructor(e,t,r,s,a,o,n){;super(r,e,"link",t,true,a,o,n),this._register(s.onShowLinkUnderline(L=>this._handleShowLinkUnderline(L))),this._register(s.onHideLinkUnderline(L=>this._handleHideLinkUnderline(L)))}resize(e,t){;super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);let e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===257?this._ctx.fillStyle=this._themeService.colors.background.css:e.fg!==void 0&&st(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;tthis._handleColorChange())),this._cellColorResolver=new G0(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new Te(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,T,this._themeService)],this.dimensions=Ue(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(T.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new J0(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register(le(this._canvas,"webglcontextlost",c=>{;this._logService.debug("webglcontextlost event received"),c.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{;this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(c)},3e3)})),this._register(le(this._canvas,"webglcontextrestored",c=>{;this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,be(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=ve(this._canvas,this._coreBrowserService.window,(c,u)=>this._setCanvasDevicePixelDimensions(c,u)),this._register(this._coreBrowserService.onWindowChange(c=>{this._observerDisposable.value=ve(this._canvas,c,(u,C)=>this._setCanvasDevicePixelDimensions(u,C))})),this._register(le(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register(M(()=>{;clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(let c of this._renderLayers)c.dispose();this._canvas.parentElement?.removeChild(this._canvas),be(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){;this._refreshCharAtlas(),this._clearModel(true)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,r){;this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(let s of this._renderLayers)s.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(false),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:true})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(let t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(let t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,r,s){for(let a of this._renderLayers)a.handleSelectionChanged(this._terminal,t,r,s);this._model.selection.update(this._core,t,r,s),this._requestRedrawViewport()}handleCursorMove(){for(let t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){;this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new ae(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new re(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0){this._isAttached=false;return}let t=Y0(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=De(c0.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),c0.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){;this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){;this._charAtlas?.clearTexture(),this._clearModel(true),this._requestRedrawViewport()}clear(){this._clearModel(true);for(let t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(false),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,r){if(!this._isAttached)if(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height)this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=true;else return;for(let o of this._renderLayers)o.handleGridChanged(this._terminal,t,r);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(true),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,r);let s=false,a=0;for(;this._charAtlas&&a++<32&&this._glyphRenderer.value.beginFrame();)s=true,this._clearModel(true),this._updateModel(0,this._terminal.rows-1);s&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible)&&this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){;this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new q0(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,r){let s=this._core,a=this._workCell,o,n,L,T,h,d,_,p,c,u,C,Q,m,R,F,E,y;t=pt(t,s.rows-1,0),r=pt(r,s.rows-1,0);let Y=this._coreService.decPrivateModes.cursorStyle??s.options.cursorStyle??"block",X=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,A0=X-s.buffer.ydisp,t0=Math.min(this._terminal.buffer.active.cursorX,s.cols-1),L0=-1,A=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let n0=false;for(n=t;n<=r;n++){L=n+s.buffer.ydisp;let a0=s.buffer.lines.get(L);if(!a0){for(this._model.lineLengths[n]=0,E=0;E=_,c=E,h.length>0&&E===h[0][0]&&p){u=h.shift();let q=this._model.selection.isCellSelected(this._terminal,u[0],L);for(F=u[0]+1;F=u[1],p?(d=true,a=new ge(a,T.translateToString(true,u[0],u[1]),u[1]-u[0]),c=u[1]-1):_=u[1]}if(Q=a.getChars(),m=a.getCode(),F=(n*s.cols+E)*4,!$&&a.isBlink()&&($=true),this._cellColorResolver.resolve(a,E,L,this.dimensions.device.cell.width,this.dimensions.device.cell.height),A&&L===X&&(E===t0&&(this._model.cursor={x:t0,y:A0,width:a.getWidth(),style:this._coreBrowserService.isFocused?Y:s.options.cursorInactiveStyle,cursorWidth:s.options.cursorWidth,dpr:this._devicePixelRatio},L0=t0+a.getWidth()-1),E>=t0&&E<=L0&&(this._coreBrowserService.isFocused&&Y==="block"||this._coreBrowserService.isFocused===false&&s.options.cursorInactiveStyle==="block")&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&a.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),m!==0&&(this._model.lineLengths[n]=E+1),!(this._model.cells[F]===m&&this._model.cells[F+1]===this._cellColorResolver.result.bg&&this._model.cells[F+2]===this._cellColorResolver.result.fg&&this._model.cells[F+3]===this._cellColorResolver.result.ext)&&(n0=true,Q.length>1&&(m|=lt),this._model.cells[F]=m,this._model.cells[F+1]=this._cellColorResolver.result.bg,this._model.cells[F+2]=this._cellColorResolver.result.fg,this._model.cells[F+3]=this._cellColorResolver.result.ext,R=a.getWidth(),this._glyphRenderer.value.updateCell(E,n,m,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,Q,R,o),d)){for(a=this._workCell,E++;E<=c;E++)y=(n*s.cols+E)*4,this._nullModelCell(E,n,y,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);E--}}this._setRowBlinkState(n,$)};n0&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,r,s,a,o,n){;this._glyphRenderer.value.updateCell(t,r,0,a,o,n,"",0,0),this._model.cells[s]=0,this._model.cells[s+1]=a,this._model.cells[s+2]=o,this._model.cells[s+3]=n}_resetBlinkingRowState(){;this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(false),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,r){this._rowHasBlinkingCells[t]!==r&&(this._rowHasBlinkingCells[t]=r,this._rowHasBlinkingCellsCount+=r?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){!this._charSizeService.width||!this._charSizeService.height||(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=this._optionsService.rawOptions.lineHeight===1?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,r){;this._canvas.width===t&&this._canvas.height===r||(this._canvas.width=t,this._canvas.height=r,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:true}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){let t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}},ge=class extends s0{constructor(t,r,s){super();this.content=0;this.combinedData="";this.fg=t.fg,this.bg=t.bg,this.combinedData=r,this._width=s}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};function pt(i5,e,t=0){return Math.max(Math.min(i5,e),t)}var Ct=class extends W{constructor(t){if(ue&&He()<16){let r={antialias:false,depth:false,preserveDrawingBuffer:true};if(!document.createElement("canvas").getContext("webgl2",r))throw new Error("WebGL2 is only supported on Safari 16 and above")}super();this._onChangeTextureAtlas=this._register(new U);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new U);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new U);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onContextLoss=this._register(new U);this.onContextLoss=this._onContextLoss.event;this._customGlyphs=t?.customGlyphs??true,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){let r=t._core;if(!t.element){this._register(r.onWillOpen(()=>this.activate(t)));return}this._terminal=t;let s=r.coreService,a=r.optionsService,o=r,n=o._renderService,L=o._characterJoinerService,T=o._charSizeService,h=o._coreBrowserService,d=o._decorationService,_=o._logService,p=o._themeService;this._renderer=this._register(new Le(t,L,T,h,s,d,_,a,p,this._customGlyphs,this._preserveDrawingBuffer)),this._register(c0.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(c0.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(c0.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(c0.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),n.setRenderer(this._renderer),this._register(M(()=>{if(this._terminal._core._store._isDisposed)return;let c=this._terminal._core._renderService;c.setRenderer(this._terminal._core._createRenderer()),c.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}};export{Ct as WebglAddon}; -diff --git a/src/GlyphRenderer.ts b/src/GlyphRenderer.ts ---- a/src/GlyphRenderer.ts -+++ b/src/GlyphRenderer.ts -@@ -74,7 +74,11 @@ - void main() { - if (v_texpage == 0) { - outColor = texture(u_texture[0], v_texcoord); -- } ${textureConditionals} -+ } ${textureConditionals} else { -+ // Pages beyond the sampler budget (atlas grew past maxAtlasPages) must -+ // render blank; leaving outColor unset is undefined behavior (garbled pixels). -+ outColor = vec4(0.0, 0.0, 0.0, 0.0); -+ } - }`); - } - -@@ -100,6 +104,8 @@ - private readonly _attributesBuffer: WebGLBuffer; - - private _atlas: ITextureAtlas | undefined; -+ private _lastSeenClearModelGeneration: number = 0; -+ private _pageOverflowWarned: boolean = false; - private _activeBuffer: number = 0; - private readonly _vertices: IVertices = { - count: 0, -@@ -214,7 +220,15 @@ - } - - public beginFrame(): boolean { -- return this._atlas ? this._atlas.beginFrame() : true; -+ if (!this._atlas) { -+ return true; -+ } -+ const generation = this._atlas.clearModelGeneration; -+ if (this._lastSeenClearModelGeneration === generation) { -+ return false; -+ } -+ this._lastSeenClearModelGeneration = generation; -+ return true; - } - - public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void { -@@ -363,7 +377,14 @@ - // Bind the atlas page texture if they have changed. AtlasPage.version is globally - // monotonic, so a page object swap at the same index (which happens after a page merge) - // is detected by the same comparison. -- for (let i = 0; i < this._atlas.pages.length; i++) { -+ // Allocation-side eviction keeps pages within the texture-unit budget; -+ // clamp and warn as a defensive backstop so an unexpected overflow cannot -+ // throw while rendering (it would kill rendering entirely). -+ if (this._atlas.pages.length > this._atlasTextures.length && !this._pageOverflowWarned) { -+ this._pageOverflowWarned = true; -+ console.warn(`xterm webgl: atlas page count (${this._atlas.pages.length}) exceeds the renderer texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`); -+ } -+ for (let i = 0; i < Math.min(this._atlas.pages.length, this._atlasTextures.length); i++) { - if (this._atlas.pages[i].version !== this._atlasTextures[i].version) { - this._bindAtlasPageTexture(gl, this._atlas, i); - } -@@ -374,7 +395,12 @@ - } - - public setAtlas(atlas: ITextureAtlas): void { -- this._atlas = atlas; -+ if (this._atlas !== atlas) { -+ this._atlas = atlas; -+ // Cached vertices still reference the previous atlas, even when the new -+ // shared atlas happens to be at the same clear generation. -+ this._lastSeenClearModelGeneration = -1; -+ } - this.invalidateAtlasTextures(); - } - -diff --git a/src/TextureAtlas.ts b/src/TextureAtlas.ts ---- a/src/TextureAtlas.ts -+++ b/src/TextureAtlas.ts -@@ -133,6 +133,7 @@ - } - - private _requestClearModel = false; -+ public clearModelGeneration = 0; - public beginFrame(): boolean { - const result = this._requestClearModel; - this._requestClearModel = false; -@@ -140,15 +141,38 @@ - } - - public clearTexture(): void { -- if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) { -+ // Guard on real content, not pages[0].currentRow: after a page merge a -+ // merged page (never written directly, currentRow at origin) can occupy -+ // index 0, which made every subsequent clearTexture a silent no-op. -+ if (this._pages.every(page => page.glyphs.length === 0 && page.currentRow.x === 0 && page.currentRow.y === 0)) { - return; - } -+ // A wipe must return the atlas to its constructor state (one fresh page), -+ // not clear pages in place: long sessions can grow _pages past -+ // maxAtlasPages, and a page at an index the fragment shader has no sampler -+ // for can never render. -+ this._evictAllPages(); -+ this._createNewPage(); -+ } -+ -+ /** -+ * Drops every page and all cached glyphs so the atlas regrows within the -+ * renderer's texture budget. Used by clearTexture and by the allocation -+ * paths that would otherwise push a page past maxAtlasPages. -+ */ -+ private _evictAllPages(): void { - for (const page of this._pages) { -- page.clear(); -+ this._onRemoveTextureAtlasCanvas.fire(page.canvas); -+ page.canvas.remove(); - } -+ this._pages.length = 0; -+ this._activePages.length = 0; -+ this._overflowSizePage = undefined; - this._cacheMap.clear(); - this._cacheMapCombined.clear(); - this._didWarmUp = false; -+ this._requestClearModel = true; -+ this.clearModelGeneration++; - } - - private _createNewPage(): AtlasPage { -@@ -156,7 +180,7 @@ - // microtask to ensure it does not interrupt textures that will be rendered in the current - // animation frame which would result in blank rendered areas. This is actually not that - // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback. -- if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) { -+ if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) { - // Find the set of the largest 4 images, below the maximum size, with the highest - // percentages used - const pagesBySize = this._pages.filter(e => { -@@ -184,31 +208,30 @@ - // Only proceed with merge if we have exactly 4 same-sized pages. If not, we cannot - // effectively reduce page count and merging would cause issues. - if (mergingPages.length < 4 || mergingPages.some(p => p.canvas.width !== mergingPages[0].canvas.width)) { -- const newPage = new AtlasPage(this._document, this._textureSize); -- this._pages.push(newPage); -- this._activePages.push(newPage); -- this._onAddTextureAtlasCanvas.fire(newPage.canvas); -- return newPage; -- } -+ // No merge can reduce the page count; evict and rebuild instead of -+ // adding a page at an index the renderer has no texture slot for. -+ this._evictAllPages(); -+ } else { -+ const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b); -+ const mergedPageIndex = this.pages.length - mergingPages.length; - -- const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b); -- const mergedPageIndex = this.pages.length - mergingPages.length; -+ // Merge into the new page -+ const mergedPage = this._mergePages(mergingPages, mergedPageIndex); -+ mergedPage.version = ++AtlasPage.nextVersion; - -- // Merge into the new page -- const mergedPage = this._mergePages(mergingPages, mergedPageIndex); -- mergedPage.version = ++AtlasPage.nextVersion; -+ // Delete the pages, shifting glyph texture pages as needed -+ for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) { -+ this._deletePage(sortedMergingPagesIndexes[i]); -+ } - -- // Delete the pages, shifting glyph texture pages as needed -- for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) { -- this._deletePage(sortedMergingPagesIndexes[i]); -- } -+ // Add the new merged page to the end -+ this.pages.push(mergedPage); - -- // Add the new merged page to the end -- this.pages.push(mergedPage); -- -- // Request the model to be cleared to refresh all texture pages. -- this._requestClearModel = true; -- this._onAddTextureAtlasCanvas.fire(mergedPage.canvas); -+ // Request the model to be cleared to refresh all texture pages. -+ this._requestClearModel = true; -+ this.clearModelGeneration++; -+ this._onAddTextureAtlasCanvas.fire(mergedPage.canvas); -+ } - } - - // All new atlas pages are created small as they are highly dynamic -@@ -516,6 +539,26 @@ - const fontStyle = italic ? 'italic' : ''; - this._tmpCtx.font = - `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`; -+ // Orca font probe: canvas silently keeps its previous font when an assignment -+ // fails to parse, which rasterizes glyphs at a stale weight (bold-collapse -+ // family). Normalize Canvas font serialization: Chromium omits 400 and emits -+ // the keyword bold for 700. -+ { -+ const desiredWeight = String(fontWeight); -+ const actualWeightToken = this._tmpCtx.font.match( -+ /(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/ -+ )?.[1] ?? '400'; -+ const actualWeight = actualWeightToken === 'normal' -+ ? '400' -+ : actualWeightToken === 'bold' -+ ? '700' -+ : actualWeightToken; -+ if (/^(?:[1-8]\d{2}|900)$/.test(desiredWeight) && actualWeight !== desiredWeight) { -+ (this as any).fontProbeMismatchCount = ((this as any).fontProbeMismatchCount || 0) + 1; -+ (this as any).fontProbeLastMismatch = { desired: desiredWeight, actual: this._tmpCtx.font }; -+ try { (globalThis as any).__orcaAtlasFontProbe?.((this as any).fontProbeLastMismatch); } catch { /* diagnostics only */ } -+ } -+ } - this._tmpCtx.textBaseline = TEXT_BASELINE; - - const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0)); -@@ -815,11 +858,16 @@ - // Create a new page for oversized glyphs as they come up - if (rasterizedGlyph.size.x > this._textureSize) { - if (!this._overflowSizePage) { -+ if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) { -+ // The oversized page must land on an index the renderer can bind. -+ this._evictAllPages(); -+ } - this._overflowSizePage = new AtlasPage(this._document, this._config.deviceMaxTextureSize); - this.pages.push(this._overflowSizePage); - - // Request the model to be cleared to refresh all texture pages. - this._requestClearModel = true; -+ this.clearModelGeneration++; - this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas); - } - activePage = this._overflowSizePage; -diff --git a/src/Types.ts b/src/Types.ts ---- a/src/Types.ts -+++ b/src/Types.ts -@@ -59,6 +59,9 @@ - export interface ITextureAtlas extends IDisposable { - readonly pages: { canvas: HTMLCanvasElement, version: number }[]; - -+ // Each renderer must observe invalidation independently because atlases are shared. -+ readonly clearModelGeneration: number; -+ - onAddTextureAtlasCanvas: IEvent; - onRemoveTextureAtlasCanvas: IEvent; - -diff --git a/src/WebglRenderer.ts b/src/WebglRenderer.ts ---- a/src/WebglRenderer.ts -+++ b/src/WebglRenderer.ts -@@ -386,7 +386,10 @@ - // page's version, so re-run the update and force a full texture rebind. - let merged = false; - let mergeRetries = 0; -- while (this._charAtlas && this._glyphRenderer.value.beginFrame() && mergeRetries++ < Constants.MERGE_RETRY_LIMIT) { -+ // Check the retry budget BEFORE beginFrame: beginFrame consumes the -+ // clear-model notification, so consuming it on the iteration that trips -+ // the limit would leave a stale model with no later rebuild. -+ while (this._charAtlas && mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()) { - merged = true; - this._clearModel(true); - this._updateModel(0, this._terminal.rows - 1); diff --git a/config/patches/@xterm__addon-webgl@0.20.0-beta.299.patch b/config/patches/@xterm__addon-webgl@0.20.0-beta.299.patch new file mode 100644 index 00000000000..b35ad071aa0 --- /dev/null +++ b/config/patches/@xterm__addon-webgl@0.20.0-beta.299.patch @@ -0,0 +1,193 @@ +diff --git a/lib/addon-webgl.js b/lib/addon-webgl.js +index c40e1afba4eeb6aef215dc687b75b1bfd6aa596e..dd620f4c46cfeb1aa45653aca358262f4d8e727c 100644 +--- a/lib/addon-webgl.js ++++ b/lib/addon-webgl.js +@@ -1,2 +1,2 @@ +-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WebglAddon=e():t.WebglAddon=e()}(globalThis,()=>(()=>{"use strict";var t={105(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.WindowIntervalTimer=e.eventType=void 0,e.getWindow=r,e.addDisposableListener=o,e.addStandardDisposableListener=function(t,e,i,s){return o(t,e,i,s)},e.getDomNodePagePosition=function(t){const e=t.getBoundingClientRect(),i=r(t);return{left:e.left+i.scrollX,top:e.top+i.scrollY,width:e.width,height:e.height}},e.scheduleAtNextAnimationFrame=function(t,e,i=0){const s=L(t),r=new n(e,i);return s.next.push(r),s.animFrameRequested||(s.animFrameRequested=!0,t.requestAnimationFrame(()=>function(t){const e=L(t);for(e.animFrameRequested=!1,e.current=e.next,e.next=[],e.inAnimationFrameRunner=!0;e.current.length>0;)e.current.sort(n.sort),e.current.shift().execute();e.inAnimationFrameRunner=!1}(t))),r};const s=i(578);function r(t){const e=t;if(e?.ownerDocument?.defaultView)return e.ownerDocument.defaultView;const i=t;return i?.view?i.view:window}class a{constructor(t,e,i,s){this._node=t,this._type=e,this._handler=i,this._options=s,t.addEventListener(e,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function o(t,e,i,s){return new a(t,e,i,s)}e.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class n{constructor(t,e){this._runner=t,this.priority=e,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(t){console.error(t)}}static sort(t,e){return e.priority-t.priority}}const h=new Map;function L(t){let e=h.get(t);return e||(e={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(t,e)),e}class T extends s.IntervalTimer{constructor(t){super(),this._defaultTarget=t?r(t):void 0}cancelAndSet(t,e,i){super.cancelAndSet(t,e,i??this._defaultTarget??window)}}e.WindowIntervalTimer=T},814(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.INVERTED_DEFAULT_COLOR=void 0,e.INVERTED_DEFAULT_COLOR=257},959(t,e){function i(t){return 57508<=t&&t<=57558}function s(t){return t>=128512&&t<=128591||t>=127744&&t<=128511||t>=128640&&t<=128767||t>=9728&&t<=9983||t>=9984&&t<=10175||t>=65024&&t<=65039||t>=129280&&t<=129535||t>=127462&&t<=127487}Object.defineProperty(e,"__esModule",{value:!0}),e.throwIfFalsy=function(t){if(!t)throw new Error("value must not be falsy");return t},e.isPowerlineGlyph=i,e.isRestrictedPowerlineGlyph=function(t){return 57520<=t&&t<=57527},e.isEmoji=s,e.allowRescaling=function(t,e,r,a){return 1===e&&r>Math.ceil(1.5*a)&&void 0!==t&&t>255&&!s(t)&&!i(t)&&!function(t){return 57344<=t&&t<=63743}(t)},e.treatGlyphAsBackgroundColor=function(t){return i(t)||function(t){return 9472<=t&&t<=9631}(t)},e.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}}}},e.computeNextVariantOffset=function(t,e,i=0){return(t-(2*Math.round(e)-i))%(2*Math.round(e))}},948(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.createSelectionRenderModel=function(){return new i};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(t,e,i,s=!1){if(this.selectionStart=e,this.selectionEnd=i,!e||!i||e[0]===i[0]&&e[1]===i[1])return void this.clear();const r=t.buffers.active.ydisp,a=e[1]-r,o=i[1]-r,n=Math.max(a,0),h=Math.min(o,t.rows-1);n>=t.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=a,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=i[0])}isCellSelected(t,e,i){return!!this.hasSelection&&(i-=t.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&i>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&e=this.startCol)}}},536(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextBlinkStateManager=void 0;const s=i(426);class r extends s.Disposable{constructor(t,e,i){super(),this._renderCallback=t,this._coreBrowserService=e,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",t=>{this.setIntervalDuration(t)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const t=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(t||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}e.TextBlinkStateManager=r},578(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.IntervalTimer=e.MicrotaskTimer=e.TimeoutTimer=void 0,e.timeout=function(t){return new Promise(e=>setTimeout(e,t))},e.disposableTimeout=function(t,e=0,i){const r=setTimeout(()=>{t(),i&&a.dispose()},e),a=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(a),a};const s=i(426);e.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,t()},e)}setIfNotSet(t,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,t()},e))}},e.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(t){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,t())}))}},e.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t,e,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{t()},e);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=l,e.contrastRatio=d;let i=0,s=0,r=0,a=0;var o,n,h,L,T;function l(t){const e=t.toString(16);return e.length<2?"0"+e:e}function d(t,e){return t>>0},t.toColor=function(e,i,s,r){return{css:t.toCss(e,i,s,r),rgba:t.toRgba(e,i,s,r)}}}(o||(e.channels=o={})),function(t){function e(t,e){return a=Math.round(255*e),[i,s,r]=T.toChannels(t.rgba),{css:o.toCss(i,s,r,a),rgba:o.toRgba(i,s,r,a)}}t.blend=function(t,e){if(a=(255&e.rgba)/255,1===a)return{css:e.css,rgba:e.rgba};const n=e.rgba>>24&255,h=e.rgba>>16&255,L=e.rgba>>8&255,T=t.rgba>>24&255,l=t.rgba>>16&255,d=t.rgba>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((h-l)*a),r=d+Math.round((L-d)*a),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,i){const s=T.ensureContrastRatio(t.rgba,e.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[i,s,r]=T.toChannels(e),{css:o.toCss(i,s,r),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,i){return a=255&t.rgba,e(t,a*i/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(n||(e.color=n={})),function(t){let e,n;try{const t=document.createElement("canvas");t.width=1,t.height=1;const i=t.getContext("2d",{willReadFrequently:!0});i&&(e=i,e.globalCompositeOperation="copy",n=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),a=parseInt(t.slice(4,5).repeat(2),16),o.toColor(i,s,r,a);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const h=t.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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),a=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),o.toColor(i,s,r,a);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!n)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=n,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[i,s,r,a]=e.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i,s,r,a),css:t}}}(h||(e.css=h={})),function(t){function e(t,e,i){const s=t/255,r=e/255,a=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*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(L||(e.rgb=L={})),function(t){function e(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,h=e>>8&255,T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));for(;T0||n>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),n-=Math.max(0,Math.ceil(.1*n)),h-=Math.max(0,Math.ceil(.1*h)),T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));return(o<<24|n<<16|h<<8|255)>>>0}function n(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,h=e>>8&255,T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));for(;T>>0}t.blend=function(t,e){if(a=(255&e)/255,1===a)return e;const n=e>>24&255,h=e>>16&255,L=e>>8&255,T=t>>24&255,l=t>>16&255,d=t>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((h-l)*a),r=d+Math.round((L-d)*a),o.toRgba(i,s,r)},t.ensureContrastRatio=function(t,i,s){const r=L.relativeLuminance(t>>8),a=L.relativeLuminance(i>>8);if(d(r,a)>8));if(od(r,L.relativeLuminance(e>>8))?a:e}return a}const o=n(t,i,s),h=d(r,L.relativeLuminance(o>>8));if(hd(r,L.relativeLuminance(a>>8))?o:a}return o}},t.reduceLuminance=e,t.increaseLuminance=n,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(T||(e.rgba=T={}))},414(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.EventUtils=e.Emitter=void 0;const s=i(426);var r;e.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(t,e,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:t,thisArgs:e};this._listeners=this._listeners.slice(),this._listeners.push(r);const a=(0,s.toDisposable)(()=>{const t=this._listeners.indexOf(r);-1!==t&&(this._listeners=this._listeners.slice(),this._listeners.splice(t,1))});return i&&(Array.isArray(i)?i.push(a):i.add(a)),a}),this._event}fire(t){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,t);const e=this._listeners;for(let i=0,s=e.length;ie.fire(t))},t.map=function(t,e){return(i,s,r)=>t(t=>i.call(s,e(t)),void 0,r)},t.any=function(...t){return(e,i,r)=>{const a=new s.DisposableStore;for(const s of t)a.add(s(t=>e.call(i,t)));return r&&(Array.isArray(r)?r.push(a):r.add(a)),a}},t.runAndSubscribe=function(t,e,i){return e(i),t(t=>e(t))}}(r||(e.EventUtils=r={}))},426(t,e){function i(t){return{dispose:t}}function s(t){if(!t)return t;if(Array.isArray(t)){for(const e of t)e.dispose();return[]}return t.dispose(),t}Object.defineProperty(e,"__esModule",{value:!0}),e.MutableDisposable=e.Disposable=e.DisposableStore=void 0,e.toDisposable=i,e.dispose=s,e.combinedDisposable=function(...t){return i(()=>s(t))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(t){return this._isDisposed?t.dispose():this._disposables.add(t),t}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const t of this._disposables)t.dispose();this._disposables.clear()}}clear(){for(const t of this._disposables)t.dispose();this._disposables.clear()}}e.DisposableStore=r;class a{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(t){return this._store.add(t)}}e.Disposable=a,a.None=Object.freeze({dispose(){}}),e.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(t){this._isDisposed||t===this._value||(this._value?.dispose(),this._value=t)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}},836(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.FourKeyMap=e.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(t,e,i){this._data[t]||(this._data[t]={}),this._data[t][e]=i}get(t,e){return this._data[t]?this._data[t][e]:void 0}clear(){this._data={}}}e.TwoKeyMap=i,e.FourKeyMap=class{constructor(){this._data=new i}set(t,e,s,r,a){this._data.get(t,e)||this._data.set(t,e,new i),this._data.get(t,e).set(s,r,a)}get(t,e,i,s){return this._data.get(t,e)?.get(i,s)}clear(){this._data.clear()}}},95(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.isChromeOS=e.isLinux=e.isWindows=e.isMac=e.isSafari=e.isLegacyEdge=e.isChrome=e.isFirefox=e.isNode=void 0,e.getZoomFactor=function(t){return 1},e.getSafariVersion=function(){if(!e.isSafari)return 0;const t=i.match(/Version\/(\d+)/);return null===t||t.length<2?0:parseInt(t[1],10)},e.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=e.isNode?"node":navigator.userAgent,s=e.isNode?"node":navigator.platform;e.isFirefox=i.includes("Firefox"),e.isChrome=i.includes("Chrome"),e.isLegacyEdge=i.includes("Edge"),e.isSafari=/^((?!chrome|android).)*safari/i.test(i),e.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),e.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),e.isLinux=s.indexOf("Linux")>=0,e.isChromeOS=/\bCrOS\b/.test(i)},930(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DebouncedIdleTask=e.IdleTaskQueue=e.PriorityTaskQueue=void 0;class i{constructor(t){this._tasks=[],this._i=0,this._logService=t}enqueue(t){this._tasks.push(t),this._start()}flush(){for(;this._ii)return r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(t){return setTimeout(()=>t(this._createDeadline(16)))}_cancelCallback(t){clearTimeout(t)}_createDeadline(t){const e=performance.now()+t;return{timeRemaining:()=>Math.max(0,e-performance.now())}}}e.PriorityTaskQueue=s,e.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(t){return requestIdleCallback(t)}_cancelCallback(t){cancelIdleCallback(t)}}:s,e.DebouncedIdleTask=class{constructor(t){this._queue=new e.IdleTaskQueue(t)}set(t){this._queue.clear(),this._queue.enqueue(t)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},917(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ExtendedAttrs=e.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(t){return[t>>>16&255,t>>>8&255,255&t]}static fromColorRGB(t){return(255&t[0])<<16|(255&t[1])<<8|255&t[2]}clone(){const t=new i;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}e.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(t){this._ext&=-67108864,this._ext|=67108863&t}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){const t=(3758096384&this._ext)>>29;return t<0?4294967288^t:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}constructor(t=0,e=0){this._ext=0,this._urlId=0,this._ext=t,this._urlId=e}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}e.ExtendedAttrs=s},721(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellData=void 0;const s=i(348),r=i(564),a=i(917);class o extends a.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new a.ExtendedAttrs,this.combinedData=""}static fromCharData(t){const e=new o;return e.setFromCharData(t),e}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(t){this.fg=t[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let e=!1;if(t[r.CHAR_DATA_CHAR_INDEX].length>2)e=!0;else if(2===t[r.CHAR_DATA_CHAR_INDEX].length){const i=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|t[r.CHAR_DATA_WIDTH_INDEX]<<22:e=!0}else e=!0}else this.content=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[r.CHAR_DATA_WIDTH_INDEX]<<22;e&&(this.combinedData=t[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|t[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor())return!1;if(this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor())return!1;if(this.isInverse()!==t.isInverse())return!1;if(this.isBold()!==t.isBold())return!1;if(this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;const e=this.isUnderlineColorDefault(),i=t.isUnderlineColorDefault();if(!e||!i){if(e!==i)return!1;if(this.getUnderlineColor()!==t.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==t.getUnderlineColorMode())return!1}}return this.isOverline()===t.isOverline()&&this.isBlink()===t.isBlink()&&this.isInvisible()===t.isInvisible()&&this.isItalic()===t.isItalic()&&this.isDim()===t.isDim()&&this.isStrikethrough()===t.isStrikethrough()}}e.CellData=o},564(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WHITESPACE_CELL_CODE=e.WHITESPACE_CELL_WIDTH=e.WHITESPACE_CELL_CHAR=e.NULL_CELL_CODE=e.NULL_CELL_WIDTH=e.NULL_CELL_CHAR=e.CHAR_DATA_CODE_INDEX=e.CHAR_DATA_WIDTH_INDEX=e.CHAR_DATA_CHAR_INDEX=e.CHAR_DATA_ATTR_INDEX=e.DEFAULT_EXT=e.DEFAULT_ATTR=e.DEFAULT_COLOR=void 0,e.DEFAULT_COLOR=0,e.DEFAULT_ATTR=e.DEFAULT_COLOR<<9|256,e.DEFAULT_EXT=0,e.CHAR_DATA_ATTR_INDEX=0,e.CHAR_DATA_CHAR_INDEX=1,e.CHAR_DATA_WIDTH_INDEX=2,e.CHAR_DATA_CODE_INDEX=3,e.NULL_CELL_CHAR="",e.NULL_CELL_WIDTH=1,e.NULL_CELL_CODE=0,e.WHITESPACE_CELL_CHAR=" ",e.WHITESPACE_CELL_WIDTH=1,e.WHITESPACE_CELL_CODE=32},348(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Utf8ToUtf32=e.StringToUtf32=void 0,e.stringFromCodePoint=function(t){return t>65535?(t-=65536,String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):String.fromCharCode(t)},e.utf32ToString=function(t,e=0,i=t.length){let s="";for(let r=e;r65535?(e-=65536,s+=String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):s+=String.fromCharCode(e)}return s},e.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t,e){const i=t.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=t.charCodeAt(r++);56320<=i&&i<=57343?e[s++]=1024*(this._interim-55296)+i-56320+65536:(e[s++]=this._interim,e[s++]=i),this._interim=0}for(let a=r;a=i)return this._interim=r,s;const o=t.charCodeAt(a);56320<=o&&o<=57343?e[s++]=1024*(r-55296)+o-56320+65536:(e[s++]=r,e[s++]=o);continue}65279!==r&&(e[s++]=r)}return s}},e.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t,e){const i=t.length;if(!i)return 0;let s,r,a,o,n,h=0,L=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let a,o=0;for(;(a=this.interim[++o])&&o<4;)r<<=6,r|=63&a;const n=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,T=n-o;for(;L=i)return 0;if(a=t[L++],128!=(192&a)){L--,s=!0;break}this.interim[o++]=a,r<<=6,r|=63&a}s||(2===n?r<128?L--:e[h++]=r:3===n?r<2048||r>=55296&&r<=57343||65279===r||(e[h++]=r):r<65536||r>1114111||(e[h++]=r)),this.interim.fill(0)}const T=i-4;let l=L;for(;l=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(n=(31&s)<<6|63&r,n<128){l--;continue}e[h++]=n}else if(224==(240&s)){if(l>=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,h;if(a=t[l++],128!=(192&a)){l--;continue}if(n=(15&s)<<12|(63&r)<<6|63&a,n<2048||n>=55296&&n<=57343||65279===n)continue;e[h++]=n}else if(240==(248&s)){if(l>=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,h;if(a=t[l++],128!=(192&a)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=a,h;if(o=t[l++],128!=(192&o)){l--;continue}if(n=(7&s)<<18|(63&r)<<12|(63&a)<<6|63&o,n<65536||n>1114111)continue;e[h++]=n}}return h}}},864(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellColorResolver=void 0;const s=i(564),r=i(993),a=i(959),o=i(915);let n,h=0,L=0,T=!1,l=!1,d=!1,c=0;e.CellColorResolver=class{constructor(t,e,i,s,r,a){this._terminal=t,this._optionService=e,this._selectionRenderModel=i,this._decorationService=s,this._coreBrowserService=r,this._themeService=a,this.result={fg:0,bg:0,ext:0}}resolve(t,e,i,_,Q){this.result.bg=t.bg,this.result.fg=t.fg,this.result.ext=268435456&t.bg?t.extended.ext:0,L=0,h=0,l=!1,T=!1,d=!1,n=this._themeService.colors,c=0;const u=t.getCode();if(u!==s.NULL_CELL_CODE&&4===t.extended.underlineStyle){const t=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));c=e*_%(2*Math.round(t))}if(0===c&&o.blockPatternCodepoints.has(u)&&(c=e*_%2*2+i*Q%2),this._decorationService.forEachDecorationAtCell(e,i,"bottom",t=>{t.backgroundColorRGB&&(L=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(h=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),d=this._selectionRenderModel.isCellSelected(this._terminal,e,i),d){if(67108864&this.result.fg||50331648&this.result.bg){if(67108864&this.result.fg)switch(50331648&this.result.fg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:L=(16777215&this.result.fg)<<8|255;break;default:L=this._themeService.colors.foreground.rgba}else switch(50331648&this.result.bg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:L=(16777215&this.result.bg)<<8|255}L=r.rgba.blend(L,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}else L=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(l=!0,n.selectionForeground&&(h=n.selectionForeground.rgba>>8&16777215,T=!0),(0,a.treatGlyphAsBackgroundColor)(t.getCode())){if(67108864&this.result.fg&&!(50331648&this.result.bg))h=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(67108864&this.result.fg)switch(50331648&this.result.bg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:h=(16777215&this.result.bg)<<8|255}else switch(50331648&this.result.fg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:h=(16777215&this.result.fg)<<8|255;break;default:h=this._themeService.colors.foreground.rgba}h=r.rgba.blend(h,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}T=!0}}this._decorationService.forEachDecorationAtCell(e,i,"top",t=>{t.backgroundColorRGB&&(L=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(h=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),l&&(L=d?-16777216&t.bg&-134217729|L|50331648:-16777216&t.bg|L|50331648),T&&(h=-16777216&t.fg&-67108865|h|50331648),67108864&this.result.fg&&(l&&!T&&(h=50331648&this.result.bg?-134217728&this.result.fg|67108863&this.result.bg:-134217728&this.result.fg|16777215&n.background.rgba>>8|50331648,T=!0),!l&&T&&(L=50331648&this.result.fg?-67108864&this.result.bg|67108863&this.result.fg:-67108864&this.result.bg|16777215&n.foreground.rgba>>8|50331648,l=!0)),n=void 0,this.result.bg=l?L:this.result.bg,this.result.fg=T?h:this.result.fg,this.result.ext&=536870911,this.result.ext|=c<<29&3758096384}}},670(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.acquireTextureAtlas=function(t,e,i,o,n,h,L,T,l,d=!0){const c=(0,r.generateConfig)(o,n,h,L,e,i,T,l,d);for(let e=0;e=0){if((0,r.configEquals)(i.config,c))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),a.splice(e,1)):i.ownedBy.splice(s,1);break}}for(let e=0;e{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(t=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0)return void this._restartInterval(t)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(t)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},t)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}}},697(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.observeDevicePixelDimensions=function(t,e,i){let r=new e.ResizeObserver(e=>{const s=e.find(e=>e.target===t);if(!s)return;if(!("devicePixelContentBoxSize"in s))return r?.disconnect(),void(r=void 0);const a=s.devicePixelContentBoxSize[0].inlineSize,o=s.devicePixelContentBoxSize[0].blockSize;a>0&&o>0&&i(a,o)});try{r.observe(t,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return(0,s.toDisposable)(()=>r?.disconnect())};const s=i(426)},28(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphRenderer=void 0;const s=i(115),r=i(564),a=i(426),o=i(719),n=i(959);let h,L=0,T=0,l=0;class d extends a.Disposable{constructor(t,e,i,r,h){super(),this._terminal=t,this._gl=e,this._dimensions=i,this._optionsService=r,this._logService=h,this._lastSeenPageLayoutVersion=-1,this._pageOverflowWarned=!1,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const L=this._gl;void 0===s.TextureAtlas.maxAtlasPages&&(s.TextureAtlas.maxAtlasPages=Math.min(32,(0,n.throwIfFalsy)(L.getParameter(L.MAX_TEXTURE_IMAGE_UNITS))),s.TextureAtlas.maxTextureSize=(0,n.throwIfFalsy)(L.getParameter(L.MAX_TEXTURE_SIZE))),this._program=(0,n.throwIfFalsy)((0,o.createProgram)(L,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(t){let e="";for(let i=1;iL.deleteProgram(this._program))),this._projectionLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_texture"));const T=this._vertexArrayObject=L.createVertexArray();this._register((0,a.toDisposable)(()=>L.deleteVertexArray(T))),L.bindVertexArray(T);const l=new Float32Array([0,0,1,0,0,1,1,1]),d=L.createBuffer();this._register((0,a.toDisposable)(()=>L.deleteBuffer(d))),L.bindBuffer(L.ARRAY_BUFFER,d),L.bufferData(L.ARRAY_BUFFER,l,L.STATIC_DRAW),L.enableVertexAttribArray(0),L.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=L.createBuffer();this._register((0,a.toDisposable)(()=>L.deleteBuffer(_))),L.bindBuffer(L.ELEMENT_ARRAY_BUFFER,_),L.bufferData(L.ELEMENT_ARRAY_BUFFER,c,L.STATIC_DRAW),this._attributesBuffer=(0,n.throwIfFalsy)(L.createBuffer()),this._register((0,a.toDisposable)(()=>L.deleteBuffer(this._attributesBuffer))),L.bindBuffer(L.ARRAY_BUFFER,this._attributesBuffer),L.enableVertexAttribArray(2),L.vertexAttribPointer(2,2,L.FLOAT,!1,44,0),L.vertexAttribDivisor(2,1),L.enableVertexAttribArray(3),L.vertexAttribPointer(3,2,L.FLOAT,!1,44,2*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(3,1),L.enableVertexAttribArray(4),L.vertexAttribPointer(4,1,L.FLOAT,!1,44,4*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(4,1),L.enableVertexAttribArray(5),L.vertexAttribPointer(5,2,L.FLOAT,!1,44,5*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(5,1),L.enableVertexAttribArray(6),L.vertexAttribPointer(6,2,L.FLOAT,!1,44,7*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(6,1),L.enableVertexAttribArray(1),L.vertexAttribPointer(1,2,L.FLOAT,!1,44,9*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(1,1),L.useProgram(this._program);const Q=new Int32Array(s.TextureAtlas.maxAtlasPages);for(let t=0;tL.deleteTexture(e.texture))),L.activeTexture(L.TEXTURE0+t),L.bindTexture(L.TEXTURE_2D,e.texture),L.texParameteri(L.TEXTURE_2D,L.TEXTURE_WRAP_S,L.CLAMP_TO_EDGE),L.texParameteri(L.TEXTURE_2D,L.TEXTURE_WRAP_T,L.CLAMP_TO_EDGE),L.texImage2D(L.TEXTURE_2D,0,L.RGBA,1,1,0,L.RGBA,L.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[t]=e}L.enable(L.BLEND),L.blendFunc(L.SRC_ALPHA,L.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.pageLayoutVersion!==this._lastSeenPageLayoutVersion&&(this._lastSeenPageLayoutVersion=this._atlas.pageLayoutVersion,!0)}updateCell(t,e,i,s,r,a,o,n,h){this._updateCell(this._vertices.attributes,t,e,i,s,r,a,o,n,h)}_updateCell(t,e,i,s,a,o,d,c,_,Q){L=11*(i*this._terminal.cols+e),s!==r.NULL_CELL_CODE&&void 0!==s?this._atlas&&(h=c&&c.length>1?this._atlas.getRasterizedGlyphCombinedChar(c,a,o,d,!1,this._terminal.element):this._atlas.getRasterizedGlyph(s,a,o,d,!1,this._terminal.element),T=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),a!==Q&&h.offset.x>T?(l=h.offset.x-T,t[L]=-(h.offset.x-l)+this._dimensions.device.char.left,t[L+1]=-h.offset.y+this._dimensions.device.char.top,t[L+2]=(h.size.x-l)/this._dimensions.device.canvas.width,t[L+3]=h.size.y/this._dimensions.device.canvas.height,t[L+4]=h.texturePage,t[L+5]=h.texturePositionClipSpace.x+l/this._atlas.pages[h.texturePage].canvas.width,t[L+6]=h.texturePositionClipSpace.y,t[L+7]=h.sizeClipSpace.x-l/this._atlas.pages[h.texturePage].canvas.width,t[L+8]=h.sizeClipSpace.y):(t[L]=-h.offset.x+this._dimensions.device.char.left,t[L+1]=-h.offset.y+this._dimensions.device.char.top,t[L+2]=h.size.x/this._dimensions.device.canvas.width,t[L+3]=h.size.y/this._dimensions.device.canvas.height,t[L+4]=h.texturePage,t[L+5]=h.texturePositionClipSpace.x,t[L+6]=h.texturePositionClipSpace.y,t[L+7]=h.sizeClipSpace.x,t[L+8]=h.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&(0,n.allowRescaling)(s,_,h.size.x,this._dimensions.device.cell.width)&&(t[L+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width)):t.fill(0,L,L+11-1-2)}clear(){const t=this._terminal,e=t.cols*t.rows*11;this._vertices.count!==e?this._vertices.attributes=new Float32Array(e):this._vertices.attributes.fill(0);let i=0;for(;ithis._atlasTextures.length&&!this._pageOverflowWarned&&(this._pageOverflowWarned=!0,this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`));for(let t=0;tT.deleteProgram(this._program))),this._projectionLocation=(0,a.throwIfFalsy)(T.getUniformLocation(this._program,"u_projection"));const l=this._vertexArrayObject=T.createVertexArray();this._register((0,s.toDisposable)(()=>T.deleteVertexArray(l))),T.bindVertexArray(l);const d=new Float32Array([0,0,1,0,0,1,1,1]),c=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(c))),T.bindBuffer(T.ARRAY_BUFFER,c),T.bufferData(T.ARRAY_BUFFER,d,T.STATIC_DRAW),T.enableVertexAttribArray(3),T.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),Q=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(Q))),T.bindBuffer(T.ELEMENT_ARRAY_BUFFER,Q),T.bufferData(T.ELEMENT_ARRAY_BUFFER,_,T.STATIC_DRAW),this._attributesBuffer=(0,a.throwIfFalsy)(T.createBuffer()),this._register((0,s.toDisposable)(()=>T.deleteBuffer(this._attributesBuffer))),T.bindBuffer(T.ARRAY_BUFFER,this._attributesBuffer),T.enableVertexAttribArray(0),T.vertexAttribPointer(0,2,T.FLOAT,!1,o,0),T.vertexAttribDivisor(0,1),T.enableVertexAttribArray(1),T.vertexAttribPointer(1,2,T.FLOAT,!1,o,2*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(1,1),T.enableVertexAttribArray(2),T.vertexAttribPointer(2,4,T.FLOAT,!1,o,4*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(2,1),this._updateCachedColors(h.colors),this._register(this._themeService.onChangeColors(t=>{this._updateCachedColors(t),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){const e=this._gl;e.useProgram(this._program),e.bindVertexArray(this._vertexArrayObject),e.uniformMatrix4fv(this._projectionLocation,!1,r.PROJECTION_MATRIX),e.bindBuffer(e.ARRAY_BUFFER,this._attributesBuffer),e.bufferData(e.ARRAY_BUFFER,t.attributes,e.DYNAMIC_DRAW),e.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,e.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){const e=this._terminal,i=this._vertices;let s,r,a,o,n,h,L,T,l,d,c,_=1;for(s=0;s>24&255)/255,d=(h>>16&255)/255,c=(h>>8&255)/255,_=1,this._addRectangle(t.attributes,e,L,T,(o-a)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,l,d,c,_)}_addRectangle(t,e,i,s,r,a,o,n,h,L){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o,t[e+5]=n,t[e+6]=h,t[e+7]=L}_addRectangleFloat(t,e,i,s,r,a,o){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o[0],t[e+5]=o[1],t[e+6]=o[2],t[e+7]=o[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(255&t.rgba)/255])}}e.RectangleRenderer=Q},208(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.RenderModel=e.COMBINED_CHAR_BIT_MASK=void 0;const s=i(948);e.COMBINED_CHAR_BIT_MASK=2147483648,e.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(t,e){const i=t*e*4;i!==this.cells.length&&(this.cells=new Uint32Array(i),this.lineLengths=new Uint32Array(e))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},115(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextureAtlas=void 0;const s=i(0),r=i(183),a=i(959),o=i(993),n=i(836),h=i(930),L=i(917),T=i(564),l=i(414),d={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let c;class _{get pages(){return this._pages}constructor(t,e,i,s){this._document=t,this._config=e,this._unicodeService=i,this._logService=s,this._didWarmUp=!1,this._cacheMap=new n.FourKeyMap,this._cacheMapCombined=new n.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new L.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new l.Emitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new l.Emitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._pageLayoutVersion=0,this._createNewPage(),this._tmpCanvas=p(t,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,a.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){this._tmpCanvas.remove();for(const t of this.pages)t.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const t=new h.IdleTaskQueue(this._logService);for(let e=33;e<126;e++)t.enqueue(()=>{if(!this._cacheMap.get(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT)){const t=this._drawToCache(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,!1,void 0);this._cacheMap.set(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,t)}})}get pageLayoutVersion(){return this._pageLayoutVersion}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const t of this._pages)t.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1,this._pageLayoutVersion++}}_createNewPage(){if(_.maxAtlasPages&&this._pages.length>=Math.max(4,_.maxAtlasPages)){const t=this._pages.filter(t=>2*t.canvas.width<=(_.maxTextureSize||4096)).sort((t,e)=>e.canvas.width!==t.canvas.width?e.canvas.width-t.canvas.width:e.percentageUsed-t.percentageUsed);let e=-1,i=0;for(let s=0;st.canvas.width!==s[0].canvas.width)){this._evictAllPages();const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}const r=s.map(t=>t.glyphs[0].texturePage).sort((t,e)=>t-e),a=this.pages.length-s.length,o=this._mergePages(s,a);o.version=++Q.nextVersion;for(let t=r.length-1;t>=0;t--)this._deletePage(r[t]);this.pages.push(o),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(o.canvas)}const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}_mergePages(t,e){const i=2*t[0].canvas.width,s=new Q(this._document,i,t);for(const[r,a]of t.entries()){const t=r*a.canvas.width%i,o=Math.floor(r/2)*a.canvas.height;s.ctx.drawImage(a.canvas,t,o);for(const s of a.glyphs)s.texturePage=e,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=t,s.texturePosition.y+=o,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(a.canvas);const n=this._activePages.indexOf(a);-1!==n&&this._activePages.splice(n,1)}return s}_deletePage(t){this._pages.splice(t,1);for(let e=t;e=this._config.colors.ansi.length)throw new Error("No color found for idx "+t);return this._config.colors.ansi[t]}_getBackgroundColor(t,e,i,s){if(this._config.allowTransparency)return o.NULL_COLOR;let r;switch(t){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(e);break;case 50331648:const t=L.AttributeData.toColorRGB(e);r=o.channels.toColor(t[0],t[1],t[2]);break;default:r=i?o.color.opaque(this._config.colors.foreground):this._config.colors.background}return this._config.allowTransparency||(r=o.color.opaque(r)),r}_getForegroundColor(t,e,i,r,a,n,h,T,l,d){const c=this._getMinimumContrastColor(t,e,i,r,a,n,h,l,T,d);if(c)return c;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&l&&n<8&&(n+=8),_=this._getColorFromAnsiIndex(n);break;case 50331648:const t=L.AttributeData.toColorRGB(n);_=o.channels.toColor(t[0],t[1],t[2]);break;default:_=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(_=o.color.opaque(_)),T&&(_=o.color.multiplyOpacity(_,s.DIM_OPACITY)),_}_resolveBackgroundRgba(t,e,i){switch(t){case 16777216:case 33554432:return this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(t,e,i,s){switch(t){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&e<8&&(e+=8),this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(t,e,i,s,r,a,n,h,L,T){if(1===this._config.minimumContrastRatio||T)return;const l=this._getContrastCache(L),d=l.getColor(t,s);if(void 0!==d)return d??void 0;const c=this._resolveBackgroundRgba(e,i,n),_=this._resolveForegroundRgba(r,a,n,h),Q=o.rgba.ensureContrastRatio(c,_,this._config.minimumContrastRatio/(L?2:1));if(!Q)return void l.setColor(t,s,null);const u=o.channels.toColor(Q>>24&255,Q>>16&255,Q>>8&255);return l.setColor(t,s,u),u}_getContrastCache(t){return t?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(t,e,i,o,n,h){const T="number"==typeof t?String.fromCharCode(t):t;h&&this._tmpCanvas.parentElement!==h&&(this._tmpCanvas.style.display="none",h.append(this._tmpCanvas));const l=Math.min(this._config.deviceCellWidth*Math.max(T.length,2)+4,this._config.deviceMaxTextureSize);this._tmpCanvas.width=t?2*t-o:t-o;!1==!(o>=t)||0===_?(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(L+_,s),this._tmpCtx.lineTo(T,s)):(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(L+_,s),this._tmpCtx.moveTo(L+_+t,s),this._tmpCtx.lineTo(T,s)),o=(0,a.computeNextVariantOffset)(T-L,t,o);break;case 5:const Q=.6,u=.3,p=T-L,g=Math.floor(Q*p),M=Math.floor(u*p),y=p-g-M;this._tmpCtx.setLineDash([g,M,y]),this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(T,s);break;default:this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(T,s)}n||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!O&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==T){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const e=this._tmpCtx.measureText(T);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in e&&e.actualBoundingBoxDescent>0){this._tmpCtx.save();const e=new Path2D;e.rect(i,h-Math.ceil(t/2),this._config.deviceCellWidth*I,l-h+Math.ceil(t/2)),this._tmpCtx.clip(e),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=E.css,this._tmpCtx.strokeText(T,S,S+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(C){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),e=t%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+e),this._tmpCtx.stroke()}if(O||this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight),"_"===T&&!this._config.allowTransparency){let t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W);if(t)for(let e=1;e<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=E.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight-e),t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W),t);e++);}if(f){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),e=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.stroke()}this._tmpCtx.restore();const P=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let N;if(N=this._config.allowTransparency?function(t){for(let e=0;e0)return!1;return!0}(P):u(P,E,D,W),N)return d;const B=this._findGlyphBoundingBox(P,this._workBoundingBox,l,Z,O,S);let $,F;for(;;){if(0===this._activePages.length){const t=this._createNewPage();$=t,F=t.currentRow,F.height=B.size.y;break}$=this._activePages[this._activePages.length-1],F=$.currentRow;for(const t of this._activePages)B.size.y<=t.currentRow.height&&($=t,F=t.currentRow);for(let t=this._activePages.length-1;t>=0;t--)for(const e of this._activePages[t].fixedRows)e.height<=F.height&&B.size.y<=e.height&&($=this._activePages[t],F=e);if(B.size.x>this._textureSize){this._overflowSizePage||(_.maxAtlasPages&&this._pages.length>=_.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new Q(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),$=this._overflowSizePage,F=this._overflowSizePage.currentRow,F.x+B.size.x>=$.canvas.width&&(F.x=0,F.y+=F.height,F.height=0);break}if(F.y+B.size.y>=$.canvas.height||F.height>B.size.y+2){let t=!1;if($.currentRow.y+$.currentRow.height+B.size.y>=$.canvas.height){let e;for(const t of this._activePages)if(t.currentRow.y+t.currentRow.height+B.size.y=_.maxAtlasPages&&F.y+B.size.y<=$.canvas.height&&F.height>=B.size.y&&F.x+B.size.x<=$.canvas.width)t=!0;else{const e=this._createNewPage();$=e,F=e.currentRow,F.height=B.size.y,t=!0}}t||($.currentRow.height>0&&$.fixedRows.push($.currentRow),F={x:0,y:$.currentRow.y+$.currentRow.height,height:B.size.y},$.fixedRows.push(F),$.currentRow={x:0,y:F.y+F.height,height:0})}if(F.x+B.size.x<=$.canvas.width)break;F===$.currentRow?(F.x=0,F.y+=F.height,F.height=0):$.fixedRows.splice($.fixedRows.indexOf(F),1)}return B.texturePage=this._pages.indexOf($),B.texturePosition.x=F.x,B.texturePosition.y=F.y,B.texturePositionClipSpace.x=F.x/$.canvas.width,B.texturePositionClipSpace.y=F.y/$.canvas.height,B.sizeClipSpace.x/=$.canvas.width,B.sizeClipSpace.y/=$.canvas.height,F.height=Math.max(F.height,B.size.y),F.x+=B.size.x,$.ctx.putImageData(P,B.texturePosition.x-this._workBoundingBox.left,B.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,B.size.x,B.size.y),$.addGlyph(B),$.version=++Q.nextVersion,B}_findGlyphBoundingBox(t,e,i,s,r,a){e.top=0;const o=s?this._config.deviceCellHeight:this._tmpCanvas.height,n=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i=a;i--){for(let s=0;s=0;i--){for(let s=0;s>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=i.rgba>>>24,h=i.rgba>>>16&255,L=i.rgba>>>8&255,T=Math.floor((Math.abs(r-n)+Math.abs(a-h)+Math.abs(o-L))/12);let l=!0;for(let e=0;ethis._handleColorChange())),this._cellColorResolver=new s.CellColorResolver(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new _.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,d,this._themeService)],this.dimensions=(0,g.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(d.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new T.TextBlinkStateManager(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextlost",t=>{this._logService.debug("webglcontextlost event received"),t.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(t)},3e3)})),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextrestored",t=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,r.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,(t,e)=>this._setCanvasDevicePixelDimensions(t,e)),this._register(this._coreBrowserService.onWindowChange(t=>{this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,t,(t,e)=>this._setCanvasDevicePixelDimensions(t,e))})),this._register((0,u.addDisposableListener)(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register((0,p.toDisposable)(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(const t of this._renderLayers)t.dispose();this._canvas.parentElement?.removeChild(this._canvas),(0,r.removeTerminalFromCache)(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,e){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(const t of this._renderLayers)t.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(const t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(const t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,e,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,t,e,i);this._model.selection.update(this._core,t,e,i),this._requestRedrawViewport()}handleCursorMove(){for(const t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new d.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new l.GlyphRenderer(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,r.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,p.combinedDisposable)(Q.EventUtils.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),Q.EventUtils.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(const t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,e){if(!this._isAttached){if(!(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,t,e);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,e);let i=!1,s=0;for(;this._charAtlas&&this._glyphRenderer.value.beginFrame()&&s++<32;)i=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);i&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,e){const i=this._core;let s,r,a,o,n,h,T,l,d,_,Q,u,p,g,M,f,C,m=this._workCell;t=v(t,i.rows-1,0),e=v(e,i.rows-1,0);const w=this._coreService.decPrivateModes.cursorStyle??i.options.cursorStyle??"block",x=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,b=x-i.buffer.ydisp,E=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let R=-1;const k=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let A=!1;for(r=t;r<=e;r++){a=r+i.buffer.ydisp;const t=i.buffer.lines.get(a);if(!t){for(this._model.lineLengths[r]=0,f=0;f=T,d=f,n.length>0&&f===n[0][0]&&l){_=n.shift();const t=this._model.selection.isCellSelected(this._terminal,_[0],a);for(M=_[0]+1;M<_[1];M++)l&&=t===this._model.selection.isCellSelected(this._terminal,M,a);l&&=!Q||E<_[0]||E>=_[1],l?(h=!0,m=new y(m,o.translateToString(!0,_[0],_[1]),_[1]-_[0]),d=_[1]-1):T=_[1]}if(u=m.getChars(),p=m.getCode(),M=4*(r*i.cols+f),!e&&m.isBlink()&&(e=!0),this._cellColorResolver.resolve(m,f,a,this.dimensions.device.cell.width,this.dimensions.device.cell.height),k&&a===x&&(f===E&&(this._model.cursor={x:E,y:b,width:m.getWidth(),style:this._coreBrowserService.isFocused?w:i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},R=E+m.getWidth()-1),f>=E&&f<=R&&(this._coreBrowserService.isFocused&&"block"===w||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&m.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),p!==L.NULL_CELL_CODE&&(this._model.lineLengths[r]=f+1),(this._model.cells[M]!==p||this._model.cells[M+1]!==this._cellColorResolver.result.bg||this._model.cells[M+2]!==this._cellColorResolver.result.fg||this._model.cells[M+3]!==this._cellColorResolver.result.ext)&&(A=!0,u.length>1&&(p|=c.COMBINED_CHAR_BIT_MASK),this._model.cells[M]=p,this._model.cells[M+1]=this._cellColorResolver.result.bg,this._model.cells[M+2]=this._cellColorResolver.result.fg,this._model.cells[M+3]=this._cellColorResolver.result.ext,g=m.getWidth(),this._glyphRenderer.value.updateCell(f,r,p,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,u,g,s),h)){for(m=this._workCell,f++;f<=d;f++)C=4*(r*i.cols+f),this._nullModelCell(f,r,C,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);f--}}this._setRowBlinkState(r,e)}A&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,e,i,s,r,a){this._glyphRenderer.value.updateCell(t,e,L.NULL_CELL_CODE,s,r,a,L.NULL_CELL_CHAR,0,0),this._model.cells[i]=L.NULL_CELL_CODE,this._model.cells[i+1]=s,this._model.cells[i+2]=r,this._model.cells[i+3]=a}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,e){this._rowHasBlinkingCells[t]!==e&&(this._rowHasBlinkingCells[t]=e,this._rowHasBlinkingCellsCount+=e?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,e){this._canvas.width===t&&this._canvas.height===e||(this._canvas.width=t,this._canvas.height=e,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}}e.WebglRenderer=M;class y extends n.AttributeData{constructor(t,e,i){super(),this.content=0,this.combinedData="",this.fg=t.fg,this.bg=t.bg,this.combinedData=e,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function v(t,e,i=0){return Math.max(Math.min(t,e),i)}e.JoinedCellData=y},719(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GLTexture=e.PROJECTION_MATRIX=void 0,e.createProgram=function(t,e,i,a){const o=(0,s.throwIfFalsy)(t.createProgram());if(t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.VERTEX_SHADER,e,a))),t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.FRAGMENT_SHADER,i,a))),t.linkProgram(o),t.getProgramParameter(o,t.LINK_STATUS))return o;a.error(t.getProgramInfoLog(o)),t.deleteProgram(o)},e.createShader=r,e.expandFloat32Array=function(t,e){const i=Math.min(2*t.length,e),s=new Float32Array(i);for(let e=0;e{const e=[],i=[3/8,2/8,3/8],s=[0,3/8,5/8];for(let r=0;r<3;r++){const a=t>>2*r&1,o=t>>2*r+1&1;a&&o?e.push(`M0,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):a?e.push(`M0,${s[r]} L0.5,${s[r]} L0.5,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):o&&e.push(`M0.5,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0.5,${s[r]+i[r]} Z`)}return e.join(" ")}}}function r(t){const e=[],i=.15,s=.015,r=.075,a=.0375,o=.95;if(64&t){const t=.175,a=.2125,n=.25,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}if(32&t){const t=o-i,s=.875,r=o,n=.265,h=.485;e.push(`M${s},${n} L${r},${n+a} L${r},${h-a} L${s},${h} L${t},${h-a} L${t},${n+a} Z`)}if(16&t){const t=o-i,s=.875,r=o,n=.515,h=.735;e.push(`M${s},${n} L${r},${n+a} L${r},${h-a} L${s},${h} L${t},${h-a} L${t},${n+a} Z`)}if(8&t){const t=.75,a=.7875,n=.825,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}if(4&t){const t=.05,i=.125,s=.2,r=.515,o=.735;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(2&t){const t=.05,i=.125,s=.2,r=.265,o=.485;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(1&t){const t=.4625,a=.5,n=.5375,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}return e.join(" ")}Object.defineProperty(e,"__esModule",{value:!0}),e.blockPatternCodepoints=e.customGlyphDefinitions=void 0,function(t){t.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),t.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),t.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),t.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),t.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),t.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),t.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.CURVE_UP_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_UP_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),t.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),t.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),t.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),t.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),t.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})}(i||(i={})),e.customGlyphDefinitions={"─":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"━":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"│":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"┃":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"┄":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"┅":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"┆":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"┇":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"┈":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"┉":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"┊":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"┋":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"┌":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"┍":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┎":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┏":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"┐":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"┑":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┒":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┓":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"└":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"┕":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┖":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┗":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"┘":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"┙":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┚":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┛":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"├":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"┝":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┞":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┟":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┠":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┡":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┢":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┣":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"┤":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"┥":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┦":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┧":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┨":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┩":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┪":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┫":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"┬":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"┭":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┮":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┯":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┰":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┱":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┲":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┳":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"┴":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"┵":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┶":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┷":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┸":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┹":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┺":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┻":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"┼":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"┽":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┾":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┿":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"╀":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"╁":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╂":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"╃":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"╄":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"╅":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"╆":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"╇":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"╈":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"╉":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"╊":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"╋":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"╌":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"╍":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"╎":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"╏":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"═":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"║":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╒":{type:2,data:(t,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╓":{type:2,data:(t,e)=>`M${.5-t},1 L${.5-t},.5 L1,.5 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╔":{type:2,data:(t,e)=>`M1,${.5-e} L${.5-t},${.5-e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╕":{type:2,data:(t,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╖":{type:2,data:(t,e)=>`M${.5+t},1 L${.5+t},.5 L0,.5 M${.5-t},.5 L${.5-t},1`,strokeWidth:1},"╗":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5+t},${.5-e} L${.5+t},1`,strokeWidth:1},"╘":{type:2,data:(t,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"╙":{type:2,data:(t,e)=>`M1,.5 L${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╚":{type:2,data:(t,e)=>`M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0 M1,${.5+e} L${.5-t},${.5+e} L${.5-t},0`,strokeWidth:1},"╛":{type:2,data:(t,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"╜":{type:2,data:(t,e)=>`M0,.5 L${.5+t},.5 L${.5+t},0 M${.5-t},.5 L${.5-t},0`,strokeWidth:1},"╝":{type:2,data:(t,e)=>`M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M0,${.5+e} L${.5+t},${.5+e} L${.5+t},0`,strokeWidth:1},"╞":{type:2,data:(t,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╟":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1 M${.5+t},.5 L1,.5`,strokeWidth:1},"╠":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╡":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╢":{type:2,data:(t,e)=>`M0,.5 L${.5-t},.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╣":{type:2,data:(t,e)=>`M${.5+t},0 L${.5+t},1 M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0`,strokeWidth:1},"╤":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"╥":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},1 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╦":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╧":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╨":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╩":{type:2,data:(t,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╪":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╫":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╬":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╭":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╮":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╯":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╰":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╱":{type:2,data:"M1,0 L0,1",strokeWidth:1},"╲":{type:2,data:"M0,0 L1,1",strokeWidth:1},"╳":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"╴":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"╵":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"╶":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"╷":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"╸":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"╹":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"╺":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"╻":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"╼":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"╽":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╾":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"╿":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"▀":{type:0,data:[{x:0,y:0,w:8,h:4}]},"▁":{type:0,data:[{x:0,y:7,w:8,h:1}]},"▂":{type:0,data:[{x:0,y:6,w:8,h:2}]},"▃":{type:0,data:[{x:0,y:5,w:8,h:3}]},"▄":{type:0,data:[{x:0,y:4,w:8,h:4}]},"▅":{type:0,data:[{x:0,y:3,w:8,h:5}]},"▆":{type:0,data:[{x:0,y:2,w:8,h:6}]},"▇":{type:0,data:[{x:0,y:1,w:8,h:7}]},"█":{type:0,data:[{x:0,y:0,w:8,h:8}]},"▉":{type:0,data:[{x:0,y:0,w:7,h:8}]},"▊":{type:0,data:[{x:0,y:0,w:6,h:8}]},"▋":{type:0,data:[{x:0,y:0,w:5,h:8}]},"▌":{type:0,data:[{x:0,y:0,w:4,h:8}]},"▍":{type:0,data:[{x:0,y:0,w:3,h:8}]},"▎":{type:0,data:[{x:0,y:0,w:2,h:8}]},"▏":{type:0,data:[{x:0,y:0,w:1,h:8}]},"▐":{type:0,data:[{x:4,y:0,w:4,h:8}]},"░":{type:1,data:[[1,0],[0,0]]},"▒":{type:1,data:[[1,0],[0,1]]},"▓":{type:1,data:[[1,1],[1,0]]},"▔":{type:0,data:[{x:0,y:0,w:8,h:1}]},"▕":{type:0,data:[{x:7,y:0,w:1,h:8}]},"▖":{type:0,data:[{x:0,y:4,w:4,h:4}]},"▗":{type:0,data:[{x:4,y:4,w:4,h:4}]},"▘":{type:0,data:[{x:0,y:0,w:4,h:4}]},"▙":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"▚":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"▛":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"▜":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"▝":{type:0,data:[{x:4,y:0,w:4,h:4}]},"▞":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"▟":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"":i.LINE_H,"":i.LINE_V,"":i.FADE_RIGHT,"":i.FADE_LEFT,"":i.FADE_DOWN,"":i.FADE_UP,"":i.CURVE_DOWN_RIGHT,"":i.CURVE_DOWN_LEFT,"":i.CURVE_UP_RIGHT,"":i.CURVE_UP_LEFT,"":[i.LINE_V,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT],"":[i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_UP_RIGHT],"":[i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE],"":i.NODE_STROKE,"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"🬀":s(1),"🬁":s(2),"🬂":s(3),"🬃":s(4),"🬄":s(5),"🬅":s(6),"🬆":s(7),"🬇":s(8),"🬈":s(9),"🬉":s(10),"🬊":s(11),"🬋":s(12),"🬌":s(13),"🬍":s(14),"🬎":s(15),"🬏":s(16),"🬐":s(17),"🬑":s(18),"🬒":s(19),"🬓":s(20),"🬔":s(22),"🬕":s(23),"🬖":s(24),"🬗":s(25),"🬘":s(26),"🬙":s(27),"🬚":s(28),"🬛":s(29),"🬜":s(30),"🬝":s(31),"🬞":s(32),"🬟":s(33),"🬠":s(34),"🬡":s(35),"🬢":s(36),"🬣":s(37),"🬤":s(38),"🬥":s(39),"🬦":s(40),"🬧":s(41),"🬨":s(43),"🬩":s(44),"🬪":s(45),"🬫":s(46),"🬬":s(47),"🬭":s(48),"🬮":s(49),"🬯":s(50),"🬰":s(51),"🬱":s(52),"🬲":s(53),"🬳":s(54),"🬴":s(55),"🬵":s(56),"🬶":s(57),"🬷":s(58),"🬸":s(59),"🬹":s(60),"🬺":s(61),"🬻":s(62),"🬼":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"🬽":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"🬾":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"🬿":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"🭀":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"🭁":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭂":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"🭃":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭄":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"🭅":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"🭆":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"🭇":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"🭈":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"🭉":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"🭊":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"🭋":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"🭌":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"🭍":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"🭎":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"🭏":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"🭐":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"🭑":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"🭒":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭓":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"🭔":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭕":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"🭖":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"🭗":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"🭘":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"🭙":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"🭚":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"🭛":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"🭜":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"🭝":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"🭞":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"🭟":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"🭠":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"🭡":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"🭢":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"🭣":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"🭤":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"🭥":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"🭦":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"🭧":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"🭨":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"🭩":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"🭪":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"🭫":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"🭬":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"🭭":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"🭮":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"🭯":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"🭰":{type:0,data:[{x:1,y:0,w:1,h:8}]},"🭱":{type:0,data:[{x:2,y:0,w:1,h:8}]},"🭲":{type:0,data:[{x:3,y:0,w:1,h:8}]},"🭳":{type:0,data:[{x:4,y:0,w:1,h:8}]},"🭴":{type:0,data:[{x:5,y:0,w:1,h:8}]},"🭵":{type:0,data:[{x:6,y:0,w:1,h:8}]},"🭶":{type:0,data:[{x:0,y:1,w:8,h:1}]},"🭷":{type:0,data:[{x:0,y:2,w:8,h:1}]},"🭸":{type:0,data:[{x:0,y:3,w:8,h:1}]},"🭹":{type:0,data:[{x:0,y:4,w:8,h:1}]},"🭺":{type:0,data:[{x:0,y:5,w:8,h:1}]},"🭻":{type:0,data:[{x:0,y:6,w:8,h:1}]},"🭼":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🭽":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭾":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭿":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🮀":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮁":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮂":{type:0,data:[{x:0,y:0,w:8,h:2}]},"🮃":{type:0,data:[{x:0,y:0,w:8,h:3}]},"🮄":{type:0,data:[{x:0,y:0,w:8,h:5}]},"🮅":{type:0,data:[{x:0,y:0,w:8,h:6}]},"🮆":{type:0,data:[{x:0,y:0,w:8,h:7}]},"🮇":{type:0,data:[{x:6,y:0,w:2,h:8}]},"🮈":{type:0,data:[{x:5,y:0,w:3,h:8}]},"🮉":{type:0,data:[{x:3,y:0,w:5,h:8}]},"🮊":{type:0,data:[{x:2,y:0,w:6,h:8}]},"🮋":{type:0,data:[{x:1,y:0,w:7,h:8}]},"🮌":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"🮍":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"🮎":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"🮏":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"🮐":{type:1,data:[[0,1],[1,0]]},"🮑":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"🮒":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"🮔":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"🮕":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"🮖":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"🮗":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"🮘":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"🮙":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"🮚":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"🮛":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"🮜":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"🮝":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"🮞":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"🮟":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"🮠":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"🮡":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"🮢":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"🮣":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"🮤":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"🮥":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"🮦":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"🮧":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"🮨":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"🮩":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"🮪":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"🮫":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"🮬":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"🮭":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"🮮":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"🮯":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"🮰":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"🮱":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"🮲":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"🮳":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"🮴":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"🮵":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮶":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮷":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮸":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮹":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"🮺":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"🮻":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"🮼":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"🮽":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"🮾":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"🮿":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"🯀":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"🯁":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"🯂":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"🯃":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"🯄":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"🯅":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯆":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯇":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯈":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯉":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯊":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"🯋":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"🯌":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"🯍":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"🯎":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"🯏":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"🯐":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"🯑":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"🯒":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"🯓":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"🯔":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"🯕":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"🯖":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"🯗":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"🯘":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"🯙":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"🯚":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"🯛":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"🯜":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"🯝":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"🯞":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"🯟":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"🯠":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"🯡":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"🯢":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"🯣":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"🯤":{type:0,data:[{x:2,y:0,w:4,h:4}]},"🯥":{type:0,data:[{x:2,y:4,w:4,h:4}]},"🯦":{type:0,data:[{x:0,y:2,w:4,h:4}]},"🯧":{type:0,data:[{x:4,y:2,w:4,h:4}]},"🯨":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"🯩":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"🯪":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"🯫":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"🯬":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"🯭":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"🯮":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"🯯":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"🯰":{type:5,data:{d:r(126),type:0},scaleType:1},"🯱":{type:5,data:{d:r(48),type:0},scaleType:1},"🯲":{type:5,data:{d:r(109),type:0},scaleType:1},"🯳":{type:5,data:{d:r(121),type:0},scaleType:1},"🯴":{type:5,data:{d:r(51),type:0},scaleType:1},"🯵":{type:5,data:{d:r(91),type:0},scaleType:1},"🯶":{type:5,data:{d:r(95),type:0},scaleType:1},"🯷":{type:5,data:{d:r(114),type:0},scaleType:1},"🯸":{type:5,data:{d:r(127),type:0},scaleType:1},"🯹":{type:5,data:{d:r(123),type:0},scaleType:1},"🯺":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(t,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},e.blockPatternCodepoints=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951])},183(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.createPatternCanvas=n,e.tryDrawCustomGlyph=function(t,e,i,s,a,o,n,L,T,l,d,c,_=0){const Q=r.customGlyphDefinitions[e];if(Q){const e=Array.isArray(Q)?Q:[Q];for(const r of e)h(t,r,i,s,a,o,n,L,T,l,d,c,_);return!0}return!1};const s=i(959),r=i(915),a="undefined"==typeof OffscreenCanvas?void 0:(t,e)=>new OffscreenCanvas(t,e),o=(t,e)=>{const i=document.createElement("canvas");return i.width=t,i.height=e,i};function n(t,e,i=a,s=o){return i?.(t,e)??s(t,e)}function h(t,e,i,r,a,o,h,d,Q,u,p,g,M=0){let y=a,v=o,f=i,C=r;switch(1===e.scaleType&&(y=h,v=d,f=i+(a-h)/2,C=r+(o-d)/2),e.clipPath&&(t.save(),function(t,e,i,s,r,a){t.beginPath();for(const o of e.split(" ")){const e=o[0];if("Z"===e){t.closePath();continue}const n=o.substring(1).split(",");if(!n[0]||!n[1])continue;const h=i+parseFloat(n[0])*r,L=s+parseFloat(n[1])*a;"M"===e?t.moveTo(h,L):"L"===e&&t.lineTo(h,L)}t.clip()}(t,e.clipPath,f,C,y,v)),e.type){case 0:!function(t,e,i,s,r,a){for(let o=0;o7&&parseInt(T.slice(7,9),16)||1;else{if(!T.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${T}" when drawing pattern glyph`);[l,c,_,Q]=T.substring(5,T.length-1).split(",").map(t=>parseFloat(t))}for(let t=0;t>1&1,_=1&h;0!==c||0!==_?d.setTransform((new DOMMatrix).translateSelf(-c,-_)):d.setTransform(new DOMMatrix),t.fillStyle=d,t.fillRect(i,r,a,o)}(t,e.data,f,C,y,v,M);break;case 2:!function(t,e,i,s,r,a,o,n,h){let L;t.save(),t.beginPath(),t.rect(i,s,r,a),t.clip(),t.beginPath(),L="function"==typeof e?e(.15,.15/a*r):e;const T={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const e of L.split(" ")){const h=e[0];if("Z"===h){t.closePath(),T.lastCommand=h;continue}const L=c[h];if(!L){n.error(`Could not find drawing instructions for "${h}"`);continue}const l=e.substring(1).split(",");l[0]&&l[1]&&(L(t,_(l,r,a,i,s,!0,o,0,0,!1),T),T.lastCommand=h)}void 0!==h?(t.strokeStyle=t.fillStyle,t.lineWidth=o*h,t.stroke()):t.fill(),t.closePath(),t.restore()}(t,e.data,f,C,y,v,u,p,e.strokeWidth);break;case 3:!function(t,e,i,s,r,a,o,n){const h="string"==typeof e?e:e(0,0);t.beginPath();let L=0,l=0,d=0,c=0,_="";for(const e of h.split(" ")){const o=e[0],n=e.substring(1).split(",");if("Z"===o){t.closePath(),_=o;continue}if("V"===o){const e=s+parseFloat(n[0])*a;t.lineTo(L,e),l=e,d=L,c=l,_=o;continue}if("H"===o){const e=i+parseFloat(n[0])*r;t.lineTo(e,l),L=e,d=L,c=l,_=o;continue}if(!n[0]||!n[1])continue;if("A"===o){const e=parseFloat(n[0])*r,o=parseFloat(n[1])*a,h=parseFloat(n[2])*Math.PI/180,d=parseInt(n[3],10),c=parseInt(n[4],10),_=i+parseFloat(n[5])*r,Q=s+parseFloat(n[6])*a;T(t,L,l,e,o,h,d,c,_,Q),L=_,l=Q;continue}const h=n.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});if("M"===o)t.moveTo(h[0],h[1]),L=h[0],l=h[1],d=L,c=l;else if("L"===o)t.lineTo(h[0],h[1]),L=h[0],l=h[1],d=L,c=l;else if("Q"===o)t.quadraticCurveTo(h[0],h[1],h[2],h[3]),d=h[0],c=h[1],L=h[2],l=h[3];else if("T"===o){let e,i;"Q"===_||"T"===_?(e=2*L-d,i=2*l-c):(e=L,i=l),t.quadraticCurveTo(e,i,h[0],h[1]),d=e,c=i,L=h[0],l=h[1]}else"C"===o&&(t.bezierCurveTo(h[0],h[1],h[2],h[3],h[4],h[5]),d=h[2],c=h[3],L=h[4],l=h[5]);_=o}void 0!==n?(t.strokeStyle=t.fillStyle,t.lineWidth=o*n,t.stroke()):t.fill()}(t,e.data,f,C,y,v,u,e.strokeWidth);break;case 4:!function(t,e,i,s,r,a,o,n){t.save(),t.fillRect(i,s,r,a),n&&(t.fillStyle=n,t.strokeStyle=n),t.lineWidth=o,t.lineCap="square",t.beginPath();for(const o of e.d.split(" ")){const e=o[0],n=o.substring(1).split(",");if(!n[0]||!n[1]){"Z"===e&&t.closePath();continue}const h=n.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});"M"===e?t.moveTo(h[0],h[1]):"L"===e&&t.lineTo(h[0],h[1])}1===e.type?t.stroke():t.fill(),t.restore()}(t,e.data,f,C,y,v,u,g);break;case 5:!function(t,e,i,s,r,a,o,n,h){const L=new Path2D;L.rect(i,s,r,a),t.clip(L),t.beginPath();const T=o/12;t.lineWidth=n*T;const l={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const o of e.d.split(" ")){const L=o[0];if("Z"===L){t.closePath(),l.lastCommand=L;continue}const d=c[L];if(!d){h.error(`Could not find drawing instructions for "${L}"`);continue}const Q=o.substring(1).split(",");Q[0]&&Q[1]&&(d(t,_(Q,r,a,i,s,!1,n,(e.leftPadding??0)*(T/2),(e.rightPadding??0)*(T/2)),l),l.lastCommand=L)}1===e.type?(t.strokeStyle=t.fillStyle,t.stroke()):t.fill(),t.closePath()}(t,e.data,f,C,y,v,Q,u,p);break;case 6:!function(t,e,i,s,r,a){const o=r/8,n=.1*a,h=.8*a/8,T=Math.min(o,h);for(let r=0;r<8;r++)if(e&1<1){const t=Math.sqrt(y);u=(s*=t)*s,p=(r*=t)*r}let v=(u*p-u*M-p*g)/(u*M+p*g);v<0&&(v=0);const f=(o===n?-1:1)*Math.sqrt(v),C=f*(s*Q/r),m=f*(-r*_/s),w=T*C-l*m+(e+h)/2,x=l*C+T*m+(i+L)/2,b=(_-C)/s,E=(Q-m)/r,R=(-_-C)/s,k=(-Q-m)/r,A=Math.atan2(E,b);let Z=Math.atan2(k,R)-A;0===n&&Z>0?Z-=2*Math.PI:1===n&&Z<0&&(Z+=2*Math.PI);const D=A+Z;t.ellipse(w,x,s,r,a,A,D,0===n)}const l=new Map;function d(t,e,i=0){return Math.max(Math.min(t,e),i)}const c={C:(t,e,i)=>{t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),i.lastControlX=e[2],i.lastControlY=e[3],i.currentX=e[4],i.currentY=e[5]},L:(t,e,i)=>{t.lineTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},M:(t,e,i)=>{t.moveTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},Q:(t,e,i)=>{t.quadraticCurveTo(e[0],e[1],e[2],e[3]),i.lastControlX=e[0],i.lastControlY=e[1],i.currentX=e[2],i.currentY=e[3]},T:(t,e,i)=>{let s,r;"Q"===i.lastCommand||"T"===i.lastCommand?(s=2*i.currentX-i.lastControlX,r=2*i.currentY-i.lastControlY):(s=i.currentX,r=i.currentY),t.quadraticCurveTo(s,r,e[0],e[1]),i.lastControlX=s,i.lastControlY=r,i.currentX=e[0],i.currentY=e[1]}};function _(t,e,i,s,r,a,o,n=0,h=0,L=!0){const T=t.map(t=>parseFloat(t)||parseInt(t));if(T.length<2)throw new Error("Too few arguments for instruction");for(let t=0;t{this._refreshCharAtlas(t,e),this.reset(t)})),this._register((0,r.toDisposable)(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=(0,a.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,e,i){}handleSelectionChanged(t,e,i,s=!1){}_setTransparency(t,e){if(e===this._alpha)return;const i=this._canvas;this._alpha=e,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,e){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(t,this._optionsService.rawOptions,e,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,e){this._deviceCellWidth=e.device.cell.width,this._deviceCellHeight=e.device.cell.height,this._deviceCharWidth=e.device.char.width,this._deviceCharHeight=e.device.char.height,this._deviceCharLeft=e.device.char.left,this._deviceCharTop=e.device.char.top,this._canvas.width=e.device.canvas.width,this._canvas.height=e.device.canvas.height,this._canvas.style.width=`${e.css.canvas.width}px`,this._canvas.style.height=`${e.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,e,i=1){this._ctx.fillRect(t*this._deviceCellWidth,(e+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,e,i,s){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(t,e,i,s){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=o.TEXT_BASELINE,this._clipCell(i,s,e.getWidth()),this._ctx.fillText(e.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,e,i){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,e,i){return`${i?"italic":""} ${e?t.options.fontWeightBold:t.options.fontWeight} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}}e.BaseRenderLayer=n},306(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.LinkRenderLayer=void 0;const s=i(657),r=i(814),a=i(133);class o extends a.BaseRenderLayer{constructor(t,e,i,s,r,a,o){super(i,t,"link",e,!0,r,a,o),this._register(s.onShowLinkUnderline(t=>this._handleShowLinkUnderline(t))),this._register(s.onHideLinkUnderline(t=>this._handleHideLinkUnderline(t)))}resize(t,e){super.resize(t,e),this._state=void 0}reset(t){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const t=this._state.y2-this._state.y1-1;t>0&&this._clearCells(0,this._state.y1+1,this._state.cols,t),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(t){if(t.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==t.fg&&(0,s.is256Color)(t.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[t.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,t.y1===t.y2)this._fillBottomLineAtCells(t.x1,t.y1,t.x2-t.x1);else{this._fillBottomLineAtCells(t.x1,t.y1,t.cols-t.x1);for(let e=t.y1+1;e{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.WebglAddon=void 0;const e=i(426),r=i(95),a=i(399),o=i(414);class n extends e.Disposable{constructor(t){if(r.isSafari&&(0,r.getSafariVersion)()<16){const t={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",t))throw new Error("WebGL2 is only supported on Safari 16 and above")}super(),this._onChangeTextureAtlas=this._register(new o.Emitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this._register(new o.Emitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this._register(new o.Emitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this._register(new o.Emitter),this.onContextLoss=this._onContextLoss.event,this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){const i=t._core;if(!t.element)return void this._register(i.onWillOpen(()=>this.activate(t)));this._terminal=t;const s=i.coreService,r=i.optionsService,n=i,h=n._renderService,L=n._characterJoinerService,T=n._charSizeService,l=n._coreBrowserService,d=n._decorationService,c=n._logService,_=n._themeService;this._renderer=this._register(new a.WebglRenderer(t,L,T,l,s,d,c,r,_,this._customGlyphs,this._preserveDrawingBuffer)),this._register(o.EventUtils.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(o.EventUtils.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(o.EventUtils.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(o.EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),h.setRenderer(this._renderer),this._register((0,e.toDisposable)(()=>{if(this._terminal._core._store._isDisposed)return;const e=this._terminal._core._renderService;e.setRenderer(this._terminal._core._createRenderer()),e.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}}t.WebglAddon=n})(),s})()); ++!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WebglAddon=e():t.WebglAddon=e()}(globalThis,()=>(()=>{"use strict";var t={105(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.WindowIntervalTimer=e.eventType=void 0,e.getWindow=r,e.addDisposableListener=o,e.addStandardDisposableListener=function(t,e,i,s){return o(t,e,i,s)},e.getDomNodePagePosition=function(t){const e=t.getBoundingClientRect(),i=r(t);return{left:e.left+i.scrollX,top:e.top+i.scrollY,width:e.width,height:e.height}},e.scheduleAtNextAnimationFrame=function(t,e,i=0){const s=L(t),r=new n(e,i);return s.next.push(r),s.animFrameRequested||(s.animFrameRequested=!0,t.requestAnimationFrame(()=>function(t){const e=L(t);for(e.animFrameRequested=!1,e.current=e.next,e.next=[],e.inAnimationFrameRunner=!0;e.current.length>0;)e.current.sort(n.sort),e.current.shift().execute();e.inAnimationFrameRunner=!1}(t))),r};const s=i(578);function r(t){const e=t;if(e?.ownerDocument?.defaultView)return e.ownerDocument.defaultView;const i=t;return i?.view?i.view:window}class a{constructor(t,e,i,s){this._node=t,this._type=e,this._handler=i,this._options=s,t.addEventListener(e,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function o(t,e,i,s){return new a(t,e,i,s)}e.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class n{constructor(t,e){this._runner=t,this.priority=e,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(t){console.error(t)}}static sort(t,e){return e.priority-t.priority}}const h=new Map;function L(t){let e=h.get(t);return e||(e={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(t,e)),e}class T extends s.IntervalTimer{constructor(t){super(),this._defaultTarget=t?r(t):void 0}cancelAndSet(t,e,i){super.cancelAndSet(t,e,i??this._defaultTarget??window)}}e.WindowIntervalTimer=T},814(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.INVERTED_DEFAULT_COLOR=void 0,e.INVERTED_DEFAULT_COLOR=257},959(t,e){function i(t){return 57508<=t&&t<=57558}function s(t){return t>=128512&&t<=128591||t>=127744&&t<=128511||t>=128640&&t<=128767||t>=9728&&t<=9983||t>=9984&&t<=10175||t>=65024&&t<=65039||t>=129280&&t<=129535||t>=127462&&t<=127487}Object.defineProperty(e,"__esModule",{value:!0}),e.throwIfFalsy=function(t){if(!t)throw new Error("value must not be falsy");return t},e.isPowerlineGlyph=i,e.isRestrictedPowerlineGlyph=function(t){return 57520<=t&&t<=57527},e.isEmoji=s,e.allowRescaling=function(t,e,r,a){return 1===e&&r>Math.ceil(1.5*a)&&void 0!==t&&t>255&&!s(t)&&!i(t)&&!function(t){return 57344<=t&&t<=63743}(t)},e.treatGlyphAsBackgroundColor=function(t){return i(t)||function(t){return 9472<=t&&t<=9631}(t)},e.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}}}},e.computeNextVariantOffset=function(t,e,i=0){return(t-(2*Math.round(e)-i))%(2*Math.round(e))}},948(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.createSelectionRenderModel=function(){return new i};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(t,e,i,s=!1){if(this.selectionStart=e,this.selectionEnd=i,!e||!i||e[0]===i[0]&&e[1]===i[1])return void this.clear();const r=t.buffers.active.ydisp,a=e[1]-r,o=i[1]-r,n=Math.max(a,0),h=Math.min(o,t.rows-1);n>=t.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=a,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=i[0])}isCellSelected(t,e,i){return!!this.hasSelection&&(i-=t.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&i>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&e=this.startCol)}}},536(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextBlinkStateManager=void 0;const s=i(426);class r extends s.Disposable{constructor(t,e,i){super(),this._renderCallback=t,this._coreBrowserService=e,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",t=>{this.setIntervalDuration(t)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const t=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(t||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}e.TextBlinkStateManager=r},578(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.IntervalTimer=e.MicrotaskTimer=e.TimeoutTimer=void 0,e.timeout=function(t){return new Promise(e=>setTimeout(e,t))},e.disposableTimeout=function(t,e=0,i){const r=setTimeout(()=>{t(),i&&a.dispose()},e),a=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(a),a};const s=i(426);e.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,t()},e)}setIfNotSet(t,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,t()},e))}},e.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(t){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,t())}))}},e.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t,e,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{t()},e);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},993(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.rgba=e.rgb=e.css=e.color=e.channels=e.NULL_COLOR=void 0,e.toPaddedHex=l,e.contrastRatio=d;let i=0,s=0,r=0,a=0;var o,n,h,L,T;function l(t){const e=t.toString(16);return e.length<2?"0"+e:e}function d(t,e){return t>>0},t.toColor=function(e,i,s,r){return{css:t.toCss(e,i,s,r),rgba:t.toRgba(e,i,s,r)}}}(o||(e.channels=o={})),function(t){function e(t,e){return a=Math.round(255*e),[i,s,r]=T.toChannels(t.rgba),{css:o.toCss(i,s,r,a),rgba:o.toRgba(i,s,r,a)}}t.blend=function(t,e){if(a=(255&e.rgba)/255,1===a)return{css:e.css,rgba:e.rgba};const n=e.rgba>>24&255,h=e.rgba>>16&255,L=e.rgba>>8&255,T=t.rgba>>24&255,l=t.rgba>>16&255,d=t.rgba>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((h-l)*a),r=d+Math.round((L-d)*a),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},t.isOpaque=function(t){return!(255&~t.rgba)},t.ensureContrastRatio=function(t,e,i){const s=T.ensureContrastRatio(t.rgba,e.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},t.opaque=function(t){const e=(255|t.rgba)>>>0;return[i,s,r]=T.toChannels(e),{css:o.toCss(i,s,r),rgba:e}},t.opacity=e,t.multiplyOpacity=function(t,i){return a=255&t.rgba,e(t,a*i/255)},t.toColorRGB=function(t){return[t.rgba>>24&255,t.rgba>>16&255,t.rgba>>8&255]}}(n||(e.color=n={})),function(t){let e,n;try{const t=document.createElement("canvas");t.width=1,t.height=1;const i=t.getContext("2d",{willReadFrequently:!0});i&&(e=i,e.globalCompositeOperation="copy",n=e.createLinearGradient(0,0,1,1))}catch{}t.toColor=function(t){if(t.match(/#[\da-f]{3,8}/i))switch(t.length){case 4:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(t.slice(1,2).repeat(2),16),s=parseInt(t.slice(2,3).repeat(2),16),r=parseInt(t.slice(3,4).repeat(2),16),a=parseInt(t.slice(4,5).repeat(2),16),o.toColor(i,s,r,a);case 7:return{css:t,rgba:(parseInt(t.slice(1),16)<<8|255)>>>0};case 9:return{css:t,rgba:parseInt(t.slice(1),16)>>>0}}const h=t.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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),a=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),o.toColor(i,s,r,a);if("transparent"===t)return{css:"transparent",rgba:0};if(!e||!n)throw new Error("css.toColor: Unsupported css format");if(e.fillStyle=n,e.fillStyle=t,"string"!=typeof e.fillStyle)throw new Error("css.toColor: Unsupported css format");if(e.fillRect(0,0,1,1),[i,s,r,a]=e.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i,s,r,a),css:t}}}(h||(e.css=h={})),function(t){function e(t,e,i){const s=t/255,r=e/255,a=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*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))}t.relativeLuminance=function(t){return e(t>>16&255,t>>8&255,255&t)},t.relativeLuminance2=e}(L||(e.rgb=L={})),function(t){function e(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,h=e>>8&255,T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));for(;T0||n>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),n-=Math.max(0,Math.ceil(.1*n)),h-=Math.max(0,Math.ceil(.1*h)),T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));return(o<<24|n<<16|h<<8|255)>>>0}function n(t,e,i){const s=t>>24&255,r=t>>16&255,a=t>>8&255;let o=e>>24&255,n=e>>16&255,h=e>>8&255,T=d(L.relativeLuminance2(o,n,h),L.relativeLuminance2(s,r,a));for(;T>>0}t.blend=function(t,e){if(a=(255&e)/255,1===a)return e;const n=e>>24&255,h=e>>16&255,L=e>>8&255,T=t>>24&255,l=t>>16&255,d=t>>8&255;return i=T+Math.round((n-T)*a),s=l+Math.round((h-l)*a),r=d+Math.round((L-d)*a),o.toRgba(i,s,r)},t.ensureContrastRatio=function(t,i,s){const r=L.relativeLuminance(t>>8),a=L.relativeLuminance(i>>8);if(d(r,a)>8));if(od(r,L.relativeLuminance(e>>8))?a:e}return a}const o=n(t,i,s),h=d(r,L.relativeLuminance(o>>8));if(hd(r,L.relativeLuminance(a>>8))?o:a}return o}},t.reduceLuminance=e,t.increaseLuminance=n,t.toChannels=function(t){return[t>>24&255,t>>16&255,t>>8&255,255&t]}}(T||(e.rgba=T={}))},414(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.EventUtils=e.Emitter=void 0;const s=i(426);var r;e.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(t,e,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:t,thisArgs:e};this._listeners=this._listeners.slice(),this._listeners.push(r);const a=(0,s.toDisposable)(()=>{const t=this._listeners.indexOf(r);-1!==t&&(this._listeners=this._listeners.slice(),this._listeners.splice(t,1))});return i&&(Array.isArray(i)?i.push(a):i.add(a)),a}),this._event}fire(t){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,t);const e=this._listeners;for(let i=0,s=e.length;ie.fire(t))},t.map=function(t,e){return(i,s,r)=>t(t=>i.call(s,e(t)),void 0,r)},t.any=function(...t){return(e,i,r)=>{const a=new s.DisposableStore;for(const s of t)a.add(s(t=>e.call(i,t)));return r&&(Array.isArray(r)?r.push(a):r.add(a)),a}},t.runAndSubscribe=function(t,e,i){return e(i),t(t=>e(t))}}(r||(e.EventUtils=r={}))},426(t,e){function i(t){return{dispose:t}}function s(t){if(!t)return t;if(Array.isArray(t)){for(const e of t)e.dispose();return[]}return t.dispose(),t}Object.defineProperty(e,"__esModule",{value:!0}),e.MutableDisposable=e.Disposable=e.DisposableStore=void 0,e.toDisposable=i,e.dispose=s,e.combinedDisposable=function(...t){return i(()=>s(t))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(t){return this._isDisposed?t.dispose():this._disposables.add(t),t}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const t of this._disposables)t.dispose();this._disposables.clear()}}clear(){for(const t of this._disposables)t.dispose();this._disposables.clear()}}e.DisposableStore=r;class a{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(t){return this._store.add(t)}}e.Disposable=a,a.None=Object.freeze({dispose(){}}),e.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(t){this._isDisposed||t===this._value||(this._value?.dispose(),this._value=t)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}}},836(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.FourKeyMap=e.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(t,e,i){this._data[t]||(this._data[t]={}),this._data[t][e]=i}get(t,e){return this._data[t]?this._data[t][e]:void 0}clear(){this._data={}}}e.TwoKeyMap=i,e.FourKeyMap=class{constructor(){this._data=new i}set(t,e,s,r,a){this._data.get(t,e)||this._data.set(t,e,new i),this._data.get(t,e).set(s,r,a)}get(t,e,i,s){return this._data.get(t,e)?.get(i,s)}clear(){this._data.clear()}}},95(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.isChromeOS=e.isLinux=e.isWindows=e.isMac=e.isSafari=e.isLegacyEdge=e.isChrome=e.isFirefox=e.isNode=void 0,e.getZoomFactor=function(t){return 1},e.getSafariVersion=function(){if(!e.isSafari)return 0;const t=i.match(/Version\/(\d+)/);return null===t||t.length<2?0:parseInt(t[1],10)},e.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=e.isNode?"node":navigator.userAgent,s=e.isNode?"node":navigator.platform;e.isFirefox=i.includes("Firefox"),e.isChrome=i.includes("Chrome"),e.isLegacyEdge=i.includes("Edge"),e.isSafari=/^((?!chrome|android).)*safari/i.test(i),e.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),e.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),e.isLinux=s.indexOf("Linux")>=0,e.isChromeOS=/\bCrOS\b/.test(i)},930(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DebouncedIdleTask=e.IdleTaskQueue=e.PriorityTaskQueue=void 0;class i{constructor(t){this._tasks=[],this._i=0,this._logService=t}enqueue(t){this._tasks.push(t),this._start()}flush(){for(;this._ii)return r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(t){return setTimeout(()=>t(this._createDeadline(16)))}_cancelCallback(t){clearTimeout(t)}_createDeadline(t){const e=performance.now()+t;return{timeRemaining:()=>Math.max(0,e-performance.now())}}}e.PriorityTaskQueue=s,e.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(t){return requestIdleCallback(t)}_cancelCallback(t){cancelIdleCallback(t)}}:s,e.DebouncedIdleTask=class{constructor(t){this._queue=new e.IdleTaskQueue(t)}set(t){this._queue.clear(),this._queue.enqueue(t)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},917(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ExtendedAttrs=e.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(t){return[t>>>16&255,t>>>8&255,255&t]}static fromColorRGB(t){return(255&t[0])<<16|(255&t[1])<<8|255&t[2]}clone(){const t=new i;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}e.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(t){this._ext&=-67108864,this._ext|=67108863&t}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){const t=(3758096384&this._ext)>>29;return t<0?4294967288^t:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}constructor(t=0,e=0){this._ext=0,this._urlId=0,this._ext=t,this._urlId=e}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}e.ExtendedAttrs=s},721(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellData=void 0;const s=i(348),r=i(564),a=i(917);class o extends a.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new a.ExtendedAttrs,this.combinedData=""}static fromCharData(t){const e=new o;return e.setFromCharData(t),e}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(t){this.fg=t[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let e=!1;if(t[r.CHAR_DATA_CHAR_INDEX].length>2)e=!0;else if(2===t[r.CHAR_DATA_CHAR_INDEX].length){const i=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|t[r.CHAR_DATA_WIDTH_INDEX]<<22:e=!0}else e=!0}else this.content=t[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[r.CHAR_DATA_WIDTH_INDEX]<<22;e&&(this.combinedData=t[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|t[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor())return!1;if(this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor())return!1;if(this.isInverse()!==t.isInverse())return!1;if(this.isBold()!==t.isBold())return!1;if(this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;const e=this.isUnderlineColorDefault(),i=t.isUnderlineColorDefault();if(!e||!i){if(e!==i)return!1;if(this.getUnderlineColor()!==t.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==t.getUnderlineColorMode())return!1}}return this.isOverline()===t.isOverline()&&this.isBlink()===t.isBlink()&&this.isInvisible()===t.isInvisible()&&this.isItalic()===t.isItalic()&&this.isDim()===t.isDim()&&this.isStrikethrough()===t.isStrikethrough()}}e.CellData=o},564(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WHITESPACE_CELL_CODE=e.WHITESPACE_CELL_WIDTH=e.WHITESPACE_CELL_CHAR=e.NULL_CELL_CODE=e.NULL_CELL_WIDTH=e.NULL_CELL_CHAR=e.CHAR_DATA_CODE_INDEX=e.CHAR_DATA_WIDTH_INDEX=e.CHAR_DATA_CHAR_INDEX=e.CHAR_DATA_ATTR_INDEX=e.DEFAULT_EXT=e.DEFAULT_ATTR=e.DEFAULT_COLOR=void 0,e.DEFAULT_COLOR=0,e.DEFAULT_ATTR=e.DEFAULT_COLOR<<9|256,e.DEFAULT_EXT=0,e.CHAR_DATA_ATTR_INDEX=0,e.CHAR_DATA_CHAR_INDEX=1,e.CHAR_DATA_WIDTH_INDEX=2,e.CHAR_DATA_CODE_INDEX=3,e.NULL_CELL_CHAR="",e.NULL_CELL_WIDTH=1,e.NULL_CELL_CODE=0,e.WHITESPACE_CELL_CHAR=" ",e.WHITESPACE_CELL_WIDTH=1,e.WHITESPACE_CELL_CODE=32},348(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Utf8ToUtf32=e.StringToUtf32=void 0,e.stringFromCodePoint=function(t){return t>65535?(t-=65536,String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):String.fromCharCode(t)},e.utf32ToString=function(t,e=0,i=t.length){let s="";for(let r=e;r65535?(e-=65536,s+=String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):s+=String.fromCharCode(e)}return s},e.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t,e){const i=t.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=t.charCodeAt(r++);56320<=i&&i<=57343?e[s++]=1024*(this._interim-55296)+i-56320+65536:(e[s++]=this._interim,e[s++]=i),this._interim=0}for(let a=r;a=i)return this._interim=r,s;const o=t.charCodeAt(a);56320<=o&&o<=57343?e[s++]=1024*(r-55296)+o-56320+65536:(e[s++]=r,e[s++]=o);continue}65279!==r&&(e[s++]=r)}return s}},e.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t,e){const i=t.length;if(!i)return 0;let s,r,a,o,n,h=0,L=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let a,o=0;for(;(a=this.interim[++o])&&o<4;)r<<=6,r|=63&a;const n=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,T=n-o;for(;L=i)return 0;if(a=t[L++],128!=(192&a)){L--,s=!0;break}this.interim[o++]=a,r<<=6,r|=63&a}s||(2===n?r<128?L--:e[h++]=r:3===n?r<2048||r>=55296&&r<=57343||65279===r||(e[h++]=r):r<65536||r>1114111||(e[h++]=r)),this.interim.fill(0)}const T=i-4;let l=L;for(;l=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(n=(31&s)<<6|63&r,n<128){l--;continue}e[h++]=n}else if(224==(240&s)){if(l>=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,h;if(a=t[l++],128!=(192&a)){l--;continue}if(n=(15&s)<<12|(63&r)<<6|63&a,n<2048||n>=55296&&n<=57343||65279===n)continue;e[h++]=n}else if(240==(248&s)){if(l>=i)return this.interim[0]=s,h;if(r=t[l++],128!=(192&r)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,h;if(a=t[l++],128!=(192&a)){l--;continue}if(l>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=a,h;if(o=t[l++],128!=(192&o)){l--;continue}if(n=(7&s)<<18|(63&r)<<12|(63&a)<<6|63&o,n<65536||n>1114111)continue;e[h++]=n}}return h}}},864(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.CellColorResolver=void 0;const s=i(564),r=i(993),a=i(959),o=i(915);let n,h=0,L=0,T=!1,l=!1,d=!1,c=0;e.CellColorResolver=class{constructor(t,e,i,s,r,a){this._terminal=t,this._optionService=e,this._selectionRenderModel=i,this._decorationService=s,this._coreBrowserService=r,this._themeService=a,this.result={fg:0,bg:0,ext:0}}resolve(t,e,i,_,Q){this.result.bg=t.bg,this.result.fg=t.fg,this.result.ext=268435456&t.bg?t.extended.ext:0,L=0,h=0,l=!1,T=!1,d=!1,n=this._themeService.colors,c=0;const u=t.getCode();if(u!==s.NULL_CELL_CODE&&4===t.extended.underlineStyle){const t=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));c=e*_%(2*Math.round(t))}if(0===c&&o.blockPatternCodepoints.has(u)&&(c=e*_%2*2+i*Q%2),this._decorationService.forEachDecorationAtCell(e,i,"bottom",t=>{t.backgroundColorRGB&&(L=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(h=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),d=this._selectionRenderModel.isCellSelected(this._terminal,e,i),d){if(67108864&this.result.fg||50331648&this.result.bg){if(67108864&this.result.fg)switch(50331648&this.result.fg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:L=(16777215&this.result.fg)<<8|255;break;default:L=this._themeService.colors.foreground.rgba}else switch(50331648&this.result.bg){case 16777216:case 33554432:L=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:L=(16777215&this.result.bg)<<8|255}L=r.rgba.blend(L,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}else L=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(l=!0,n.selectionForeground&&(h=n.selectionForeground.rgba>>8&16777215,T=!0),(0,a.treatGlyphAsBackgroundColor)(t.getCode())){if(67108864&this.result.fg&&!(50331648&this.result.bg))h=(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(67108864&this.result.fg)switch(50331648&this.result.bg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.bg].rgba;break;case 50331648:h=(16777215&this.result.bg)<<8|255}else switch(50331648&this.result.fg){case 16777216:case 33554432:h=this._themeService.colors.ansi[255&this.result.fg].rgba;break;case 50331648:h=(16777215&this.result.fg)<<8|255;break;default:h=this._themeService.colors.foreground.rgba}h=r.rgba.blend(h,4294967040&(this._coreBrowserService.isFocused?n.selectionBackgroundOpaque:n.selectionInactiveBackgroundOpaque).rgba|128)>>8&16777215}T=!0}}this._decorationService.forEachDecorationAtCell(e,i,"top",t=>{t.backgroundColorRGB&&(L=t.backgroundColorRGB.rgba>>8&16777215,l=!0),t.foregroundColorRGB&&(h=t.foregroundColorRGB.rgba>>8&16777215,T=!0)}),l&&(L=d?-16777216&t.bg&-134217729|L|50331648:-16777216&t.bg|L|50331648),T&&(h=-16777216&t.fg&-67108865|h|50331648),67108864&this.result.fg&&(l&&!T&&(h=50331648&this.result.bg?-134217728&this.result.fg|67108863&this.result.bg:-134217728&this.result.fg|16777215&n.background.rgba>>8|50331648,T=!0),!l&&T&&(L=50331648&this.result.fg?-67108864&this.result.bg|67108863&this.result.fg:-67108864&this.result.bg|16777215&n.foreground.rgba>>8|50331648,l=!0)),n=void 0,this.result.bg=l?L:this.result.bg,this.result.fg=T?h:this.result.fg,this.result.ext&=536870911,this.result.ext|=c<<29&3758096384}}},670(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.acquireTextureAtlas=function(t,e,i,o,n,h,L,T,l,d=!0){const c=(0,r.generateConfig)(o,n,h,L,e,i,T,l,d);for(let e=0;e=0){if((0,r.configEquals)(i.config,c))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),a.splice(e,1)):i.ownedBy.splice(s,1);break}}for(let e=0;e{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(t=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0)return void this._restartInterval(t)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){const t=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(t)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},t)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}}},697(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.observeDevicePixelDimensions=function(t,e,i){let r=new e.ResizeObserver(e=>{const s=e.find(e=>e.target===t);if(!s)return;if(!("devicePixelContentBoxSize"in s))return r?.disconnect(),void(r=void 0);const a=s.devicePixelContentBoxSize[0].inlineSize,o=s.devicePixelContentBoxSize[0].blockSize;a>0&&o>0&&i(a,o)});try{r.observe(t,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return(0,s.toDisposable)(()=>r?.disconnect())};const s=i(426)},28(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphRenderer=void 0;const s=i(115),r=i(564),a=i(426),o=i(719),n=i(959);let h,L=0,T=0,l=0;class d extends a.Disposable{constructor(t,e,i,r,h){super(),this._terminal=t,this._gl=e,this._dimensions=i,this._optionsService=r,this._logService=h,this._lastSeenPageLayoutVersion=-1,this._pageOverflowWarned=!1,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const L=this._gl;void 0===s.TextureAtlas.maxAtlasPages&&(s.TextureAtlas.maxAtlasPages=Math.min(32,(0,n.throwIfFalsy)(L.getParameter(L.MAX_TEXTURE_IMAGE_UNITS))),s.TextureAtlas.maxTextureSize=(0,n.throwIfFalsy)(L.getParameter(L.MAX_TEXTURE_SIZE))),this._program=(0,n.throwIfFalsy)((0,o.createProgram)(L,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(t){let e="";for(let i=1;iL.deleteProgram(this._program))),this._projectionLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,n.throwIfFalsy)(L.getUniformLocation(this._program,"u_texture"));const T=this._vertexArrayObject=L.createVertexArray();this._register((0,a.toDisposable)(()=>L.deleteVertexArray(T))),L.bindVertexArray(T);const l=new Float32Array([0,0,1,0,0,1,1,1]),d=L.createBuffer();this._register((0,a.toDisposable)(()=>L.deleteBuffer(d))),L.bindBuffer(L.ARRAY_BUFFER,d),L.bufferData(L.ARRAY_BUFFER,l,L.STATIC_DRAW),L.enableVertexAttribArray(0),L.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=L.createBuffer();this._register((0,a.toDisposable)(()=>L.deleteBuffer(_))),L.bindBuffer(L.ELEMENT_ARRAY_BUFFER,_),L.bufferData(L.ELEMENT_ARRAY_BUFFER,c,L.STATIC_DRAW),this._attributesBuffer=(0,n.throwIfFalsy)(L.createBuffer()),this._register((0,a.toDisposable)(()=>L.deleteBuffer(this._attributesBuffer))),L.bindBuffer(L.ARRAY_BUFFER,this._attributesBuffer),L.enableVertexAttribArray(2),L.vertexAttribPointer(2,2,L.FLOAT,!1,44,0),L.vertexAttribDivisor(2,1),L.enableVertexAttribArray(3),L.vertexAttribPointer(3,2,L.FLOAT,!1,44,2*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(3,1),L.enableVertexAttribArray(4),L.vertexAttribPointer(4,1,L.FLOAT,!1,44,4*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(4,1),L.enableVertexAttribArray(5),L.vertexAttribPointer(5,2,L.FLOAT,!1,44,5*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(5,1),L.enableVertexAttribArray(6),L.vertexAttribPointer(6,2,L.FLOAT,!1,44,7*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(6,1),L.enableVertexAttribArray(1),L.vertexAttribPointer(1,2,L.FLOAT,!1,44,9*Float32Array.BYTES_PER_ELEMENT),L.vertexAttribDivisor(1,1),L.useProgram(this._program);const Q=new Int32Array(s.TextureAtlas.maxAtlasPages);for(let t=0;tL.deleteTexture(e.texture))),L.activeTexture(L.TEXTURE0+t),L.bindTexture(L.TEXTURE_2D,e.texture),L.texParameteri(L.TEXTURE_2D,L.TEXTURE_WRAP_S,L.CLAMP_TO_EDGE),L.texParameteri(L.TEXTURE_2D,L.TEXTURE_WRAP_T,L.CLAMP_TO_EDGE),L.texImage2D(L.TEXTURE_2D,0,L.RGBA,1,1,0,L.RGBA,L.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[t]=e}L.enable(L.BLEND),L.blendFunc(L.SRC_ALPHA,L.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.pageLayoutVersion!==this._lastSeenPageLayoutVersion&&(this._lastSeenPageLayoutVersion=this._atlas.pageLayoutVersion,!0)}updateCell(t,e,i,s,r,a,o,n,h){this._updateCell(this._vertices.attributes,t,e,i,s,r,a,o,n,h)}_updateCell(t,e,i,s,a,o,d,c,_,Q){L=11*(i*this._terminal.cols+e),s!==r.NULL_CELL_CODE&&void 0!==s?this._atlas&&(h=c&&c.length>1?this._atlas.getRasterizedGlyphCombinedChar(c,a,o,d,!1,this._terminal.element):this._atlas.getRasterizedGlyph(s,a,o,d,!1,this._terminal.element),T=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),a!==Q&&h.offset.x>T?(l=h.offset.x-T,t[L]=-(h.offset.x-l)+this._dimensions.device.char.left,t[L+1]=-h.offset.y+this._dimensions.device.char.top,t[L+2]=(h.size.x-l)/this._dimensions.device.canvas.width,t[L+3]=h.size.y/this._dimensions.device.canvas.height,t[L+4]=h.texturePage,t[L+5]=h.texturePositionClipSpace.x+l/this._atlas.pages[h.texturePage].canvas.width,t[L+6]=h.texturePositionClipSpace.y,t[L+7]=h.sizeClipSpace.x-l/this._atlas.pages[h.texturePage].canvas.width,t[L+8]=h.sizeClipSpace.y):(t[L]=-h.offset.x+this._dimensions.device.char.left,t[L+1]=-h.offset.y+this._dimensions.device.char.top,t[L+2]=h.size.x/this._dimensions.device.canvas.width,t[L+3]=h.size.y/this._dimensions.device.canvas.height,t[L+4]=h.texturePage,t[L+5]=h.texturePositionClipSpace.x,t[L+6]=h.texturePositionClipSpace.y,t[L+7]=h.sizeClipSpace.x,t[L+8]=h.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&(0,n.allowRescaling)(s,_,h.size.x,this._dimensions.device.cell.width)&&(t[L+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width)):t.fill(0,L,L+11-1-2)}clear(){const t=this._terminal,e=t.cols*t.rows*11;this._vertices.count!==e?this._vertices.attributes=new Float32Array(e):this._vertices.attributes.fill(0);let i=0;for(;ithis._atlasTextures.length&&!this._pageOverflowWarned&&(this._pageOverflowWarned=!0,this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`));for(let t=0;tT.deleteProgram(this._program))),this._projectionLocation=(0,a.throwIfFalsy)(T.getUniformLocation(this._program,"u_projection"));const l=this._vertexArrayObject=T.createVertexArray();this._register((0,s.toDisposable)(()=>T.deleteVertexArray(l))),T.bindVertexArray(l);const d=new Float32Array([0,0,1,0,0,1,1,1]),c=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(c))),T.bindBuffer(T.ARRAY_BUFFER,c),T.bufferData(T.ARRAY_BUFFER,d,T.STATIC_DRAW),T.enableVertexAttribArray(3),T.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),Q=T.createBuffer();this._register((0,s.toDisposable)(()=>T.deleteBuffer(Q))),T.bindBuffer(T.ELEMENT_ARRAY_BUFFER,Q),T.bufferData(T.ELEMENT_ARRAY_BUFFER,_,T.STATIC_DRAW),this._attributesBuffer=(0,a.throwIfFalsy)(T.createBuffer()),this._register((0,s.toDisposable)(()=>T.deleteBuffer(this._attributesBuffer))),T.bindBuffer(T.ARRAY_BUFFER,this._attributesBuffer),T.enableVertexAttribArray(0),T.vertexAttribPointer(0,2,T.FLOAT,!1,o,0),T.vertexAttribDivisor(0,1),T.enableVertexAttribArray(1),T.vertexAttribPointer(1,2,T.FLOAT,!1,o,2*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(1,1),T.enableVertexAttribArray(2),T.vertexAttribPointer(2,4,T.FLOAT,!1,o,4*Float32Array.BYTES_PER_ELEMENT),T.vertexAttribDivisor(2,1),this._updateCachedColors(h.colors),this._register(this._themeService.onChangeColors(t=>{this._updateCachedColors(t),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){const e=this._gl;e.useProgram(this._program),e.bindVertexArray(this._vertexArrayObject),e.uniformMatrix4fv(this._projectionLocation,!1,r.PROJECTION_MATRIX),e.bindBuffer(e.ARRAY_BUFFER,this._attributesBuffer),e.bufferData(e.ARRAY_BUFFER,t.attributes,e.DYNAMIC_DRAW),e.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,e.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){const e=this._terminal,i=this._vertices;let s,r,a,o,n,h,L,T,l,d,c,_=1;for(s=0;s>24&255)/255,d=(h>>16&255)/255,c=(h>>8&255)/255,_=1,this._addRectangle(t.attributes,e,L,T,(o-a)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,l,d,c,_)}_addRectangle(t,e,i,s,r,a,o,n,h,L){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o,t[e+5]=n,t[e+6]=h,t[e+7]=L}_addRectangleFloat(t,e,i,s,r,a,o){t[e]=i/this._dimensions.device.canvas.width,t[e+1]=s/this._dimensions.device.canvas.height,t[e+2]=r/this._dimensions.device.canvas.width,t[e+3]=a/this._dimensions.device.canvas.height,t[e+4]=o[0],t[e+5]=o[1],t[e+6]=o[2],t[e+7]=o[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(255&t.rgba)/255])}}e.RectangleRenderer=Q},208(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.RenderModel=e.COMBINED_CHAR_BIT_MASK=void 0;const s=i(948);e.COMBINED_CHAR_BIT_MASK=2147483648,e.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(t,e){const i=t*e*4;i!==this.cells.length&&(this.cells=new Uint32Array(i),this.lineLengths=new Uint32Array(e))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},115(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.TextureAtlas=void 0;const s=i(0),r=i(183),a=i(959),o=i(993),n=i(836),h=i(930),L=i(917),T=i(564),l=i(414),d={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let c;class _{get pages(){return this._pages}constructor(t,e,i,s){this._document=t,this._config=e,this._unicodeService=i,this._logService=s,this._didWarmUp=!1,this._cacheMap=new n.FourKeyMap,this._cacheMapCombined=new n.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new L.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new l.Emitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new l.Emitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._pageLayoutVersion=0,this.fontProbeMismatchCount=0,this._createNewPage(),this._tmpCanvas=p(t,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,a.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){this._tmpCanvas.remove();for(const t of this.pages)t.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const t=new h.IdleTaskQueue(this._logService);for(let e=33;e<126;e++)t.enqueue(()=>{if(!this._cacheMap.get(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT)){const t=this._drawToCache(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,!1,void 0);this._cacheMap.set(e,T.DEFAULT_COLOR,T.DEFAULT_COLOR,T.DEFAULT_EXT,t)}})}get pageLayoutVersion(){return this._pageLayoutVersion}clearTexture(){this._pages.every(t=>0===t.glyphs.length&&0===t.currentRow.x&&0===t.currentRow.y)||(this._evictAllPages(),this._createNewPage())}_createNewPage(){if(_.maxAtlasPages&&this._pages.length>=Math.max(4,_.maxAtlasPages)){const t=this._pages.filter(t=>2*t.canvas.width<=(_.maxTextureSize||4096)).sort((t,e)=>e.canvas.width!==t.canvas.width?e.canvas.width-t.canvas.width:e.percentageUsed-t.percentageUsed);let e=-1,i=0;for(let s=0;st.canvas.width!==s[0].canvas.width)){this._evictAllPages();const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}const r=s.map(t=>t.glyphs[0].texturePage).sort((t,e)=>t-e),a=this.pages.length-s.length,o=this._mergePages(s,a);o.version=++Q.nextVersion;for(let t=r.length-1;t>=0;t--)this._deletePage(r[t]);this.pages.push(o),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(o.canvas)}const t=new Q(this._document,this._textureSize);return this._pages.push(t),this._activePages.push(t),this._onAddTextureAtlasCanvas.fire(t.canvas),t}_mergePages(t,e){const i=2*t[0].canvas.width,s=new Q(this._document,i,t);for(const[r,a]of t.entries()){const t=r*a.canvas.width%i,o=Math.floor(r/2)*a.canvas.height;s.ctx.drawImage(a.canvas,t,o);for(const s of a.glyphs)s.texturePage=e,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=t,s.texturePosition.y+=o,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(a.canvas);const n=this._activePages.indexOf(a);-1!==n&&this._activePages.splice(n,1)}return s}_deletePage(t){this._pages.splice(t,1);for(let e=t;e=this._config.colors.ansi.length)throw new Error("No color found for idx "+t);return this._config.colors.ansi[t]}_getBackgroundColor(t,e,i,s){if(this._config.allowTransparency)return o.NULL_COLOR;let r;switch(t){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(e);break;case 50331648:const t=L.AttributeData.toColorRGB(e);r=o.channels.toColor(t[0],t[1],t[2]);break;default:r=i?o.color.opaque(this._config.colors.foreground):this._config.colors.background}return this._config.allowTransparency||(r=o.color.opaque(r)),r}_getForegroundColor(t,e,i,r,a,n,h,T,l,d){const c=this._getMinimumContrastColor(t,e,i,r,a,n,h,l,T,d);if(c)return c;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&l&&n<8&&(n+=8),_=this._getColorFromAnsiIndex(n);break;case 50331648:const t=L.AttributeData.toColorRGB(n);_=o.channels.toColor(t[0],t[1],t[2]);break;default:_=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(_=o.color.opaque(_)),T&&(_=o.color.multiplyOpacity(_,s.DIM_OPACITY)),_}_resolveBackgroundRgba(t,e,i){switch(t){case 16777216:case 33554432:return this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(t,e,i,s){switch(t){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&e<8&&(e+=8),this._getColorFromAnsiIndex(e).rgba;case 50331648:return e<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(t,e,i,s,r,a,n,h,L,T){if(1===this._config.minimumContrastRatio||T)return;const l=this._getContrastCache(L),d=l.getColor(t,s);if(void 0!==d)return d??void 0;const c=this._resolveBackgroundRgba(e,i,n),_=this._resolveForegroundRgba(r,a,n,h),Q=o.rgba.ensureContrastRatio(c,_,this._config.minimumContrastRatio/(L?2:1));if(!Q)return void l.setColor(t,s,null);const u=o.channels.toColor(Q>>24&255,Q>>16&255,Q>>8&255);return l.setColor(t,s,u),u}_getContrastCache(t){return t?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_probeRasterizationFontWeight(t){const e=String(t);if(!/^(?:[1-8]\d{2}|900)$/.test(e))return;const i=this._tmpCtx.font.match(/(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/)?.[1]??"400";if(("normal"===i?"400":"bold"===i?"700":i)!==e){this.fontProbeMismatchCount++,this.fontProbeLastMismatch={desired:e,actual:this._tmpCtx.font};try{globalThis.__orcaAtlasFontProbe?.(this.fontProbeLastMismatch)}catch{}}}_drawToCache(t,e,i,o,n,h){const T="number"==typeof t?String.fromCharCode(t):t;h&&this._tmpCanvas.parentElement!==h&&(this._tmpCanvas.style.display="none",h.append(this._tmpCanvas));const l=Math.min(this._config.deviceCellWidth*Math.max(T.length,2)+4,this._config.deviceMaxTextureSize);this._tmpCanvas.width=t?2*t-o:t-o;!1==!(o>=t)||0===_?(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(L+_,s),this._tmpCtx.lineTo(T,s)):(this._tmpCtx.setLineDash([Math.round(t),Math.round(t)]),this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(L+_,s),this._tmpCtx.moveTo(L+_+t,s),this._tmpCtx.lineTo(T,s)),o=(0,a.computeNextVariantOffset)(T-L,t,o);break;case 5:const Q=.6,u=.3,p=T-L,g=Math.floor(Q*p),M=Math.floor(u*p),y=p-g-M;this._tmpCtx.setLineDash([g,M,y]),this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(T,s);break;default:this._tmpCtx.moveTo(L,s),this._tmpCtx.lineTo(T,s)}n||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!O&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==T){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const e=this._tmpCtx.measureText(T);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in e&&e.actualBoundingBoxDescent>0){this._tmpCtx.save();const e=new Path2D;e.rect(i,h-Math.ceil(t/2),this._config.deviceCellWidth*I,l-h+Math.ceil(t/2)),this._tmpCtx.clip(e),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=E.css,this._tmpCtx.strokeText(T,S,S+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(C){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),e=t%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+e),this._tmpCtx.stroke()}if(O||this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight),"_"===T&&!this._config.allowTransparency){let t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W);if(t)for(let e=1;e<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=E.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(T,S,S+this._config.deviceCharHeight-e),t=u(this._tmpCtx.getImageData(S,S,this._config.deviceCellWidth,this._config.deviceCellHeight),E,D,W),t);e++);}if(f){const t=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),e=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=t,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(S,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.lineTo(S+this._config.deviceCharWidth*I,S+Math.floor(this._config.deviceCharHeight/2)-e),this._tmpCtx.stroke()}this._tmpCtx.restore();const P=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let N;if(N=this._config.allowTransparency?function(t){for(let e=0;e0)return!1;return!0}(P):u(P,E,D,W),N)return d;const B=this._findGlyphBoundingBox(P,this._workBoundingBox,l,Z,O,S);let $,F;for(;;){if(0===this._activePages.length){const t=this._createNewPage();$=t,F=t.currentRow,F.height=B.size.y;break}$=this._activePages[this._activePages.length-1],F=$.currentRow;for(const t of this._activePages)B.size.y<=t.currentRow.height&&($=t,F=t.currentRow);for(let t=this._activePages.length-1;t>=0;t--)for(const e of this._activePages[t].fixedRows)e.height<=F.height&&B.size.y<=e.height&&($=this._activePages[t],F=e);if(B.size.x>this._textureSize){this._overflowSizePage||(_.maxAtlasPages&&this._pages.length>=_.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new Q(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),$=this._overflowSizePage,F=this._overflowSizePage.currentRow,F.x+B.size.x>=$.canvas.width&&(F.x=0,F.y+=F.height,F.height=0);break}if(F.y+B.size.y>=$.canvas.height||F.height>B.size.y+2){let t=!1;if($.currentRow.y+$.currentRow.height+B.size.y>=$.canvas.height){let e;for(const t of this._activePages)if(t.currentRow.y+t.currentRow.height+B.size.y=_.maxAtlasPages&&F.y+B.size.y<=$.canvas.height&&F.height>=B.size.y&&F.x+B.size.x<=$.canvas.width)t=!0;else{const e=this._createNewPage();$=e,F=e.currentRow,F.height=B.size.y,t=!0}}t||($.currentRow.height>0&&$.fixedRows.push($.currentRow),F={x:0,y:$.currentRow.y+$.currentRow.height,height:B.size.y},$.fixedRows.push(F),$.currentRow={x:0,y:F.y+F.height,height:0})}if(F.x+B.size.x<=$.canvas.width)break;F===$.currentRow?(F.x=0,F.y+=F.height,F.height=0):$.fixedRows.splice($.fixedRows.indexOf(F),1)}return B.texturePage=this._pages.indexOf($),B.texturePosition.x=F.x,B.texturePosition.y=F.y,B.texturePositionClipSpace.x=F.x/$.canvas.width,B.texturePositionClipSpace.y=F.y/$.canvas.height,B.sizeClipSpace.x/=$.canvas.width,B.sizeClipSpace.y/=$.canvas.height,F.height=Math.max(F.height,B.size.y),F.x+=B.size.x,$.ctx.putImageData(P,B.texturePosition.x-this._workBoundingBox.left,B.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,B.size.x,B.size.y),$.addGlyph(B),$.version=++Q.nextVersion,B}_findGlyphBoundingBox(t,e,i,s,r,a){e.top=0;const o=s?this._config.deviceCellHeight:this._tmpCanvas.height,n=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i=a;i--){for(let s=0;s=0;i--){for(let s=0;s>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=i.rgba>>>24,h=i.rgba>>>16&255,L=i.rgba>>>8&255,T=Math.floor((Math.abs(r-n)+Math.abs(a-h)+Math.abs(o-L))/12);let l=!0;for(let e=0;ethis._handleColorChange())),this._cellColorResolver=new s.CellColorResolver(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new _.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,d,this._themeService)],this.dimensions=(0,g.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(d.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new T.TextBlinkStateManager(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextlost",t=>{this._logService.debug("webglcontextlost event received"),t.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(t)},3e3)})),this._register((0,u.addDisposableListener)(this._canvas,"webglcontextrestored",t=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,r.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,(t,e)=>this._setCanvasDevicePixelDimensions(t,e)),this._register(this._coreBrowserService.onWindowChange(t=>{this._observerDisposable.value=(0,o.observeDevicePixelDimensions)(this._canvas,t,(t,e)=>this._setCanvasDevicePixelDimensions(t,e))})),this._register((0,u.addDisposableListener)(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register((0,p.toDisposable)(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(const t of this._renderLayers)t.dispose();this._canvas.parentElement?.removeChild(this._canvas),(0,r.removeTerminalFromCache)(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,e){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(const t of this._renderLayers)t.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(const t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(const t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,e,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,t,e,i);this._model.selection.update(this._core,t,e,i),this._requestRedrawViewport()}handleCursorMove(){for(const t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new d.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new l.GlyphRenderer(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,r.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,p.combinedDisposable)(Q.EventUtils.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),Q.EventUtils.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(const t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,e){if(!this._isAttached){if(!(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,t,e);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,e);let i=!1,s=0;for(;this._charAtlas&&s++<32&&this._glyphRenderer.value.beginFrame();)i=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);i&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,e){const i=this._core;let s,r,a,o,n,h,T,l,d,_,Q,u,p,g,M,f,C,m=this._workCell;t=v(t,i.rows-1,0),e=v(e,i.rows-1,0);const w=this._coreService.decPrivateModes.cursorStyle??i.options.cursorStyle??"block",x=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,b=x-i.buffer.ydisp,E=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let R=-1;const k=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let A=!1;for(r=t;r<=e;r++){a=r+i.buffer.ydisp;const t=i.buffer.lines.get(a);if(!t){for(this._model.lineLengths[r]=0,f=0;f=T,d=f,n.length>0&&f===n[0][0]&&l){_=n.shift();const t=this._model.selection.isCellSelected(this._terminal,_[0],a);for(M=_[0]+1;M<_[1];M++)l&&=t===this._model.selection.isCellSelected(this._terminal,M,a);l&&=!Q||E<_[0]||E>=_[1],l?(h=!0,m=new y(m,o.translateToString(!0,_[0],_[1]),_[1]-_[0]),d=_[1]-1):T=_[1]}if(u=m.getChars(),p=m.getCode(),M=4*(r*i.cols+f),!e&&m.isBlink()&&(e=!0),this._cellColorResolver.resolve(m,f,a,this.dimensions.device.cell.width,this.dimensions.device.cell.height),k&&a===x&&(f===E&&(this._model.cursor={x:E,y:b,width:m.getWidth(),style:this._coreBrowserService.isFocused?w:i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},R=E+m.getWidth()-1),f>=E&&f<=R&&(this._coreBrowserService.isFocused&&"block"===w||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&m.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),p!==L.NULL_CELL_CODE&&(this._model.lineLengths[r]=f+1),(this._model.cells[M]!==p||this._model.cells[M+1]!==this._cellColorResolver.result.bg||this._model.cells[M+2]!==this._cellColorResolver.result.fg||this._model.cells[M+3]!==this._cellColorResolver.result.ext)&&(A=!0,u.length>1&&(p|=c.COMBINED_CHAR_BIT_MASK),this._model.cells[M]=p,this._model.cells[M+1]=this._cellColorResolver.result.bg,this._model.cells[M+2]=this._cellColorResolver.result.fg,this._model.cells[M+3]=this._cellColorResolver.result.ext,g=m.getWidth(),this._glyphRenderer.value.updateCell(f,r,p,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,u,g,s),h)){for(m=this._workCell,f++;f<=d;f++)C=4*(r*i.cols+f),this._nullModelCell(f,r,C,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);f--}}this._setRowBlinkState(r,e)}A&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,e,i,s,r,a){this._glyphRenderer.value.updateCell(t,e,L.NULL_CELL_CODE,s,r,a,L.NULL_CELL_CHAR,0,0),this._model.cells[i]=L.NULL_CELL_CODE,this._model.cells[i+1]=s,this._model.cells[i+2]=r,this._model.cells[i+3]=a}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,e){this._rowHasBlinkingCells[t]!==e&&(this._rowHasBlinkingCells[t]=e,this._rowHasBlinkingCellsCount+=e?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,e){this._canvas.width===t&&this._canvas.height===e||(this._canvas.width=t,this._canvas.height=e,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}}e.WebglRenderer=M;class y extends n.AttributeData{constructor(t,e,i){super(),this.content=0,this.combinedData="",this.fg=t.fg,this.bg=t.bg,this.combinedData=e,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function v(t,e,i=0){return Math.max(Math.min(t,e),i)}e.JoinedCellData=y},719(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.GLTexture=e.PROJECTION_MATRIX=void 0,e.createProgram=function(t,e,i,a){const o=(0,s.throwIfFalsy)(t.createProgram());if(t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.VERTEX_SHADER,e,a))),t.attachShader(o,(0,s.throwIfFalsy)(r(t,t.FRAGMENT_SHADER,i,a))),t.linkProgram(o),t.getProgramParameter(o,t.LINK_STATUS))return o;a.error(t.getProgramInfoLog(o)),t.deleteProgram(o)},e.createShader=r,e.expandFloat32Array=function(t,e){const i=Math.min(2*t.length,e),s=new Float32Array(i);for(let e=0;e{const e=[],i=[3/8,2/8,3/8],s=[0,3/8,5/8];for(let r=0;r<3;r++){const a=t>>2*r&1,o=t>>2*r+1&1;a&&o?e.push(`M0,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):a?e.push(`M0,${s[r]} L0.5,${s[r]} L0.5,${s[r]+i[r]} L0,${s[r]+i[r]} Z`):o&&e.push(`M0.5,${s[r]} L1,${s[r]} L1,${s[r]+i[r]} L0.5,${s[r]+i[r]} Z`)}return e.join(" ")}}}function r(t){const e=[],i=.15,s=.015,r=.075,a=.0375,o=.95;if(64&t){const t=.175,a=.2125,n=.25,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}if(32&t){const t=o-i,s=.875,r=o,n=.265,h=.485;e.push(`M${s},${n} L${r},${n+a} L${r},${h-a} L${s},${h} L${t},${h-a} L${t},${n+a} Z`)}if(16&t){const t=o-i,s=.875,r=o,n=.515,h=.735;e.push(`M${s},${n} L${r},${n+a} L${r},${h-a} L${s},${h} L${t},${h-a} L${t},${n+a} Z`)}if(8&t){const t=.75,a=.7875,n=.825,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}if(4&t){const t=.05,i=.125,s=.2,r=.515,o=.735;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(2&t){const t=.05,i=.125,s=.2,r=.265,o=.485;e.push(`M${i},${r} L${s},${r+a} L${s},${o-a} L${i},${o} L${t},${o-a} L${t},${r+a} Z`)}if(1&t){const t=.4625,a=.5,n=.5375,h=.2+s,L=o-i-s;e.push(`M${h},${a} L${h+r},${t} L${L-r},${t} L${L},${a} L${L-r},${n} L${h+r},${n} Z`)}return e.join(" ")}Object.defineProperty(e,"__esModule",{value:!0}),e.blockPatternCodepoints=e.customGlyphDefinitions=void 0,function(t){t.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),t.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),t.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),t.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),t.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),t.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),t.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.CURVE_UP_RIGHT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1}),t.CURVE_UP_LEFT=Object.freeze({type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1}),t.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),t.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),t.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),t.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),t.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),t.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})}(i||(i={})),e.customGlyphDefinitions={"─":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"━":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"│":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"┃":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"┄":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"┅":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"┆":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"┇":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"┈":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"┉":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"┊":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"┋":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"┌":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"┍":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┎":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┏":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"┐":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"┑":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┒":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┓":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"└":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"┕":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┖":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┗":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"┘":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"┙":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┚":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┛":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"├":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"┝":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┞":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┟":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┠":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┡":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┢":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┣":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"┤":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"┥":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┦":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┧":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┨":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"┩":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┪":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┫":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"┬":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"┭":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┮":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┯":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┰":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"┱":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"┲":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"┳":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"┴":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"┵":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┶":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┷":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"┸":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"┹":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"┺":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"┻":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"┼":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"┽":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"┾":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"┿":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"╀":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"╁":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╂":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"╃":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"╄":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"╅":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"╆":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"╇":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"╈":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"╉":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"╊":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"╋":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"╌":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"╍":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"╎":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"╏":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"═":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"║":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╒":{type:2,data:(t,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╓":{type:2,data:(t,e)=>`M${.5-t},1 L${.5-t},.5 L1,.5 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╔":{type:2,data:(t,e)=>`M1,${.5-e} L${.5-t},${.5-e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╕":{type:2,data:(t,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╖":{type:2,data:(t,e)=>`M${.5+t},1 L${.5+t},.5 L0,.5 M${.5-t},.5 L${.5-t},1`,strokeWidth:1},"╗":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5+t},${.5-e} L${.5+t},1`,strokeWidth:1},"╘":{type:2,data:(t,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"╙":{type:2,data:(t,e)=>`M1,.5 L${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╚":{type:2,data:(t,e)=>`M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0 M1,${.5+e} L${.5-t},${.5+e} L${.5-t},0`,strokeWidth:1},"╛":{type:2,data:(t,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"╜":{type:2,data:(t,e)=>`M0,.5 L${.5+t},.5 L${.5+t},0 M${.5-t},.5 L${.5-t},0`,strokeWidth:1},"╝":{type:2,data:(t,e)=>`M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M0,${.5+e} L${.5+t},${.5+e} L${.5+t},0`,strokeWidth:1},"╞":{type:2,data:(t,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"╟":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1 M${.5+t},.5 L1,.5`,strokeWidth:1},"╠":{type:2,data:(t,e)=>`M${.5-t},0 L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╡":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"╢":{type:2,data:(t,e)=>`M0,.5 L${.5-t},.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╣":{type:2,data:(t,e)=>`M${.5+t},0 L${.5+t},1 M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0`,strokeWidth:1},"╤":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"╥":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},1 M${.5+t},.5 L${.5+t},1`,strokeWidth:1},"╦":{type:2,data:(t,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1`,strokeWidth:1},"╧":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╨":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},.5 L${.5-t},0 M${.5+t},.5 L${.5+t},0`,strokeWidth:1},"╩":{type:2,data:(t,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╪":{type:2,data:(t,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"╫":{type:2,data:(t,e)=>`M0,.5 L1,.5 M${.5-t},0 L${.5-t},1 M${.5+t},0 L${.5+t},1`,strokeWidth:1},"╬":{type:2,data:(t,e)=>`M0,${.5+e} L${.5-t},${.5+e} L${.5-t},1 M1,${.5+e} L${.5+t},${.5+e} L${.5+t},1 M0,${.5-e} L${.5-t},${.5-e} L${.5-t},0 M1,${.5-e} L${.5+t},${.5-e} L${.5+t},0`,strokeWidth:1},"╭":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╮":{type:2,data:(t,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╯":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"╰":{type:2,data:(t,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"╱":{type:2,data:"M1,0 L0,1",strokeWidth:1},"╲":{type:2,data:"M0,0 L1,1",strokeWidth:1},"╳":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"╴":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"╵":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"╶":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"╷":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"╸":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"╹":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"╺":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"╻":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"╼":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"╽":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"╾":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"╿":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"▀":{type:0,data:[{x:0,y:0,w:8,h:4}]},"▁":{type:0,data:[{x:0,y:7,w:8,h:1}]},"▂":{type:0,data:[{x:0,y:6,w:8,h:2}]},"▃":{type:0,data:[{x:0,y:5,w:8,h:3}]},"▄":{type:0,data:[{x:0,y:4,w:8,h:4}]},"▅":{type:0,data:[{x:0,y:3,w:8,h:5}]},"▆":{type:0,data:[{x:0,y:2,w:8,h:6}]},"▇":{type:0,data:[{x:0,y:1,w:8,h:7}]},"█":{type:0,data:[{x:0,y:0,w:8,h:8}]},"▉":{type:0,data:[{x:0,y:0,w:7,h:8}]},"▊":{type:0,data:[{x:0,y:0,w:6,h:8}]},"▋":{type:0,data:[{x:0,y:0,w:5,h:8}]},"▌":{type:0,data:[{x:0,y:0,w:4,h:8}]},"▍":{type:0,data:[{x:0,y:0,w:3,h:8}]},"▎":{type:0,data:[{x:0,y:0,w:2,h:8}]},"▏":{type:0,data:[{x:0,y:0,w:1,h:8}]},"▐":{type:0,data:[{x:4,y:0,w:4,h:8}]},"░":{type:1,data:[[1,0],[0,0]]},"▒":{type:1,data:[[1,0],[0,1]]},"▓":{type:1,data:[[1,1],[1,0]]},"▔":{type:0,data:[{x:0,y:0,w:8,h:1}]},"▕":{type:0,data:[{x:7,y:0,w:1,h:8}]},"▖":{type:0,data:[{x:0,y:4,w:4,h:4}]},"▗":{type:0,data:[{x:4,y:4,w:4,h:4}]},"▘":{type:0,data:[{x:0,y:0,w:4,h:4}]},"▙":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"▚":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"▛":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"▜":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"▝":{type:0,data:[{x:4,y:0,w:4,h:4}]},"▞":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"▟":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"":i.LINE_H,"":i.LINE_V,"":i.FADE_RIGHT,"":i.FADE_LEFT,"":i.FADE_DOWN,"":i.FADE_UP,"":i.CURVE_DOWN_RIGHT,"":i.CURVE_DOWN_LEFT,"":i.CURVE_UP_RIGHT,"":i.CURVE_UP_LEFT,"":[i.LINE_V,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT],"":[i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT],"":[i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_UP_RIGHT],"":[i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_UP_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_DOWN_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_RIGHT],"":[i.LINE_V,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_V,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.LINE_H,i.CURVE_DOWN_RIGHT,i.CURVE_UP_LEFT],"":[i.LINE_H,i.CURVE_DOWN_LEFT,i.CURVE_UP_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE],"":i.NODE_STROKE,"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_STROKE,i.NODE_LINE_DOWN],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_UP],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_FILL,i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"":[i.NODE_STROKE,i.NODE_LINE_UP,i.NODE_LINE_DOWN,i.NODE_LINE_LEFT,i.NODE_LINE_RIGHT],"🬀":s(1),"🬁":s(2),"🬂":s(3),"🬃":s(4),"🬄":s(5),"🬅":s(6),"🬆":s(7),"🬇":s(8),"🬈":s(9),"🬉":s(10),"🬊":s(11),"🬋":s(12),"🬌":s(13),"🬍":s(14),"🬎":s(15),"🬏":s(16),"🬐":s(17),"🬑":s(18),"🬒":s(19),"🬓":s(20),"🬔":s(22),"🬕":s(23),"🬖":s(24),"🬗":s(25),"🬘":s(26),"🬙":s(27),"🬚":s(28),"🬛":s(29),"🬜":s(30),"🬝":s(31),"🬞":s(32),"🬟":s(33),"🬠":s(34),"🬡":s(35),"🬢":s(36),"🬣":s(37),"🬤":s(38),"🬥":s(39),"🬦":s(40),"🬧":s(41),"🬨":s(43),"🬩":s(44),"🬪":s(45),"🬫":s(46),"🬬":s(47),"🬭":s(48),"🬮":s(49),"🬯":s(50),"🬰":s(51),"🬱":s(52),"🬲":s(53),"🬳":s(54),"🬴":s(55),"🬵":s(56),"🬶":s(57),"🬷":s(58),"🬸":s(59),"🬹":s(60),"🬺":s(61),"🬻":s(62),"🬼":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"🬽":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"🬾":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"🬿":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"🭀":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"🭁":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭂":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"🭃":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"🭄":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"🭅":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"🭆":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"🭇":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"🭈":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"🭉":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"🭊":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"🭋":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"🭌":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"🭍":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"🭎":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"🭏":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"🭐":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"🭑":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"🭒":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭓":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"🭔":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"🭕":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"🭖":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"🭗":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"🭘":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"🭙":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"🭚":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"🭛":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"🭜":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"🭝":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"🭞":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"🭟":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"🭠":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"🭡":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"🭢":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"🭣":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"🭤":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"🭥":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"🭦":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"🭧":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"🭨":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"🭩":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"🭪":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"🭫":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"🭬":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"🭭":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"🭮":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"🭯":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"🭰":{type:0,data:[{x:1,y:0,w:1,h:8}]},"🭱":{type:0,data:[{x:2,y:0,w:1,h:8}]},"🭲":{type:0,data:[{x:3,y:0,w:1,h:8}]},"🭳":{type:0,data:[{x:4,y:0,w:1,h:8}]},"🭴":{type:0,data:[{x:5,y:0,w:1,h:8}]},"🭵":{type:0,data:[{x:6,y:0,w:1,h:8}]},"🭶":{type:0,data:[{x:0,y:1,w:8,h:1}]},"🭷":{type:0,data:[{x:0,y:2,w:8,h:1}]},"🭸":{type:0,data:[{x:0,y:3,w:8,h:1}]},"🭹":{type:0,data:[{x:0,y:4,w:8,h:1}]},"🭺":{type:0,data:[{x:0,y:5,w:8,h:1}]},"🭻":{type:0,data:[{x:0,y:6,w:8,h:1}]},"🭼":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🭽":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭾":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"🭿":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"🮀":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮁":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"🮂":{type:0,data:[{x:0,y:0,w:8,h:2}]},"🮃":{type:0,data:[{x:0,y:0,w:8,h:3}]},"🮄":{type:0,data:[{x:0,y:0,w:8,h:5}]},"🮅":{type:0,data:[{x:0,y:0,w:8,h:6}]},"🮆":{type:0,data:[{x:0,y:0,w:8,h:7}]},"🮇":{type:0,data:[{x:6,y:0,w:2,h:8}]},"🮈":{type:0,data:[{x:5,y:0,w:3,h:8}]},"🮉":{type:0,data:[{x:3,y:0,w:5,h:8}]},"🮊":{type:0,data:[{x:2,y:0,w:6,h:8}]},"🮋":{type:0,data:[{x:1,y:0,w:7,h:8}]},"🮌":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"🮍":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"🮎":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"🮏":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"🮐":{type:1,data:[[0,1],[1,0]]},"🮑":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"🮒":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"🮔":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"🮕":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"🮖":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"🮗":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"🮘":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"🮙":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"🮚":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"🮛":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"🮜":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"🮝":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"🮞":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"🮟":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"🮠":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"🮡":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"🮢":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"🮣":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"🮤":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"🮥":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"🮦":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"🮧":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"🮨":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"🮩":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"🮪":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"🮫":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"🮬":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"🮭":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"🮮":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"🮯":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"🮰":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"🮱":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"🮲":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"🮳":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"🮴":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"🮵":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮶":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"🮷":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮸":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"🮹":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"🮺":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"🮻":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"🮼":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"🮽":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"🮾":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"🮿":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"🯀":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"🯁":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"🯂":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"🯃":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"🯄":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"🯅":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯆":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯇":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯈":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯉":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"🯊":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"🯋":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"🯌":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"🯍":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"🯎":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"🯏":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"🯐":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"🯑":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"🯒":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"🯓":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"🯔":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"🯕":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"🯖":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"🯗":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"🯘":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"🯙":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"🯚":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"🯛":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"🯜":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"🯝":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"🯞":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"🯟":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"🯠":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"🯡":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"🯢":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"🯣":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"🯤":{type:0,data:[{x:2,y:0,w:4,h:4}]},"🯥":{type:0,data:[{x:2,y:4,w:4,h:4}]},"🯦":{type:0,data:[{x:0,y:2,w:4,h:4}]},"🯧":{type:0,data:[{x:4,y:2,w:4,h:4}]},"🯨":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"🯩":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"🯪":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"🯫":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"🯬":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"🯭":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"🯮":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"🯯":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"🯰":{type:5,data:{d:r(126),type:0},scaleType:1},"🯱":{type:5,data:{d:r(48),type:0},scaleType:1},"🯲":{type:5,data:{d:r(109),type:0},scaleType:1},"🯳":{type:5,data:{d:r(121),type:0},scaleType:1},"🯴":{type:5,data:{d:r(51),type:0},scaleType:1},"🯵":{type:5,data:{d:r(91),type:0},scaleType:1},"🯶":{type:5,data:{d:r(95),type:0},scaleType:1},"🯷":{type:5,data:{d:r(114),type:0},scaleType:1},"🯸":{type:5,data:{d:r(127),type:0},scaleType:1},"🯹":{type:5,data:{d:r(123),type:0},scaleType:1},"🯺":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(t,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},e.blockPatternCodepoints=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951])},183(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.createPatternCanvas=n,e.tryDrawCustomGlyph=function(t,e,i,s,a,o,n,L,T,l,d,c,_=0){const Q=r.customGlyphDefinitions[e];if(Q){const e=Array.isArray(Q)?Q:[Q];for(const r of e)h(t,r,i,s,a,o,n,L,T,l,d,c,_);return!0}return!1};const s=i(959),r=i(915),a="undefined"==typeof OffscreenCanvas?void 0:(t,e)=>new OffscreenCanvas(t,e),o=(t,e)=>{const i=document.createElement("canvas");return i.width=t,i.height=e,i};function n(t,e,i=a,s=o){return i?.(t,e)??s(t,e)}function h(t,e,i,r,a,o,h,d,Q,u,p,g,M=0){let y=a,v=o,f=i,C=r;switch(1===e.scaleType&&(y=h,v=d,f=i+(a-h)/2,C=r+(o-d)/2),e.clipPath&&(t.save(),function(t,e,i,s,r,a){t.beginPath();for(const o of e.split(" ")){const e=o[0];if("Z"===e){t.closePath();continue}const n=o.substring(1).split(",");if(!n[0]||!n[1])continue;const h=i+parseFloat(n[0])*r,L=s+parseFloat(n[1])*a;"M"===e?t.moveTo(h,L):"L"===e&&t.lineTo(h,L)}t.clip()}(t,e.clipPath,f,C,y,v)),e.type){case 0:!function(t,e,i,s,r,a){for(let o=0;o7&&parseInt(T.slice(7,9),16)||1;else{if(!T.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${T}" when drawing pattern glyph`);[l,c,_,Q]=T.substring(5,T.length-1).split(",").map(t=>parseFloat(t))}for(let t=0;t>1&1,_=1&h;0!==c||0!==_?d.setTransform((new DOMMatrix).translateSelf(-c,-_)):d.setTransform(new DOMMatrix),t.fillStyle=d,t.fillRect(i,r,a,o)}(t,e.data,f,C,y,v,M);break;case 2:!function(t,e,i,s,r,a,o,n,h){let L;t.save(),t.beginPath(),t.rect(i,s,r,a),t.clip(),t.beginPath(),L="function"==typeof e?e(.15,.15/a*r):e;const T={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const e of L.split(" ")){const h=e[0];if("Z"===h){t.closePath(),T.lastCommand=h;continue}const L=c[h];if(!L){n.error(`Could not find drawing instructions for "${h}"`);continue}const l=e.substring(1).split(",");l[0]&&l[1]&&(L(t,_(l,r,a,i,s,!0,o,0,0,!1),T),T.lastCommand=h)}void 0!==h?(t.strokeStyle=t.fillStyle,t.lineWidth=o*h,t.stroke()):t.fill(),t.closePath(),t.restore()}(t,e.data,f,C,y,v,u,p,e.strokeWidth);break;case 3:!function(t,e,i,s,r,a,o,n){const h="string"==typeof e?e:e(0,0);t.beginPath();let L=0,l=0,d=0,c=0,_="";for(const e of h.split(" ")){const o=e[0],n=e.substring(1).split(",");if("Z"===o){t.closePath(),_=o;continue}if("V"===o){const e=s+parseFloat(n[0])*a;t.lineTo(L,e),l=e,d=L,c=l,_=o;continue}if("H"===o){const e=i+parseFloat(n[0])*r;t.lineTo(e,l),L=e,d=L,c=l,_=o;continue}if(!n[0]||!n[1])continue;if("A"===o){const e=parseFloat(n[0])*r,o=parseFloat(n[1])*a,h=parseFloat(n[2])*Math.PI/180,d=parseInt(n[3],10),c=parseInt(n[4],10),_=i+parseFloat(n[5])*r,Q=s+parseFloat(n[6])*a;T(t,L,l,e,o,h,d,c,_,Q),L=_,l=Q;continue}const h=n.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});if("M"===o)t.moveTo(h[0],h[1]),L=h[0],l=h[1],d=L,c=l;else if("L"===o)t.lineTo(h[0],h[1]),L=h[0],l=h[1],d=L,c=l;else if("Q"===o)t.quadraticCurveTo(h[0],h[1],h[2],h[3]),d=h[0],c=h[1],L=h[2],l=h[3];else if("T"===o){let e,i;"Q"===_||"T"===_?(e=2*L-d,i=2*l-c):(e=L,i=l),t.quadraticCurveTo(e,i,h[0],h[1]),d=e,c=i,L=h[0],l=h[1]}else"C"===o&&(t.bezierCurveTo(h[0],h[1],h[2],h[3],h[4],h[5]),d=h[2],c=h[3],L=h[4],l=h[5]);_=o}void 0!==n?(t.strokeStyle=t.fillStyle,t.lineWidth=o*n,t.stroke()):t.fill()}(t,e.data,f,C,y,v,u,e.strokeWidth);break;case 4:!function(t,e,i,s,r,a,o,n){t.save(),t.fillRect(i,s,r,a),n&&(t.fillStyle=n,t.strokeStyle=n),t.lineWidth=o,t.lineCap="square",t.beginPath();for(const o of e.d.split(" ")){const e=o[0],n=o.substring(1).split(",");if(!n[0]||!n[1]){"Z"===e&&t.closePath();continue}const h=n.map((t,e)=>{const o=parseFloat(t);return e%2==0?i+o*r:s+o*a});"M"===e?t.moveTo(h[0],h[1]):"L"===e&&t.lineTo(h[0],h[1])}1===e.type?t.stroke():t.fill(),t.restore()}(t,e.data,f,C,y,v,u,g);break;case 5:!function(t,e,i,s,r,a,o,n,h){const L=new Path2D;L.rect(i,s,r,a),t.clip(L),t.beginPath();const T=o/12;t.lineWidth=n*T;const l={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(const o of e.d.split(" ")){const L=o[0];if("Z"===L){t.closePath(),l.lastCommand=L;continue}const d=c[L];if(!d){h.error(`Could not find drawing instructions for "${L}"`);continue}const Q=o.substring(1).split(",");Q[0]&&Q[1]&&(d(t,_(Q,r,a,i,s,!1,n,(e.leftPadding??0)*(T/2),(e.rightPadding??0)*(T/2)),l),l.lastCommand=L)}1===e.type?(t.strokeStyle=t.fillStyle,t.stroke()):t.fill(),t.closePath()}(t,e.data,f,C,y,v,Q,u,p);break;case 6:!function(t,e,i,s,r,a){const o=r/8,n=.1*a,h=.8*a/8,T=Math.min(o,h);for(let r=0;r<8;r++)if(e&1<1){const t=Math.sqrt(y);u=(s*=t)*s,p=(r*=t)*r}let v=(u*p-u*M-p*g)/(u*M+p*g);v<0&&(v=0);const f=(o===n?-1:1)*Math.sqrt(v),C=f*(s*Q/r),m=f*(-r*_/s),w=T*C-l*m+(e+h)/2,x=l*C+T*m+(i+L)/2,b=(_-C)/s,E=(Q-m)/r,R=(-_-C)/s,k=(-Q-m)/r,A=Math.atan2(E,b);let Z=Math.atan2(k,R)-A;0===n&&Z>0?Z-=2*Math.PI:1===n&&Z<0&&(Z+=2*Math.PI);const D=A+Z;t.ellipse(w,x,s,r,a,A,D,0===n)}const l=new Map;function d(t,e,i=0){return Math.max(Math.min(t,e),i)}const c={C:(t,e,i)=>{t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),i.lastControlX=e[2],i.lastControlY=e[3],i.currentX=e[4],i.currentY=e[5]},L:(t,e,i)=>{t.lineTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},M:(t,e,i)=>{t.moveTo(e[0],e[1]),i.lastControlX=i.currentX=e[0],i.lastControlY=i.currentY=e[1]},Q:(t,e,i)=>{t.quadraticCurveTo(e[0],e[1],e[2],e[3]),i.lastControlX=e[0],i.lastControlY=e[1],i.currentX=e[2],i.currentY=e[3]},T:(t,e,i)=>{let s,r;"Q"===i.lastCommand||"T"===i.lastCommand?(s=2*i.currentX-i.lastControlX,r=2*i.currentY-i.lastControlY):(s=i.currentX,r=i.currentY),t.quadraticCurveTo(s,r,e[0],e[1]),i.lastControlX=s,i.lastControlY=r,i.currentX=e[0],i.currentY=e[1]}};function _(t,e,i,s,r,a,o,n=0,h=0,L=!0){const T=t.map(t=>parseFloat(t)||parseInt(t));if(T.length<2)throw new Error("Too few arguments for instruction");for(let t=0;t{this._refreshCharAtlas(t,e),this.reset(t)})),this._register((0,r.toDisposable)(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=(0,a.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,e,i){}handleSelectionChanged(t,e,i,s=!1){}_setTransparency(t,e){if(e===this._alpha)return;const i=this._canvas;this._alpha=e,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,e){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(t,this._optionsService.rawOptions,e,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,e){this._deviceCellWidth=e.device.cell.width,this._deviceCellHeight=e.device.cell.height,this._deviceCharWidth=e.device.char.width,this._deviceCharHeight=e.device.char.height,this._deviceCharLeft=e.device.char.left,this._deviceCharTop=e.device.char.top,this._canvas.width=e.device.canvas.width,this._canvas.height=e.device.canvas.height,this._canvas.style.width=`${e.css.canvas.width}px`,this._canvas.style.height=`${e.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,e,i=1){this._ctx.fillRect(t*this._deviceCellWidth,(e+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,e,i,s){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(t,e,i,s){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=o.TEXT_BASELINE,this._clipCell(i,s,e.getWidth()),this._ctx.fillText(e.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,e,i){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,e*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,e,i){return`${i?"italic":""} ${e?t.options.fontWeightBold:t.options.fontWeight} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}}e.BaseRenderLayer=n},306(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.LinkRenderLayer=void 0;const s=i(657),r=i(814),a=i(133);class o extends a.BaseRenderLayer{constructor(t,e,i,s,r,a,o){super(i,t,"link",e,!0,r,a,o),this._register(s.onShowLinkUnderline(t=>this._handleShowLinkUnderline(t))),this._register(s.onHideLinkUnderline(t=>this._handleHideLinkUnderline(t)))}resize(t,e){super.resize(t,e),this._state=void 0}reset(t){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const t=this._state.y2-this._state.y1-1;t>0&&this._clearCells(0,this._state.y1+1,this._state.cols,t),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(t){if(t.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==t.fg&&(0,s.is256Color)(t.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[t.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,t.y1===t.y2)this._fillBottomLineAtCells(t.x1,t.y1,t.x2-t.x1);else{this._fillBottomLineAtCells(t.x1,t.y1,t.cols-t.x1);for(let e=t.y1+1;e{var t=s;Object.defineProperty(t,"__esModule",{value:!0}),t.WebglAddon=void 0;const e=i(426),r=i(95),a=i(399),o=i(414);class n extends e.Disposable{constructor(t){if(r.isSafari&&(0,r.getSafariVersion)()<16){const t={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",t))throw new Error("WebGL2 is only supported on Safari 16 and above")}super(),this._onChangeTextureAtlas=this._register(new o.Emitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this._register(new o.Emitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this._register(new o.Emitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this._register(new o.Emitter),this.onContextLoss=this._onContextLoss.event,this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){const i=t._core;if(!t.element)return void this._register(i.onWillOpen(()=>this.activate(t)));this._terminal=t;const s=i.coreService,r=i.optionsService,n=i,h=n._renderService,L=n._characterJoinerService,T=n._charSizeService,l=n._coreBrowserService,d=n._decorationService,c=n._logService,_=n._themeService;this._renderer=this._register(new a.WebglRenderer(t,L,T,l,s,d,c,r,_,this._customGlyphs,this._preserveDrawingBuffer)),this._register(o.EventUtils.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(o.EventUtils.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(o.EventUtils.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(o.EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),h.setRenderer(this._renderer),this._register((0,e.toDisposable)(()=>{if(this._terminal._core._store._isDisposed)return;const e=this._terminal._core._renderService;e.setRenderer(this._terminal._core._createRenderer()),e.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}}t.WebglAddon=n})(),s})()); + //# sourceMappingURL=addon-webgl.js.map +\ No newline at end of file +diff --git a/lib/addon-webgl.js.map b/lib/addon-webgl.js.map +index 07f1560db82df8bd440e9bac15075efea891ccee..bb49fa91a5835941fe4ca0dfeb92a796caf4d197 100644 +--- a/lib/addon-webgl.js.map ++++ b/lib/addon-webgl.js.map +@@ -1 +1 @@ +-{"version":3,"file":"addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/../src/browser/Dom.ts","webpack://WebglAddon/../src/browser/renderer/shared/Constants.ts","webpack://WebglAddon/../src/browser/renderer/shared/RendererUtils.ts","webpack://WebglAddon/../src/browser/renderer/shared/SelectionRenderModel.ts","webpack://WebglAddon/../src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://WebglAddon/../src/common/Async.ts","webpack://WebglAddon/../src/common/Color.ts","webpack://WebglAddon/../src/common/Event.ts","webpack://WebglAddon/../src/common/Lifecycle.ts","webpack://WebglAddon/../src/common/MultiKeyMap.ts","webpack://WebglAddon/../src/common/Platform.ts","webpack://WebglAddon/../src/common/TaskQueue.ts","webpack://WebglAddon/../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../src/common/buffer/CellData.ts","webpack://WebglAddon/../src/common/buffer/Constants.ts","webpack://WebglAddon/../src/common/input/TextDecoder.ts","webpack://WebglAddon/./src/CellColorResolver.ts","webpack://WebglAddon/./src/CharAtlasCache.ts","webpack://WebglAddon/./src/CharAtlasUtils.ts","webpack://WebglAddon/./src/Constants.ts","webpack://WebglAddon/./src/CursorBlinkStateManager.ts","webpack://WebglAddon/./src/DevicePixelObserver.ts","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/TextureAtlas.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/customGlyphs/CustomGlyphDefinitions.ts","webpack://WebglAddon/./src/customGlyphs/CustomGlyphRasterizer.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/buffer/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\nimport { blockPatternCodepoints } from './customGlyphs/CustomGlyphDefinitions';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number, deviceCellHeight: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n if ($variantOffset === 0 && blockPatternCodepoints.has(code)) {\n $variantOffset = ((x * deviceCellWidth) % 2) * 2 + ((y * deviceCellHeight) % 2);\n }\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from './TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from './Types';\nimport { generateConfig, configEquals } from './CharAtlasUtils';\nimport type { ILogService } from 'common/services/Services';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number,\n deviceMaxTextureSize: number,\n customGlyphs: boolean = true\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio, deviceMaxTextureSize, customGlyphs);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const logService = (core as any)._logService as ILogService;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService, logService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required, colors: ReadonlyColorSet, devicePixelRatio: number, deviceMaxTextureSize: number, customGlyphs: boolean = true): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs,\n devicePixelRatio,\n deviceMaxTextureSize,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.deviceMaxTextureSize === b.deviceMaxTextureSize &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCellWidth === b.deviceCellWidth &&\n a.deviceCellHeight === b.deviceCellHeight &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RendererConstants } from 'browser/renderer/shared/Constants';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\nconst enum Constants {\n /**\n * The time between cursor blinks.\n */\n BLINK_INTERVAL = 600,\n}\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n this._resetIdleTimer();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._resetIdleTimer();\n }\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = Constants.BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, Constants.BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n this._isIdlePaused = false;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this._resetIdleTimer();\n this.restartBlinkAnimation();\n }\n\n /**\n * Resets the idle timer. If the terminal is idle for the idle timeout period,\n * the cursor blinking will stop.\n */\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n }\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n /**\n * Stops cursor blinking due to idle timeout.\n */\n private _stopBlinkingDueToIdle(): void {\n // Make cursor visible and stop blinking\n this.isCursorVisible = true;\n this._isIdlePaused = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n // Clear the idle timeout as we've already acted on it\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n // Trigger a render to show the cursor in its final visible state\n this._renderCallback();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable, IDisposable } from 'common/Lifecycle';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { TextureAtlas } from './TextureAtlas';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { ILogService, IOptionsService } from 'common/services/Services';\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals}\n}`);\n}\n\nconst enum Constants {\n INDICES_PER_CELL = 11,\n BYTES_PER_CELL = INDICES_PER_CELL * 4/* Float32Array.BYTES_PER_ELEMENT */,\n CELL_POSITION_INDICES = 2\n}\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _lastSeenPageLayoutVersion: number = -1;\n private _pageOverflowWarned: boolean = false;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages), this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, Constants.BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this._register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n /**\n * Call when a frame is being drawn. Returns whether the full model must be rebuilt before\n * rendering this frame because the atlas page layout changed since this renderer last drew.\n */\n public beginFrame(): boolean {\n if (!this._atlas) {\n return true;\n }\n if (this._atlas.pageLayoutVersion !== this._lastSeenPageLayoutVersion) {\n this._lastSeenPageLayoutVersion = this._atlas.pageLayoutVersion;\n return true;\n }\n return false;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a one-off for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * Constants.INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + Constants.INDICES_PER_CELL - 1 - Constants.CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false, this._terminal.element);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false, this._terminal.element);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * Constants.INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += Constants.INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n gl.uniform2f(this._resolutionLocation, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * Constants.INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * Constants.INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed. AtlasPage.version is globally\n // monotonic, so a page object swap at the same index (which happens after a page merge)\n // is detected by the same comparison.\n // Clamp defensively in case the atlas unexpectedly exceeds texture capacity.\n const pageCount = Math.min(this._atlas.pages.length, this._atlasTextures.length);\n if (this._atlas.pages.length > this._atlasTextures.length && !this._pageOverflowWarned) {\n this._pageOverflowWarned = true;\n this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`);\n }\n for (let i = 0; i < pageCount; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / Constants.INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n this._lastSeenPageLayoutVersion = -1;\n this.invalidateAtlasTextures();\n }\n\n public invalidateAtlasTextures(): void {\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RenderModelConstants } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource, this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this._register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RenderModelConstants.BG_OFFSET];\n fg = model.cells[modelIndex + RenderModelConstants.FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + INDICES_PER_RECTANGLE) {\n // +1 for the viewport-clear rectangle at offset 0.\n vertices.attributes = expandFloat32Array(vertices.attributes, (this._terminal.rows * this._terminal.cols + 1) * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const enum RenderModelConstants {\n INDICIES_PER_CELL = 4,\n BG_OFFSET = 1,\n FG_OFFSET = 2,\n EXT_OFFSET = 3\n}\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RenderModelConstants.INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from './Constants';\nimport { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { ILogService, IUnicodeService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n private _overflowSizePage: AtlasPage | undefined;\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transferred to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new Emitter();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new Emitter();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService,\n private readonly _logService: ILogService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n this._tmpCanvas.remove();\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n this._onRemoveTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue(this._logService);\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, false, undefined);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _pageLayoutVersion = 0;\n public get pageLayoutVersion(): number { return this._pageLayoutVersion; }\n\n public clearTexture(): void {\n if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n return;\n }\n for (const page of this._pages) {\n page.clear();\n }\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n\n // Invalidate renderer models so all texture pages are refreshed. The atlas may be shared, in\n // which case the clearing renderer has cleared only its own model and every other owner still\n // holds texture coords into the rows just wiped.\n this._pageLayoutVersion++;\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n\n // Only proceed with merge if we have exactly 4 same-sized pages. If not, we cannot\n // effectively reduce page count and merging would cause issues.\n if (mergingPages.length < 4 || mergingPages.some(p => p.canvas.width !== mergingPages[0].canvas.width)) {\n // Evict instead of adding a page beyond the renderer's texture capacity.\n this._evictAllPages();\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version = ++AtlasPage.nextVersion;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version = ++AtlasPage.nextVersion;\n }\n }\n\n private _evictAllPages(): void {\n const startTime = performance.now();\n const pageCount = this._pages.length;\n for (const page of this._pages) {\n this._onRemoveTextureAtlasCanvas.fire(page.canvas);\n page.canvas.remove();\n }\n this._pages.length = 0;\n this._activePages.length = 0;\n this._overflowSizePage = undefined;\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n this._pageLayoutVersion++;\n this._logService.debug(`Evicted ${pageCount} WebGL atlas pages in ${(performance.now() - startTime).toFixed(2)}ms`);\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean,\n domContainer: HTMLElement | undefined\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight, domContainer);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n // Ignore alpha channel when allowTransparency is false\n if (!this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor ?? undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Attach the canvas to the DOM in order to inherit font-feature-settings\n // from the parent elements. This is necessary for ligatures and variants to\n // work.\n if (domContainer && this._tmpCanvas.parentElement !== domContainer) {\n this._tmpCanvas.style.display = 'none';\n domContainer.append(this._tmpCanvas);\n }\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._config.deviceMaxTextureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n const variantOffset = this._workAttributeData.getUnderlineVariantOffset();\n customGlyph = tryDrawCustomGlyph(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.deviceCharWidth, this._config.deviceCharHeight, this._config.fontSize, this._config.devicePixelRatio, this._logService, backgroundColor.css, variantOffset);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n this._tmpCtx.fillStyle = this._tmpCtx.strokeStyle;\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTopDefault = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yBotDefault = yTopDefault + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n let yTop = 0;\n let yBot = 0;\n\n for (let i = 0; i < chWidth; i++) {\n let wasFilled = false;\n this._tmpCtx.save();\n yTop = yTopDefault;\n yBot = yBotDefault;\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n this._tmpCtx.moveTo(xChLeft, yBotDefault);\n this._tmpCtx.lineTo(xChRight, yBotDefault);\n break;\n case UnderlineStyle.CURLY:\n yTop = this._config.deviceCharHeight + 1;\n yBot = yTop + 3 * this._config.devicePixelRatio;\n\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n\n // Draw a zigzag pattern, this is derived from the SVG used in monaco for the same\n // style. The viewbox is 6x3 so scale it using that.\n const cellW = this._config.deviceCellWidth;\n const curlyH = (yBot - yTop);\n const scaleX = cellW / 6;\n const scaleY = curlyH / 3;\n\n const polygons: number[][] = [\n [0, 2, 1, 3, 2.4, 3, 0, 0.6],\n [5.5, 0, 2.5, 3, 1.1, 3, 4.1, 0],\n [4, 0, 6, 2, 6, 0.6, 5.4, 0],\n ];\n\n for (const polygon of polygons) {\n this._tmpCtx.beginPath();\n for (let i = 0; i < polygon.length; i += 2) {\n const x = xChLeft + polygon[i] * scaleX;\n const y = yBot - polygon[i + 1] * scaleY;\n if (i === 0) {\n this._tmpCtx.moveTo(x, y);\n } else {\n this._tmpCtx.lineTo(x, y);\n }\n }\n this._tmpCtx.closePath();\n this._tmpCtx.fill();\n }\n wasFilled = true;\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n }\n if (!wasFilled) {\n this._tmpCtx.stroke();\n }\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page for oversized glyphs as they come up\n if (rasterizedGlyph.size.x > this._textureSize) {\n if (!this._overflowSizePage) {\n // Make room for the oversized page without exceeding texture capacity.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) {\n this._evictAllPages();\n }\n this._overflowSizePage = new AtlasPage(this._document, this._config.deviceMaxTextureSize);\n this.pages.push(this._overflowSizePage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas);\n }\n activePage = this._overflowSizePage;\n activeRow = this._overflowSizePage.currentRow;\n // Move to next row if necessary\n if (activeRow.x + rasterizedGlyph.size.x >= activePage.canvas.width) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n }\n break;\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version = ++AtlasPage.nextVersion;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Monotonically increasing across all atlas pages globally. Used to detect when the texture\n * unit at a given index needs to be re-uploaded — both for content changes within the same\n * page and for a page object swap at the same index (which happens after a page merge,\n * where a per-page counter could coincide with the previously-bound page's value).\n */\n public static nextVersion: number = 0;\n public version = ++AtlasPage.nextVersion;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n if (sourcePages) {\n if (sourcePages.length === 4) {\n // optimized for quadmerge\n this._glyphs = this._glyphs.concat(\n sourcePages[0].glyphs,\n sourcePages[1].glyphs,\n sourcePages[2].glyphs,\n sourcePages[3].glyphs\n );\n this._usedPixels = sourcePages[0]._usedPixels +\n sourcePages[1]._usedPixels +\n sourcePages[2]._usedPixels +\n sourcePages[3]._usedPixels;\n } else {\n // fallback for non quadmerges (should never be used)\n for (let i = 0; i < sourcePages.length; ++i) {\n this._glyphs = this._glyphs.concat(sourcePages[i].glyphs);\n this._usedPixels += sourcePages[i]._usedPixels;\n }\n\n }\n }\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version = ++AtlasPage.nextVersion;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevant pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from './CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from './CharAtlasCache';\nimport { CursorBlinkStateManager } from './CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from './DevicePixelObserver';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { CharData, IBufferLine, ICellData } from 'common/buffer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RenderModel, RenderModelConstants } from './RenderModel';\nimport { IWebGL2RenderingContext, type ITextureAtlas } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\n\nconst enum Constants {\n MERGE_RETRY_LIMIT = 32\n}\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable = this._register(new MutableDisposable());\n private _textBlinkStateManager: TextBlinkStateManager;\n private _charAtlasDisposable = this._register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _deviceMaxTextureSize: number;\n private _observerDisposable = this._register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n private _workCell: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable = this._register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable = this._register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n private readonly _customGlyphs: boolean = true,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n // IMPORTANT: Canvas initialization and fetching of the context must be first in order to\n // prevent possible listeners leaking and continuing to operate after the WebglRenderer has been\n // discarded.\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this._register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this._register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._requestRedrawViewport(),\n this._coreBrowserService,\n this._optionsService\n ));\n this._resetBlinkingRowState();\n\n this._deviceMaxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE);\n\n this._register(addDisposableListener(this._canvas, 'webglcontextlost', (e) => {\n this._logService.debug('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n this._logService.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this._register(addDisposableListener(this._canvas, 'webglcontextrestored', (e) => {\n this._logService.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this._register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._register(addDisposableListener(this._coreBrowserService.mainDocument, 'mousedown', () => this._cursorBlinkStateManager.value?.restartBlinkAnimation()));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._core.screenElement!.isConnected;\n\n this._register(toDisposable(() => {\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n this._resetBlinkingRowState();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService, this._logService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService, this._logService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr,\n this._deviceMaxTextureSize,\n this._customGlyphs\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = combinedDisposable(\n EventUtils.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n EventUtils.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n );\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._resetBlinkingRowState();\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._core.screenElement?.isConnected && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // A mid-update atlas page merge invalidates vertex data and may not bump the host\n // page's version, so re-run the update and force a full texture rebind.\n let merged = false;\n let mergeRetries = 0;\n while (this._charAtlas && this._glyphRenderer.value.beginFrame() && mergeRetries++ < Constants.MERGE_RETRY_LIMIT) {\n merged = true;\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n }\n if (merged) {\n this._glyphRenderer.value.invalidateAtlasTextures();\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._coreService.decPrivateModes.cursorBlink ?? this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let skipJoinedCheckUntilX: number;\n let isValidJoinRange: boolean;\n let lastCharX: number;\n let range: [number, number];\n let isCursorRow: boolean;\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? terminal.options.cursorStyle ?? 'block';\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n const bufferLine = terminal.buffer.lines.get(row);\n if (!bufferLine) {\n this._model.lineLengths[y] = 0;\n for (x = 0; x < terminal.cols; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n modelUpdated = true;\n this._nullModelCell(x, y, j, 0, 0, 0);\n }\n this._setRowBlinkState(y, false);\n continue;\n }\n line = bufferLine;\n let rowHasBlinkingCells = false;\n this._model.lineLengths[y] = 0;\n isCursorRow = cursorY === row;\n skipJoinedCheckUntilX = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n range = joinedRanges.shift()!;\n\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._model.selection.isCellSelected(this._terminal, range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._model.selection.isCellSelected(this._terminal, i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n\n if (!rowHasBlinkingCells && cell.isBlink()) {\n rowHasBlinkingCells = true;\n }\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width, this.dimensions.device.cell.height);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ? cursorStyle : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n cursorStyle === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))\n ) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (this._textBlinkStateManager.isEnabled && !this._textBlinkStateManager.isBlinkOn && cell.isBlink()) {\n this._cellColorResolver.result.fg |= FgFlags.INVISIBLE;\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RenderModelConstants.BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RenderModelConstants.FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RenderModelConstants.BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RenderModelConstants.FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x <= lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n // Don't re-resolve the cell color since multi-colored ligature backgrounds are not\n // supported\n this._nullModelCell(x, y, j, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext);\n }\n x--; // Go back to the previous update cell for next iteration\n }\n }\n this._setRowBlinkState(y, rowHasBlinkingCells);\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n this._updateTextBlinkState();\n }\n\n private _nullModelCell(x: number, y: number, cellIndex: number, bg: number, fg: number, ext: number): void {\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, bg, fg, ext, NULL_CELL_CHAR, 0, 0);\n this._model.cells[cellIndex] = NULL_CELL_CODE;\n this._model.cells[cellIndex + RenderModelConstants.BG_OFFSET] = bg;\n this._model.cells[cellIndex + RenderModelConstants.FG_OFFSET] = fg;\n this._model.cells[cellIndex + RenderModelConstants.EXT_OFFSET] = ext;\n }\n\n private _resetBlinkingRowState(): void {\n this._rowHasBlinkingCells = new Array(this._terminal.rows).fill(false);\n this._rowHasBlinkingCellsCount = 0;\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may cause blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string, logService: ILogService): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource, logService)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource, logService)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n logService.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string, logService: ILogService): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n logService.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types';\n\n/* oxlint-disable @stylistic/max-len -- generated glyph path data */\n\nconst enum Shapes {\n /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nnamespace GitBranchSymbolsParts {\n // Lines\n export const LINE_H: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 });\n export const LINE_V: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 });\n\n // Fading lines\n export const FADE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5', strokeWidth: 1 });\n export const FADE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5', strokeWidth: 1 });\n export const FADE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90', strokeWidth: 1 });\n export const FADE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1', strokeWidth: 1 });\n\n // Curved corners\n export const CURVE_DOWN_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_DOWN_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n export const CURVE_UP_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_UP_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n\n // Node parts\n export const NODE_FILL: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5' });\n export const NODE_STROKE: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5', strokeWidth: 1 });\n export const NODE_LINE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M1,.5 L.85,.5', strokeWidth: 1 });\n export const NODE_LINE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M0,.5 L.15,.5', strokeWidth: 1 });\n export const NODE_LINE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,1 L.5,.7', strokeWidth: 1 });\n export const NODE_LINE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,0 L.5,.3', strokeWidth: 1 });\n}\n\nexport const customGlyphDefinitions: { [index: string]: CustomGlyphCharacterDefinition | undefined } = {\n // #region Box Drawing (2500-257F)\n\n // https://www.unicode.org/charts/PDF/U2500.pdf\n\n // Light and heavy solid lines (2500-2503)\n '─': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 },\n '━': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 },\n '│': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 },\n '┃': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 },\n\n // Light and heavy dashed lines (2504-250B)\n '┄': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 1 },\n '┅': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 3 },\n '┆': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 1 },\n '┇': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 3 },\n '┈': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 1 },\n '┉': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 3 },\n '┊': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 1 },\n '┋': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Light and heavy line box components (250C-254B)\n '┌': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 },\n '┍': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┎': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┏': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 },\n '┐': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 },\n '┑': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┒': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┓': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 },\n '└': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 },\n '┕': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┖': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┗': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 },\n '┘': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 },\n '┙': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┚': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┛': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 },\n '├': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 1 },\n '┝': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┞': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┟': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┠': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '┡': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '┢': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '┣': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 3 },\n '┤': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 1 },\n '┥': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┦': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┧': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┨': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '┩': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '┪': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '┫': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 3 },\n '┬': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 1 },\n '┭': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┮': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┯': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '┰': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┱': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '┲': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '┳': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 3 },\n '┴': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 1 },\n '┵': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┶': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┷': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '┸': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┹': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '┺': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '┻': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 3 },\n '┼': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 1 },\n '┽': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┾': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┿': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '╀': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '╁': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '╂': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '╃': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '╄': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '╅': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '╆': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '╇': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 3 }],\n '╈': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 3 }],\n '╉': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 3 }],\n '╊': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 3 }],\n '╋': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 3 },\n\n // Light and heavy dashed lines (254C-254F)\n '╌': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 1 },\n '╍': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 3 },\n '╎': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 1 },\n '╏': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Double lines (2550-2551)\n '═': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '║': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n\n // Light and double line box components (2552-256C)\n '╒': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╓': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '╔': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╕': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '╖': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1`, strokeWidth: 1 },\n '╗': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╘': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}`, strokeWidth: 1 },\n '╙': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '╚': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0`, strokeWidth: 1 },\n '╛': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}`, strokeWidth: 1 },\n '╜': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0`, strokeWidth: 1 },\n '╝': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╞': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╟': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5`, strokeWidth: 1 },\n '╠': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╡': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '╢': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '╣': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0`, strokeWidth: 1 },\n '╤': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1`, strokeWidth: 1 },\n '╥': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '╦': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╧': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╨': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '╩': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╪': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╫': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '╬': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n\n // Character cell arcs (256D-2570)\n '╭': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n '╮': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '╯': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '╰': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n\n // Character cell diagonals (2571-2573)\n '╱': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1', strokeWidth: 1 },\n '╲': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,1', strokeWidth: 1 },\n '╳': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1 M0,0 L1,1', strokeWidth: 1 },\n\n // Light and heavy half lines (2574-257B)\n '╴': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 },\n '╵': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 },\n '╶': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 },\n '╷': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 },\n '╸': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 },\n '╹': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 },\n '╺': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 },\n '╻': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 },\n\n // Mixed light and heavy lines (257C-257F)\n '╼': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '╽': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '╾': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '╿': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n\n // #endregion\n\n // #region Block elements (2580-259F)\n\n // https://www.unicode.org/charts/PDF/U2580.pdf\n\n // Block elements (2580-2590)\n '▀': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }, // UPPER HALF BLOCK\n '▁': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 7, w: 8, h: 1 }] }, // LOWER ONE EIGHTH BLOCK\n '▂': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 2 }] }, // LOWER ONE QUARTER BLOCK\n '▃': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 3 }] }, // LOWER THREE EIGHTHS BLOCK\n '▄': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }, // LOWER HALF BLOCK\n '▅': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 5 }] }, // LOWER FIVE EIGHTHS BLOCK\n '▆': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 6 }] }, // LOWER THREE QUARTERS BLOCK\n '▇': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 7 }] }, // LOWER SEVEN EIGHTHS BLOCK\n '█': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 8 }] }, // FULL BLOCK (=solid -> 25A0=black square)\n '▉': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 7, h: 8 }] }, // LEFT SEVEN EIGHTHS BLOCK\n '▊': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 6, h: 8 }] }, // LEFT THREE QUARTERS BLOCK\n '▋': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 5, h: 8 }] }, // LEFT FIVE EIGHTHS BLOCK\n '▌': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }] }, // LEFT HALF BLOCK\n '▍': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 3, h: 8 }] }, // LEFT THREE EIGHTHS BLOCK\n '▎': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 2, h: 8 }] }, // LEFT ONE QUARTER BLOCK\n '▏': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }] }, // LEFT ONE EIGHTH BLOCK\n '▐': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }, // RIGHT HALF BLOCK\n\n // Shade characters (2591-2593)\n '░': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LIGHT SHADE (25%)\n [1, 0],\n [0, 0]\n ] },\n '▒': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // MEDIUM SHADE (=speckles fill, dotted fill, 50%, used in mapping to cp949, -> 1FB90 inverse medium shade)\n [1, 0],\n [0, 1]\n ] },\n '▓': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // DARK SHADE (75%)\n [1, 1],\n [1, 0]\n ] },\n\n // Block elements (2594-2595)\n '▔': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }] }, // UPPER ONE EIGHTH BLOCK\n '▕': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }] }, // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (2596-259F)\n '▖': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER LEFT\n '▗': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER RIGHT\n '▘': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT\n '▙': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT (-> 1F67F reverse checker board, -> 1FB95 checker board fill)\n '▚': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER RIGHT\n '▛': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '▜': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '▝': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT\n '▞': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT (-> 1F67E checker board, 1FB96 inverse checker board fill)\n '▟': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // #endregion\n\n // #region Powerline Symbols (E0A0-E0BF)\n\n // This contains the definitions of the primarily used box drawing characters as vector shapes.\n // The reason these characters are defined specially is to avoid common problems if a user's font\n // has not been patched with powerline characters and also to get pixel perfect rendering as\n // rendering issues can occur around AA/SPAA.\n //\n // The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n // visible.\n //\n // Original symbols defined in https://github.com/powerline/fontpatcher\n\n // Git branch\n '\\u{E0A0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: CustomGlyphVectorType.FILL } },\n // LN (Line Number)\n '\\u{E0A1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Lock\n '\\u{E0A2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: CustomGlyphVectorType.FILL } },\n // CN (Column Number)\n '\\u{E0A3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Right triangle solid\n '\\u{E0B0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,.5 L0,1', type: CustomGlyphVectorType.FILL, rightPadding: 2 } },\n // Right triangle line\n '\\u{E0B1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-1,-.5 L1,.5 L-1,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Left triangle solid\n '\\u{E0B2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L0,.5 L1,1', type: CustomGlyphVectorType.FILL, leftPadding: 2 } },\n // Left triangle line\n '\\u{E0B3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M2,-.5 L0,.5 L2,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n\n // Powerline Extra Symbols\n\n // Original symbols defined in https://github.com/ryanoasis/powerline-extra-symbols\n\n // Right semi-circle solid\n '\\u{E0B4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: CustomGlyphVectorType.FILL, rightPadding: 1 } },\n // Right semi-circle line\n '\\u{E0B5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: CustomGlyphVectorType.STROKE, rightPadding: 1 } },\n // Left semi-circle solid\n '\\u{E0B6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: CustomGlyphVectorType.FILL, leftPadding: 1 } },\n // Left semi-circle line\n '\\u{E0B7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: CustomGlyphVectorType.STROKE, leftPadding: 1 } },\n // Lower left triangle\n '\\u{E0B8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator\n '\\u{E0B9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Lower right triangle\n '\\u{E0BA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator redundant (identical to E0BD)\n '\\u{E0BB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper left triangle\n '\\u{E0BC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator\n '\\u{E0BD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper right triangle\n '\\u{E0BE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator redundant (identical to E0B9)\n '\\u{E0BF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n '\\u{E0C0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C8}' is unused\n '\\u{E0CA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0CB}' is unused\n '\\u{E0CC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C3}' is unused\n '\\u{E0D4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n\n // #endregion\n\n // #region Progress Indicators (EE00-EE0B)\n\n // initially added in Fira Code and later Nerd Fonts\n // https://github.com/ryanoasis/nerd-fonts/pull/1733\n\n // Progress bars (EE00-EE05)\n '\\u{EE00}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY START\n '\\u{EE01}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY MIDDLE\n '\\u{EE02}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z' }, // PROGRESS BAR EMPTY END\n '\\u{EE03}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z' }, // PROGRESS BAR FILLED START\n '\\u{EE04}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z' }, // PROGRESS BAR FILLED MIDDLE\n '\\u{EE05}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z' }, // PROGRESS BAR FILLED END\n\n // Progress spinners (EE06-EE0B) - 6-frame spinner animation using stroked arcs\n '\\u{EE06}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 1 (12 o'clock)\n '\\u{EE07}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 2 (2 o'clock)\n '\\u{EE08}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 3 (4 o'clock)\n '\\u{EE09}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 4 (6 o'clock)\n '\\u{EE0A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 5 (8 o'clock)\n '\\u{EE0B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 6 (10 o'clock)\n\n // #endregion\n\n // #region Git Branch Symbols (F5D0-F60D)\n\n // Initially added in Kitty (https://github.com/kovidgoyal/kitty/pull/7681)\n // then in Wezterm (https://github.com/wezterm/wezterm/issues/6328).\n\n // Straight lines (F5D0-F5D9)\n '\\u{F5D0}': GitBranchSymbolsParts.LINE_H, // Same as 2500\n '\\u{F5D1}': GitBranchSymbolsParts.LINE_V, // Same as 2502\n '\\u{F5D2}': GitBranchSymbolsParts.FADE_RIGHT,\n '\\u{F5D3}': GitBranchSymbolsParts.FADE_LEFT,\n '\\u{F5D4}': GitBranchSymbolsParts.FADE_DOWN,\n '\\u{F5D5}': GitBranchSymbolsParts.FADE_UP,\n\n // Curved lines (F5D6-F5D9)\n '\\u{F5D6}': GitBranchSymbolsParts.CURVE_DOWN_RIGHT, // Same as 256D)\n '\\u{F5D7}': GitBranchSymbolsParts.CURVE_DOWN_LEFT, // Same as 256E)\n '\\u{F5D8}': GitBranchSymbolsParts.CURVE_UP_RIGHT, // Same as 2570)\n '\\u{F5D9}': GitBranchSymbolsParts.CURVE_UP_LEFT, // Same as 256F)\n\n // Branching lines (F5DA-F5ED)\n '\\u{F5DA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5DC}': [GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DD}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5DE}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5DF}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E0}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5E1}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E2}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E3}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E4}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E5}': [GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E6}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E7}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E8}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E9}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5EB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EC}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5ED}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n\n // Nodes (F5EE-F5FB)\n '\\u{F5EE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE],\n '\\u{F5EF}': GitBranchSymbolsParts.NODE_STROKE,\n '\\u{F5F0}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F1}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F2}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F3}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F4}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F5}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F6}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F7}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F8}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5F9}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FA}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FB}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n\n // Extended Nodes (F5FC-F60D)\n // These were added a little later https://github.com/kovidgoyal/kitty/pull/7805\n '\\u{F5FC}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FD}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5FF}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F600}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F601}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F602}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F603}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F604}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F605}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F606}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F607}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F608}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F609}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60A}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60B}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60C}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60D}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n\n // #endregion\n\n // #region Symbols for Legacy Computing (1FB00-1FB3B)\n\n // https://www.unicode.org/charts/PDF/U1FB00.pdf\n\n // Block mosaic terminal graphic characters (1FB00-1FB3B)\n // The term \"sextant\" refers to block mosaics divided into six parts.\n '\\u{1FB00}': sextant(0b000001), // BLOCK SEXTANT-1\n '\\u{1FB01}': sextant(0b000010), // BLOCK SEXTANT-2\n '\\u{1FB02}': sextant(0b000011), // BLOCK SEXTANT-12 (upper one third block)\n '\\u{1FB03}': sextant(0b000100), // BLOCK SEXTANT-3\n '\\u{1FB04}': sextant(0b000101), // BLOCK SEXTANT-13\n '\\u{1FB05}': sextant(0b000110), // BLOCK SEXTANT-23\n '\\u{1FB06}': sextant(0b000111), // BLOCK SEXTANT-123\n '\\u{1FB07}': sextant(0b001000), // BLOCK SEXTANT-4\n '\\u{1FB08}': sextant(0b001001), // BLOCK SEXTANT-14\n '\\u{1FB09}': sextant(0b001010), // BLOCK SEXTANT-24\n '\\u{1FB0A}': sextant(0b001011), // BLOCK SEXTANT-124\n '\\u{1FB0B}': sextant(0b001100), // BLOCK SEXTANT-34 (middle one third block)\n '\\u{1FB0C}': sextant(0b001101), // BLOCK SEXTANT-134\n '\\u{1FB0D}': sextant(0b001110), // BLOCK SEXTANT-234\n '\\u{1FB0E}': sextant(0b001111), // BLOCK SEXTANT-1234 (upper two thirds block)\n '\\u{1FB0F}': sextant(0b010000), // BLOCK SEXTANT-5\n '\\u{1FB10}': sextant(0b010001), // BLOCK SEXTANT-15\n '\\u{1FB11}': sextant(0b010010), // BLOCK SEXTANT-25\n '\\u{1FB12}': sextant(0b010011), // BLOCK SEXTANT-125\n '\\u{1FB13}': sextant(0b010100), // BLOCK SEXTANT-35\n '\\u{1FB14}': sextant(0b010110), // BLOCK SEXTANT-235\n '\\u{1FB15}': sextant(0b010111), // BLOCK SEXTANT-1235\n '\\u{1FB16}': sextant(0b011000), // BLOCK SEXTANT-45\n '\\u{1FB17}': sextant(0b011001), // BLOCK SEXTANT-145\n '\\u{1FB18}': sextant(0b011010), // BLOCK SEXTANT-245\n '\\u{1FB19}': sextant(0b011011), // BLOCK SEXTANT-1245\n '\\u{1FB1A}': sextant(0b011100), // BLOCK SEXTANT-345\n '\\u{1FB1B}': sextant(0b011101), // BLOCK SEXTANT-1345\n '\\u{1FB1C}': sextant(0b011110), // BLOCK SEXTANT-2345\n '\\u{1FB1D}': sextant(0b011111), // BLOCK SEXTANT-12345\n '\\u{1FB1E}': sextant(0b100000), // BLOCK SEXTANT-6\n '\\u{1FB1F}': sextant(0b100001), // BLOCK SEXTANT-16\n '\\u{1FB20}': sextant(0b100010), // BLOCK SEXTANT-26\n '\\u{1FB21}': sextant(0b100011), // BLOCK SEXTANT-126\n '\\u{1FB22}': sextant(0b100100), // BLOCK SEXTANT-36\n '\\u{1FB23}': sextant(0b100101), // BLOCK SEXTANT-136\n '\\u{1FB24}': sextant(0b100110), // BLOCK SEXTANT-236\n '\\u{1FB25}': sextant(0b100111), // BLOCK SEXTANT-1236\n '\\u{1FB26}': sextant(0b101000), // BLOCK SEXTANT-46\n '\\u{1FB27}': sextant(0b101001), // BLOCK SEXTANT-146\n '\\u{1FB28}': sextant(0b101011), // BLOCK SEXTANT-1246\n '\\u{1FB29}': sextant(0b101100), // BLOCK SEXTANT-346\n '\\u{1FB2A}': sextant(0b101101), // BLOCK SEXTANT-1346\n '\\u{1FB2B}': sextant(0b101110), // BLOCK SEXTANT-2346\n '\\u{1FB2C}': sextant(0b101111), // BLOCK SEXTANT-12346\n '\\u{1FB2D}': sextant(0b110000), // BLOCK SEXTANT-56 (lower one third block)\n '\\u{1FB2E}': sextant(0b110001), // BLOCK SEXTANT-156\n '\\u{1FB2F}': sextant(0b110010), // BLOCK SEXTANT-256\n '\\u{1FB30}': sextant(0b110011), // BLOCK SEXTANT-1256 (upper and lower one third block)\n '\\u{1FB31}': sextant(0b110100), // BLOCK SEXTANT-356\n '\\u{1FB32}': sextant(0b110101), // BLOCK SEXTANT-1356\n '\\u{1FB33}': sextant(0b110110), // BLOCK SEXTANT-2356\n '\\u{1FB34}': sextant(0b110111), // BLOCK SEXTANT-12356\n '\\u{1FB35}': sextant(0b111000), // BLOCK SEXTANT-456\n '\\u{1FB36}': sextant(0b111001), // BLOCK SEXTANT-1456\n '\\u{1FB37}': sextant(0b111010), // BLOCK SEXTANT-2456\n '\\u{1FB38}': sextant(0b111011), // BLOCK SEXTANT-12456\n '\\u{1FB39}': sextant(0b111100), // BLOCK SEXTANT-3456 (lower two thirds block)\n '\\u{1FB3A}': sextant(0b111101), // BLOCK SEXTANT-13456\n '\\u{1FB3B}': sextant(0b111110), // BLOCK SEXTANT-23456\n\n // Smooth mosaic terminal graphic characters (1FB3C-1FB6F)\n '\\u{1FB3C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB3E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB40}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB41}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB42}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB43}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB44}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB45}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0.5,0 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB46}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0.3333 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB47}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB48}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB49}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB4C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB4F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB50}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB51}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB52}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB53}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB54}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB55}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB56}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,1 L1,1 L1,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB57}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB58}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB59}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB5A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB5B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB5C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB5D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB5E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB5F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB60}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB61}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB62}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB63}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB64}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB65}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB66}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,1 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB67}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0.6667 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB68}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z' }, // UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing left)\n '\\u{1FB69}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z' }, // LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing upper)\n '\\u{1FB6A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z' }, // UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing right)\n '\\u{1FB6B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z' }, // LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing lower)\n '\\u{1FB6C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L0,1 Z' }, // LEFT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 Z' }, // UPPER TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6E}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L1,1 L0.5,0.5 Z' }, // RIGHT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,1 L0.5,0.5 Z' }, // LOWER TRIANGULAR ONE QUARTER BLOCK\n\n // Block elements (1FB70-1FB80)\n '\\u{1FB70}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-2\n '\\u{1FB71}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-3\n '\\u{1FB72}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-4\n '\\u{1FB73}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-5\n '\\u{1FB74}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-6\n '\\u{1FB75}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-2\n '\\u{1FB77}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-3\n '\\u{1FB78}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-4\n '\\u{1FB79}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-5\n '\\u{1FB7A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-6\n '\\u{1FB7B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB7C}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7D}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7F}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // UPPER AND LOWER ONE EIGHTH BLOCK\n\n // Window title bar (1FB81-1FB81)\n '\\u{1FB81}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-1358\n\n // Block elements (1FB82-1FB8B)\n '\\u{1FB82}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 2 }] }, // UPPER ONE QUARTER BLOCK\n '\\u{1FB83}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 3 }] }, // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB84}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 5 }] }, // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB85}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 6 }] }, // UPPER THREE QUARTERS BLOCK\n '\\u{1FB86}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 7 }] }, // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB87}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 2, h: 8 }] }, // RIGHT ONE QUARTER BLOCK\n '\\u{1FB88}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 3, h: 8 }] }, // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB89}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 5, h: 8 }] }, // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB8A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 6, h: 8 }] }, // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 7, h: 8 }] }, // RIGHT SEVEN EIGHTHS B0OCK\n\n // Rectangular shade characters (1FB8C-1FB94)\n '\\u{1FB8C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LEFT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n '\\u{1FB8D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // RIGHT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0.5,0 L1,0 L1,1 L0.5,1 Z' },\n '\\u{1FB8E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n '\\u{1FB8F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n '\\u{1FB90}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // INVERSE MEDIUM SHADE\n [0, 1],\n [1, 0]\n ] },\n '\\u{1FB91}': [ // UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }\n ],\n '\\u{1FB92}': [ // UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }\n ],\n // 1FB93 is \n '\\u{1FB94}': [ // LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }\n ],\n\n // Fill characters (1FB95-1FB97)\n '\\u{1FB95}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // CHECKER BOARD FILL\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB96}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // INVERSE CHECKER BOARD FILL\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB97}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n { x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }\n ] },\n\n // Diagonal fill characters (1FB98-1FB99)\n '\\u{1FB98}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25', strokeWidth: 1 }, // UPPER LEFT TO LOWER RIGHT FILL\n '\\u{1FB99}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75', strokeWidth: 1 }, // UPPER RIGHT TO LOWER LEFT FILL\n\n // Smooth mosaic terminal graphic characters (1FB9A-1FB9B)\n '\\u{1FB9A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0', type: CustomGlyphVectorType.FILL } }, // UPPER AND LOWER TRIANGULAR HALF BLOCK\n '\\u{1FB9B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1', type: CustomGlyphVectorType.FILL } }, // LEFT AND RIGHT TRIANGULAR HALF BLOCK\n\n // Triangular shade characters (1FB9C-1FB9F)\n '\\u{1FB9C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L0,1 Z' },\n '\\u{1FB9D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,1 Z' },\n '\\u{1FB9E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M1,0 L1,1 L0,1 Z' },\n '\\u{1FB9F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,1 L0,1 Z' },\n\n // Character cell diagonals (1FBA0-1FBAE)\n '\\u{1FBA0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT\n '\\u{1FBA1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT\n '\\u{1FBAB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBAC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBAD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL DIAMOND\n\n // Light solid line with stroke (1FBAF-1FBAF)\n '\\u{1FBAF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} M.5,.35 L.5,.65`, strokeWidth: 1 }, // BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE\n\n // Terminal graphic characters (1FBB0-1FBB3)\n '\\u{1FBB0}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z', scaleType: CustomGlyphScaleType.CHAR }, // ARROWHEAD-SHAPED POINTER\n '\\u{1FBB1}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.1,.525 L.35,.675 L.9,.35', type: CustomGlyphVectorType.STROKE }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE CHECK MARK\n '\\u{1FBB2}': { type: CustomGlyphDefinitionType.PATH, data: 'M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13' }, // LEFT HALF RUNNING MAN\n '\\u{1FBB3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6' }, // RIGHT HALF RUNNING MAN\n\n // Arrows (1FBB4-1FBB8)\n // TODO: Improve all arrows, use hybrid approach\n '\\u{1FBB4}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS\n '\\u{1FBB5}': [ // LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB6}': [ // RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB7}': [ // DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB8}': [ // UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Terminal graphic characters (1FBB9-1FBBC)\n '\\u{1FBB9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z', type: CustomGlyphVectorType.FILL } }, // LEFT HALF FOLDER\n '\\u{1FBBA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT HALF FOLDER\n '\\u{1FBBB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // VOIDED GREEK CROSS\n '\\u{1FBBC}': [ // RIGHT OPEN SQUARED DOT\n { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z' },\n { type: CustomGlyphDefinitionType.PATH, data: 'M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5', scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Negative terminal graphic characters (1FBBD-1FBBF)\n '\\u{1FBBD}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL CROSS\n '\\u{1FBBE}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M1,.5 L.5,1', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBBF}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL DIAMOND\n\n // Terminal graphic characters (1FBC0-1FBCA)\n '\\u{1FBC0}': { type: CustomGlyphDefinitionType.PATH, data: 'M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', scaleType: CustomGlyphScaleType.CHAR }, // WHITE HEAVY SALTIRE WITH ROUNDED CORNERS\n // 1FBC1-1FBC4 is dervied from the Iosevka font (SIL OFL v1.1) https://github.com/be5invis/Iosevka\n '\\u{1FBC1}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z' }, // LEFT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC2}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z' }, // MIDDLE THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z' }, // RIGHT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC4}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z', scaleType: CustomGlyphScaleType.CHAR }, // NEGATIVE SQUARED QUESTION MARK\n '\\u{1FBC5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE\n '\\u{1FBC6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH ARMS RAISED\n '\\u{1FBC7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING LEFT\n '\\u{1FBC8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING RIGHT\n '\\u{1FBC9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH DRESS\n '\\u{1FBCA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE UP-POINTING CHEVRON\n\n // Terminal graphic characters (1FBCB-1FBCD)\n '\\u{1FBCB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE CROSS MARK\n '\\u{1FBCC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // RAISED SMALL LEFT SQUARE BRACKET\n '\\u{1FBCD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // BLACK SMALL UP-POINTING CHEVRON\n\n // Block elements (1FBCE-1FBCF)\n '\\u{1FBCE}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.6667,0 L0.6667,1 L0,1 Z' }, // LEFT TWO THIRDS BLOCK\n '\\u{1FBCF}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.3333,0 L0.3333,1 L0,1 Z' }, // LEFT ONE THIRD BLOCK\n\n // Character cell diagonals (1FBD0-1FBDF)\n '\\u{1FBD0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT\n '\\u{1FBD1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT\n '\\u{1FBD2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT\n '\\u{1FBD3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBD4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FBD5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBD6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE\n '\\u{1FBD7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT\n '\\u{1FBD8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT\n '\\u{1FBD9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT\n '\\u{1FBDC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT\n '\\u{1FBDD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBDE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBDF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT\n\n // Geometric shapes (1FBE0-1FBEF)\n '\\u{1FBE0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0', type: CustomGlyphVectorType.STROKE } }, // TOP JUSTIFIED LOWER HALF WHITE CIRCLE\n '\\u{1FBE1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1', type: CustomGlyphVectorType.STROKE } }, // RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE\n '\\u{1FBE2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1', type: CustomGlyphVectorType.STROKE } }, // BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE\n '\\u{1FBE3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1', type: CustomGlyphVectorType.STROKE } }, // LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE\n '\\u{1FBE4}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 4, h: 4 }] }, // UPPER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE5}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 4, w: 4, h: 4 }] }, // LOWER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE6}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 4, h: 4 }] }, // MIDDLE LEFT ONE QUARTER BLOCK\n '\\u{1FBE7}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 2, w: 4, h: 4 }] }, // MIDDLE RIGHT ONE QUARTER BLOCK\n '\\u{1FBE8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP JUSTIFIED LOWER HALF BLACK CIRCLE\n '\\u{1FBE9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE\n '\\u{1FBEA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE\n '\\u{1FBEB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z', type: CustomGlyphVectorType.FILL } }, // LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE\n '\\u{1FBEC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z', type: CustomGlyphVectorType.FILL } }, // TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBED}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE\n '\\u{1FBEE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBEF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE\n\n // Segmented digits (1FBF0-1FBF9)\n '\\u{1FBF0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111110), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ZERO (abcdef)\n '\\u{1FBF1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110000), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ONE (bc)\n '\\u{1FBF2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1101101), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT TWO (abdeg)\n '\\u{1FBF3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111001), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT THREE (abcdg)\n '\\u{1FBF4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FOUR (bcfg)\n '\\u{1FBF5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FIVE (acdfg)\n '\\u{1FBF6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SIX (acdefg)\n '\\u{1FBF7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1110010), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SEVEN (abcf)\n '\\u{1FBF8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT EIGHT (abcdefg)\n '\\u{1FBF9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT NINE (abcdfg)\n\n // Terminal graphic character (1FBFA-1FBFA)\n '\\u{1FBFA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // ALARM BELL SYMBOL\n\n // #endregion\n\n // #region Braille Patterns (2800-28FF)\n\n // https://www.unicode.org/charts/PDF/U2800.pdf\n\n // Braille patterns (2800-28FF)\n ...Object.fromEntries(\n Array.from({ length: 256 }, (_, i) => [\n String.fromCodePoint(0x2800 + i),\n { type: CustomGlyphDefinitionType.BRAILLE, data: i }\n ])\n ),\n\n // #endregion\n};\n\nexport const blockPatternCodepoints = new Set([\n // Shade characters (2591-2593)\n 0x2591,\n 0x2592,\n 0x2593,\n // Rectangular shade characters (1FB8C-1FB94)\n 0x1FB8C,\n 0x1FB8D,\n 0x1FB8E,\n 0x1FB8F,\n 0x1FB90,\n 0x1FB91,\n 0x1FB92,\n 0x1FB94,\n // Triangular shade characters (1FB9C-1FB9F)\n 0x1FB9C,\n 0x1FB9D,\n 0x1FB9E,\n 0x1FB9F\n]);\n\n/**\n * Generates a drawing function for sextant characters. Sextants are a 2x3 grid where each cell\n * can be on or off.\n * @param pattern A 6-bit pattern where bit 0 = top-left, bit 1 = top-right, bit 2 = middle-left,\n * bit 3 = middle-right, bit 4 = bottom-left, bit 5 = bottom-right\n */\nfunction sextant(pattern: number): { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: CustomGlyphPathDrawFunctionDefinition } {\n return {\n type: CustomGlyphDefinitionType.PATH_FUNCTION,\n data: () => {\n // Sextant grid: 2 columns, 3 rows\n // Row heights in 8ths: top=3, middle=2, bottom=3\n // Column widths: left=4, right=4\n const rects: string[] = [];\n const colW = 0.5; // Each column is half width\n const rowH = [3 / 8, 2 / 8, 3 / 8]; // Row heights as fractions\n const rowY = [0, 3 / 8, 5 / 8]; // Row Y positions\n\n for (let row = 0; row < 3; row++) {\n const leftBit = (pattern >> (row * 2)) & 1;\n const rightBit = (pattern >> (row * 2 + 1)) & 1;\n\n if (leftBit && rightBit) {\n // Full row\n rects.push(`M0,${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (leftBit) {\n rects.push(`M0,${rowY[row]} L${colW},${rowY[row]} L${colW},${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (rightBit) {\n rects.push(`M${colW},${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L${colW},${rowY[row] + rowH[row]} Z`);\n }\n }\n return rects.join(' ');\n }\n };\n}\n\n/**\n * Generates SVG path data for a 7-segment display digit.\n *\n * Segment mapping (bit positions):\n *\n * - bit 6: a (top)\n * - bit 5: b (upper right)\n * - bit 4: c (lower right)\n * - bit 3: d (bottom)\n * - bit 2: e (lower left)\n * - bit 1: f (upper left)\n * - bit 0: g (middle)\n *\n * ```\n * ─a─\n * │ │\n * f b\n * ─g─\n * e c\n * │ │\n * ─d─\n * ```\n */\nfunction segmentedDigit(pattern: number): string {\n const paths: string[] = [];\n\n // Each segment should have approximately the same stroke width, this is somewhat difficult to be\n // precise since coordinates are 0-1 of the whole cell (percentage-based). To handle this, the\n // fact that terminal cells are typically sized at ~2:1 (height:width) is leveraged.\n // for horizontal vs vertical to make segments appear the same thickness\n const segW = 0.15; // Width of vertical segments (fraction of cell width)\n const segH = 0.075; // Height of horizontal segments (fraction of cell height, ~half of segW for 2:1 cells)\n const padX = 0.05; // Horizontal padding from edge\n const padY = 0.175; // Vertical padding from edge (35% total = 65% height)\n const gap = 0.015; // Gap between segments\n const taperX = segW / 2; // Horizontal taper for vertical segments\n const taperY = segH / 2; // Vertical taper for horizontal segments\n\n const left = padX;\n const right = 1 - padX;\n const top = padY;\n const bottom = 1 - padY;\n const midY = 0.5;\n\n // Segment a (top horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b1000000) {\n const y1 = top;\n const y2 = top + segH / 2;\n const y3 = top + segH;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment b (upper right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0100000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment c (lower right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0010000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment d (bottom horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0001000) {\n const y1 = bottom - segH;\n const y2 = bottom - segH / 2;\n const y3 = bottom;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment e (lower left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000100) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment f (upper left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000010) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment g (middle horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0000001) {\n const y1 = midY - segH / 2;\n const y2 = midY;\n const y3 = midY + segH / 2;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n\n return paths.join(' ');\n}\n\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\nimport { customGlyphDefinitions } from './CustomGlyphDefinitions';\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition, type CustomGlyphPatternDefinition, type ICustomGlyphSolidOctantBlockVector, type ICustomGlyphVectorShape } from './Types';\n\ntype PatternCanvas = HTMLCanvasElement | OffscreenCanvas;\ntype PatternCanvasFactory = (width: number, height: number) => PatternCanvas;\n\nconst createOffscreenPatternCanvas: PatternCanvasFactory | undefined = typeof OffscreenCanvas === 'undefined'\n ? undefined\n : (width, height) => new OffscreenCanvas(width, height);\n\nconst createDomPatternCanvas: PatternCanvasFactory = (width, height) => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n};\n\nexport function createPatternCanvas(\n width: number,\n height: number,\n offscreenCanvasFactory: PatternCanvasFactory | undefined = createOffscreenPatternCanvas,\n domCanvasFactory: PatternCanvasFactory = createDomPatternCanvas\n): PatternCanvas {\n return offscreenCanvasFactory?.(width, height) ?? domCanvasFactory(width, height);\n}\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomGlyph(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): boolean {\n const unifiedCharDefinition = customGlyphDefinitions[c];\n if (unifiedCharDefinition) {\n // Normalize to array for uniform handling\n const parts = Array.isArray(unifiedCharDefinition) ? unifiedCharDefinition : [unifiedCharDefinition];\n for (const part of parts) {\n drawDefinitionPart(ctx, part, xOffset, yOffset, deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, fontSize, devicePixelRatio, logService, backgroundColor, variantOffset);\n }\n return true;\n }\n\n return false;\n}\n\nfunction drawDefinitionPart(\n ctx: CanvasRenderingContext2D,\n part: CustomGlyphDefinitionPart,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): void {\n // Handle scaleType - adjust dimensions and offset when scaling to character area\n let drawWidth = deviceCellWidth;\n let drawHeight = deviceCellHeight;\n let drawXOffset = xOffset;\n let drawYOffset = yOffset;\n if (part.scaleType === CustomGlyphScaleType.CHAR) {\n drawWidth = deviceCharWidth;\n drawHeight = deviceCharHeight;\n // Center the character within the cell\n drawXOffset = xOffset + (deviceCellWidth - deviceCharWidth) / 2;\n drawYOffset = yOffset + (deviceCellHeight - deviceCharHeight) / 2;\n }\n\n // Handle clipPath generically for any definition type\n if (part.clipPath) {\n ctx.save();\n applyClipPath(ctx, part.clipPath, drawXOffset, drawYOffset, drawWidth, drawHeight);\n }\n\n switch (part.type) {\n case CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR:\n drawBlockVectorChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n case CustomGlyphDefinitionType.BLOCK_PATTERN:\n drawPatternChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, variantOffset);\n break;\n case CustomGlyphDefinitionType.PATH_FUNCTION:\n drawPathFunctionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, logService, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH:\n drawPathDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH_NEGATIVE:\n drawPathNegativeDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, backgroundColor);\n break;\n case CustomGlyphDefinitionType.VECTOR_SHAPE:\n drawVectorShape(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, fontSize, devicePixelRatio, logService);\n break;\n case CustomGlyphDefinitionType.BRAILLE:\n drawBrailleCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n }\n\n if (part.clipPath) {\n ctx.restore();\n }\n}\n\nfunction drawBlockVectorChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphSolidOctantBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\n/**\n * Braille dot positions in octant coordinates (x, y for center of each dot area)\n * Columns: left=1-2, right=5-6 (leaving 0 and 7 as margins, 3-4 as gap)\n * Rows: 0-1, 2-3, 4-5, 6-7 for the 4 rows\n */\nconst brailleDotPositions = new Uint8Array([\n 1, 0, // dot 1 - bit 0\n 1, 2, // dot 2 - bit 1\n 1, 4, // dot 3 - bit 2\n 5, 0, // dot 4 - bit 3\n 5, 2, // dot 5 - bit 4\n 5, 4, // dot 6 - bit 5\n 1, 6, // dot 7 - bit 6\n 5, 6, // dot 8 - bit 7\n]);\n\n/**\n * Draws a braille pattern\n */\nfunction drawBrailleCharacter(\n ctx: CanvasRenderingContext2D,\n pattern: number,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n const xEighth = deviceCellWidth / 8;\n const paddingY = deviceCellHeight * 0.1;\n const usableHeight = deviceCellHeight * 0.8;\n const yEighth = usableHeight / 8;\n const radius = Math.min(xEighth, yEighth);\n\n for (let bit = 0; bit < 8; bit++) {\n if (pattern & (1 << bit)) {\n const x = brailleDotPositions[bit * 2];\n const y = brailleDotPositions[bit * 2 + 1];\n const cx = xOffset + (x + 1) * xEighth;\n const cy = yOffset + paddingY + (y + 1) * yEighth;\n ctx.beginPath();\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n}\n\nfunction drawPathDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: CustomGlyphPathDrawFunctionDefinition | string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n strokeWidth?: number\n): void {\n const instructions = typeof charDefinition === 'string' ? charDefinition : charDefinition(0, 0);\n ctx.beginPath();\n let currentX = 0;\n let currentY = 0;\n let lastControlX = 0;\n let lastControlY = 0;\n let lastCommand = '';\n for (const instruction of instructions.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (type === 'Z') {\n ctx.closePath();\n lastCommand = type;\n continue;\n }\n if (type === 'V') {\n const y = yOffset + parseFloat(args[0]) * deviceCellHeight;\n ctx.lineTo(currentX, y);\n currentY = y;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (type === 'H') {\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n ctx.lineTo(x, currentY);\n currentX = x;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (!args[0] || !args[1]) {\n continue;\n }\n if (type === 'A') {\n // SVG arc: A rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y\n const rx = parseFloat(args[0]) * deviceCellWidth;\n const ry = parseFloat(args[1]) * deviceCellHeight;\n const xAxisRotation = parseFloat(args[2]) * Math.PI / 180;\n const largeArcFlag = parseInt(args[3], 10);\n const sweepFlag = parseInt(args[4], 10);\n const x = xOffset + parseFloat(args[5]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[6]) * deviceCellHeight;\n drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);\n currentX = x;\n currentY = y;\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'Q') {\n ctx.quadraticCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3]);\n lastControlX = translatedArgs[0];\n lastControlY = translatedArgs[1];\n currentX = translatedArgs[2];\n currentY = translatedArgs[3];\n } else if (type === 'T') {\n // T uses reflection of last control point if previous command was Q or T\n let cpX: number;\n let cpY: number;\n if (lastCommand === 'Q' || lastCommand === 'T') {\n cpX = 2 * currentX - lastControlX;\n cpY = 2 * currentY - lastControlY;\n } else {\n cpX = currentX;\n cpY = currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, translatedArgs[0], translatedArgs[1]);\n lastControlX = cpX;\n lastControlY = cpY;\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n } else if (type === 'C') {\n ctx.bezierCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3], translatedArgs[4], translatedArgs[5]);\n lastControlX = translatedArgs[2];\n lastControlY = translatedArgs[3];\n currentX = translatedArgs[4];\n currentY = translatedArgs[5];\n }\n lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n}\n\n/**\n * Converts SVG arc parameters to canvas arc/ellipse calls.\n * Based on the SVG spec's endpoint to center parameterization conversion.\n */\nfunction drawSvgArc(\n ctx: CanvasRenderingContext2D,\n x1: number, y1: number,\n rx: number, ry: number,\n phi: number,\n largeArcFlag: number,\n sweepFlag: number,\n x2: number, y2: number\n): void {\n // Handle degenerate cases\n if (rx === 0 || ry === 0) {\n ctx.lineTo(x2, y2);\n return;\n }\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: Compute (x1', y1')\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Step 2: Compute (cx', cy')\n let rxSq = rx * rx;\n let rySq = ry * ry;\n const x1pSq = x1p * x1p;\n const y1pSq = y1p * y1p;\n\n // Correct radii if necessary\n const lambda = x1pSq / rxSq + y1pSq / rySq;\n if (lambda > 1) {\n const lambdaSqrt = Math.sqrt(lambda);\n rx *= lambdaSqrt;\n ry *= lambdaSqrt;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);\n if (sq < 0) sq = 0;\n const coef = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(sq);\n const cxp = coef * (rx * y1p / ry);\n const cyp = coef * -(ry * x1p / rx);\n\n // Step 3: Compute (cx, cy) from (cx', cy')\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: Compute angles\n const ux = (x1p - cxp) / rx;\n const uy = (y1p - cyp) / ry;\n const vx = (-x1p - cxp) / rx;\n const vy = (-y1p - cyp) / ry;\n\n const startAngle = Math.atan2(uy, ux);\n let dTheta = Math.atan2(vy, vx) - startAngle;\n\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta -= 2 * Math.PI;\n } else if (sweepFlag === 1 && dTheta < 0) {\n dTheta += 2 * Math.PI;\n }\n\n const endAngle = startAngle + dTheta;\n\n ctx.ellipse(cx, cy, rx, ry, phi, startAngle, endAngle, sweepFlag === 0);\n}\n\n/**\n * Draws a \"negative\" path where the background color is used to draw the shape on top of a\n * foreground-filled cell. This creates the appearance of a cutout without using actual\n * transparency, which allows SPAA (subpixel anti-aliasing) to work correctly.\n *\n * @param ctx The canvas rendering context (fillStyle should be set to foreground color)\n * @param charDefinition The vector shape definition for the negative shape\n * @param xOffset The x offset to draw at\n * @param yOffset The y offset to draw at\n * @param deviceCellWidth The width of the cell in device pixels\n * @param deviceCellHeight The height of the cell in device pixels\n * @param devicePixelRatio The device pixel ratio\n * @param backgroundColor The background color to use for the \"cutout\" portion\n */\nfunction drawPathNegativeDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n backgroundColor?: string\n): void {\n ctx.save();\n\n // First, fill the entire cell with foreground color\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n\n // Then draw the \"negative\" shape with the background color\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.strokeStyle = backgroundColor;\n }\n\n ctx.lineWidth = devicePixelRatio;\n ctx.lineCap = 'square';\n ctx.beginPath();\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n if (type === 'Z') {\n ctx.closePath();\n }\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n }\n }\n\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.stroke();\n } else {\n ctx.fill();\n }\n\n ctx.restore();\n}\n\nconst cachedPatterns: Map> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n variantOffset: number = 0\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n // The atlas canvas can be adopted into another document, so temporary resources must not use\n // its mutable ownerDocument.\n const tmpCanvas = createPatternCanvas(width, height);\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n // Apply pattern offset to ensure seamless tiling across cells when cell dimensions are odd.\n // variantOffset encodes: bit 1 = x pixel shift, bit 0 = y pixel shift.\n const dx = (variantOffset >> 1) & 1;\n const dy = variantOffset & 1;\n if (dx !== 0 || dy !== 0) {\n pattern.setTransform(new DOMMatrix().translateSelf(-dx, -dy));\n } else {\n pattern.setTransform(new DOMMatrix());\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\nfunction drawPathFunctionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: string | ((xp: number, yp: number) => string),\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n logService: ILogService,\n strokeWidth?: number\n): void {\n ctx.save();\n ctx.beginPath();\n ctx.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip();\n\n ctx.beginPath();\n let actualInstructions: string;\n if (typeof charDefinition === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = charDefinition(xp, yp);\n } else {\n actualInstructions = charDefinition;\n }\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio, 0, 0, false), state);\n state.lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n ctx.restore();\n}\n\n/**\n * Applies a clip path to the canvas context from SVG-like path instructions.\n */\nfunction applyClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n ctx.beginPath();\n for (const instruction of clipPath.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[1]) * deviceCellHeight;\n if (type === 'M') {\n ctx.moveTo(x, y);\n } else if (type === 'L') {\n ctx.lineTo(x, y);\n }\n }\n ctx.clip();\n}\n\nfunction drawVectorShape(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ), state);\n state.lastCommand = type;\n }\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\ninterface ISvgPathState {\n currentX: number;\n currentY: number;\n lastControlX: number;\n lastControlY: number;\n lastCommand: string;\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: (ctx: CanvasRenderingContext2D, args: number[], state: ISvgPathState) => void } = {\n 'C': (ctx, args, state) => {\n ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]);\n state.lastControlX = args[2];\n state.lastControlY = args[3];\n state.currentX = args[4];\n state.currentY = args[5];\n },\n 'L': (ctx, args, state) => {\n ctx.lineTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'M': (ctx, args, state) => {\n ctx.moveTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'Q': (ctx, args, state) => {\n ctx.quadraticCurveTo(args[0], args[1], args[2], args[3]);\n state.lastControlX = args[0];\n state.lastControlY = args[1];\n state.currentX = args[2];\n state.currentY = args[3];\n },\n 'T': (ctx, args, state) => {\n let cpX: number;\n let cpY: number;\n if (state.lastCommand === 'Q' || state.lastCommand === 'T') {\n cpX = 2 * state.currentX - state.lastControlX;\n cpY = 2 * state.currentY - state.lastControlY;\n } else {\n cpX = state.currentX;\n cpY = state.currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, args[0], args[1]);\n state.lastControlX = cpX;\n state.lastControlY = cpY;\n state.currentX = args[0];\n state.currentY = args[1];\n }\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0, clampToCell: boolean = true): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[x] !== 0) {\n const rounded = Math.round(result[x] + 0.5) - 0.5;\n result[x] = clampToCell ? clamp(rounded, cellWidth, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[y] !== 0) {\n const rounded = Math.round(result[y] + 0.5) - 0.5;\n result[y] = clampToCell ? clamp(rounded, cellHeight, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from '../CharAtlasCache';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TEXT_BASELINE } from '../Constants';\nimport type { ITextureAtlas } from '../Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this._register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this._register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr, 2048);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from '../CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this._register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this._register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IWebglAddonOptions, WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { Emitter, EventUtils } from 'common/Event';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon, IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n private readonly _customGlyphs: boolean;\n private readonly _preserveDrawingBuffer?: boolean;\n\n constructor(options?: IWebglAddonOptions) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('WebGL2 is only supported on Safari 16 and above');\n }\n }\n super();\n this._customGlyphs = options?.customGlyphs ?? true;\n this._preserveDrawingBuffer = options?.preserveDrawingBuffer;\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this._register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n this._renderer = this._register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n logService,\n optionsService,\n themeService,\n this._customGlyphs,\n this._preserveDrawingBuffer\n ));\n this._register(EventUtils.forward(this._renderer.onContextLoss, this._onContextLoss));\n this._register(EventUtils.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this._register(EventUtils.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this._register(EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this._register(toDisposable(() => {\n if ((this._terminal as any)._core._store._isDisposed) {\n return;\n }\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","node","type","handler","useCapture","addDisposableListener","domNode","bb","getBoundingClientRect","win","getWindow","left","scrollX","top","scrollY","width","height","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","push","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","length","sort","shift","execute","animationFrameRunner","Async_1","__webpack_require__","e","candidateNode","ownerDocument","defaultView","candidateEvent","view","window","DomListener","constructor","options","this","_node","_type","_handler","_options","addEventListener","dispose","removeEventListener","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","console","error","a","b","animationFrameState","Map","get","set","WindowIntervalTimer","IntervalTimer","super","_defaultTarget","undefined","cancelAndSet","interval","INVERTED_DEFAULT_COLOR","isPowerlineGlyph","codepoint","isEmoji","value","Error","glyphSizeX","deviceCellWidth","Math","ceil","isNerdFontGlyph","isBoxOrBlockGlyph","css","canvas","cell","device","char","cellWidth","lineWidth","currentOffset","round","SelectionRenderModel","clear","hasSelection","columnSelectMode","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startCol","endCol","selectionStart","selectionEnd","update","terminal","start","end","viewportY","buffers","active","ydisp","max","min","rows","isCellSelected","x","y","buffer","Lifecycle_1","TextBlinkStateManager","Disposable","_renderCallback","_coreBrowserService","_optionsService","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","_register","onSpecificOptionChange","duration","setIntervalDuration","rawOptions","blinkIntervalDuration","toDisposable","_clearInterval","isBlinkOn","isEnabled","setNeedsBlinkInViewport","needsBlinkInViewport","_updateIntervalState","setViewportVisible","isVisible","_interval","wasBlinkOn","setInterval","clearInterval","millis","Promise","resolve","setTimeout","timeout","store","timer","disposable","clearTimeout","add","_token","_isDisposed","cancel","setIfNotSet","_isScheduled","queueMicrotask","_disposable","context","handle","$r","$g","$b","$a","channels","color","rgb","rgba","toPaddedHex","c","s","toString","contrastRatio","l1","l2","NULL_COLOR","toCss","r","g","toRgba","toColor","color_1","opacity","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","document","createElement","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","EventUtils","_listeners","_disposed","event","_event","listener","thisArgs","disposables","entry","fn","idx","indexOf","splice","Array","isArray","fire","call","listeners","i","len","forward","from","to","map","any","events","DisposableStore","runAndSubscribe","initial","arg","d","_disposables","Set","isDisposed","o","_store","None","Object","freeze","_value","TwoKeyMap","_data","first","second","third","fourth","_targetWindow","isSafari","majorVersion","userAgent","isNode","process","navigator","startsWith","platform","isFirefox","includes","isChrome","isLegacyEdge","test","isMac","isWindows","isLinux","isChromeOS","TaskQueue","logService","_tasks","_i","_logService","enqueue","task","_start","flush","_idleCallback","_cancelCallback","_requestCallback","_process","bind","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","performance","now","warn","abs","PriorityTaskQueue","callback","_createDeadline","identifier","IdleTaskQueue","requestIdleCallback","cancelIdleCallback","_queue","AttributeData","extended","ExtendedAttrs","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","hasExtendedAttrs","underlineStyle","isBlink","isInvisible","isItalic","isDim","isStrikethrough","isProtected","isOverline","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","getFgColor","getBgColor","updateExtended","isEmpty","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","ext","_urlId","_ext","urlId","val","TextDecoder_1","Constants_1","AttributeData_1","CellData","content","combinedData","fromCharData","obj","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","charCodeAt","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","code","CHAR_DATA_WIDTH_INDEX","getAsCharData","attributesEquals","other","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","String","fromCharCode","_interim","decode","input","target","size","startPos","interim","Uint8Array","fill","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","missing","fourStop","Color_1","RendererUtils_1","CustomGlyphDefinitions_1","$colors","$fg","$bg","$hasFg","$hasBg","$isSelected","$variantOffset","_terminal","_optionService","_selectionRenderModel","_decorationService","_themeService","deviceCellHeight","colors","floor","fontSize","dpr","blockPatternCodepoints","has","forEachDecorationAtCell","backgroundColorRGB","foregroundColorRGB","ansi","foreground","isFocused","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","selectionForeground","treatGlyphAsBackgroundColor","background","deviceCharWidth","deviceCharHeight","devicePixelRatio","deviceMaxTextureSize","customGlyphs","newConfig","CharAtlasUtils_1","generateConfig","charAtlasCache","ownedByIndex","ownedBy","configEquals","config","atlas","core","_core","newEntry","TextureAtlas_1","TextureAtlas","unicodeService","index","clonedColors","cursor","cursorAccent","selectionBackgroundTransparent","selectionInactiveBackgroundTransparent","overviewRulerBorder","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","contrastCache","halfContrastCache","letterSpacing","lineHeight","fontFamily","fontWeight","fontWeightBold","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","Platform_1","DIM_OPACITY","TEXT_BASELINE","_isIdlePaused","isCursorVisible","_restartInterval","_resetIdleTimer","isPaused","_blinkStartTimeout","_blinkInterval","_animationFrame","cancelAnimationFrame","_idleTimeout","restartBlinkAnimation","_animationTimeRestarted","Date","timeToStart","time","pause","resume","_stopBlinkingDueToIdle","element","parentWindow","observer","ResizeObserver","entries","find","disconnect","devicePixelContentBoxSize","inlineSize","blockSize","observe","box","WebglUtils_1","$glyph","$i","$leftCellPadding","$clippedPixels","GlyphRenderer","_gl","_dimensions","_lastSeenPageLayoutVersion","_pageOverflowWarned","_activeBuffer","_vertices","count","attributes","Float32Array","attributesBuffers","gl","maxAtlasPages","throwIfFalsy","getParameter","MAX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","_program","createProgram","maxFragmentShaderTextureUnits","textureConditionals","createFragmentShaderSource","deleteProgram","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","vertexArrayObject","_vertexArrayObject","createVertexArray","deleteVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","deleteBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","BYTES_PER_ELEMENT","useProgram","textureUnits","Int32Array","uniform1iv","uniformMatrix4fv","PROJECTION_MATRIX","_atlasTextures","glTexture","GLTexture","createTexture","deleteTexture","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","RGBA","UNSIGNED_BYTE","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","handleResize","beginFrame","_atlas","pageLayoutVersion","updateCell","chars","lastBg","_updateCell","array","cols","getRasterizedGlyphCombinedChar","getRasterizedGlyph","offset","texturePage","texturePositionClipSpace","pages","sizeClipSpace","rescaleOverlappingGlyphs","allowRescaling","newCount","viewport","uniform2f","render","renderModel","activeBuffer","bufferLength","lineLengths","si","sub","subarray","STREAM_DRAW","pageCount","version","_bindAtlasPageTexture","drawElementsInstanced","TRIANGLE_STRIP","setAtlas","invalidateAtlasTextures","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_MAG_FILTER","setDimensions","dimensions","BYTES_PER_RECTANGLE","Vertices","$rgba","$x1","$y1","RectangleRenderer","_verticesCursor","_updateCachedColors","onChangeColors","_updateViewportRectangle","renderBackgrounds","_renderVertices","renderCursor","vertices","DYNAMIC_DRAW","_bgFloat","_colorToFloat32Array","_cursorFloat","_addRectangleFloat","updateBackgrounds","model","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","rectangleCount","cells","_updateRectangle","updateCursor","style","cursorWidth","startX","endX","expandFloat32Array","_addRectangle","x1","y1","SelectionRenderModel_1","COMBINED_CHAR_BIT_MASK","Uint32Array","selection","createSelectionRenderModel","resize","indexCount","CustomGlyphRasterizer_1","MultiKeyMap_1","TaskQueue_1","Constants_2","Event_1","NULL_RASTERIZED_GLYPH","texturePosition","_pages","_document","_config","_unicodeService","_didWarmUp","_cacheMap","FourKeyMap","_cacheMapCombined","_activePages","_workBoundingBox","bottom","right","_workAttributeData","_textureSize","_onAddTextureAtlasCanvas","Emitter","onAddTextureAtlasCanvas","_onRemoveTextureAtlasCanvas","onRemoveTextureAtlasCanvas","_pageLayoutVersion","_createNewPage","_tmpCanvas","createCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","alpha","remove","page","warmUp","_doWarmUp","queue","rasterizedGlyph","_drawToCache","clearTexture","currentRow","pagesBySize","filter","percentageUsed","sameSizeI","mergingPages","some","p","_evictAllPages","newPage","AtlasPage","sortedMergingPagesIndexes","glyphs","mergedPageIndex","mergedPage","_mergePages","nextVersion","_deletePage","mergedSize","xOffset","yOffset","drawImage","pageIndex","j","adjustingPage","startTime","_overflowSizePage","debug","toFixed","restrictToCellHeight","domContainer","_getFromCacheMap","cacheMap","key","_getColorFromAnsiIndex","_getBackgroundColor","bgColorMode","bgColor","dim","arr","_getForegroundColor","fgColorMode","fgColor","bold","excludeFromContrastRatioDemands","minimumContrastColor","_getMinimumContrastColor","_resolveBackgroundRgba","_resolveForegroundRgba","cache","_getContrastCache","adjustedColor","getColor","setColor","codeOrChars","parentElement","display","append","allowedWidth","allowedHeight","save","italic","underline","strikethrough","overline","temp","temp2","backgroundColor","fontStyle","font","textBaseline","powerlineGlyph","restrictedPowerlineGlyph","isRestrictedPowerlineGlyph","foregroundColor","padding","customGlyph","variantOffset","tryDrawCustomGlyph","chWidth","enableClearThresholdCheck","wcwidth","getStringCellWidth","strokeStyle","join","beginPath","xLeft","yTopDefault","yBotDefault","nextOffset","yTop","yBot","wasFilled","xChLeft","xChRight","moveTo","lineTo","clipRegion","Path2D","rect","clip","scaleX","scaleY","polygons","polygon","closePath","offsetWidth","setLineDash","computeNextVariantOffset","lineRatio","gapRatio","xChWidth","line","gap","stroke","restore","metrics","measureText","actualBoundingBoxDescent","strokeText","fillText","isBeyondCellBounds","clearColor","imageData","checkCompletelyTransparent","_findGlyphBoundingBox","activePage","activeRow","row","fixedRows","wasPageAndRowFound","candidatePage","putImageData","addGlyph","boundingBox","restrictedGlyph","found","alphaOffset","_usedPixels","_glyphs","glyph","sourcePages","concat","clearRect","enableThresholdCheck","threshold","CellColorResolver_1","CharAtlasCache_1","CursorBlinkStateManager_1","DevicePixelObserver_1","CellData_1","TextBlinkStateManager_1","GlyphRenderer_1","RectangleRenderer_1","RenderModel_1","LinkRenderLayer_1","Dom_1","WebglRenderer","_characterJoinerService","_charSizeService","_coreService","_customGlyphs","preserveDrawingBuffer","_cursorBlinkStateManager","MutableDisposable","_charAtlasDisposable","_observerDisposable","_model","RenderModel","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_workCell","_rectangleRenderer","_glyphRenderer","_onChangeTextureAtlas","onChangeTextureAtlas","_onRequestRedraw","onRequestRedraw","_onContextLoss","onContextLoss","_canvas","mainDocument","contextAttributes","antialias","depth","_handleColorChange","_cellColorResolver","CellColorResolver","_renderLayers","LinkRenderLayer","screenElement","linkifier","createRenderDimensions","_devicePixelRatio","_updateDimensions","_updateCursorBlink","onOptionChange","_handleOptionsChanged","_textBlinkStateManager","_requestRedrawViewport","_resetBlinkingRowState","_deviceMaxTextureSize","preventDefault","_contextRestorationTimeout","removeTerminalFromCache","_initializeWebGLState","observeDevicePixelDimensions","w","h","_setCanvasDevicePixelDimensions","onWindowChange","appendChild","_isAttached","isConnected","l","removeChild","textureAtlas","_charAtlas","_refreshCharAtlas","_clearModel","handleDevicePixelRatioChange","sync","handleCharSizeChanged","handleBlur","handleFocus","handleViewportVisibilityChange","handleSelectionChanged","handleCursorMove","acquireTextureAtlas","combinedDisposable","clearGlyphRenderer","clearTextureAtlas","reset","renderRows","handleGridChanged","_updateModel","merged","mergeRetries","decPrivateModes","cursorBlink","CursorBlinkStateManager","_requestRedrawCursor","joinedRanges","isJoined","skipJoinedCheckUntilX","isValidJoinRange","lastCharX","range","isCursorRow","clamp","cursorStyle","cursorY","baseY","viewportRelativeCursorY","cursorX","lastCursorX","isCursorInitialized","isCursorHidden","modelUpdated","bufferLine","lines","_nullModelCell","_setRowBlinkState","rowHasBlinkingCells","getJoinedCharacters","loadCell","firstSelectionState","JoinedCellData","translateToString","cursorInactiveStyle","_updateTextBlinkState","cellIndex","hasBlinkingCells","firstCell","_width","vertexSource","fragmentSource","program","attachShader","createShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","source","newLength","newArray","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","deleteShader","GitBranchSymbolsParts","sextant","pattern","rects","rowH","rowY","leftBit","rightBit","segmentedDigit","paths","segW","taperX","taperY","segH","y2","y3","x2","x3","midY","LINE_H","strokeWidth","LINE_V","FADE_RIGHT","FADE_LEFT","FADE_DOWN","FADE_UP","CURVE_DOWN_RIGHT","xp","yp","CURVE_DOWN_LEFT","CURVE_UP_RIGHT","CURVE_UP_LEFT","NODE_FILL","NODE_STROKE","NODE_LINE_RIGHT","NODE_LINE_LEFT","NODE_LINE_DOWN","NODE_LINE_UP","customGlyphDefinitions","rightPadding","leftPadding","scaleType","clipPath","fromEntries","_","fromCodePoint","unifiedCharDefinition","parts","part","drawDefinitionPart","createOffscreenPatternCanvas","OffscreenCanvas","createDomPatternCanvas","createPatternCanvas","offscreenCanvasFactory","domCanvasFactory","drawWidth","drawHeight","drawXOffset","drawYOffset","instruction","split","args","substring","applyClipPath","charDefinition","xEighth","yEighth","drawBlockVectorChar","patternSet","cachedPatterns","tmpCanvas","tmpCtx","ImageData","createPattern","dx","dy","setTransform","DOMMatrix","translateSelf","drawPatternChar","actualInstructions","currentX","currentY","lastControlX","lastControlY","lastCommand","f","svgToCanvasInstructionMap","translateArgs","drawPathFunctionCharacter","instructions","rx","ry","xAxisRotation","PI","largeArcFlag","sweepFlag","drawSvgArc","translatedArgs","quadraticCurveTo","cpX","cpY","bezierCurveTo","drawPathDefinitionCharacter","lineCap","drawPathNegativeDefinitionCharacter","cssLineWidth","drawVectorShape","paddingY","radius","bit","cx","brailleDotPositions","cy","arc","drawBrailleCharacter","phi","cosPhi","cos","sinPhi","sin","x1p","y1p","rxSq","rySq","x1pSq","y1pSq","lambda","lambdaSqrt","sqrt","sq","coef","cxp","cyp","ux","uy","vx","vy","startAngle","atan2","dTheta","endAngle","ellipse","C","L","M","Q","T","cellHeight","doClamp","clampToCell","rounded","BaseRenderLayer","_container","id","zIndex","_alpha","_deviceCharWidth","_deviceCharHeight","_deviceCellWidth","_deviceCellHeight","_deviceCharLeft","_deviceCharTop","classList","_initCanvas","_ctx","_clearAll","startRow","endRow","_setTransparency","oldCanvas","cloneNode","replaceChild","colorSet","_fillBottomLineAtCells","_clearCells","_fillCharTrueColor","_getFont","_clipCell","BaseRenderLayer_1","container","linkifier2","coreBrowserService","optionsService","themeService","onShowLinkUnderline","_handleShowLinkUnderline","onHideLinkUnderline","_handleHideLinkUnderline","_state","_clearCurrentLink","middleRowCount","is256Color","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","WebglRenderer_1","WebglAddon","getSafariVersion","_preserveDrawingBuffer","activate","onWillOpen","coreService","unsafeCore","renderService","_renderService","characterJoinerService","charSizeService","decorationService","_renderer","setRenderer","_createRenderer"],"sourceRoot":""} +\ No newline at end of file ++{"version":3,"file":"addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/../src/browser/Dom.ts","webpack://WebglAddon/../src/browser/renderer/shared/Constants.ts","webpack://WebglAddon/../src/browser/renderer/shared/RendererUtils.ts","webpack://WebglAddon/../src/browser/renderer/shared/SelectionRenderModel.ts","webpack://WebglAddon/../src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://WebglAddon/../src/common/Async.ts","webpack://WebglAddon/../src/common/Color.ts","webpack://WebglAddon/../src/common/Event.ts","webpack://WebglAddon/../src/common/Lifecycle.ts","webpack://WebglAddon/../src/common/MultiKeyMap.ts","webpack://WebglAddon/../src/common/Platform.ts","webpack://WebglAddon/../src/common/TaskQueue.ts","webpack://WebglAddon/../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../src/common/buffer/CellData.ts","webpack://WebglAddon/../src/common/buffer/Constants.ts","webpack://WebglAddon/../src/common/input/TextDecoder.ts","webpack://WebglAddon/./src/CellColorResolver.ts","webpack://WebglAddon/./src/CharAtlasCache.ts","webpack://WebglAddon/./src/CharAtlasUtils.ts","webpack://WebglAddon/./src/Constants.ts","webpack://WebglAddon/./src/CursorBlinkStateManager.ts","webpack://WebglAddon/./src/DevicePixelObserver.ts","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/TextureAtlas.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/customGlyphs/CustomGlyphDefinitions.ts","webpack://WebglAddon/./src/customGlyphs/CustomGlyphRasterizer.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/buffer/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\nimport { blockPatternCodepoints } from './customGlyphs/CustomGlyphDefinitions';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number, deviceCellHeight: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n if ($variantOffset === 0 && blockPatternCodepoints.has(code)) {\n $variantOffset = ((x * deviceCellWidth) % 2) * 2 + ((y * deviceCellHeight) % 2);\n }\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from './TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from './Types';\nimport { generateConfig, configEquals } from './CharAtlasUtils';\nimport type { ILogService } from 'common/services/Services';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number,\n deviceMaxTextureSize: number,\n customGlyphs: boolean = true\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio, deviceMaxTextureSize, customGlyphs);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const logService = (core as any)._logService as ILogService;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService, logService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required, colors: ReadonlyColorSet, devicePixelRatio: number, deviceMaxTextureSize: number, customGlyphs: boolean = true): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs,\n devicePixelRatio,\n deviceMaxTextureSize,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.deviceMaxTextureSize === b.deviceMaxTextureSize &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCellWidth === b.deviceCellWidth &&\n a.deviceCellHeight === b.deviceCellHeight &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RendererConstants } from 'browser/renderer/shared/Constants';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\nconst enum Constants {\n /**\n * The time between cursor blinks.\n */\n BLINK_INTERVAL = 600,\n}\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n this._resetIdleTimer();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._resetIdleTimer();\n }\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = Constants.BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, Constants.BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n this._isIdlePaused = false;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this._resetIdleTimer();\n this.restartBlinkAnimation();\n }\n\n /**\n * Resets the idle timer. If the terminal is idle for the idle timeout period,\n * the cursor blinking will stop.\n */\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n }\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n /**\n * Stops cursor blinking due to idle timeout.\n */\n private _stopBlinkingDueToIdle(): void {\n // Make cursor visible and stop blinking\n this.isCursorVisible = true;\n this._isIdlePaused = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n // Clear the idle timeout as we've already acted on it\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n // Trigger a render to show the cursor in its final visible state\n this._renderCallback();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable, IDisposable } from 'common/Lifecycle';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { TextureAtlas } from './TextureAtlas';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { ILogService, IOptionsService } from 'common/services/Services';\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n // A v_texpage beyond the sampler budget matches no branch above. Leaving outColor unwritten\n // is undefined behaviour in GLSL ES and paints garbage, so fall through to transparent.\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals} else { outColor = vec4(0.0, 0.0, 0.0, 0.0); }\n}`);\n}\n\nconst enum Constants {\n INDICES_PER_CELL = 11,\n BYTES_PER_CELL = INDICES_PER_CELL * 4/* Float32Array.BYTES_PER_ELEMENT */,\n CELL_POSITION_INDICES = 2\n}\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _lastSeenPageLayoutVersion: number = -1;\n private _pageOverflowWarned: boolean = false;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages), this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, Constants.BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this._register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n /**\n * Call when a frame is being drawn. Returns whether the full model must be rebuilt before\n * rendering this frame because the atlas page layout changed since this renderer last drew.\n */\n public beginFrame(): boolean {\n if (!this._atlas) {\n return true;\n }\n if (this._atlas.pageLayoutVersion !== this._lastSeenPageLayoutVersion) {\n this._lastSeenPageLayoutVersion = this._atlas.pageLayoutVersion;\n return true;\n }\n return false;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a one-off for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * Constants.INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + Constants.INDICES_PER_CELL - 1 - Constants.CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false, this._terminal.element);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false, this._terminal.element);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * Constants.INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += Constants.INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n gl.uniform2f(this._resolutionLocation, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * Constants.INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * Constants.INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed. AtlasPage.version is globally\n // monotonic, so a page object swap at the same index (which happens after a page merge)\n // is detected by the same comparison.\n // Clamp defensively in case the atlas unexpectedly exceeds texture capacity.\n const pageCount = Math.min(this._atlas.pages.length, this._atlasTextures.length);\n if (this._atlas.pages.length > this._atlasTextures.length && !this._pageOverflowWarned) {\n this._pageOverflowWarned = true;\n this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`);\n }\n for (let i = 0; i < pageCount; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / Constants.INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n this._lastSeenPageLayoutVersion = -1;\n this.invalidateAtlasTextures();\n }\n\n public invalidateAtlasTextures(): void {\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RenderModelConstants } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource, this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this._register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RenderModelConstants.BG_OFFSET];\n fg = model.cells[modelIndex + RenderModelConstants.FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + INDICES_PER_RECTANGLE) {\n // +1 for the viewport-clear rectangle at offset 0.\n vertices.attributes = expandFloat32Array(vertices.attributes, (this._terminal.rows * this._terminal.cols + 1) * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const enum RenderModelConstants {\n INDICIES_PER_CELL = 4,\n BG_OFFSET = 1,\n FG_OFFSET = 2,\n EXT_OFFSET = 3\n}\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RenderModelConstants.INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { FontWeight } from '@xterm/xterm';\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from './Constants';\nimport { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { ILogService, IUnicodeService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n private _overflowSizePage: AtlasPage | undefined;\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transferred to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new Emitter();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new Emitter();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService,\n private readonly _logService: ILogService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n this._tmpCanvas.remove();\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n this._onRemoveTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue(this._logService);\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, false, undefined);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _pageLayoutVersion = 0;\n public get pageLayoutVersion(): number { return this._pageLayoutVersion; }\n\n // Orca diagnostics: read by terminal-render-desync-weight-probe.ts to tell a real\n // bold-collapse from a repaint problem. Canvas silently keeps its previous font when an\n // assignment fails to parse, which rasterizes glyphs at a stale weight.\n public fontProbeMismatchCount = 0;\n public fontProbeLastMismatch: { desired: string, actual: string } | undefined;\n\n public clearTexture(): void {\n // Guard on every page rather than pages[0]: a merged page is never written through\n // currentRow, so once one lands at index 0 the old check made every later clear a no-op.\n if (this._pages.every(page => page.glyphs.length === 0 && page.currentRow.x === 0 && page.currentRow.y === 0)) {\n return;\n }\n // Return the atlas to its constructor state instead of clearing in place: page.clear() leaves\n // page.glyphs populated, which would keep the guard above from ever firing again. Eviction\n // also bumps _pageLayoutVersion, so every renderer sharing this atlas rebuilds its model.\n this._evictAllPages();\n this._createNewPage();\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n\n // Only proceed with merge if we have exactly 4 same-sized pages. If not, we cannot\n // effectively reduce page count and merging would cause issues.\n if (mergingPages.length < 4 || mergingPages.some(p => p.canvas.width !== mergingPages[0].canvas.width)) {\n // Evict instead of adding a page beyond the renderer's texture capacity.\n this._evictAllPages();\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version = ++AtlasPage.nextVersion;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version = ++AtlasPage.nextVersion;\n }\n }\n\n private _evictAllPages(): void {\n const startTime = performance.now();\n const pageCount = this._pages.length;\n for (const page of this._pages) {\n this._onRemoveTextureAtlasCanvas.fire(page.canvas);\n page.canvas.remove();\n }\n this._pages.length = 0;\n this._activePages.length = 0;\n this._overflowSizePage = undefined;\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n this._pageLayoutVersion++;\n this._logService.debug(`Evicted ${pageCount} WebGL atlas pages in ${(performance.now() - startTime).toFixed(2)}ms`);\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean,\n domContainer: HTMLElement | undefined\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight, domContainer);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n // Ignore alpha channel when allowTransparency is false\n if (!this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor ?? undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n /**\n * Orca diagnostic. Canvas ignores a font assignment it cannot parse and silently keeps the\n * previous value, so a bad family or weight rasterizes every glyph at a stale weight. Record\n * the mismatch rather than correcting it: the goal is to tell that failure apart from a\n * repaint bug when a terminal renders bold-collapsed.\n */\n private _probeRasterizationFontWeight(fontWeight: FontWeight): void {\n const desired = String(fontWeight);\n // Only numeric weights are comparable; keywords round-trip through Canvas unchanged.\n if (!/^(?:[1-8]\\d{2}|900)$/.test(desired)) {\n return;\n }\n // Canvas normalizes font serialization: Chromium omits 400 and emits the keyword bold for 700.\n const token = this._tmpCtx.font.match(\n /(?:^|\\s)(normal|bold|[1-9]\\d{0,3})(?=\\s+\\d+(?:\\.\\d+)?px(?:\\s|$))/\n )?.[1] ?? '400';\n const actual = token === 'normal' ? '400' : token === 'bold' ? '700' : token;\n if (actual === desired) {\n return;\n }\n this.fontProbeMismatchCount++;\n this.fontProbeLastMismatch = { desired, actual: this._tmpCtx.font };\n try {\n (globalThis as { __orcaAtlasFontProbe?: (mismatch: { desired: string, actual: string }) => void })\n .__orcaAtlasFontProbe?.(this.fontProbeLastMismatch);\n } catch {\n // Diagnostics only; a throwing listener must never break rasterization.\n }\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Attach the canvas to the DOM in order to inherit font-feature-settings\n // from the parent elements. This is necessary for ligatures and variants to\n // work.\n if (domContainer && this._tmpCanvas.parentElement !== domContainer) {\n this._tmpCanvas.style.display = 'none';\n domContainer.append(this._tmpCanvas);\n }\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._config.deviceMaxTextureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._probeRasterizationFontWeight(fontWeight);\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n const variantOffset = this._workAttributeData.getUnderlineVariantOffset();\n customGlyph = tryDrawCustomGlyph(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.deviceCharWidth, this._config.deviceCharHeight, this._config.fontSize, this._config.devicePixelRatio, this._logService, backgroundColor.css, variantOffset);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n this._tmpCtx.fillStyle = this._tmpCtx.strokeStyle;\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTopDefault = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yBotDefault = yTopDefault + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n let yTop = 0;\n let yBot = 0;\n\n for (let i = 0; i < chWidth; i++) {\n let wasFilled = false;\n this._tmpCtx.save();\n yTop = yTopDefault;\n yBot = yBotDefault;\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n this._tmpCtx.moveTo(xChLeft, yBotDefault);\n this._tmpCtx.lineTo(xChRight, yBotDefault);\n break;\n case UnderlineStyle.CURLY:\n yTop = this._config.deviceCharHeight + 1;\n yBot = yTop + 3 * this._config.devicePixelRatio;\n\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n\n // Draw a zigzag pattern, this is derived from the SVG used in monaco for the same\n // style. The viewbox is 6x3 so scale it using that.\n const cellW = this._config.deviceCellWidth;\n const curlyH = (yBot - yTop);\n const scaleX = cellW / 6;\n const scaleY = curlyH / 3;\n\n const polygons: number[][] = [\n [0, 2, 1, 3, 2.4, 3, 0, 0.6],\n [5.5, 0, 2.5, 3, 1.1, 3, 4.1, 0],\n [4, 0, 6, 2, 6, 0.6, 5.4, 0],\n ];\n\n for (const polygon of polygons) {\n this._tmpCtx.beginPath();\n for (let i = 0; i < polygon.length; i += 2) {\n const x = xChLeft + polygon[i] * scaleX;\n const y = yBot - polygon[i + 1] * scaleY;\n if (i === 0) {\n this._tmpCtx.moveTo(x, y);\n } else {\n this._tmpCtx.lineTo(x, y);\n }\n }\n this._tmpCtx.closePath();\n this._tmpCtx.fill();\n }\n wasFilled = true;\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n }\n if (!wasFilled) {\n this._tmpCtx.stroke();\n }\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page for oversized glyphs as they come up\n if (rasterizedGlyph.size.x > this._textureSize) {\n if (!this._overflowSizePage) {\n // Make room for the oversized page without exceeding texture capacity.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) {\n this._evictAllPages();\n }\n this._overflowSizePage = new AtlasPage(this._document, this._config.deviceMaxTextureSize);\n this.pages.push(this._overflowSizePage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas);\n }\n activePage = this._overflowSizePage;\n activeRow = this._overflowSizePage.currentRow;\n // Move to next row if necessary\n if (activeRow.x + rasterizedGlyph.size.x >= activePage.canvas.width) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n }\n break;\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version = ++AtlasPage.nextVersion;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Monotonically increasing across all atlas pages globally. Used to detect when the texture\n * unit at a given index needs to be re-uploaded — both for content changes within the same\n * page and for a page object swap at the same index (which happens after a page merge,\n * where a per-page counter could coincide with the previously-bound page's value).\n */\n public static nextVersion: number = 0;\n public version = ++AtlasPage.nextVersion;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n if (sourcePages) {\n if (sourcePages.length === 4) {\n // optimized for quadmerge\n this._glyphs = this._glyphs.concat(\n sourcePages[0].glyphs,\n sourcePages[1].glyphs,\n sourcePages[2].glyphs,\n sourcePages[3].glyphs\n );\n this._usedPixels = sourcePages[0]._usedPixels +\n sourcePages[1]._usedPixels +\n sourcePages[2]._usedPixels +\n sourcePages[3]._usedPixels;\n } else {\n // fallback for non quadmerges (should never be used)\n for (let i = 0; i < sourcePages.length; ++i) {\n this._glyphs = this._glyphs.concat(sourcePages[i].glyphs);\n this._usedPixels += sourcePages[i]._usedPixels;\n }\n\n }\n }\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version = ++AtlasPage.nextVersion;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevant pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from './CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from './CharAtlasCache';\nimport { CursorBlinkStateManager } from './CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from './DevicePixelObserver';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { CharData, IBufferLine, ICellData } from 'common/buffer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RenderModel, RenderModelConstants } from './RenderModel';\nimport { IWebGL2RenderingContext, type ITextureAtlas } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\n\nconst enum Constants {\n MERGE_RETRY_LIMIT = 32\n}\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable = this._register(new MutableDisposable());\n private _textBlinkStateManager: TextBlinkStateManager;\n private _charAtlasDisposable = this._register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _deviceMaxTextureSize: number;\n private _observerDisposable = this._register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n private _workCell: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable = this._register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable = this._register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n private readonly _customGlyphs: boolean = true,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n // IMPORTANT: Canvas initialization and fetching of the context must be first in order to\n // prevent possible listeners leaking and continuing to operate after the WebglRenderer has been\n // discarded.\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this._register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this._register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._requestRedrawViewport(),\n this._coreBrowserService,\n this._optionsService\n ));\n this._resetBlinkingRowState();\n\n this._deviceMaxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE);\n\n this._register(addDisposableListener(this._canvas, 'webglcontextlost', (e) => {\n this._logService.debug('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n this._logService.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this._register(addDisposableListener(this._canvas, 'webglcontextrestored', (e) => {\n this._logService.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this._register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._register(addDisposableListener(this._coreBrowserService.mainDocument, 'mousedown', () => this._cursorBlinkStateManager.value?.restartBlinkAnimation()));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._core.screenElement!.isConnected;\n\n this._register(toDisposable(() => {\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n this._resetBlinkingRowState();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService, this._logService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService, this._logService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr,\n this._deviceMaxTextureSize,\n this._customGlyphs\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = combinedDisposable(\n EventUtils.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n EventUtils.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n );\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._resetBlinkingRowState();\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._core.screenElement?.isConnected && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // A mid-update atlas page merge invalidates vertex data and may not bump the host\n // page's version, so re-run the update and force a full texture rebind.\n let merged = false;\n let mergeRetries = 0;\n // Test the retry budget before beginFrame: beginFrame latches the page layout version it\n // observed, so tripping the limit after consuming it would strand a stale model with no\n // later frame able to notice it needs rebuilding.\n while (this._charAtlas && mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()) {\n merged = true;\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n }\n if (merged) {\n this._glyphRenderer.value.invalidateAtlasTextures();\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._coreService.decPrivateModes.cursorBlink ?? this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let skipJoinedCheckUntilX: number;\n let isValidJoinRange: boolean;\n let lastCharX: number;\n let range: [number, number];\n let isCursorRow: boolean;\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? terminal.options.cursorStyle ?? 'block';\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n const bufferLine = terminal.buffer.lines.get(row);\n if (!bufferLine) {\n this._model.lineLengths[y] = 0;\n for (x = 0; x < terminal.cols; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n modelUpdated = true;\n this._nullModelCell(x, y, j, 0, 0, 0);\n }\n this._setRowBlinkState(y, false);\n continue;\n }\n line = bufferLine;\n let rowHasBlinkingCells = false;\n this._model.lineLengths[y] = 0;\n isCursorRow = cursorY === row;\n skipJoinedCheckUntilX = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n range = joinedRanges.shift()!;\n\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._model.selection.isCellSelected(this._terminal, range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._model.selection.isCellSelected(this._terminal, i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n\n if (!rowHasBlinkingCells && cell.isBlink()) {\n rowHasBlinkingCells = true;\n }\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width, this.dimensions.device.cell.height);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ? cursorStyle : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n cursorStyle === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))\n ) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (this._textBlinkStateManager.isEnabled && !this._textBlinkStateManager.isBlinkOn && cell.isBlink()) {\n this._cellColorResolver.result.fg |= FgFlags.INVISIBLE;\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RenderModelConstants.BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RenderModelConstants.FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RenderModelConstants.BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RenderModelConstants.FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x <= lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n // Don't re-resolve the cell color since multi-colored ligature backgrounds are not\n // supported\n this._nullModelCell(x, y, j, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext);\n }\n x--; // Go back to the previous update cell for next iteration\n }\n }\n this._setRowBlinkState(y, rowHasBlinkingCells);\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n this._updateTextBlinkState();\n }\n\n private _nullModelCell(x: number, y: number, cellIndex: number, bg: number, fg: number, ext: number): void {\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, bg, fg, ext, NULL_CELL_CHAR, 0, 0);\n this._model.cells[cellIndex] = NULL_CELL_CODE;\n this._model.cells[cellIndex + RenderModelConstants.BG_OFFSET] = bg;\n this._model.cells[cellIndex + RenderModelConstants.FG_OFFSET] = fg;\n this._model.cells[cellIndex + RenderModelConstants.EXT_OFFSET] = ext;\n }\n\n private _resetBlinkingRowState(): void {\n this._rowHasBlinkingCells = new Array(this._terminal.rows).fill(false);\n this._rowHasBlinkingCellsCount = 0;\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may cause blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string, logService: ILogService): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource, logService)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource, logService)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n logService.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string, logService: ILogService): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n logService.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types';\n\n/* oxlint-disable @stylistic/max-len -- generated glyph path data */\n\nconst enum Shapes {\n /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nnamespace GitBranchSymbolsParts {\n // Lines\n export const LINE_H: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 });\n export const LINE_V: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 });\n\n // Fading lines\n export const FADE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5', strokeWidth: 1 });\n export const FADE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5', strokeWidth: 1 });\n export const FADE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90', strokeWidth: 1 });\n export const FADE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1', strokeWidth: 1 });\n\n // Curved corners\n export const CURVE_DOWN_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_DOWN_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n export const CURVE_UP_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_UP_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n\n // Node parts\n export const NODE_FILL: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5' });\n export const NODE_STROKE: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5', strokeWidth: 1 });\n export const NODE_LINE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M1,.5 L.85,.5', strokeWidth: 1 });\n export const NODE_LINE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M0,.5 L.15,.5', strokeWidth: 1 });\n export const NODE_LINE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,1 L.5,.7', strokeWidth: 1 });\n export const NODE_LINE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,0 L.5,.3', strokeWidth: 1 });\n}\n\nexport const customGlyphDefinitions: { [index: string]: CustomGlyphCharacterDefinition | undefined } = {\n // #region Box Drawing (2500-257F)\n\n // https://www.unicode.org/charts/PDF/U2500.pdf\n\n // Light and heavy solid lines (2500-2503)\n '─': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 },\n '━': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 },\n '│': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 },\n '┃': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 },\n\n // Light and heavy dashed lines (2504-250B)\n '┄': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 1 },\n '┅': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 3 },\n '┆': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 1 },\n '┇': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 3 },\n '┈': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 1 },\n '┉': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 3 },\n '┊': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 1 },\n '┋': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Light and heavy line box components (250C-254B)\n '┌': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 },\n '┍': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┎': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┏': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 },\n '┐': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 },\n '┑': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┒': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┓': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 },\n '└': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 },\n '┕': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┖': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┗': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 },\n '┘': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 },\n '┙': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┚': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┛': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 },\n '├': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 1 },\n '┝': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┞': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┟': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┠': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '┡': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '┢': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '┣': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 3 },\n '┤': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 1 },\n '┥': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┦': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┧': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┨': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '┩': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '┪': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '┫': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 3 },\n '┬': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 1 },\n '┭': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┮': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┯': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '┰': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '┱': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '┲': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '┳': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 3 },\n '┴': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 1 },\n '┵': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┶': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┷': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '┸': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '┹': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '┺': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '┻': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 3 },\n '┼': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 1 },\n '┽': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '┾': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '┿': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '╀': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '╁': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '╂': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '╃': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '╄': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '╅': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '╆': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '╇': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 3 }],\n '╈': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 3 }],\n '╉': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 3 }],\n '╊': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 3 }],\n '╋': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 3 },\n\n // Light and heavy dashed lines (254C-254F)\n '╌': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 1 },\n '╍': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 3 },\n '╎': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 1 },\n '╏': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Double lines (2550-2551)\n '═': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '║': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n\n // Light and double line box components (2552-256C)\n '╒': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╓': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '╔': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╕': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '╖': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1`, strokeWidth: 1 },\n '╗': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╘': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}`, strokeWidth: 1 },\n '╙': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '╚': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0`, strokeWidth: 1 },\n '╛': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}`, strokeWidth: 1 },\n '╜': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0`, strokeWidth: 1 },\n '╝': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╞': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╟': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5`, strokeWidth: 1 },\n '╠': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╡': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '╢': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '╣': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0`, strokeWidth: 1 },\n '╤': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1`, strokeWidth: 1 },\n '╥': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '╦': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '╧': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╨': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '╩': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '╪': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '╫': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '╬': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n\n // Character cell arcs (256D-2570)\n '╭': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n '╮': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '╯': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '╰': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n\n // Character cell diagonals (2571-2573)\n '╱': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1', strokeWidth: 1 },\n '╲': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,1', strokeWidth: 1 },\n '╳': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1 M0,0 L1,1', strokeWidth: 1 },\n\n // Light and heavy half lines (2574-257B)\n '╴': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 },\n '╵': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 },\n '╶': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 },\n '╷': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 },\n '╸': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 },\n '╹': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 },\n '╺': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 },\n '╻': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 },\n\n // Mixed light and heavy lines (257C-257F)\n '╼': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '╽': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '╾': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '╿': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n\n // #endregion\n\n // #region Block elements (2580-259F)\n\n // https://www.unicode.org/charts/PDF/U2580.pdf\n\n // Block elements (2580-2590)\n '▀': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }, // UPPER HALF BLOCK\n '▁': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 7, w: 8, h: 1 }] }, // LOWER ONE EIGHTH BLOCK\n '▂': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 2 }] }, // LOWER ONE QUARTER BLOCK\n '▃': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 3 }] }, // LOWER THREE EIGHTHS BLOCK\n '▄': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }, // LOWER HALF BLOCK\n '▅': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 5 }] }, // LOWER FIVE EIGHTHS BLOCK\n '▆': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 6 }] }, // LOWER THREE QUARTERS BLOCK\n '▇': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 7 }] }, // LOWER SEVEN EIGHTHS BLOCK\n '█': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 8 }] }, // FULL BLOCK (=solid -> 25A0=black square)\n '▉': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 7, h: 8 }] }, // LEFT SEVEN EIGHTHS BLOCK\n '▊': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 6, h: 8 }] }, // LEFT THREE QUARTERS BLOCK\n '▋': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 5, h: 8 }] }, // LEFT FIVE EIGHTHS BLOCK\n '▌': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }] }, // LEFT HALF BLOCK\n '▍': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 3, h: 8 }] }, // LEFT THREE EIGHTHS BLOCK\n '▎': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 2, h: 8 }] }, // LEFT ONE QUARTER BLOCK\n '▏': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }] }, // LEFT ONE EIGHTH BLOCK\n '▐': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }, // RIGHT HALF BLOCK\n\n // Shade characters (2591-2593)\n '░': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LIGHT SHADE (25%)\n [1, 0],\n [0, 0]\n ] },\n '▒': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // MEDIUM SHADE (=speckles fill, dotted fill, 50%, used in mapping to cp949, -> 1FB90 inverse medium shade)\n [1, 0],\n [0, 1]\n ] },\n '▓': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // DARK SHADE (75%)\n [1, 1],\n [1, 0]\n ] },\n\n // Block elements (2594-2595)\n '▔': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }] }, // UPPER ONE EIGHTH BLOCK\n '▕': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }] }, // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (2596-259F)\n '▖': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER LEFT\n '▗': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER RIGHT\n '▘': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT\n '▙': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT (-> 1F67F reverse checker board, -> 1FB95 checker board fill)\n '▚': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER RIGHT\n '▛': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '▜': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '▝': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT\n '▞': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT (-> 1F67E checker board, 1FB96 inverse checker board fill)\n '▟': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // #endregion\n\n // #region Powerline Symbols (E0A0-E0BF)\n\n // This contains the definitions of the primarily used box drawing characters as vector shapes.\n // The reason these characters are defined specially is to avoid common problems if a user's font\n // has not been patched with powerline characters and also to get pixel perfect rendering as\n // rendering issues can occur around AA/SPAA.\n //\n // The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n // visible.\n //\n // Original symbols defined in https://github.com/powerline/fontpatcher\n\n // Git branch\n '\\u{E0A0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: CustomGlyphVectorType.FILL } },\n // LN (Line Number)\n '\\u{E0A1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Lock\n '\\u{E0A2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: CustomGlyphVectorType.FILL } },\n // CN (Column Number)\n '\\u{E0A3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Right triangle solid\n '\\u{E0B0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,.5 L0,1', type: CustomGlyphVectorType.FILL, rightPadding: 2 } },\n // Right triangle line\n '\\u{E0B1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-1,-.5 L1,.5 L-1,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Left triangle solid\n '\\u{E0B2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L0,.5 L1,1', type: CustomGlyphVectorType.FILL, leftPadding: 2 } },\n // Left triangle line\n '\\u{E0B3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M2,-.5 L0,.5 L2,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n\n // Powerline Extra Symbols\n\n // Original symbols defined in https://github.com/ryanoasis/powerline-extra-symbols\n\n // Right semi-circle solid\n '\\u{E0B4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: CustomGlyphVectorType.FILL, rightPadding: 1 } },\n // Right semi-circle line\n '\\u{E0B5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: CustomGlyphVectorType.STROKE, rightPadding: 1 } },\n // Left semi-circle solid\n '\\u{E0B6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: CustomGlyphVectorType.FILL, leftPadding: 1 } },\n // Left semi-circle line\n '\\u{E0B7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: CustomGlyphVectorType.STROKE, leftPadding: 1 } },\n // Lower left triangle\n '\\u{E0B8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator\n '\\u{E0B9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Lower right triangle\n '\\u{E0BA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator redundant (identical to E0BD)\n '\\u{E0BB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper left triangle\n '\\u{E0BC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator\n '\\u{E0BD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper right triangle\n '\\u{E0BE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator redundant (identical to E0B9)\n '\\u{E0BF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n '\\u{E0C0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C8}' is unused\n '\\u{E0CA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0CB}' is unused\n '\\u{E0CC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C3}' is unused\n '\\u{E0D4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n\n // #endregion\n\n // #region Progress Indicators (EE00-EE0B)\n\n // initially added in Fira Code and later Nerd Fonts\n // https://github.com/ryanoasis/nerd-fonts/pull/1733\n\n // Progress bars (EE00-EE05)\n '\\u{EE00}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY START\n '\\u{EE01}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY MIDDLE\n '\\u{EE02}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z' }, // PROGRESS BAR EMPTY END\n '\\u{EE03}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z' }, // PROGRESS BAR FILLED START\n '\\u{EE04}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z' }, // PROGRESS BAR FILLED MIDDLE\n '\\u{EE05}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z' }, // PROGRESS BAR FILLED END\n\n // Progress spinners (EE06-EE0B) - 6-frame spinner animation using stroked arcs\n '\\u{EE06}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 1 (12 o'clock)\n '\\u{EE07}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 2 (2 o'clock)\n '\\u{EE08}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 3 (4 o'clock)\n '\\u{EE09}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 4 (6 o'clock)\n '\\u{EE0A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 5 (8 o'clock)\n '\\u{EE0B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 6 (10 o'clock)\n\n // #endregion\n\n // #region Git Branch Symbols (F5D0-F60D)\n\n // Initially added in Kitty (https://github.com/kovidgoyal/kitty/pull/7681)\n // then in Wezterm (https://github.com/wezterm/wezterm/issues/6328).\n\n // Straight lines (F5D0-F5D9)\n '\\u{F5D0}': GitBranchSymbolsParts.LINE_H, // Same as 2500\n '\\u{F5D1}': GitBranchSymbolsParts.LINE_V, // Same as 2502\n '\\u{F5D2}': GitBranchSymbolsParts.FADE_RIGHT,\n '\\u{F5D3}': GitBranchSymbolsParts.FADE_LEFT,\n '\\u{F5D4}': GitBranchSymbolsParts.FADE_DOWN,\n '\\u{F5D5}': GitBranchSymbolsParts.FADE_UP,\n\n // Curved lines (F5D6-F5D9)\n '\\u{F5D6}': GitBranchSymbolsParts.CURVE_DOWN_RIGHT, // Same as 256D)\n '\\u{F5D7}': GitBranchSymbolsParts.CURVE_DOWN_LEFT, // Same as 256E)\n '\\u{F5D8}': GitBranchSymbolsParts.CURVE_UP_RIGHT, // Same as 2570)\n '\\u{F5D9}': GitBranchSymbolsParts.CURVE_UP_LEFT, // Same as 256F)\n\n // Branching lines (F5DA-F5ED)\n '\\u{F5DA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5DC}': [GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DD}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5DE}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5DF}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E0}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5E1}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E2}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E3}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E4}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E5}': [GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E6}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E7}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E8}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E9}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5EB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EC}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5ED}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n\n // Nodes (F5EE-F5FB)\n '\\u{F5EE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE],\n '\\u{F5EF}': GitBranchSymbolsParts.NODE_STROKE,\n '\\u{F5F0}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F1}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F2}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F3}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F4}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F5}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F6}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F7}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F8}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5F9}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FA}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FB}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n\n // Extended Nodes (F5FC-F60D)\n // These were added a little later https://github.com/kovidgoyal/kitty/pull/7805\n '\\u{F5FC}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FD}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5FF}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F600}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F601}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F602}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F603}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F604}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F605}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F606}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F607}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F608}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F609}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60A}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60B}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60C}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60D}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n\n // #endregion\n\n // #region Symbols for Legacy Computing (1FB00-1FB3B)\n\n // https://www.unicode.org/charts/PDF/U1FB00.pdf\n\n // Block mosaic terminal graphic characters (1FB00-1FB3B)\n // The term \"sextant\" refers to block mosaics divided into six parts.\n '\\u{1FB00}': sextant(0b000001), // BLOCK SEXTANT-1\n '\\u{1FB01}': sextant(0b000010), // BLOCK SEXTANT-2\n '\\u{1FB02}': sextant(0b000011), // BLOCK SEXTANT-12 (upper one third block)\n '\\u{1FB03}': sextant(0b000100), // BLOCK SEXTANT-3\n '\\u{1FB04}': sextant(0b000101), // BLOCK SEXTANT-13\n '\\u{1FB05}': sextant(0b000110), // BLOCK SEXTANT-23\n '\\u{1FB06}': sextant(0b000111), // BLOCK SEXTANT-123\n '\\u{1FB07}': sextant(0b001000), // BLOCK SEXTANT-4\n '\\u{1FB08}': sextant(0b001001), // BLOCK SEXTANT-14\n '\\u{1FB09}': sextant(0b001010), // BLOCK SEXTANT-24\n '\\u{1FB0A}': sextant(0b001011), // BLOCK SEXTANT-124\n '\\u{1FB0B}': sextant(0b001100), // BLOCK SEXTANT-34 (middle one third block)\n '\\u{1FB0C}': sextant(0b001101), // BLOCK SEXTANT-134\n '\\u{1FB0D}': sextant(0b001110), // BLOCK SEXTANT-234\n '\\u{1FB0E}': sextant(0b001111), // BLOCK SEXTANT-1234 (upper two thirds block)\n '\\u{1FB0F}': sextant(0b010000), // BLOCK SEXTANT-5\n '\\u{1FB10}': sextant(0b010001), // BLOCK SEXTANT-15\n '\\u{1FB11}': sextant(0b010010), // BLOCK SEXTANT-25\n '\\u{1FB12}': sextant(0b010011), // BLOCK SEXTANT-125\n '\\u{1FB13}': sextant(0b010100), // BLOCK SEXTANT-35\n '\\u{1FB14}': sextant(0b010110), // BLOCK SEXTANT-235\n '\\u{1FB15}': sextant(0b010111), // BLOCK SEXTANT-1235\n '\\u{1FB16}': sextant(0b011000), // BLOCK SEXTANT-45\n '\\u{1FB17}': sextant(0b011001), // BLOCK SEXTANT-145\n '\\u{1FB18}': sextant(0b011010), // BLOCK SEXTANT-245\n '\\u{1FB19}': sextant(0b011011), // BLOCK SEXTANT-1245\n '\\u{1FB1A}': sextant(0b011100), // BLOCK SEXTANT-345\n '\\u{1FB1B}': sextant(0b011101), // BLOCK SEXTANT-1345\n '\\u{1FB1C}': sextant(0b011110), // BLOCK SEXTANT-2345\n '\\u{1FB1D}': sextant(0b011111), // BLOCK SEXTANT-12345\n '\\u{1FB1E}': sextant(0b100000), // BLOCK SEXTANT-6\n '\\u{1FB1F}': sextant(0b100001), // BLOCK SEXTANT-16\n '\\u{1FB20}': sextant(0b100010), // BLOCK SEXTANT-26\n '\\u{1FB21}': sextant(0b100011), // BLOCK SEXTANT-126\n '\\u{1FB22}': sextant(0b100100), // BLOCK SEXTANT-36\n '\\u{1FB23}': sextant(0b100101), // BLOCK SEXTANT-136\n '\\u{1FB24}': sextant(0b100110), // BLOCK SEXTANT-236\n '\\u{1FB25}': sextant(0b100111), // BLOCK SEXTANT-1236\n '\\u{1FB26}': sextant(0b101000), // BLOCK SEXTANT-46\n '\\u{1FB27}': sextant(0b101001), // BLOCK SEXTANT-146\n '\\u{1FB28}': sextant(0b101011), // BLOCK SEXTANT-1246\n '\\u{1FB29}': sextant(0b101100), // BLOCK SEXTANT-346\n '\\u{1FB2A}': sextant(0b101101), // BLOCK SEXTANT-1346\n '\\u{1FB2B}': sextant(0b101110), // BLOCK SEXTANT-2346\n '\\u{1FB2C}': sextant(0b101111), // BLOCK SEXTANT-12346\n '\\u{1FB2D}': sextant(0b110000), // BLOCK SEXTANT-56 (lower one third block)\n '\\u{1FB2E}': sextant(0b110001), // BLOCK SEXTANT-156\n '\\u{1FB2F}': sextant(0b110010), // BLOCK SEXTANT-256\n '\\u{1FB30}': sextant(0b110011), // BLOCK SEXTANT-1256 (upper and lower one third block)\n '\\u{1FB31}': sextant(0b110100), // BLOCK SEXTANT-356\n '\\u{1FB32}': sextant(0b110101), // BLOCK SEXTANT-1356\n '\\u{1FB33}': sextant(0b110110), // BLOCK SEXTANT-2356\n '\\u{1FB34}': sextant(0b110111), // BLOCK SEXTANT-12356\n '\\u{1FB35}': sextant(0b111000), // BLOCK SEXTANT-456\n '\\u{1FB36}': sextant(0b111001), // BLOCK SEXTANT-1456\n '\\u{1FB37}': sextant(0b111010), // BLOCK SEXTANT-2456\n '\\u{1FB38}': sextant(0b111011), // BLOCK SEXTANT-12456\n '\\u{1FB39}': sextant(0b111100), // BLOCK SEXTANT-3456 (lower two thirds block)\n '\\u{1FB3A}': sextant(0b111101), // BLOCK SEXTANT-13456\n '\\u{1FB3B}': sextant(0b111110), // BLOCK SEXTANT-23456\n\n // Smooth mosaic terminal graphic characters (1FB3C-1FB6F)\n '\\u{1FB3C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB3E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB40}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB41}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB42}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB43}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB44}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB45}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0.5,0 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB46}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0.3333 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB47}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB48}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB49}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB4C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB4F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB50}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB51}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB52}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB53}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB54}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB55}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB56}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,1 L1,1 L1,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB57}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB58}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB59}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB5A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB5B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB5C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB5D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB5E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB5F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB60}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB61}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB62}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB63}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB64}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB65}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB66}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,1 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB67}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0.6667 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB68}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z' }, // UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing left)\n '\\u{1FB69}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z' }, // LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing upper)\n '\\u{1FB6A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z' }, // UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing right)\n '\\u{1FB6B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z' }, // LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing lower)\n '\\u{1FB6C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L0,1 Z' }, // LEFT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 Z' }, // UPPER TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6E}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L1,1 L0.5,0.5 Z' }, // RIGHT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,1 L0.5,0.5 Z' }, // LOWER TRIANGULAR ONE QUARTER BLOCK\n\n // Block elements (1FB70-1FB80)\n '\\u{1FB70}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-2\n '\\u{1FB71}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-3\n '\\u{1FB72}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-4\n '\\u{1FB73}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-5\n '\\u{1FB74}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-6\n '\\u{1FB75}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-2\n '\\u{1FB77}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-3\n '\\u{1FB78}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-4\n '\\u{1FB79}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-5\n '\\u{1FB7A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-6\n '\\u{1FB7B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB7C}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7D}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7F}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // UPPER AND LOWER ONE EIGHTH BLOCK\n\n // Window title bar (1FB81-1FB81)\n '\\u{1FB81}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-1358\n\n // Block elements (1FB82-1FB8B)\n '\\u{1FB82}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 2 }] }, // UPPER ONE QUARTER BLOCK\n '\\u{1FB83}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 3 }] }, // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB84}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 5 }] }, // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB85}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 6 }] }, // UPPER THREE QUARTERS BLOCK\n '\\u{1FB86}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 7 }] }, // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB87}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 2, h: 8 }] }, // RIGHT ONE QUARTER BLOCK\n '\\u{1FB88}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 3, h: 8 }] }, // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB89}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 5, h: 8 }] }, // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB8A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 6, h: 8 }] }, // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 7, h: 8 }] }, // RIGHT SEVEN EIGHTHS B0OCK\n\n // Rectangular shade characters (1FB8C-1FB94)\n '\\u{1FB8C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LEFT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n '\\u{1FB8D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // RIGHT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0.5,0 L1,0 L1,1 L0.5,1 Z' },\n '\\u{1FB8E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n '\\u{1FB8F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n '\\u{1FB90}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // INVERSE MEDIUM SHADE\n [0, 1],\n [1, 0]\n ] },\n '\\u{1FB91}': [ // UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }\n ],\n '\\u{1FB92}': [ // UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }\n ],\n // 1FB93 is \n '\\u{1FB94}': [ // LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }\n ],\n\n // Fill characters (1FB95-1FB97)\n '\\u{1FB95}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // CHECKER BOARD FILL\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB96}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // INVERSE CHECKER BOARD FILL\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB97}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n { x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }\n ] },\n\n // Diagonal fill characters (1FB98-1FB99)\n '\\u{1FB98}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25', strokeWidth: 1 }, // UPPER LEFT TO LOWER RIGHT FILL\n '\\u{1FB99}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75', strokeWidth: 1 }, // UPPER RIGHT TO LOWER LEFT FILL\n\n // Smooth mosaic terminal graphic characters (1FB9A-1FB9B)\n '\\u{1FB9A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0', type: CustomGlyphVectorType.FILL } }, // UPPER AND LOWER TRIANGULAR HALF BLOCK\n '\\u{1FB9B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1', type: CustomGlyphVectorType.FILL } }, // LEFT AND RIGHT TRIANGULAR HALF BLOCK\n\n // Triangular shade characters (1FB9C-1FB9F)\n '\\u{1FB9C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L0,1 Z' },\n '\\u{1FB9D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,1 Z' },\n '\\u{1FB9E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M1,0 L1,1 L0,1 Z' },\n '\\u{1FB9F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,1 L0,1 Z' },\n\n // Character cell diagonals (1FBA0-1FBAE)\n '\\u{1FBA0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT\n '\\u{1FBA1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT\n '\\u{1FBAB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBAC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBAD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL DIAMOND\n\n // Light solid line with stroke (1FBAF-1FBAF)\n '\\u{1FBAF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} M.5,.35 L.5,.65`, strokeWidth: 1 }, // BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE\n\n // Terminal graphic characters (1FBB0-1FBB3)\n '\\u{1FBB0}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z', scaleType: CustomGlyphScaleType.CHAR }, // ARROWHEAD-SHAPED POINTER\n '\\u{1FBB1}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.1,.525 L.35,.675 L.9,.35', type: CustomGlyphVectorType.STROKE }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE CHECK MARK\n '\\u{1FBB2}': { type: CustomGlyphDefinitionType.PATH, data: 'M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13' }, // LEFT HALF RUNNING MAN\n '\\u{1FBB3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6' }, // RIGHT HALF RUNNING MAN\n\n // Arrows (1FBB4-1FBB8)\n // TODO: Improve all arrows, use hybrid approach\n '\\u{1FBB4}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS\n '\\u{1FBB5}': [ // LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB6}': [ // RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB7}': [ // DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB8}': [ // UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Terminal graphic characters (1FBB9-1FBBC)\n '\\u{1FBB9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z', type: CustomGlyphVectorType.FILL } }, // LEFT HALF FOLDER\n '\\u{1FBBA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT HALF FOLDER\n '\\u{1FBBB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // VOIDED GREEK CROSS\n '\\u{1FBBC}': [ // RIGHT OPEN SQUARED DOT\n { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z' },\n { type: CustomGlyphDefinitionType.PATH, data: 'M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5', scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Negative terminal graphic characters (1FBBD-1FBBF)\n '\\u{1FBBD}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL CROSS\n '\\u{1FBBE}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M1,.5 L.5,1', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBBF}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL DIAMOND\n\n // Terminal graphic characters (1FBC0-1FBCA)\n '\\u{1FBC0}': { type: CustomGlyphDefinitionType.PATH, data: 'M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', scaleType: CustomGlyphScaleType.CHAR }, // WHITE HEAVY SALTIRE WITH ROUNDED CORNERS\n // 1FBC1-1FBC4 is dervied from the Iosevka font (SIL OFL v1.1) https://github.com/be5invis/Iosevka\n '\\u{1FBC1}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z' }, // LEFT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC2}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z' }, // MIDDLE THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z' }, // RIGHT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC4}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z', scaleType: CustomGlyphScaleType.CHAR }, // NEGATIVE SQUARED QUESTION MARK\n '\\u{1FBC5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE\n '\\u{1FBC6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH ARMS RAISED\n '\\u{1FBC7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING LEFT\n '\\u{1FBC8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING RIGHT\n '\\u{1FBC9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH DRESS\n '\\u{1FBCA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE UP-POINTING CHEVRON\n\n // Terminal graphic characters (1FBCB-1FBCD)\n '\\u{1FBCB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE CROSS MARK\n '\\u{1FBCC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // RAISED SMALL LEFT SQUARE BRACKET\n '\\u{1FBCD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // BLACK SMALL UP-POINTING CHEVRON\n\n // Block elements (1FBCE-1FBCF)\n '\\u{1FBCE}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.6667,0 L0.6667,1 L0,1 Z' }, // LEFT TWO THIRDS BLOCK\n '\\u{1FBCF}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.3333,0 L0.3333,1 L0,1 Z' }, // LEFT ONE THIRD BLOCK\n\n // Character cell diagonals (1FBD0-1FBDF)\n '\\u{1FBD0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT\n '\\u{1FBD1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT\n '\\u{1FBD2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT\n '\\u{1FBD3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBD4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FBD5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBD6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE\n '\\u{1FBD7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT\n '\\u{1FBD8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT\n '\\u{1FBD9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT\n '\\u{1FBDC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT\n '\\u{1FBDD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBDE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBDF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT\n\n // Geometric shapes (1FBE0-1FBEF)\n '\\u{1FBE0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0', type: CustomGlyphVectorType.STROKE } }, // TOP JUSTIFIED LOWER HALF WHITE CIRCLE\n '\\u{1FBE1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1', type: CustomGlyphVectorType.STROKE } }, // RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE\n '\\u{1FBE2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1', type: CustomGlyphVectorType.STROKE } }, // BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE\n '\\u{1FBE3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1', type: CustomGlyphVectorType.STROKE } }, // LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE\n '\\u{1FBE4}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 4, h: 4 }] }, // UPPER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE5}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 4, w: 4, h: 4 }] }, // LOWER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE6}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 4, h: 4 }] }, // MIDDLE LEFT ONE QUARTER BLOCK\n '\\u{1FBE7}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 2, w: 4, h: 4 }] }, // MIDDLE RIGHT ONE QUARTER BLOCK\n '\\u{1FBE8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP JUSTIFIED LOWER HALF BLACK CIRCLE\n '\\u{1FBE9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE\n '\\u{1FBEA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE\n '\\u{1FBEB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z', type: CustomGlyphVectorType.FILL } }, // LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE\n '\\u{1FBEC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z', type: CustomGlyphVectorType.FILL } }, // TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBED}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE\n '\\u{1FBEE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBEF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE\n\n // Segmented digits (1FBF0-1FBF9)\n '\\u{1FBF0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111110), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ZERO (abcdef)\n '\\u{1FBF1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110000), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ONE (bc)\n '\\u{1FBF2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1101101), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT TWO (abdeg)\n '\\u{1FBF3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111001), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT THREE (abcdg)\n '\\u{1FBF4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FOUR (bcfg)\n '\\u{1FBF5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FIVE (acdfg)\n '\\u{1FBF6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SIX (acdefg)\n '\\u{1FBF7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1110010), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SEVEN (abcf)\n '\\u{1FBF8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT EIGHT (abcdefg)\n '\\u{1FBF9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT NINE (abcdfg)\n\n // Terminal graphic character (1FBFA-1FBFA)\n '\\u{1FBFA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // ALARM BELL SYMBOL\n\n // #endregion\n\n // #region Braille Patterns (2800-28FF)\n\n // https://www.unicode.org/charts/PDF/U2800.pdf\n\n // Braille patterns (2800-28FF)\n ...Object.fromEntries(\n Array.from({ length: 256 }, (_, i) => [\n String.fromCodePoint(0x2800 + i),\n { type: CustomGlyphDefinitionType.BRAILLE, data: i }\n ])\n ),\n\n // #endregion\n};\n\nexport const blockPatternCodepoints = new Set([\n // Shade characters (2591-2593)\n 0x2591,\n 0x2592,\n 0x2593,\n // Rectangular shade characters (1FB8C-1FB94)\n 0x1FB8C,\n 0x1FB8D,\n 0x1FB8E,\n 0x1FB8F,\n 0x1FB90,\n 0x1FB91,\n 0x1FB92,\n 0x1FB94,\n // Triangular shade characters (1FB9C-1FB9F)\n 0x1FB9C,\n 0x1FB9D,\n 0x1FB9E,\n 0x1FB9F\n]);\n\n/**\n * Generates a drawing function for sextant characters. Sextants are a 2x3 grid where each cell\n * can be on or off.\n * @param pattern A 6-bit pattern where bit 0 = top-left, bit 1 = top-right, bit 2 = middle-left,\n * bit 3 = middle-right, bit 4 = bottom-left, bit 5 = bottom-right\n */\nfunction sextant(pattern: number): { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: CustomGlyphPathDrawFunctionDefinition } {\n return {\n type: CustomGlyphDefinitionType.PATH_FUNCTION,\n data: () => {\n // Sextant grid: 2 columns, 3 rows\n // Row heights in 8ths: top=3, middle=2, bottom=3\n // Column widths: left=4, right=4\n const rects: string[] = [];\n const colW = 0.5; // Each column is half width\n const rowH = [3 / 8, 2 / 8, 3 / 8]; // Row heights as fractions\n const rowY = [0, 3 / 8, 5 / 8]; // Row Y positions\n\n for (let row = 0; row < 3; row++) {\n const leftBit = (pattern >> (row * 2)) & 1;\n const rightBit = (pattern >> (row * 2 + 1)) & 1;\n\n if (leftBit && rightBit) {\n // Full row\n rects.push(`M0,${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (leftBit) {\n rects.push(`M0,${rowY[row]} L${colW},${rowY[row]} L${colW},${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (rightBit) {\n rects.push(`M${colW},${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L${colW},${rowY[row] + rowH[row]} Z`);\n }\n }\n return rects.join(' ');\n }\n };\n}\n\n/**\n * Generates SVG path data for a 7-segment display digit.\n *\n * Segment mapping (bit positions):\n *\n * - bit 6: a (top)\n * - bit 5: b (upper right)\n * - bit 4: c (lower right)\n * - bit 3: d (bottom)\n * - bit 2: e (lower left)\n * - bit 1: f (upper left)\n * - bit 0: g (middle)\n *\n * ```\n * ─a─\n * │ │\n * f b\n * ─g─\n * e c\n * │ │\n * ─d─\n * ```\n */\nfunction segmentedDigit(pattern: number): string {\n const paths: string[] = [];\n\n // Each segment should have approximately the same stroke width, this is somewhat difficult to be\n // precise since coordinates are 0-1 of the whole cell (percentage-based). To handle this, the\n // fact that terminal cells are typically sized at ~2:1 (height:width) is leveraged.\n // for horizontal vs vertical to make segments appear the same thickness\n const segW = 0.15; // Width of vertical segments (fraction of cell width)\n const segH = 0.075; // Height of horizontal segments (fraction of cell height, ~half of segW for 2:1 cells)\n const padX = 0.05; // Horizontal padding from edge\n const padY = 0.175; // Vertical padding from edge (35% total = 65% height)\n const gap = 0.015; // Gap between segments\n const taperX = segW / 2; // Horizontal taper for vertical segments\n const taperY = segH / 2; // Vertical taper for horizontal segments\n\n const left = padX;\n const right = 1 - padX;\n const top = padY;\n const bottom = 1 - padY;\n const midY = 0.5;\n\n // Segment a (top horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b1000000) {\n const y1 = top;\n const y2 = top + segH / 2;\n const y3 = top + segH;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment b (upper right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0100000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment c (lower right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0010000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment d (bottom horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0001000) {\n const y1 = bottom - segH;\n const y2 = bottom - segH / 2;\n const y3 = bottom;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment e (lower left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000100) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment f (upper left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000010) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment g (middle horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0000001) {\n const y1 = midY - segH / 2;\n const y2 = midY;\n const y3 = midY + segH / 2;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n\n return paths.join(' ');\n}\n\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\nimport { customGlyphDefinitions } from './CustomGlyphDefinitions';\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition, type CustomGlyphPatternDefinition, type ICustomGlyphSolidOctantBlockVector, type ICustomGlyphVectorShape } from './Types';\n\ntype PatternCanvas = HTMLCanvasElement | OffscreenCanvas;\ntype PatternCanvasFactory = (width: number, height: number) => PatternCanvas;\n\nconst createOffscreenPatternCanvas: PatternCanvasFactory | undefined = typeof OffscreenCanvas === 'undefined'\n ? undefined\n : (width, height) => new OffscreenCanvas(width, height);\n\nconst createDomPatternCanvas: PatternCanvasFactory = (width, height) => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n};\n\nexport function createPatternCanvas(\n width: number,\n height: number,\n offscreenCanvasFactory: PatternCanvasFactory | undefined = createOffscreenPatternCanvas,\n domCanvasFactory: PatternCanvasFactory = createDomPatternCanvas\n): PatternCanvas {\n return offscreenCanvasFactory?.(width, height) ?? domCanvasFactory(width, height);\n}\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomGlyph(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): boolean {\n const unifiedCharDefinition = customGlyphDefinitions[c];\n if (unifiedCharDefinition) {\n // Normalize to array for uniform handling\n const parts = Array.isArray(unifiedCharDefinition) ? unifiedCharDefinition : [unifiedCharDefinition];\n for (const part of parts) {\n drawDefinitionPart(ctx, part, xOffset, yOffset, deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, fontSize, devicePixelRatio, logService, backgroundColor, variantOffset);\n }\n return true;\n }\n\n return false;\n}\n\nfunction drawDefinitionPart(\n ctx: CanvasRenderingContext2D,\n part: CustomGlyphDefinitionPart,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): void {\n // Handle scaleType - adjust dimensions and offset when scaling to character area\n let drawWidth = deviceCellWidth;\n let drawHeight = deviceCellHeight;\n let drawXOffset = xOffset;\n let drawYOffset = yOffset;\n if (part.scaleType === CustomGlyphScaleType.CHAR) {\n drawWidth = deviceCharWidth;\n drawHeight = deviceCharHeight;\n // Center the character within the cell\n drawXOffset = xOffset + (deviceCellWidth - deviceCharWidth) / 2;\n drawYOffset = yOffset + (deviceCellHeight - deviceCharHeight) / 2;\n }\n\n // Handle clipPath generically for any definition type\n if (part.clipPath) {\n ctx.save();\n applyClipPath(ctx, part.clipPath, drawXOffset, drawYOffset, drawWidth, drawHeight);\n }\n\n switch (part.type) {\n case CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR:\n drawBlockVectorChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n case CustomGlyphDefinitionType.BLOCK_PATTERN:\n drawPatternChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, variantOffset);\n break;\n case CustomGlyphDefinitionType.PATH_FUNCTION:\n drawPathFunctionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, logService, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH:\n drawPathDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH_NEGATIVE:\n drawPathNegativeDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, backgroundColor);\n break;\n case CustomGlyphDefinitionType.VECTOR_SHAPE:\n drawVectorShape(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, fontSize, devicePixelRatio, logService);\n break;\n case CustomGlyphDefinitionType.BRAILLE:\n drawBrailleCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n }\n\n if (part.clipPath) {\n ctx.restore();\n }\n}\n\nfunction drawBlockVectorChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphSolidOctantBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\n/**\n * Braille dot positions in octant coordinates (x, y for center of each dot area)\n * Columns: left=1-2, right=5-6 (leaving 0 and 7 as margins, 3-4 as gap)\n * Rows: 0-1, 2-3, 4-5, 6-7 for the 4 rows\n */\nconst brailleDotPositions = new Uint8Array([\n 1, 0, // dot 1 - bit 0\n 1, 2, // dot 2 - bit 1\n 1, 4, // dot 3 - bit 2\n 5, 0, // dot 4 - bit 3\n 5, 2, // dot 5 - bit 4\n 5, 4, // dot 6 - bit 5\n 1, 6, // dot 7 - bit 6\n 5, 6, // dot 8 - bit 7\n]);\n\n/**\n * Draws a braille pattern\n */\nfunction drawBrailleCharacter(\n ctx: CanvasRenderingContext2D,\n pattern: number,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n const xEighth = deviceCellWidth / 8;\n const paddingY = deviceCellHeight * 0.1;\n const usableHeight = deviceCellHeight * 0.8;\n const yEighth = usableHeight / 8;\n const radius = Math.min(xEighth, yEighth);\n\n for (let bit = 0; bit < 8; bit++) {\n if (pattern & (1 << bit)) {\n const x = brailleDotPositions[bit * 2];\n const y = brailleDotPositions[bit * 2 + 1];\n const cx = xOffset + (x + 1) * xEighth;\n const cy = yOffset + paddingY + (y + 1) * yEighth;\n ctx.beginPath();\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n}\n\nfunction drawPathDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: CustomGlyphPathDrawFunctionDefinition | string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n strokeWidth?: number\n): void {\n const instructions = typeof charDefinition === 'string' ? charDefinition : charDefinition(0, 0);\n ctx.beginPath();\n let currentX = 0;\n let currentY = 0;\n let lastControlX = 0;\n let lastControlY = 0;\n let lastCommand = '';\n for (const instruction of instructions.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (type === 'Z') {\n ctx.closePath();\n lastCommand = type;\n continue;\n }\n if (type === 'V') {\n const y = yOffset + parseFloat(args[0]) * deviceCellHeight;\n ctx.lineTo(currentX, y);\n currentY = y;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (type === 'H') {\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n ctx.lineTo(x, currentY);\n currentX = x;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (!args[0] || !args[1]) {\n continue;\n }\n if (type === 'A') {\n // SVG arc: A rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y\n const rx = parseFloat(args[0]) * deviceCellWidth;\n const ry = parseFloat(args[1]) * deviceCellHeight;\n const xAxisRotation = parseFloat(args[2]) * Math.PI / 180;\n const largeArcFlag = parseInt(args[3], 10);\n const sweepFlag = parseInt(args[4], 10);\n const x = xOffset + parseFloat(args[5]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[6]) * deviceCellHeight;\n drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);\n currentX = x;\n currentY = y;\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'Q') {\n ctx.quadraticCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3]);\n lastControlX = translatedArgs[0];\n lastControlY = translatedArgs[1];\n currentX = translatedArgs[2];\n currentY = translatedArgs[3];\n } else if (type === 'T') {\n // T uses reflection of last control point if previous command was Q or T\n let cpX: number;\n let cpY: number;\n if (lastCommand === 'Q' || lastCommand === 'T') {\n cpX = 2 * currentX - lastControlX;\n cpY = 2 * currentY - lastControlY;\n } else {\n cpX = currentX;\n cpY = currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, translatedArgs[0], translatedArgs[1]);\n lastControlX = cpX;\n lastControlY = cpY;\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n } else if (type === 'C') {\n ctx.bezierCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3], translatedArgs[4], translatedArgs[5]);\n lastControlX = translatedArgs[2];\n lastControlY = translatedArgs[3];\n currentX = translatedArgs[4];\n currentY = translatedArgs[5];\n }\n lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n}\n\n/**\n * Converts SVG arc parameters to canvas arc/ellipse calls.\n * Based on the SVG spec's endpoint to center parameterization conversion.\n */\nfunction drawSvgArc(\n ctx: CanvasRenderingContext2D,\n x1: number, y1: number,\n rx: number, ry: number,\n phi: number,\n largeArcFlag: number,\n sweepFlag: number,\n x2: number, y2: number\n): void {\n // Handle degenerate cases\n if (rx === 0 || ry === 0) {\n ctx.lineTo(x2, y2);\n return;\n }\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: Compute (x1', y1')\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Step 2: Compute (cx', cy')\n let rxSq = rx * rx;\n let rySq = ry * ry;\n const x1pSq = x1p * x1p;\n const y1pSq = y1p * y1p;\n\n // Correct radii if necessary\n const lambda = x1pSq / rxSq + y1pSq / rySq;\n if (lambda > 1) {\n const lambdaSqrt = Math.sqrt(lambda);\n rx *= lambdaSqrt;\n ry *= lambdaSqrt;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);\n if (sq < 0) sq = 0;\n const coef = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(sq);\n const cxp = coef * (rx * y1p / ry);\n const cyp = coef * -(ry * x1p / rx);\n\n // Step 3: Compute (cx, cy) from (cx', cy')\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: Compute angles\n const ux = (x1p - cxp) / rx;\n const uy = (y1p - cyp) / ry;\n const vx = (-x1p - cxp) / rx;\n const vy = (-y1p - cyp) / ry;\n\n const startAngle = Math.atan2(uy, ux);\n let dTheta = Math.atan2(vy, vx) - startAngle;\n\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta -= 2 * Math.PI;\n } else if (sweepFlag === 1 && dTheta < 0) {\n dTheta += 2 * Math.PI;\n }\n\n const endAngle = startAngle + dTheta;\n\n ctx.ellipse(cx, cy, rx, ry, phi, startAngle, endAngle, sweepFlag === 0);\n}\n\n/**\n * Draws a \"negative\" path where the background color is used to draw the shape on top of a\n * foreground-filled cell. This creates the appearance of a cutout without using actual\n * transparency, which allows SPAA (subpixel anti-aliasing) to work correctly.\n *\n * @param ctx The canvas rendering context (fillStyle should be set to foreground color)\n * @param charDefinition The vector shape definition for the negative shape\n * @param xOffset The x offset to draw at\n * @param yOffset The y offset to draw at\n * @param deviceCellWidth The width of the cell in device pixels\n * @param deviceCellHeight The height of the cell in device pixels\n * @param devicePixelRatio The device pixel ratio\n * @param backgroundColor The background color to use for the \"cutout\" portion\n */\nfunction drawPathNegativeDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n backgroundColor?: string\n): void {\n ctx.save();\n\n // First, fill the entire cell with foreground color\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n\n // Then draw the \"negative\" shape with the background color\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.strokeStyle = backgroundColor;\n }\n\n ctx.lineWidth = devicePixelRatio;\n ctx.lineCap = 'square';\n ctx.beginPath();\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n if (type === 'Z') {\n ctx.closePath();\n }\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n }\n }\n\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.stroke();\n } else {\n ctx.fill();\n }\n\n ctx.restore();\n}\n\nconst cachedPatterns: Map> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n variantOffset: number = 0\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n // The atlas canvas can be adopted into another document, so temporary resources must not use\n // its mutable ownerDocument.\n const tmpCanvas = createPatternCanvas(width, height);\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n // Apply pattern offset to ensure seamless tiling across cells when cell dimensions are odd.\n // variantOffset encodes: bit 1 = x pixel shift, bit 0 = y pixel shift.\n const dx = (variantOffset >> 1) & 1;\n const dy = variantOffset & 1;\n if (dx !== 0 || dy !== 0) {\n pattern.setTransform(new DOMMatrix().translateSelf(-dx, -dy));\n } else {\n pattern.setTransform(new DOMMatrix());\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\nfunction drawPathFunctionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: string | ((xp: number, yp: number) => string),\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n logService: ILogService,\n strokeWidth?: number\n): void {\n ctx.save();\n ctx.beginPath();\n ctx.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip();\n\n ctx.beginPath();\n let actualInstructions: string;\n if (typeof charDefinition === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = charDefinition(xp, yp);\n } else {\n actualInstructions = charDefinition;\n }\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio, 0, 0, false), state);\n state.lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n ctx.restore();\n}\n\n/**\n * Applies a clip path to the canvas context from SVG-like path instructions.\n */\nfunction applyClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n ctx.beginPath();\n for (const instruction of clipPath.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[1]) * deviceCellHeight;\n if (type === 'M') {\n ctx.moveTo(x, y);\n } else if (type === 'L') {\n ctx.lineTo(x, y);\n }\n }\n ctx.clip();\n}\n\nfunction drawVectorShape(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ), state);\n state.lastCommand = type;\n }\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\ninterface ISvgPathState {\n currentX: number;\n currentY: number;\n lastControlX: number;\n lastControlY: number;\n lastCommand: string;\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: (ctx: CanvasRenderingContext2D, args: number[], state: ISvgPathState) => void } = {\n 'C': (ctx, args, state) => {\n ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]);\n state.lastControlX = args[2];\n state.lastControlY = args[3];\n state.currentX = args[4];\n state.currentY = args[5];\n },\n 'L': (ctx, args, state) => {\n ctx.lineTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'M': (ctx, args, state) => {\n ctx.moveTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'Q': (ctx, args, state) => {\n ctx.quadraticCurveTo(args[0], args[1], args[2], args[3]);\n state.lastControlX = args[0];\n state.lastControlY = args[1];\n state.currentX = args[2];\n state.currentY = args[3];\n },\n 'T': (ctx, args, state) => {\n let cpX: number;\n let cpY: number;\n if (state.lastCommand === 'Q' || state.lastCommand === 'T') {\n cpX = 2 * state.currentX - state.lastControlX;\n cpY = 2 * state.currentY - state.lastControlY;\n } else {\n cpX = state.currentX;\n cpY = state.currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, args[0], args[1]);\n state.lastControlX = cpX;\n state.lastControlY = cpY;\n state.currentX = args[0];\n state.currentY = args[1];\n }\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0, clampToCell: boolean = true): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[x] !== 0) {\n const rounded = Math.round(result[x] + 0.5) - 0.5;\n result[x] = clampToCell ? clamp(rounded, cellWidth, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[y] !== 0) {\n const rounded = Math.round(result[y] + 0.5) - 0.5;\n result[y] = clampToCell ? clamp(rounded, cellHeight, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from '../CharAtlasCache';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TEXT_BASELINE } from '../Constants';\nimport type { ITextureAtlas } from '../Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this._register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this._register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr, 2048);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from '../CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this._register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this._register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IWebglAddonOptions, WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { Emitter, EventUtils } from 'common/Event';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon, IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n private readonly _customGlyphs: boolean;\n private readonly _preserveDrawingBuffer?: boolean;\n\n constructor(options?: IWebglAddonOptions) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('WebGL2 is only supported on Safari 16 and above');\n }\n }\n super();\n this._customGlyphs = options?.customGlyphs ?? true;\n this._preserveDrawingBuffer = options?.preserveDrawingBuffer;\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this._register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n this._renderer = this._register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n logService,\n optionsService,\n themeService,\n this._customGlyphs,\n this._preserveDrawingBuffer\n ));\n this._register(EventUtils.forward(this._renderer.onContextLoss, this._onContextLoss));\n this._register(EventUtils.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this._register(EventUtils.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this._register(EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this._register(toDisposable(() => {\n if ((this._terminal as any)._core._store._isDisposed) {\n return;\n }\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"],"names":["root","factory","exports","module","define","amd","globalThis","node","type","handler","useCapture","addDisposableListener","domNode","bb","getBoundingClientRect","win","getWindow","left","scrollX","top","scrollY","width","height","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","push","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","length","sort","shift","execute","animationFrameRunner","Async_1","__webpack_require__","e","candidateNode","ownerDocument","defaultView","candidateEvent","view","window","DomListener","constructor","options","this","_node","_type","_handler","_options","addEventListener","dispose","removeEventListener","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","console","error","a","b","animationFrameState","Map","get","set","WindowIntervalTimer","IntervalTimer","super","_defaultTarget","undefined","cancelAndSet","interval","INVERTED_DEFAULT_COLOR","isPowerlineGlyph","codepoint","isEmoji","value","Error","glyphSizeX","deviceCellWidth","Math","ceil","isNerdFontGlyph","isBoxOrBlockGlyph","css","canvas","cell","device","char","cellWidth","lineWidth","currentOffset","round","SelectionRenderModel","clear","hasSelection","columnSelectMode","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startCol","endCol","selectionStart","selectionEnd","update","terminal","start","end","viewportY","buffers","active","ydisp","max","min","rows","isCellSelected","x","y","buffer","Lifecycle_1","TextBlinkStateManager","Disposable","_renderCallback","_coreBrowserService","_optionsService","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","_register","onSpecificOptionChange","duration","setIntervalDuration","rawOptions","blinkIntervalDuration","toDisposable","_clearInterval","isBlinkOn","isEnabled","setNeedsBlinkInViewport","needsBlinkInViewport","_updateIntervalState","setViewportVisible","isVisible","_interval","wasBlinkOn","setInterval","clearInterval","millis","Promise","resolve","setTimeout","timeout","store","timer","disposable","clearTimeout","add","_token","_isDisposed","cancel","setIfNotSet","_isScheduled","queueMicrotask","_disposable","context","handle","$r","$g","$b","$a","channels","color","rgb","rgba","toPaddedHex","c","s","toString","contrastRatio","l1","l2","NULL_COLOR","toCss","r","g","toRgba","toColor","color_1","opacity","toChannels","blend","bg","fg","fgR","fgG","fgB","bgR","bgG","bgB","isOpaque","ensureContrastRatio","ratio","result","opaque","rgbaColor","multiplyOpacity","factor","toColorRGB","css_1","$ctx","$litmusColor","document","createElement","ctx","getContext","willReadFrequently","globalCompositeOperation","createLinearGradient","match","parseInt","slice","repeat","rgbaMatch","parseFloat","fillStyle","fillRect","getImageData","data","rgb_1","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","EventUtils","_listeners","_disposed","event","_event","listener","thisArgs","disposables","entry","fn","idx","indexOf","splice","Array","isArray","fire","call","listeners","i","len","forward","from","to","map","any","events","DisposableStore","runAndSubscribe","initial","arg","d","_disposables","Set","isDisposed","o","_store","None","Object","freeze","_value","TwoKeyMap","_data","first","second","third","fourth","_targetWindow","isSafari","majorVersion","userAgent","isNode","process","navigator","startsWith","platform","isFirefox","includes","isChrome","isLegacyEdge","test","isMac","isWindows","isLinux","isChromeOS","TaskQueue","logService","_tasks","_i","_logService","enqueue","task","_start","flush","_idleCallback","_cancelCallback","_requestCallback","_process","bind","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","performance","now","warn","abs","PriorityTaskQueue","callback","_createDeadline","identifier","IdleTaskQueue","requestIdleCallback","cancelIdleCallback","_queue","AttributeData","extended","ExtendedAttrs","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","hasExtendedAttrs","underlineStyle","isBlink","isInvisible","isItalic","isDim","isStrikethrough","isProtected","isOverline","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","getFgColor","getBgColor","updateExtended","isEmpty","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","ext","_urlId","_ext","urlId","val","TextDecoder_1","Constants_1","AttributeData_1","CellData","content","combinedData","fromCharData","obj","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","charCodeAt","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","code","CHAR_DATA_WIDTH_INDEX","getAsCharData","attributesEquals","other","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","String","fromCharCode","_interim","decode","input","target","size","startPos","interim","Uint8Array","fill","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","missing","fourStop","Color_1","RendererUtils_1","CustomGlyphDefinitions_1","$colors","$fg","$bg","$hasFg","$hasBg","$isSelected","$variantOffset","_terminal","_optionService","_selectionRenderModel","_decorationService","_themeService","deviceCellHeight","colors","floor","fontSize","dpr","blockPatternCodepoints","has","forEachDecorationAtCell","backgroundColorRGB","foregroundColorRGB","ansi","foreground","isFocused","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","selectionForeground","treatGlyphAsBackgroundColor","background","deviceCharWidth","deviceCharHeight","devicePixelRatio","deviceMaxTextureSize","customGlyphs","newConfig","CharAtlasUtils_1","generateConfig","charAtlasCache","ownedByIndex","ownedBy","configEquals","config","atlas","core","_core","newEntry","TextureAtlas_1","TextureAtlas","unicodeService","index","clonedColors","cursor","cursorAccent","selectionBackgroundTransparent","selectionInactiveBackgroundTransparent","overviewRulerBorder","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","contrastCache","halfContrastCache","letterSpacing","lineHeight","fontFamily","fontWeight","fontWeightBold","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","Platform_1","DIM_OPACITY","TEXT_BASELINE","_isIdlePaused","isCursorVisible","_restartInterval","_resetIdleTimer","isPaused","_blinkStartTimeout","_blinkInterval","_animationFrame","cancelAnimationFrame","_idleTimeout","restartBlinkAnimation","_animationTimeRestarted","Date","timeToStart","time","pause","resume","_stopBlinkingDueToIdle","element","parentWindow","observer","ResizeObserver","entries","find","disconnect","devicePixelContentBoxSize","inlineSize","blockSize","observe","box","WebglUtils_1","$glyph","$i","$leftCellPadding","$clippedPixels","GlyphRenderer","_gl","_dimensions","_lastSeenPageLayoutVersion","_pageOverflowWarned","_activeBuffer","_vertices","count","attributes","Float32Array","attributesBuffers","gl","maxAtlasPages","throwIfFalsy","getParameter","MAX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","_program","createProgram","maxFragmentShaderTextureUnits","textureConditionals","createFragmentShaderSource","deleteProgram","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","vertexArrayObject","_vertexArrayObject","createVertexArray","deleteVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","deleteBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","BYTES_PER_ELEMENT","useProgram","textureUnits","Int32Array","uniform1iv","uniformMatrix4fv","PROJECTION_MATRIX","_atlasTextures","glTexture","GLTexture","createTexture","deleteTexture","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","RGBA","UNSIGNED_BYTE","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","handleResize","beginFrame","_atlas","pageLayoutVersion","updateCell","chars","lastBg","_updateCell","array","cols","getRasterizedGlyphCombinedChar","getRasterizedGlyph","offset","texturePage","texturePositionClipSpace","pages","sizeClipSpace","rescaleOverlappingGlyphs","allowRescaling","newCount","viewport","uniform2f","render","renderModel","activeBuffer","bufferLength","lineLengths","si","sub","subarray","STREAM_DRAW","pageCount","version","_bindAtlasPageTexture","drawElementsInstanced","TRIANGLE_STRIP","setAtlas","invalidateAtlasTextures","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_MAG_FILTER","setDimensions","dimensions","BYTES_PER_RECTANGLE","Vertices","$rgba","$x1","$y1","RectangleRenderer","_verticesCursor","_updateCachedColors","onChangeColors","_updateViewportRectangle","renderBackgrounds","_renderVertices","renderCursor","vertices","DYNAMIC_DRAW","_bgFloat","_colorToFloat32Array","_cursorFloat","_addRectangleFloat","updateBackgrounds","model","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","rectangleCount","cells","_updateRectangle","updateCursor","style","cursorWidth","startX","endX","expandFloat32Array","_addRectangle","x1","y1","SelectionRenderModel_1","COMBINED_CHAR_BIT_MASK","Uint32Array","selection","createSelectionRenderModel","resize","indexCount","CustomGlyphRasterizer_1","MultiKeyMap_1","TaskQueue_1","Constants_2","Event_1","NULL_RASTERIZED_GLYPH","texturePosition","_pages","_document","_config","_unicodeService","_didWarmUp","_cacheMap","FourKeyMap","_cacheMapCombined","_activePages","_workBoundingBox","bottom","right","_workAttributeData","_textureSize","_onAddTextureAtlasCanvas","Emitter","onAddTextureAtlasCanvas","_onRemoveTextureAtlasCanvas","onRemoveTextureAtlasCanvas","_pageLayoutVersion","fontProbeMismatchCount","_createNewPage","_tmpCanvas","createCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","alpha","remove","page","warmUp","_doWarmUp","queue","rasterizedGlyph","_drawToCache","clearTexture","every","glyphs","currentRow","_evictAllPages","pagesBySize","filter","percentageUsed","sameSizeI","mergingPages","some","p","newPage","AtlasPage","sortedMergingPagesIndexes","mergedPageIndex","mergedPage","_mergePages","nextVersion","_deletePage","mergedSize","xOffset","yOffset","drawImage","pageIndex","j","adjustingPage","startTime","_overflowSizePage","debug","toFixed","restrictToCellHeight","domContainer","_getFromCacheMap","cacheMap","key","_getColorFromAnsiIndex","_getBackgroundColor","bgColorMode","bgColor","dim","arr","_getForegroundColor","fgColorMode","fgColor","bold","excludeFromContrastRatioDemands","minimumContrastColor","_getMinimumContrastColor","_resolveBackgroundRgba","_resolveForegroundRgba","cache","_getContrastCache","adjustedColor","getColor","setColor","_probeRasterizationFontWeight","desired","token","font","fontProbeLastMismatch","actual","__orcaAtlasFontProbe","codeOrChars","parentElement","display","append","allowedWidth","allowedHeight","save","italic","underline","strikethrough","overline","temp","temp2","backgroundColor","fontStyle","textBaseline","powerlineGlyph","restrictedPowerlineGlyph","isRestrictedPowerlineGlyph","foregroundColor","padding","customGlyph","variantOffset","tryDrawCustomGlyph","chWidth","enableClearThresholdCheck","wcwidth","getStringCellWidth","strokeStyle","join","beginPath","xLeft","yTopDefault","yBotDefault","nextOffset","yTop","yBot","wasFilled","xChLeft","xChRight","moveTo","lineTo","clipRegion","Path2D","rect","clip","scaleX","scaleY","polygons","polygon","closePath","offsetWidth","setLineDash","computeNextVariantOffset","lineRatio","gapRatio","xChWidth","line","gap","stroke","restore","metrics","measureText","actualBoundingBoxDescent","strokeText","fillText","isBeyondCellBounds","clearColor","imageData","checkCompletelyTransparent","_findGlyphBoundingBox","activePage","activeRow","row","fixedRows","wasPageAndRowFound","candidatePage","putImageData","addGlyph","boundingBox","restrictedGlyph","found","alphaOffset","_usedPixels","_glyphs","glyph","sourcePages","concat","clearRect","enableThresholdCheck","threshold","CellColorResolver_1","CharAtlasCache_1","CursorBlinkStateManager_1","DevicePixelObserver_1","CellData_1","TextBlinkStateManager_1","GlyphRenderer_1","RectangleRenderer_1","RenderModel_1","LinkRenderLayer_1","Dom_1","WebglRenderer","_characterJoinerService","_charSizeService","_coreService","_customGlyphs","preserveDrawingBuffer","_cursorBlinkStateManager","MutableDisposable","_charAtlasDisposable","_observerDisposable","_model","RenderModel","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_workCell","_rectangleRenderer","_glyphRenderer","_onChangeTextureAtlas","onChangeTextureAtlas","_onRequestRedraw","onRequestRedraw","_onContextLoss","onContextLoss","_canvas","mainDocument","contextAttributes","antialias","depth","_handleColorChange","_cellColorResolver","CellColorResolver","_renderLayers","LinkRenderLayer","screenElement","linkifier","createRenderDimensions","_devicePixelRatio","_updateDimensions","_updateCursorBlink","onOptionChange","_handleOptionsChanged","_textBlinkStateManager","_requestRedrawViewport","_resetBlinkingRowState","_deviceMaxTextureSize","preventDefault","_contextRestorationTimeout","removeTerminalFromCache","_initializeWebGLState","observeDevicePixelDimensions","w","h","_setCanvasDevicePixelDimensions","onWindowChange","appendChild","_isAttached","isConnected","l","removeChild","textureAtlas","_charAtlas","_refreshCharAtlas","_clearModel","handleDevicePixelRatioChange","sync","handleCharSizeChanged","handleBlur","handleFocus","handleViewportVisibilityChange","handleSelectionChanged","handleCursorMove","acquireTextureAtlas","combinedDisposable","clearGlyphRenderer","clearTextureAtlas","reset","renderRows","handleGridChanged","_updateModel","merged","mergeRetries","decPrivateModes","cursorBlink","CursorBlinkStateManager","_requestRedrawCursor","joinedRanges","isJoined","skipJoinedCheckUntilX","isValidJoinRange","lastCharX","range","isCursorRow","clamp","cursorStyle","cursorY","baseY","viewportRelativeCursorY","cursorX","lastCursorX","isCursorInitialized","isCursorHidden","modelUpdated","bufferLine","lines","_nullModelCell","_setRowBlinkState","rowHasBlinkingCells","getJoinedCharacters","loadCell","firstSelectionState","JoinedCellData","translateToString","cursorInactiveStyle","_updateTextBlinkState","cellIndex","hasBlinkingCells","firstCell","_width","vertexSource","fragmentSource","program","attachShader","createShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","source","newLength","newArray","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","deleteShader","GitBranchSymbolsParts","sextant","pattern","rects","rowH","rowY","leftBit","rightBit","segmentedDigit","paths","segW","taperX","taperY","segH","y2","y3","x2","x3","midY","LINE_H","strokeWidth","LINE_V","FADE_RIGHT","FADE_LEFT","FADE_DOWN","FADE_UP","CURVE_DOWN_RIGHT","xp","yp","CURVE_DOWN_LEFT","CURVE_UP_RIGHT","CURVE_UP_LEFT","NODE_FILL","NODE_STROKE","NODE_LINE_RIGHT","NODE_LINE_LEFT","NODE_LINE_DOWN","NODE_LINE_UP","customGlyphDefinitions","rightPadding","leftPadding","scaleType","clipPath","fromEntries","_","fromCodePoint","unifiedCharDefinition","parts","part","drawDefinitionPart","createOffscreenPatternCanvas","OffscreenCanvas","createDomPatternCanvas","createPatternCanvas","offscreenCanvasFactory","domCanvasFactory","drawWidth","drawHeight","drawXOffset","drawYOffset","instruction","split","args","substring","applyClipPath","charDefinition","xEighth","yEighth","drawBlockVectorChar","patternSet","cachedPatterns","tmpCanvas","tmpCtx","ImageData","createPattern","dx","dy","setTransform","DOMMatrix","translateSelf","drawPatternChar","actualInstructions","currentX","currentY","lastControlX","lastControlY","lastCommand","f","svgToCanvasInstructionMap","translateArgs","drawPathFunctionCharacter","instructions","rx","ry","xAxisRotation","PI","largeArcFlag","sweepFlag","drawSvgArc","translatedArgs","quadraticCurveTo","cpX","cpY","bezierCurveTo","drawPathDefinitionCharacter","lineCap","drawPathNegativeDefinitionCharacter","cssLineWidth","drawVectorShape","paddingY","radius","bit","cx","brailleDotPositions","cy","arc","drawBrailleCharacter","phi","cosPhi","cos","sinPhi","sin","x1p","y1p","rxSq","rySq","x1pSq","y1pSq","lambda","lambdaSqrt","sqrt","sq","coef","cxp","cyp","ux","uy","vx","vy","startAngle","atan2","dTheta","endAngle","ellipse","C","L","M","Q","T","cellHeight","doClamp","clampToCell","rounded","BaseRenderLayer","_container","id","zIndex","_alpha","_deviceCharWidth","_deviceCharHeight","_deviceCellWidth","_deviceCellHeight","_deviceCharLeft","_deviceCharTop","classList","_initCanvas","_ctx","_clearAll","startRow","endRow","_setTransparency","oldCanvas","cloneNode","replaceChild","colorSet","_fillBottomLineAtCells","_clearCells","_fillCharTrueColor","_getFont","_clipCell","BaseRenderLayer_1","container","linkifier2","coreBrowserService","optionsService","themeService","onShowLinkUnderline","_handleShowLinkUnderline","onHideLinkUnderline","_handleHideLinkUnderline","_state","_clearCurrentLink","middleRowCount","is256Color","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","WebglRenderer_1","WebglAddon","getSafariVersion","_preserveDrawingBuffer","activate","onWillOpen","coreService","unsafeCore","renderService","_renderService","characterJoinerService","charSizeService","decorationService","_renderer","setRenderer","_createRenderer"],"sourceRoot":""} +\ No newline at end of file +diff --git a/lib/addon-webgl.mjs b/lib/addon-webgl.mjs +index 3e3c99a1e6807b2f57d7f93631bcee02a423e9bb..f040d0011e6859dab64e357a89d0e08bf8ce69ba 100644 +--- a/lib/addon-webgl.mjs ++++ b/lib/addon-webgl.mjs +@@ -14,7 +14,7 @@ + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +-function g(i){return{dispose:i}}function Ft(i){if(!i)return i;if(Array.isArray(i)){for(let e of i)e.dispose();return[]}return i.dispose(),i}function De(...i){return g(()=>Ft(i))}var R0=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},W=class{constructor(){this._store=new R0}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};W.None=Object.freeze({dispose(){}});var m0=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}};var Pe=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),O0=Pe?"node":navigator.userAgent,ce=Pe?"node":navigator.platform,Be=O0.includes("Firefox"),T1=O0.includes("Chrome"),we=O0.includes("Edge"),ue=/^((?!chrome|android).)*safari/i.test(O0);function He(){if(!ue)return 0;let i=O0.match(/Version\/(\d+)/);return i===null||i.length<2?0:parseInt(i[1],10)}var l1=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(ce),L1=["Windows","Win16","Win32","WinCE"].includes(ce),h1=ce.indexOf("Linux")>=0,d1=/\bCrOS\b/.test(O0);var P=0,B=0,w=0,x=0,K={css:"#00000000",rgba:0},Z;(r=>{function i(s,a,o,n){return n!==void 0?`#${E0(s)}${E0(a)}${E0(o)}${E0(n)}`:`#${E0(s)}${E0(a)}${E0(o)}`}r.toCss=i;function e(s,a,o,n=255){return(s<<24|a<<16|o<<8|n)>>>0}r.toRgba=e;function t(s,a,o,n){return{css:r.toCss(s,a,o,n),rgba:r.toRgba(s,a,o,n)}}r.toColor=t})(Z||={});var I0;(n=>{function i(L,T){if(x=(T.rgba&255)/255,x===1)return{css:T.css,rgba:T.rgba};let h=T.rgba>>24&255,d=T.rgba>>16&255,_=T.rgba>>8&255,p=L.rgba>>24&255,c=L.rgba>>16&255,u=L.rgba>>8&255;P=p+Math.round((h-p)*x),B=c+Math.round((d-c)*x),w=u+Math.round((_-u)*x);let C=Z.toCss(P,B,w),Q=Z.toRgba(P,B,w);return{css:C,rgba:Q}}n.blend=i;function e(L){return(L.rgba&255)===255}n.isOpaque=e;function t(L,T,h){let d=d0.ensureContrastRatio(L.rgba,T.rgba,h);if(d)return Z.toColor(d>>24&255,d>>16&255,d>>8&255)}n.ensureContrastRatio=t;function r(L){let T=(L.rgba|255)>>>0;return[P,B,w]=d0.toChannels(T),{css:Z.toCss(P,B,w),rgba:T}}n.opaque=r;function s(L,T){return x=Math.round(T*255),[P,B,w]=d0.toChannels(L.rgba),{css:Z.toCss(P,B,w,x),rgba:Z.toRgba(P,B,w,x)}}n.opacity=s;function a(L,T){return x=L.rgba&255,s(L,x*T/255)}n.multiplyOpacity=a;function o(L){return[L.rgba>>24&255,L.rgba>>16&255,L.rgba>>8&255]}n.toColorRGB=o})(I0||={});var gt;(r=>{let i,e;try{let s=document.createElement("canvas");s.width=1,s.height=1;let a=s.getContext("2d",{willReadFrequently:!0});a&&(i=a,i.globalCompositeOperation="copy",e=i.createLinearGradient(0,0,1,1))}catch{}function t(s){if(s.match(/#[\da-f]{3,8}/i))switch(s.length){case 4:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),Z.toColor(P,B,w);case 5:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),x=parseInt(s.slice(4,5).repeat(2),16),Z.toColor(P,B,w,x);case 7:return{css:s,rgba:(parseInt(s.slice(1),16)<<8|255)>>>0};case 9:return{css:s,rgba:parseInt(s.slice(1),16)>>>0}}let a=s.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return P=parseInt(a[1],10),B=parseInt(a[2],10),w=parseInt(a[3],10),x=Math.round((a[5]===void 0?1:parseFloat(a[5]))*255),Z.toColor(P,B,w,x);if(s==="transparent")return{css:"transparent",rgba:0};if(!i||!e)throw new Error("css.toColor: Unsupported css format");if(i.fillStyle=e,i.fillStyle=s,typeof i.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(i.fillRect(0,0,1,1),[P,B,w,x]=i.getImageData(0,0,1,1).data,x!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:Z.toRgba(P,B,w,x),css:s}}r.toColor=t})(gt||={});var V;(t=>{function i(r){return e(r>>16&255,r>>8&255,r&255)}t.relativeLuminance=i;function e(r,s,a){let o=r/255,n=s/255,L=a/255,T=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),h=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4),d=L<=.03928?L/12.92:Math.pow((L+.055)/1.055,2.4);return T*.2126+h*.7152+d*.0722}t.relativeLuminance2=e})(V||={});var d0;(a=>{function i(o,n){if(x=(n&255)/255,x===1)return n;let L=n>>24&255,T=n>>16&255,h=n>>8&255,d=o>>24&255,_=o>>16&255,p=o>>8&255;return P=d+Math.round((L-d)*x),B=_+Math.round((T-_)*x),w=p+Math.round((h-p)*x),Z.toRgba(P,B,w)}a.blend=i;function e(o,n,L){let T=V.relativeLuminance(o>>8),h=V.relativeLuminance(n>>8);if(h0(T,h)>8));if(u>8));return u>Q?c:C}return c}let _=r(o,n,L),p=h0(T,V.relativeLuminance(_>>8));if(p>8));return p>u?_:c}return _}}a.ensureContrastRatio=e;function t(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u0||p>0||c>0);)_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),c-=Math.max(0,Math.ceil(c*.1)),u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));return(_<<24|p<<16|c<<8|255)>>>0}a.reduceLuminance=t;function r(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u>>0}a.increaseLuminance=r;function s(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}a.toChannels=s})(d0||={});function E0(i){let e=i.toString(16);return e.length<2?"0"+e:e}function h0(i,e){return i=128512&&i<=128591||i>=127744&&i<=128511||i>=128640&&i<=128767||i>=9728&&i<=9983||i>=9984&&i<=10175||i>=65024&&i<=65039||i>=129280&&i<=129535||i>=127462&&i<=127487}function Ze(i,e,t,r){return e===1&&t>Math.ceil(r*1.5)&&i!==void 0&&i>255&&!yt(i)&&!W0(i)&&!Mt(i)}function V0(i){return W0(i)||At(i)}function Ue(){return{css:{canvas:U0(),cell:U0()},device:{canvas:U0(),cell:U0(),char:{width:0,height:0,left:0,top:0}}}}function U0(){return{width:0,height:0}}function We(i,e,t=0){return(i-(Math.round(e)*2-t))%(Math.round(e)*2)}var l;(C=>(C.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),C.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),C.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),C.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),C.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),C.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),C.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.CURVE_UP_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_UP_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),C.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),C.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),C.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),C.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),C.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})))(l||={});var Ve={"\u2500":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"\u2501":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"\u2502":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"\u2503":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"\u2504":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"\u2505":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"\u2506":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"\u2507":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"\u2508":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"\u2509":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"\u250A":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"\u250B":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"\u250C":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"\u250D":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u250E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u250F":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"\u2510":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"\u2511":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2512":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2513":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"\u2514":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"\u2515":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2516":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2517":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"\u2518":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"\u2519":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u251A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251B":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"\u251C":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"\u251D":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u251E":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251F":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2520":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2521":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2522":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2523":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"\u2524":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"\u2525":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2526":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2527":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2528":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2529":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u252A":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u252B":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"\u252C":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"\u252D":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u252E":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u252F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2530":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2531":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2532":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2533":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"\u2534":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"\u2535":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2536":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2537":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2538":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2539":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u253A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u253B":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"\u253C":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"\u253D":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u253E":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u253F":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2540":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2541":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2542":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2543":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u2544":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2545":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2546":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2547":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"\u2548":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"\u2549":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"\u254A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"\u254B":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"\u254C":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"\u254D":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"\u254E":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"\u254F":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"\u2550":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2551":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2552":{type:2,data:(i,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2553":{type:2,data:(i,e)=>`M${.5-i},1 L${.5-i},.5 L1,.5 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2554":{type:2,data:(i,e)=>`M1,${.5-e} L${.5-i},${.5-e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2555":{type:2,data:(i,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2556":{type:2,data:(i,e)=>`M${.5+i},1 L${.5+i},.5 L0,.5 M${.5-i},.5 L${.5-i},1`,strokeWidth:1},"\u2557":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5+i},${.5-e} L${.5+i},1`,strokeWidth:1},"\u2558":{type:2,data:(i,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"\u2559":{type:2,data:(i,e)=>`M1,.5 L${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u255A":{type:2,data:(i,e)=>`M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0 M1,${.5+e} L${.5-i},${.5+e} L${.5-i},0`,strokeWidth:1},"\u255B":{type:2,data:(i,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"\u255C":{type:2,data:(i,e)=>`M0,.5 L${.5+i},.5 L${.5+i},0 M${.5-i},.5 L${.5-i},0`,strokeWidth:1},"\u255D":{type:2,data:(i,e)=>`M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M0,${.5+e} L${.5+i},${.5+e} L${.5+i},0`,strokeWidth:1},"\u255E":{type:2,data:(i,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u255F":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1 M${.5+i},.5 L1,.5`,strokeWidth:1},"\u2560":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u2561":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2562":{type:2,data:(i,e)=>`M0,.5 L${.5-i},.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2563":{type:2,data:(i,e)=>`M${.5+i},0 L${.5+i},1 M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0`,strokeWidth:1},"\u2564":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"\u2565":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},1 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2566":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2567":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2568":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u2569":{type:2,data:(i,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256A":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u256B":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u256C":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256D":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u256E":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u256F":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u2570":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u2571":{type:2,data:"M1,0 L0,1",strokeWidth:1},"\u2572":{type:2,data:"M0,0 L1,1",strokeWidth:1},"\u2573":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"\u2574":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"\u2575":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"\u2576":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"\u2577":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"\u2578":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"\u2579":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"\u257A":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"\u257B":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"\u257C":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u257D":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u257E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u257F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2580":{type:0,data:[{x:0,y:0,w:8,h:4}]},"\u2581":{type:0,data:[{x:0,y:7,w:8,h:1}]},"\u2582":{type:0,data:[{x:0,y:6,w:8,h:2}]},"\u2583":{type:0,data:[{x:0,y:5,w:8,h:3}]},"\u2584":{type:0,data:[{x:0,y:4,w:8,h:4}]},"\u2585":{type:0,data:[{x:0,y:3,w:8,h:5}]},"\u2586":{type:0,data:[{x:0,y:2,w:8,h:6}]},"\u2587":{type:0,data:[{x:0,y:1,w:8,h:7}]},"\u2588":{type:0,data:[{x:0,y:0,w:8,h:8}]},"\u2589":{type:0,data:[{x:0,y:0,w:7,h:8}]},"\u258A":{type:0,data:[{x:0,y:0,w:6,h:8}]},"\u258B":{type:0,data:[{x:0,y:0,w:5,h:8}]},"\u258C":{type:0,data:[{x:0,y:0,w:4,h:8}]},"\u258D":{type:0,data:[{x:0,y:0,w:3,h:8}]},"\u258E":{type:0,data:[{x:0,y:0,w:2,h:8}]},"\u258F":{type:0,data:[{x:0,y:0,w:1,h:8}]},"\u2590":{type:0,data:[{x:4,y:0,w:4,h:8}]},"\u2591":{type:1,data:[[1,0],[0,0]]},"\u2592":{type:1,data:[[1,0],[0,1]]},"\u2593":{type:1,data:[[1,1],[1,0]]},"\u2594":{type:0,data:[{x:0,y:0,w:8,h:1}]},"\u2595":{type:0,data:[{x:7,y:0,w:1,h:8}]},"\u2596":{type:0,data:[{x:0,y:4,w:4,h:4}]},"\u2597":{type:0,data:[{x:4,y:4,w:4,h:4}]},"\u2598":{type:0,data:[{x:0,y:0,w:4,h:4}]},"\u2599":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\u259A":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"\u259B":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"\u259C":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"\u259D":{type:0,data:[{x:4,y:0,w:4,h:4}]},"\u259E":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"\u259F":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\uE0A0":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"\uE0A1":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0A2":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"\uE0A3":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0B0":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"\uE0B1":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B2":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"\uE0B3":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B4":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"\uE0B5":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"\uE0B6":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"\uE0B7":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"\uE0B8":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"\uE0B9":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BA":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"\uE0BB":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BC":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"\uE0BD":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BE":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"\uE0BF":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0C0":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"\uE0C1":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"\uE0C2":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"\uE0C3":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"\uE0C4":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"\uE0C5":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"\uE0C6":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"\uE0C7":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"\uE0C8":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"\uE0CA":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"\uE0CC":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"\uE0CD":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"\uE0CE":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"\uE0CF":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"\uE0D0":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"\uE0D1":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"\uE0D2":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"\uE0D4":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"\uEE00":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"\uEE01":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"\uEE02":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"\uEE03":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"\uEE04":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"\uEE05":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"\uEE06":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"\uEE07":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"\uEE08":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE09":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0A":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0B":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"\uF5D0":l.LINE_H,"\uF5D1":l.LINE_V,"\uF5D2":l.FADE_RIGHT,"\uF5D3":l.FADE_LEFT,"\uF5D4":l.FADE_DOWN,"\uF5D5":l.FADE_UP,"\uF5D6":l.CURVE_DOWN_RIGHT,"\uF5D7":l.CURVE_DOWN_LEFT,"\uF5D8":l.CURVE_UP_RIGHT,"\uF5D9":l.CURVE_UP_LEFT,"\uF5DA":[l.LINE_V,l.CURVE_UP_RIGHT],"\uF5DB":[l.LINE_V,l.CURVE_DOWN_RIGHT],"\uF5DC":[l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5DD":[l.LINE_V,l.CURVE_UP_LEFT],"\uF5DE":[l.LINE_V,l.CURVE_DOWN_LEFT],"\uF5DF":[l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E0":[l.LINE_H,l.CURVE_DOWN_LEFT],"\uF5E1":[l.LINE_H,l.CURVE_DOWN_RIGHT],"\uF5E2":[l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E3":[l.LINE_H,l.CURVE_UP_LEFT],"\uF5E4":[l.LINE_H,l.CURVE_UP_RIGHT],"\uF5E5":[l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E6":[l.LINE_V,l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E7":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E8":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E9":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5EA":[l.LINE_V,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5EB":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EC":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5ED":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EE":[l.NODE_FILL,l.NODE_STROKE],"\uF5EF":l.NODE_STROKE,"\uF5F0":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F1":[l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F2":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F3":[l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F4":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F5":[l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F6":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F7":[l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F8":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP],"\uF5F9":[l.NODE_STROKE,l.NODE_LINE_UP],"\uF5FA":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FB":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FC":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FD":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FE":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF5FF":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF600":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF601":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF602":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF603":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF604":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF605":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF606":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF607":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF608":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF609":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60A":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60B":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60C":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60D":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\u{1FB00}":f(1),"\u{1FB01}":f(2),"\u{1FB02}":f(3),"\u{1FB03}":f(4),"\u{1FB04}":f(5),"\u{1FB05}":f(6),"\u{1FB06}":f(7),"\u{1FB07}":f(8),"\u{1FB08}":f(9),"\u{1FB09}":f(10),"\u{1FB0A}":f(11),"\u{1FB0B}":f(12),"\u{1FB0C}":f(13),"\u{1FB0D}":f(14),"\u{1FB0E}":f(15),"\u{1FB0F}":f(16),"\u{1FB10}":f(17),"\u{1FB11}":f(18),"\u{1FB12}":f(19),"\u{1FB13}":f(20),"\u{1FB14}":f(22),"\u{1FB15}":f(23),"\u{1FB16}":f(24),"\u{1FB17}":f(25),"\u{1FB18}":f(26),"\u{1FB19}":f(27),"\u{1FB1A}":f(28),"\u{1FB1B}":f(29),"\u{1FB1C}":f(30),"\u{1FB1D}":f(31),"\u{1FB1E}":f(32),"\u{1FB1F}":f(33),"\u{1FB20}":f(34),"\u{1FB21}":f(35),"\u{1FB22}":f(36),"\u{1FB23}":f(37),"\u{1FB24}":f(38),"\u{1FB25}":f(39),"\u{1FB26}":f(40),"\u{1FB27}":f(41),"\u{1FB28}":f(43),"\u{1FB29}":f(44),"\u{1FB2A}":f(45),"\u{1FB2B}":f(46),"\u{1FB2C}":f(47),"\u{1FB2D}":f(48),"\u{1FB2E}":f(49),"\u{1FB2F}":f(50),"\u{1FB30}":f(51),"\u{1FB31}":f(52),"\u{1FB32}":f(53),"\u{1FB33}":f(54),"\u{1FB34}":f(55),"\u{1FB35}":f(56),"\u{1FB36}":f(57),"\u{1FB37}":f(58),"\u{1FB38}":f(59),"\u{1FB39}":f(60),"\u{1FB3A}":f(61),"\u{1FB3B}":f(62),"\u{1FB3C}":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"\u{1FB3D}":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"\u{1FB3E}":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"\u{1FB3F}":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"\u{1FB40}":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"\u{1FB41}":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB42}":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"\u{1FB43}":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB44}":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"\u{1FB45}":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"\u{1FB46}":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"\u{1FB47}":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"\u{1FB48}":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"\u{1FB49}":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"\u{1FB4A}":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"\u{1FB4B}":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"\u{1FB4C}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4D}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4E}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB4F}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB50}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"\u{1FB51}":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB52}":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB53}":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"\u{1FB54}":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB55}":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"\u{1FB56}":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"\u{1FB57}":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"\u{1FB58}":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"\u{1FB59}":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"\u{1FB5A}":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"\u{1FB5B}":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"\u{1FB5C}":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB5D}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5E}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5F}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB60}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB61}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"\u{1FB62}":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"\u{1FB63}":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"\u{1FB64}":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"\u{1FB65}":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"\u{1FB66}":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"\u{1FB67}":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"\u{1FB68}":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"\u{1FB69}":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"\u{1FB6A}":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"\u{1FB6B}":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"\u{1FB6C}":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"\u{1FB6D}":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"\u{1FB6E}":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"\u{1FB6F}":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"\u{1FB70}":{type:0,data:[{x:1,y:0,w:1,h:8}]},"\u{1FB71}":{type:0,data:[{x:2,y:0,w:1,h:8}]},"\u{1FB72}":{type:0,data:[{x:3,y:0,w:1,h:8}]},"\u{1FB73}":{type:0,data:[{x:4,y:0,w:1,h:8}]},"\u{1FB74}":{type:0,data:[{x:5,y:0,w:1,h:8}]},"\u{1FB75}":{type:0,data:[{x:6,y:0,w:1,h:8}]},"\u{1FB76}":{type:0,data:[{x:0,y:1,w:8,h:1}]},"\u{1FB77}":{type:0,data:[{x:0,y:2,w:8,h:1}]},"\u{1FB78}":{type:0,data:[{x:0,y:3,w:8,h:1}]},"\u{1FB79}":{type:0,data:[{x:0,y:4,w:8,h:1}]},"\u{1FB7A}":{type:0,data:[{x:0,y:5,w:8,h:1}]},"\u{1FB7B}":{type:0,data:[{x:0,y:6,w:8,h:1}]},"\u{1FB7C}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB7D}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7E}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7F}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB80}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB81}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB82}":{type:0,data:[{x:0,y:0,w:8,h:2}]},"\u{1FB83}":{type:0,data:[{x:0,y:0,w:8,h:3}]},"\u{1FB84}":{type:0,data:[{x:0,y:0,w:8,h:5}]},"\u{1FB85}":{type:0,data:[{x:0,y:0,w:8,h:6}]},"\u{1FB86}":{type:0,data:[{x:0,y:0,w:8,h:7}]},"\u{1FB87}":{type:0,data:[{x:6,y:0,w:2,h:8}]},"\u{1FB88}":{type:0,data:[{x:5,y:0,w:3,h:8}]},"\u{1FB89}":{type:0,data:[{x:3,y:0,w:5,h:8}]},"\u{1FB8A}":{type:0,data:[{x:2,y:0,w:6,h:8}]},"\u{1FB8B}":{type:0,data:[{x:1,y:0,w:7,h:8}]},"\u{1FB8C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"\u{1FB8D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"\u{1FB8E}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"\u{1FB8F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"\u{1FB90}":{type:1,data:[[0,1],[1,0]]},"\u{1FB91}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"\u{1FB92}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"\u{1FB94}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"\u{1FB95}":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"\u{1FB96}":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"\u{1FB97}":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"\u{1FB98}":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"\u{1FB99}":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"\u{1FB9A}":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"\u{1FB9B}":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"\u{1FB9C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"\u{1FB9D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"\u{1FB9E}":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"\u{1FB9F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"\u{1FBA0}":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"\u{1FBA1}":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"\u{1FBA2}":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"\u{1FBA3}":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"\u{1FBA4}":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBA5}":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBA6}":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBA7}":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"\u{1FBA8}":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"\u{1FBA9}":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"\u{1FBAA}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"\u{1FBAB}":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBAC}":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBAD}":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBAE}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"\u{1FBAF}":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"\u{1FBB0}":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"\u{1FBB1}":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"\u{1FBB2}":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"\u{1FBB3}":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"\u{1FBB4}":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"\u{1FBB5}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB6}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB7}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB8}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB9}":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"\u{1FBBA}":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"\u{1FBBB}":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"\u{1FBBC}":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"\u{1FBBD}":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"\u{1FBBE}":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"\u{1FBBF}":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"\u{1FBC0}":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"\u{1FBC1}":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"\u{1FBC2}":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"\u{1FBC3}":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"\u{1FBC4}":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"\u{1FBC5}":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC6}":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC7}":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC8}":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC9}":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBCA}":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"\u{1FBCB}":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"\u{1FBCC}":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"\u{1FBCD}":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"\u{1FBCE}":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"\u{1FBCF}":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"\u{1FBD0}":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"\u{1FBD1}":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"\u{1FBD2}":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"\u{1FBD3}":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"\u{1FBD4}":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"\u{1FBD5}":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"\u{1FBD6}":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"\u{1FBD7}":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"\u{1FBD8}":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"\u{1FBD9}":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDA}":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDB}":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"\u{1FBDC}":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"\u{1FBDD}":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"\u{1FBDE}":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"\u{1FBDF}":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"\u{1FBE0}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"\u{1FBE1}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"\u{1FBE2}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"\u{1FBE3}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"\u{1FBE4}":{type:0,data:[{x:2,y:0,w:4,h:4}]},"\u{1FBE5}":{type:0,data:[{x:2,y:4,w:4,h:4}]},"\u{1FBE6}":{type:0,data:[{x:0,y:2,w:4,h:4}]},"\u{1FBE7}":{type:0,data:[{x:4,y:2,w:4,h:4}]},"\u{1FBE8}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"\u{1FBE9}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"\u{1FBEA}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"\u{1FBEB}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"\u{1FBEC}":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"\u{1FBED}":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"\u{1FBEE}":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"\u{1FBEF}":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"\u{1FBF0}":{type:5,data:{d:o0(126),type:0},scaleType:1},"\u{1FBF1}":{type:5,data:{d:o0(48),type:0},scaleType:1},"\u{1FBF2}":{type:5,data:{d:o0(109),type:0},scaleType:1},"\u{1FBF3}":{type:5,data:{d:o0(121),type:0},scaleType:1},"\u{1FBF4}":{type:5,data:{d:o0(51),type:0},scaleType:1},"\u{1FBF5}":{type:5,data:{d:o0(91),type:0},scaleType:1},"\u{1FBF6}":{type:5,data:{d:o0(95),type:0},scaleType:1},"\u{1FBF7}":{type:5,data:{d:o0(114),type:0},scaleType:1},"\u{1FBF8}":{type:5,data:{d:o0(127),type:0},scaleType:1},"\u{1FBF9}":{type:5,data:{d:o0(123),type:0},scaleType:1},"\u{1FBFA}":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(i,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},$e=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951]);function f(i){return{type:2,data:()=>{let e=[],r=[.375,.25,.375],s=[0,3/8,5/8];for(let a=0;a<3;a++){let o=i>>a*2&1,n=i>>a*2+1&1;o&&n?e.push(`M0,${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L0,${s[a]+r[a]} Z`):o?e.push(`M0,${s[a]} L${.5},${s[a]} L${.5},${s[a]+r[a]} L0,${s[a]+r[a]} Z`):n&&e.push(`M${.5},${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L${.5},${s[a]+r[a]} Z`)}return e.join(" ")}}}function o0(i){let e=[];if(i&64){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.2125} L${Q+.075},${.175} L${m-.075},${.175} L${m},${.2125} L${m-.075},${.25} L${Q+.075},${.25} Z`)}if(i&32){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.175+.075+.015,m=.5-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&16){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.5+.015,m=.825-.075-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&8){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.7875} L${Q+.075},${.75} L${m-.075},${.75} L${m},${.7875} L${m-.075},${.825} L${Q+.075},${.825} Z`)}if(i&4&&e.push(`M${.125},${.515} L${.2},${.515+.0375} L${.2},${.735-.0375} L${.125},${.735} L${.05},${.735-.0375} L${.05},${.515+.0375} Z`),i&2&&e.push(`M${.125},${.265} L${.2},${.265+.0375} L${.2},${.485-.0375} L${.125},${.485} L${.05},${.485-.0375} L${.05},${.265+.0375} Z`),i&1){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.5} L${Q+.075},${.4625} L${m-.075},${.4625} L${m},${.5} L${m-.075},${.5375} L${Q+.075},${.5375} Z`)}return e.join(" ")}var k=0,H=0,T0=!1,_0=!1,$0=!1,z,x0=0,G0=class{constructor(e,t,r,s,a,o){this._terminal=e;this._optionService=t;this._selectionRenderModel=r;this._decorationService=s;this._coreBrowserService=a;this._themeService=o;this.result={fg:0,bg:0,ext:0}}resolve(e,t,r,s,a){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=e.bg&268435456?e.extended.ext:0,H=0,k=0,_0=!1,T0=!1,$0=!1,z=this._themeService.colors,x0=0;let o=e.getCode();if(o!==0&&e.extended.underlineStyle===4){let n=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));x0=t*s%(Math.round(n)*2)}if(x0===0&&$e.has(o)&&(x0=t*s%2*2+r*a%2),this._decorationService.forEachDecorationAtCell(t,r,"bottom",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),$0=this._selectionRenderModel.isCellSelected(this._terminal,t,r),$0){if(this.result.fg&67108864||(this.result.bg&50331648)!==0){if(this.result.fg&67108864)switch(this.result.fg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:H=(this.result.fg&16777215)<<8|255;break;case 0:default:H=this._themeService.colors.foreground.rgba}else switch(this.result.bg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:H=(this.result.bg&16777215)<<8|255;break}H=d0.blend(H,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}else H=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(_0=!0,z.selectionForeground&&(k=z.selectionForeground.rgba>>8&16777215,T0=!0),V0(e.getCode())){if(this.result.fg&67108864&&(this.result.bg&50331648)===0)k=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(this.result.fg&67108864)switch(this.result.bg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:k=(this.result.bg&16777215)<<8|255;break}else switch(this.result.fg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:k=(this.result.fg&16777215)<<8|255;break;case 0:default:k=this._themeService.colors.foreground.rgba}k=d0.blend(k,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}T0=!0}}this._decorationService.forEachDecorationAtCell(t,r,"top",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),_0&&($0?H=e.bg&-16777216&-134217729|H|50331648:H=e.bg&-16777216|H|50331648),T0&&(k=e.fg&-16777216&-67108865|k|50331648),this.result.fg&67108864&&(_0&&!T0&&((this.result.bg&50331648)===0?k=this.result.fg&-134217728|z.background.rgba>>8&16777215&16777215|50331648:k=this.result.fg&-134217728|this.result.bg&67108863,T0=!0),!_0&&T0&&((this.result.fg&50331648)===0?H=this.result.bg&-67108864|z.foreground.rgba>>8&16777215&16777215|50331648:H=this.result.bg&-67108864|this.result.fg&67108863,_0=!0)),z=void 0,this.result.bg=_0?H:this.result.bg,this.result.fg=T0?k:this.result.fg,this.result.ext&=536870911,this.result.ext|=x0<<29&3758096384}};var Ke=.5,K0=Be||we?"bottom":"ideographic";var Pt=typeof OffscreenCanvas>"u"?void 0:(i,e)=>new OffscreenCanvas(i,e),Bt=(i,e)=>{let t=document.createElement("canvas");return t.width=i,t.height=e,t};function wt(i,e,t=Pt,r=Bt){return t?.(i,e)??r(i,e)}function qe(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=Ve[e];if(p){let c=Array.isArray(p)?p:[p];for(let u of c)Ht(i,u,t,r,s,a,o,n,L,T,h,d,_);return!0}return!1}function Ht(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=s,c=a,u=t,C=r;switch(e.scaleType===1&&(p=o,c=n,u=t+(s-o)/2,C=r+(a-n)/2),e.clipPath&&(i.save(),Kt(i,e.clipPath,u,C,p,c)),e.type){case 0:kt(i,e.data,u,C,p,c);break;case 1:$t(i,e.data,u,C,p,c,_);break;case 2:Gt(i,e.data,u,C,p,c,T,h,e.strokeWidth);break;case 3:Ut(i,e.data,u,C,p,c,T,e.strokeWidth);break;case 4:Vt(i,e.data,u,C,p,c,T,d);break;case 5:zt(i,e.data,u,C,p,c,L,T,h);break;case 6:Zt(i,e.data,u,C,p,c);break}e.clipPath&&i.restore()}function kt(i,e,t,r,s,a){for(let o=0;o{let F=parseFloat(m);return R%2===0?t+F*s:r+F*a});if(u==="M")i.moveTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="L")i.lineTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="Q")i.quadraticCurveTo(Q[0],Q[1],Q[2],Q[3]),d=Q[0],_=Q[1],T=Q[2],h=Q[3];else if(u==="T"){let m,R;p==="Q"||p==="T"?(m=2*T-d,R=2*h-_):(m=T,R=h),i.quadraticCurveTo(m,R,Q[0],Q[1]),d=m,_=R,T=Q[0],h=Q[1]}else u==="C"&&(i.bezierCurveTo(Q[0],Q[1],Q[2],Q[3],Q[4],Q[5]),d=Q[2],_=Q[3],T=Q[4],h=Q[5]);p=u}n!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*n,i.stroke()):i.fill()}function Wt(i,e,t,r,s,a,o,n,L,T){if(r===0||s===0){i.lineTo(L,T);return}r=Math.abs(r),s=Math.abs(s);let h=Math.cos(a),d=Math.sin(a),_=(e-L)/2,p=(t-T)/2,c=h*_+d*p,u=-d*_+h*p,C=r*r,Q=s*s,m=c*c,R=u*u,F=m/C+R/Q;if(F>1){let I=Math.sqrt(F);r*=I,s*=I,C=r*r,Q=s*s}let E=(C*Q-C*R-Q*m)/(C*R+Q*m);E<0&&(E=0);let y=(o===n?-1:1)*Math.sqrt(E),Y=y*(r*u/s),X=y*-(s*c/r),M0=h*Y-d*X+(e+L)/2,t0=d*Y+h*X+(t+T)/2,L0=(c-Y)/r,M=(u-X)/s,n0=(-c-Y)/r,a0=(-u-X)/s,$=Math.atan2(M,L0),q=Math.atan2(a0,n0)-$;n===0&&q>0?q-=2*Math.PI:n===1&&q<0&&(q+=2*Math.PI);let A0=$+q;i.ellipse(M0,t0,r,s,a,$,A0,n===0)}function Vt(i,e,t,r,s,a,o,n){i.save(),i.fillRect(t,r,s,a),n&&(i.fillStyle=n,i.strokeStyle=n),i.lineWidth=o,i.lineCap="square",i.beginPath();for(let L of e.d.split(" ")){let T=L[0],h=L.substring(1).split(",");if(!h[0]||!h[1]){T==="Z"&&i.closePath();continue}let d=h.map((_,p)=>{let c=parseFloat(_);return p%2===0?t+c*s:r+c*a});T==="M"?i.moveTo(d[0],d[1]):T==="L"&&i.lineTo(d[0],d[1])}e.type===1?i.stroke():i.fill(),i.restore()}var Xe=new Map;function $t(i,e,t,r,s,a,o=0){let n=Xe.get(e);n||(n=new Map,Xe.set(e,n));let L=i.fillStyle;if(typeof L!="string")throw new Error(`Unexpected fillStyle type "${L}"`);let T=n.get(L);if(!T){let _=e[0].length,p=e.length,c=wt(_,p),u=A(c.getContext("2d")),C=new ImageData(_,p),Q,m,R,F;if(L.startsWith("#"))Q=parseInt(L.slice(1,3),16),m=parseInt(L.slice(3,5),16),R=parseInt(L.slice(5,7),16),F=L.length>7&&parseInt(L.slice(7,9),16)||1;else if(L.startsWith("rgba"))[Q,m,R,F]=L.substring(5,L.length-1).split(",").map(E=>parseFloat(E));else throw new Error(`Unexpected fillStyle color format "${L}" when drawing pattern glyph`);for(let E=0;E>1&1,d=o&1;h!==0||d!==0?T.setTransform(new DOMMatrix().translateSelf(-h,-d)):T.setTransform(new DOMMatrix),i.fillStyle=T,i.fillRect(t,r,s,a)}function Gt(i,e,t,r,s,a,o,n,L){i.save(),i.beginPath(),i.rect(t,r,s,a),i.clip(),i.beginPath();let T;if(typeof e=="function"){let _=.15/a*s;T=e(.15,_)}else T=e;let h={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let d of T.split(" ")){let _=d[0];if(_==="Z"){i.closePath(),h.lastCommand=_;continue}let p=je[_];if(!p){n.error(`Could not find drawing instructions for "${_}"`);continue}let c=d.substring(1).split(",");!c[0]||!c[1]||(p(i,Je(c,s,a,t,r,!0,o,0,0,!1),h),h.lastCommand=_)}L!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*L,i.stroke()):i.fill(),i.closePath(),i.restore()}function Kt(i,e,t,r,s,a){i.beginPath();for(let o of e.split(" ")){let n=o[0];if(n==="Z"){i.closePath();continue}let L=o.substring(1).split(",");if(!L[0]||!L[1])continue;let T=t+parseFloat(L[0])*s,h=r+parseFloat(L[1])*a;n==="M"?i.moveTo(T,h):n==="L"&&i.lineTo(T,h)}i.clip()}function zt(i,e,t,r,s,a,o,n,L){let T=new Path2D;T.rect(t,r,s,a),i.clip(T),i.beginPath();let h=o/12;i.lineWidth=n*h;let d={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let _ of e.d.split(" ")){let p=_[0];if(p==="Z"){i.closePath(),d.lastCommand=p;continue}let c=je[p];if(!c){L.error(`Could not find drawing instructions for "${p}"`);continue}let u=_.substring(1).split(",");!u[0]||!u[1]||(c(i,Je(u,s,a,t,r,!1,n,(e.leftPadding??0)*(h/2),(e.rightPadding??0)*(h/2)),d),d.lastCommand=p)}e.type===1?(i.strokeStyle=i.fillStyle,i.stroke()):i.fill(),i.closePath()}function Ye(i,e,t=0){return Math.max(Math.min(i,e),t)}var je={C:(i,e,t)=>{i.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),t.lastControlX=e[2],t.lastControlY=e[3],t.currentX=e[4],t.currentY=e[5]},L:(i,e,t)=>{i.lineTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},M:(i,e,t)=>{i.moveTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},Q:(i,e,t)=>{i.quadraticCurveTo(e[0],e[1],e[2],e[3]),t.lastControlX=e[0],t.lastControlY=e[1],t.currentX=e[2],t.currentY=e[3]},T:(i,e,t)=>{let r,s;t.lastCommand==="Q"||t.lastCommand==="T"?(r=2*t.currentX-t.lastControlX,s=2*t.currentY-t.lastControlY):(r=t.currentX,s=t.currentY),i.quadraticCurveTo(r,s,e[0],e[1]),t.lastControlX=r,t.lastControlY=s,t.currentX=e[0],t.currentY=e[1]}};function Je(i,e,t,r,s,a,o,n=0,L=0,T=!0){let h=i.map(d=>parseFloat(d)||parseInt(d));if(h.length<2)throw new Error("Too few arguments for instruction");for(let d=0;da){s-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),this._start();return}s=a}this.clear()}},Ce=class extends X0{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){let t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}},Qe=class extends X0{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}},et="requestIdleCallback"in globalThis?Qe:Ce;var s0=class i{constructor(){this.fg=0;this.bg=0;this.extended=new P0}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},P0=class i{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new i(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var U=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(e,t,r)=>{if(this._disposed)return g(()=>{});let s={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(s);let a=g(()=>{let o=this._listeners.indexOf(s);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return r&&(Array.isArray(r)?r.push(a):r.add(a)),a},this._event)}fire(e){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,e);return}let t=this._listeners;for(let r=0,s=t.length;r{function i(a,o){return a(n=>o.fire(n))}s.forward=i;function e(a,o){return(n,L,T)=>a(h=>n.call(L,o(h)),void 0,T)}s.map=e;function t(...a){return(o,n,L)=>{let T=new R0;for(let h of a)T.add(h(d=>o.call(n,d)));return L&&(Array.isArray(L)?L.push(T):L.add(T)),T}}s.any=t;function r(a,o,n){return o(n),a(L=>o(L))}s.runAndSubscribe=r})(c0||={});var tt={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},B0=2;var w0,J=class i{constructor(e,t,r,s){this._document=e;this._config=t;this._unicodeService=r;this._logService=s;this._didWarmUp=!1;this._cacheMap=new D0;this._cacheMapCombined=new D0;this._pages=[];this._activePages=[];this._workBoundingBox={top:0,left:0,bottom:0,right:0};this._workAttributeData=new s0;this._textureSize=512;this._onAddTextureAtlasCanvas=new U;this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=new U;this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._pageLayoutVersion=0;this._createNewPage(),this._tmpCanvas=it(e,this._config.deviceCellWidth*4+B0*2,this._config.deviceCellHeight+B0*2),this._tmpCtx=A(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new et(this._logService);for(let t=33;t<126;t++)e.enqueue(()=>{if(!this._cacheMap.get(t,0,0,0)){let r=this._drawToCache(t,0,0,0,!1,void 0);this._cacheMap.set(t,0,0,0,r)}})}get pageLayoutVersion(){return this._pageLayoutVersion}clearTexture(){if(!(this._pages[0].currentRow.x===0&&this._pages[0].currentRow.y===0)){for(let e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1,this._pageLayoutVersion++}}_createNewPage(){if(i.maxAtlasPages&&this._pages.length>=Math.max(4,i.maxAtlasPages)){let t=this._pages.filter(T=>T.canvas.width*2<=(i.maxTextureSize||4096)).sort((T,h)=>h.canvas.width!==T.canvas.width?h.canvas.width-T.canvas.width:h.percentageUsed-T.percentageUsed),r=-1,s=0;for(let T=0;TT.canvas.width!==a[0].canvas.width)){this._evictAllPages();let T=new u0(this._document,this._textureSize);return this._pages.push(T),this._activePages.push(T),this._onAddTextureAtlasCanvas.fire(T.canvas),T}let o=a.map(T=>T.glyphs[0].texturePage).sort((T,h)=>T-h),n=this.pages.length-a.length,L=this._mergePages(a,n);L.version=++u0.nextVersion;for(let T=o.length-1;T>=0;T--)this._deletePage(o[T]);this.pages.push(L),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(L.canvas)}let e=new u0(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){let r=e[0].canvas.width*2,s=new u0(this._document,r,e);for(let[a,o]of e.entries()){let n=a*o.canvas.width%r,L=Math.floor(a/2)*o.canvas.height;s.ctx.drawImage(o.canvas,n,L);for(let h of o.glyphs)h.texturePage=t,h.sizeClipSpace.x=h.size.x/r,h.sizeClipSpace.y=h.size.y/r,h.texturePosition.x+=n,h.texturePosition.y+=L,h.texturePositionClipSpace.x=h.texturePosition.x/r,h.texturePositionClipSpace.y=h.texturePosition.y/r;this._onRemoveTextureAtlasCanvas.fire(o.canvas);let T=this._activePages.indexOf(o);T!==-1&&this._activePages.splice(T,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,r,s){if(this._config.allowTransparency)return K;let a;switch(e){case 16777216:case 33554432:a=this._getColorFromAnsiIndex(t);break;case 50331648:let o=s0.toColorRGB(t);a=Z.toColor(o[0],o[1],o[2]);break;case 0:default:r?a=I0.opaque(this._config.colors.foreground):a=this._config.colors.background;break}return this._config.allowTransparency||(a=I0.opaque(a)),a}_getForegroundColor(e,t,r,s,a,o,n,L,T,h){let d=this._getMinimumContrastColor(e,t,r,s,a,o,n,T,L,h);if(d)return d;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&T&&o<8&&(o+=8),_=this._getColorFromAnsiIndex(o);break;case 50331648:let p=s0.toColorRGB(o);_=Z.toColor(p[0],p[1],p[2]);break;case 0:default:n?_=this._config.colors.background:_=this._config.colors.foreground}return this._config.allowTransparency&&(_=I0.opaque(_)),L&&(_=I0.multiplyOpacity(_,Ke)),_}_resolveBackgroundRgba(e,t,r){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,r,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,r,s,a,o,n,L,T,h){if(this._config.minimumContrastRatio===1||h)return;let d=this._getContrastCache(T),_=d.getColor(e,s);if(_!==void 0)return _??void 0;let p=this._resolveBackgroundRgba(t,r,n),c=this._resolveForegroundRgba(a,o,n,L),u=d0.ensureContrastRatio(p,c,this._config.minimumContrastRatio/(T?2:1));if(!u){d.setColor(e,s,null);return}let C=Z.toColor(u>>24&255,u>>16&255,u>>8&255);return d.setColor(e,s,C),C}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,r,s,a,o){let n=typeof e=="number"?String.fromCharCode(e):e;o&&this._tmpCanvas.parentElement!==o&&(this._tmpCanvas.style.display="none",o.append(this._tmpCanvas));let L=Math.min(this._config.deviceCellWidth*Math.max(n.length,2)+B0*2,this._config.deviceMaxTextureSize);this._tmpCanvas.width=b?b*2-f0:b-f0;!(f0>=b)===!1||Z0===0?(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j+Z0,G),this._tmpCtx.lineTo(Q0,G)):(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(j+Z0,G),this._tmpCtx.moveTo(j+Z0+b,G),this._tmpCtx.lineTo(Q0,G)),f0=We(Q0-j,b,f0);break;case 5:let vt=.6,Ot=.3,de=Q0-j,Se=Math.floor(vt*de),Re=Math.floor(Ot*de),It=de-Se-Re;this._tmpCtx.setLineDash([Se,Re,It]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break;case 1:default:this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break}y0||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!n0&&this._config.fontSize>=12&&!this._config.allowTransparency&&n!==" "){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";let r0=this._tmpCtx.measureText(n);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in r0&&r0.actualBoundingBoxDescent>0){this._tmpCtx.save();let y0=new Path2D;y0.rect(i0,C0-Math.ceil(b/2),this._config.deviceCellWidth*$,v0-C0+Math.ceil(b/2)),this._tmpCtx.clip(y0),this._tmpCtx.lineWidth=this._config.devicePixelRatio*3,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(n,M,M+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(Q){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),D=b%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(M,M+D),this._tmpCtx.lineTo(M+this._config.deviceCharWidth*$,M+D),this._tmpCtx.stroke()}if(n0||this._tmpCtx.fillText(n,M,M+this._config.deviceCharHeight),n==="_"&&!this._config.allowTransparency){let b=fe(this._tmpCtx.getImageData(M,M,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0);if(b)for(let D=1;D<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(n,M,M+this._config.deviceCharHeight-D),b=fe(this._tmpCtx.getImageData(M,M,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0),!!b);D++);}if(C){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),D=this._tmpCtx.lineWidth%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(M,M+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.lineTo(M+this._config.deviceCharWidth*$,M+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.stroke()}this._tmpCtx.restore();let q=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height),A0;if(this._config.allowTransparency?A0=Xt(q):A0=fe(q,y,L0,a0),A0)return tt;let I=this._findGlyphBoundingBox(q,this._workBoundingBox,L,t0,n0,M),O,v;for(;;){if(this._activePages.length===0){let b=this._createNewPage();O=b,v=b.currentRow,v.height=I.size.y;break}O=this._activePages[this._activePages.length-1],v=O.currentRow;for(let b of this._activePages)I.size.y<=b.currentRow.height&&(O=b,v=b.currentRow);for(let b=this._activePages.length-1;b>=0;b--)for(let D of this._activePages[b].fixedRows)D.height<=v.height&&I.size.y<=D.height&&(O=this._activePages[b],v=D);if(I.size.x>this._textureSize){this._overflowSizePage||(i.maxAtlasPages&&this._pages.length>=i.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new u0(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),O=this._overflowSizePage,v=this._overflowSizePage.currentRow,v.x+I.size.x>=O.canvas.width&&(v.x=0,v.y+=v.height,v.height=0);break}if(v.y+I.size.y>=O.canvas.height||v.height>I.size.y+2){let b=!1;if(O.currentRow.y+O.currentRow.height+I.size.y>=O.canvas.height){let D;for(let i0 of this._activePages)if(i0.currentRow.y+i0.currentRow.height+I.size.y=i.maxAtlasPages&&v.y+I.size.y<=O.canvas.height&&v.height>=I.size.y&&v.x+I.size.x<=O.canvas.width)b=!0;else{let i0=this._createNewPage();O=i0,v=i0.currentRow,v.height=I.size.y,b=!0}}b||(O.currentRow.height>0&&O.fixedRows.push(O.currentRow),v={x:0,y:O.currentRow.y+O.currentRow.height,height:I.size.y},O.fixedRows.push(v),O.currentRow={x:0,y:v.y+v.height,height:0})}if(v.x+I.size.x<=O.canvas.width)break;v===O.currentRow?(v.x=0,v.y+=v.height,v.height=0):O.fixedRows.splice(O.fixedRows.indexOf(v),1)}return I.texturePage=this._pages.indexOf(O),I.texturePosition.x=v.x,I.texturePosition.y=v.y,I.texturePositionClipSpace.x=v.x/O.canvas.width,I.texturePositionClipSpace.y=v.y/O.canvas.height,I.sizeClipSpace.x/=O.canvas.width,I.sizeClipSpace.y/=O.canvas.height,v.height=Math.max(v.height,I.size.y),v.x+=I.size.x,O.ctx.putImageData(q,I.texturePosition.x-this._workBoundingBox.left,I.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,I.size.x,I.size.y),O.addGlyph(I),O.version=++u0.nextVersion,I}_findGlyphBoundingBox(e,t,r,s,a,o){t.top=0;let n=s?this._config.deviceCellHeight:this._tmpCanvas.height,L=s?this._config.deviceCellWidth:r,T=!1;for(let h=0;h=o;h--){for(let d=0;d=0;h--){for(let d=0;d>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=t.rgba>>>24,L=t.rgba>>>16&255,T=t.rgba>>>8&255,h=Math.floor((Math.abs(s-n)+Math.abs(a-L)+Math.abs(o-T))/12),d=!0;for(let _=0;_0)return!1;return!0}function it(i,e,t){let r=i.createElement("canvas");return r.width=e,r.height=t,r}function rt(i,e,t,r,s,a,o,n,L=!0){let T={foreground:a.foreground,background:a.background,cursor:K,cursorAccent:K,selectionForeground:K,selectionBackgroundTransparent:K,selectionBackgroundOpaque:K,selectionInactiveBackgroundTransparent:K,selectionInactiveBackgroundOpaque:K,overviewRulerBorder:K,scrollbarSliderBackground:K,scrollbarSliderHoverBackground:K,scrollbarSliderActiveBackground:K,ansi:a.ansi.slice(),contrastCache:a.contrastCache,halfContrastCache:a.halfContrastCache};return{customGlyphs:L,devicePixelRatio:o,deviceMaxTextureSize:n,letterSpacing:s.letterSpacing,lineHeight:s.lineHeight,deviceCellWidth:i,deviceCellHeight:e,deviceCharWidth:t,deviceCharHeight:r,fontFamily:s.fontFamily,fontSize:s.fontSize,fontWeight:s.fontWeight,fontWeightBold:s.fontWeightBold,allowTransparency:s.allowTransparency,drawBoldTextInBrightColors:s.drawBoldTextInBrightColors,minimumContrastRatio:s.minimumContrastRatio,colors:T}}function Ee(i,e){for(let t=0;t=0){if(Ee(u.config,h))return u.atlas;u.ownedBy.length===1?(u.atlas.dispose(),e0.splice(c,1)):u.ownedBy.splice(C,1);break}}for(let c=0;c{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0){this._restartInterval(t);return}}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);this._animationTimeRestarted=void 0,this._restartInterval(t);return}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},e)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}};function ve(i,e,t){let r=new e.ResizeObserver(s=>{let a=s.find(L=>L.target===i);if(!a)return;if(!("devicePixelContentBoxSize"in a)){r?.disconnect(),r=void 0;return}let o=a.devicePixelContentBoxSize[0].inlineSize,n=a.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&t(o,n)});try{r.observe(i,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return g(()=>r?.disconnect())}function nt(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}var j0=class i extends s0{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new P0;this.combinedData=""}static fromCharData(t){let r=new i;return r.setFromCharData(t),r}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?nt(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let r=!1;if(t[1].length>2)r=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let a=t[1].charCodeAt(1);56320<=a&&a<=57343?this.content=(s-55296)*1024+a-56320+65536|t[2]<<22:r=!0}else r=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;r&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;let r=this.isUnderlineColorDefault(),s=t.isUnderlineColorDefault();if(!(r&&s)&&(r!==s||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return!1}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var J0=class extends W{constructor(t,r,s){super();this._renderCallback=t;this._coreBrowserService=r;this._optionsService=s;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",a=>{this.setIntervalDuration(a)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(g(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let r=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),r||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var te=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]);function ie(i,e,t,r){let s=A(i.createProgram());if(i.attachShader(s,A(at(i,i.VERTEX_SHADER,e,r))),i.attachShader(s,A(at(i,i.FRAGMENT_SHADER,t,r))),i.linkProgram(s),i.getProgramParameter(s,i.LINK_STATUS))return s;r.error(i.getProgramInfoLog(s)),i.deleteProgram(s)}function at(i,e,t,r){let s=A(i.createShader(e));if(i.shaderSource(s,t),i.compileShader(s),i.getShaderParameter(s,i.COMPILE_STATUS))return s;r.error(i.getShaderInfoLog(s)),i.deleteShader(s)}function ot(i,e){let t=Math.min(i.length*2,e),r=new Float32Array(t);for(let s=0;sFt(i))}var R0=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(let e of this._disposables)e.dispose();this._disposables.clear()}},W=class{constructor(){this._store=new R0}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}};W.None=Object.freeze({dispose(){}});var m0=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}};var Pe=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),O0=Pe?"node":navigator.userAgent,ce=Pe?"node":navigator.platform,Be=O0.includes("Firefox"),T1=O0.includes("Chrome"),we=O0.includes("Edge"),ue=/^((?!chrome|android).)*safari/i.test(O0);function He(){if(!ue)return 0;let i=O0.match(/Version\/(\d+)/);return i===null||i.length<2?0:parseInt(i[1],10)}var l1=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(ce),L1=["Windows","Win16","Win32","WinCE"].includes(ce),h1=ce.indexOf("Linux")>=0,d1=/\bCrOS\b/.test(O0);var P=0,B=0,w=0,x=0,K={css:"#00000000",rgba:0},Z;(r=>{function i(s,a,o,n){return n!==void 0?`#${E0(s)}${E0(a)}${E0(o)}${E0(n)}`:`#${E0(s)}${E0(a)}${E0(o)}`}r.toCss=i;function e(s,a,o,n=255){return(s<<24|a<<16|o<<8|n)>>>0}r.toRgba=e;function t(s,a,o,n){return{css:r.toCss(s,a,o,n),rgba:r.toRgba(s,a,o,n)}}r.toColor=t})(Z||={});var I0;(n=>{function i(L,T){if(x=(T.rgba&255)/255,x===1)return{css:T.css,rgba:T.rgba};let h=T.rgba>>24&255,d=T.rgba>>16&255,_=T.rgba>>8&255,p=L.rgba>>24&255,c=L.rgba>>16&255,u=L.rgba>>8&255;P=p+Math.round((h-p)*x),B=c+Math.round((d-c)*x),w=u+Math.round((_-u)*x);let C=Z.toCss(P,B,w),Q=Z.toRgba(P,B,w);return{css:C,rgba:Q}}n.blend=i;function e(L){return(L.rgba&255)===255}n.isOpaque=e;function t(L,T,h){let d=d0.ensureContrastRatio(L.rgba,T.rgba,h);if(d)return Z.toColor(d>>24&255,d>>16&255,d>>8&255)}n.ensureContrastRatio=t;function r(L){let T=(L.rgba|255)>>>0;return[P,B,w]=d0.toChannels(T),{css:Z.toCss(P,B,w),rgba:T}}n.opaque=r;function s(L,T){return x=Math.round(T*255),[P,B,w]=d0.toChannels(L.rgba),{css:Z.toCss(P,B,w,x),rgba:Z.toRgba(P,B,w,x)}}n.opacity=s;function a(L,T){return x=L.rgba&255,s(L,x*T/255)}n.multiplyOpacity=a;function o(L){return[L.rgba>>24&255,L.rgba>>16&255,L.rgba>>8&255]}n.toColorRGB=o})(I0||={});var gt;(r=>{let i,e;try{let s=document.createElement("canvas");s.width=1,s.height=1;let a=s.getContext("2d",{willReadFrequently:!0});a&&(i=a,i.globalCompositeOperation="copy",e=i.createLinearGradient(0,0,1,1))}catch{}function t(s){if(s.match(/#[\da-f]{3,8}/i))switch(s.length){case 4:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),Z.toColor(P,B,w);case 5:return P=parseInt(s.slice(1,2).repeat(2),16),B=parseInt(s.slice(2,3).repeat(2),16),w=parseInt(s.slice(3,4).repeat(2),16),x=parseInt(s.slice(4,5).repeat(2),16),Z.toColor(P,B,w,x);case 7:return{css:s,rgba:(parseInt(s.slice(1),16)<<8|255)>>>0};case 9:return{css:s,rgba:parseInt(s.slice(1),16)>>>0}}let a=s.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return P=parseInt(a[1],10),B=parseInt(a[2],10),w=parseInt(a[3],10),x=Math.round((a[5]===void 0?1:parseFloat(a[5]))*255),Z.toColor(P,B,w,x);if(s==="transparent")return{css:"transparent",rgba:0};if(!i||!e)throw new Error("css.toColor: Unsupported css format");if(i.fillStyle=e,i.fillStyle=s,typeof i.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(i.fillRect(0,0,1,1),[P,B,w,x]=i.getImageData(0,0,1,1).data,x!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:Z.toRgba(P,B,w,x),css:s}}r.toColor=t})(gt||={});var V;(t=>{function i(r){return e(r>>16&255,r>>8&255,r&255)}t.relativeLuminance=i;function e(r,s,a){let o=r/255,n=s/255,L=a/255,T=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),h=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4),d=L<=.03928?L/12.92:Math.pow((L+.055)/1.055,2.4);return T*.2126+h*.7152+d*.0722}t.relativeLuminance2=e})(V||={});var d0;(a=>{function i(o,n){if(x=(n&255)/255,x===1)return n;let L=n>>24&255,T=n>>16&255,h=n>>8&255,d=o>>24&255,_=o>>16&255,p=o>>8&255;return P=d+Math.round((L-d)*x),B=_+Math.round((T-_)*x),w=p+Math.round((h-p)*x),Z.toRgba(P,B,w)}a.blend=i;function e(o,n,L){let T=V.relativeLuminance(o>>8),h=V.relativeLuminance(n>>8);if(h0(T,h)>8));if(u>8));return u>Q?c:C}return c}let _=r(o,n,L),p=h0(T,V.relativeLuminance(_>>8));if(p>8));return p>u?_:c}return _}}a.ensureContrastRatio=e;function t(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u0||p>0||c>0);)_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),c-=Math.max(0,Math.ceil(c*.1)),u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));return(_<<24|p<<16|c<<8|255)>>>0}a.reduceLuminance=t;function r(o,n,L){let T=o>>24&255,h=o>>16&255,d=o>>8&255,_=n>>24&255,p=n>>16&255,c=n>>8&255,u=h0(V.relativeLuminance2(_,p,c),V.relativeLuminance2(T,h,d));for(;u>>0}a.increaseLuminance=r;function s(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}a.toChannels=s})(d0||={});function E0(i){let e=i.toString(16);return e.length<2?"0"+e:e}function h0(i,e){return i=128512&&i<=128591||i>=127744&&i<=128511||i>=128640&&i<=128767||i>=9728&&i<=9983||i>=9984&&i<=10175||i>=65024&&i<=65039||i>=129280&&i<=129535||i>=127462&&i<=127487}function Ze(i,e,t,r){return e===1&&t>Math.ceil(r*1.5)&&i!==void 0&&i>255&&!yt(i)&&!W0(i)&&!Mt(i)}function V0(i){return W0(i)||At(i)}function Ue(){return{css:{canvas:U0(),cell:U0()},device:{canvas:U0(),cell:U0(),char:{width:0,height:0,left:0,top:0}}}}function U0(){return{width:0,height:0}}function We(i,e,t=0){return(i-(Math.round(e)*2-t))%(Math.round(e)*2)}var l;(C=>(C.LINE_H=Object.freeze({type:2,data:"M0,.5 L1,.5",strokeWidth:1}),C.LINE_V=Object.freeze({type:2,data:"M.5,0 L.5,1",strokeWidth:1}),C.FADE_RIGHT=Object.freeze({type:2,data:"M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5",strokeWidth:1}),C.FADE_LEFT=Object.freeze({type:2,data:"M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5",strokeWidth:1}),C.FADE_DOWN=Object.freeze({type:2,data:"M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90",strokeWidth:1}),C.FADE_UP=Object.freeze({type:2,data:"M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1",strokeWidth:1}),C.CURVE_DOWN_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_DOWN_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,1 L.5,${.5+m/.15*.5} C.5,${.5+m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.CURVE_UP_RIGHT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,1,.5`,strokeWidth:1}),C.CURVE_UP_LEFT=Object.freeze({type:2,data:(Q,m)=>`M.5,0 L.5,${.5-m/.15*.5} C.5,${.5-m/.15*.5},.5,.5,0,.5`,strokeWidth:1}),C.NODE_FILL=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5"}),C.NODE_STROKE=Object.freeze({type:3,data:"M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5",strokeWidth:1}),C.NODE_LINE_RIGHT=Object.freeze({type:3,data:"M1,.5 L.85,.5",strokeWidth:1}),C.NODE_LINE_LEFT=Object.freeze({type:3,data:"M0,.5 L.15,.5",strokeWidth:1}),C.NODE_LINE_DOWN=Object.freeze({type:3,data:"M.5,1 L.5,.7",strokeWidth:1}),C.NODE_LINE_UP=Object.freeze({type:3,data:"M.5,0 L.5,.3",strokeWidth:1})))(l||={});var Ve={"\u2500":{type:2,data:"M0,.5 L1,.5",strokeWidth:1},"\u2501":{type:2,data:"M0,.5 L1,.5",strokeWidth:3},"\u2502":{type:2,data:"M.5,0 L.5,1",strokeWidth:1},"\u2503":{type:2,data:"M.5,0 L.5,1",strokeWidth:3},"\u2504":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:1},"\u2505":{type:2,data:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5",strokeWidth:3},"\u2506":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:1},"\u2507":{type:2,data:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333",strokeWidth:3},"\u2508":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:1},"\u2509":{type:2,data:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5",strokeWidth:3},"\u250A":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:1},"\u250B":{type:2,data:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95",strokeWidth:3},"\u250C":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},"\u250D":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u250E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u250F":{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3},"\u2510":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},"\u2511":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2512":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2513":{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3},"\u2514":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},"\u2515":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2516":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2517":{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3},"\u2518":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},"\u2519":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u251A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251B":{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3},"\u251C":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},"\u251D":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u251E":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u251F":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2520":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2521":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2522":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2523":{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3},"\u2524":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},"\u2525":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2526":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2527":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2528":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2529":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u252A":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u252B":{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3},"\u252C":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},"\u252D":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u252E":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u252F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2530":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2531":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2532":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2533":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3},"\u2534":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:1},"\u2535":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u2536":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u2537":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2538":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2539":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u253A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u253B":{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,0",strokeWidth:3},"\u253C":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:1},"\u253D":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u253E":[{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u253F":[{type:2,data:"M.5,0 L.5,1",strokeWidth:1},{type:2,data:"M0,.5 L1,.5",strokeWidth:3}],"\u2540":[{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2541":[{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u2542":[{type:2,data:"M0,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1",strokeWidth:3}],"\u2543":[{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:3}],"\u2544":[{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:3}],"\u2545":[{type:2,data:"M.5,0 L.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M0,.5 L.5,.5 L.5,1",strokeWidth:3}],"\u2546":[{type:2,data:"M.5,0 L.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M0.5,1 L.5,.5 L1,.5",strokeWidth:3}],"\u2547":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0 M0,.5 L1,.5",strokeWidth:3}],"\u2548":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M0,.5 L1,.5 M.5,.5 L.5,1",strokeWidth:3}],"\u2549":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L0,.5",strokeWidth:3}],"\u254A":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,0 L.5,1 M.5,.5 L1,.5",strokeWidth:3}],"\u254B":{type:2,data:"M0,.5 L1,.5 M.5,0 L.5,1",strokeWidth:3},"\u254C":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:1},"\u254D":{type:2,data:"M.1,.5 L.4,.5 M.6,.5 L.9,.5",strokeWidth:3},"\u254E":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:1},"\u254F":{type:2,data:"M.5,.1 L.5,.4 M.5,.6 L.5,.9",strokeWidth:3},"\u2550":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2551":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2552":{type:2,data:(i,e)=>`M.5,1 L.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2553":{type:2,data:(i,e)=>`M${.5-i},1 L${.5-i},.5 L1,.5 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2554":{type:2,data:(i,e)=>`M1,${.5-e} L${.5-i},${.5-e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2555":{type:2,data:(i,e)=>`M0,${.5-e} L.5,${.5-e} L.5,1 M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2556":{type:2,data:(i,e)=>`M${.5+i},1 L${.5+i},.5 L0,.5 M${.5-i},.5 L${.5-i},1`,strokeWidth:1},"\u2557":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5+i},${.5-e} L${.5+i},1`,strokeWidth:1},"\u2558":{type:2,data:(i,e)=>`M.5,0 L.5,${.5+e} L1,${.5+e} M.5,${.5-e} L1,${.5-e}`,strokeWidth:1},"\u2559":{type:2,data:(i,e)=>`M1,.5 L${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u255A":{type:2,data:(i,e)=>`M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0 M1,${.5+e} L${.5-i},${.5+e} L${.5-i},0`,strokeWidth:1},"\u255B":{type:2,data:(i,e)=>`M0,${.5+e} L.5,${.5+e} L.5,0 M0,${.5-e} L.5,${.5-e}`,strokeWidth:1},"\u255C":{type:2,data:(i,e)=>`M0,.5 L${.5+i},.5 L${.5+i},0 M${.5-i},.5 L${.5-i},0`,strokeWidth:1},"\u255D":{type:2,data:(i,e)=>`M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M0,${.5+e} L${.5+i},${.5+e} L${.5+i},0`,strokeWidth:1},"\u255E":{type:2,data:(i,e)=>`M.5,0 L.5,1 M.5,${.5-e} L1,${.5-e} M.5,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u255F":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1 M${.5+i},.5 L1,.5`,strokeWidth:1},"\u2560":{type:2,data:(i,e)=>`M${.5-i},0 L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u2561":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L.5,${.5-e} M0,${.5+e} L.5,${.5+e}`,strokeWidth:1},"\u2562":{type:2,data:(i,e)=>`M0,.5 L${.5-i},.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u2563":{type:2,data:(i,e)=>`M${.5+i},0 L${.5+i},1 M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0`,strokeWidth:1},"\u2564":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e} M.5,${.5+e} L.5,1`,strokeWidth:1},"\u2565":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},1 M${.5+i},.5 L${.5+i},1`,strokeWidth:1},"\u2566":{type:2,data:(i,e)=>`M0,${.5-e} L1,${.5-e} M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1`,strokeWidth:1},"\u2567":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e} M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u2568":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},.5 L${.5-i},0 M${.5+i},.5 L${.5+i},0`,strokeWidth:1},"\u2569":{type:2,data:(i,e)=>`M0,${.5+e} L1,${.5+e} M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256A":{type:2,data:(i,e)=>`M.5,0 L.5,1 M0,${.5-e} L1,${.5-e} M0,${.5+e} L1,${.5+e}`,strokeWidth:1},"\u256B":{type:2,data:(i,e)=>`M0,.5 L1,.5 M${.5-i},0 L${.5-i},1 M${.5+i},0 L${.5+i},1`,strokeWidth:1},"\u256C":{type:2,data:(i,e)=>`M0,${.5+e} L${.5-i},${.5+e} L${.5-i},1 M1,${.5+e} L${.5+i},${.5+e} L${.5+i},1 M0,${.5-e} L${.5-i},${.5-e} L${.5-i},0 M1,${.5-e} L${.5+i},${.5-e} L${.5+i},0`,strokeWidth:1},"\u256D":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u256E":{type:2,data:(i,e)=>`M.5,1 L.5,${.5+e/.15*.5} C.5,${.5+e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u256F":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,0,.5`,strokeWidth:1},"\u2570":{type:2,data:(i,e)=>`M.5,0 L.5,${.5-e/.15*.5} C.5,${.5-e/.15*.5},.5,.5,1,.5`,strokeWidth:1},"\u2571":{type:2,data:"M1,0 L0,1",strokeWidth:1},"\u2572":{type:2,data:"M0,0 L1,1",strokeWidth:1},"\u2573":{type:2,data:"M1,0 L0,1 M0,0 L1,1",strokeWidth:1},"\u2574":{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},"\u2575":{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},"\u2576":{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},"\u2577":{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},"\u2578":{type:2,data:"M.5,.5 L0,.5",strokeWidth:3},"\u2579":{type:2,data:"M.5,.5 L.5,0",strokeWidth:3},"\u257A":{type:2,data:"M.5,.5 L1,.5",strokeWidth:3},"\u257B":{type:2,data:"M.5,.5 L.5,1",strokeWidth:3},"\u257C":[{type:2,data:"M.5,.5 L0,.5",strokeWidth:1},{type:2,data:"M.5,.5 L1,.5",strokeWidth:3}],"\u257D":[{type:2,data:"M.5,.5 L.5,0",strokeWidth:1},{type:2,data:"M.5,.5 L.5,1",strokeWidth:3}],"\u257E":[{type:2,data:"M.5,.5 L1,.5",strokeWidth:1},{type:2,data:"M.5,.5 L0,.5",strokeWidth:3}],"\u257F":[{type:2,data:"M.5,.5 L.5,1",strokeWidth:1},{type:2,data:"M.5,.5 L.5,0",strokeWidth:3}],"\u2580":{type:0,data:[{x:0,y:0,w:8,h:4}]},"\u2581":{type:0,data:[{x:0,y:7,w:8,h:1}]},"\u2582":{type:0,data:[{x:0,y:6,w:8,h:2}]},"\u2583":{type:0,data:[{x:0,y:5,w:8,h:3}]},"\u2584":{type:0,data:[{x:0,y:4,w:8,h:4}]},"\u2585":{type:0,data:[{x:0,y:3,w:8,h:5}]},"\u2586":{type:0,data:[{x:0,y:2,w:8,h:6}]},"\u2587":{type:0,data:[{x:0,y:1,w:8,h:7}]},"\u2588":{type:0,data:[{x:0,y:0,w:8,h:8}]},"\u2589":{type:0,data:[{x:0,y:0,w:7,h:8}]},"\u258A":{type:0,data:[{x:0,y:0,w:6,h:8}]},"\u258B":{type:0,data:[{x:0,y:0,w:5,h:8}]},"\u258C":{type:0,data:[{x:0,y:0,w:4,h:8}]},"\u258D":{type:0,data:[{x:0,y:0,w:3,h:8}]},"\u258E":{type:0,data:[{x:0,y:0,w:2,h:8}]},"\u258F":{type:0,data:[{x:0,y:0,w:1,h:8}]},"\u2590":{type:0,data:[{x:4,y:0,w:4,h:8}]},"\u2591":{type:1,data:[[1,0],[0,0]]},"\u2592":{type:1,data:[[1,0],[0,1]]},"\u2593":{type:1,data:[[1,1],[1,0]]},"\u2594":{type:0,data:[{x:0,y:0,w:8,h:1}]},"\u2595":{type:0,data:[{x:7,y:0,w:1,h:8}]},"\u2596":{type:0,data:[{x:0,y:4,w:4,h:4}]},"\u2597":{type:0,data:[{x:4,y:4,w:4,h:4}]},"\u2598":{type:0,data:[{x:0,y:0,w:4,h:4}]},"\u2599":{type:0,data:[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\u259A":{type:0,data:[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}]},"\u259B":{type:0,data:[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}]},"\u259C":{type:0,data:[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}]},"\u259D":{type:0,data:[{x:4,y:0,w:4,h:4}]},"\u259E":{type:0,data:[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}]},"\u259F":{type:0,data:[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}]},"\uE0A0":{type:5,data:{d:"M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655",type:0}},"\uE0A1":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0A2":{type:5,data:{d:"M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82",type:0}},"\uE0A3":{type:5,data:{d:"M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5",type:0}},"\uE0B0":{type:5,data:{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2}},"\uE0B1":{type:5,data:{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B2":{type:5,data:{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2}},"\uE0B3":{type:5,data:{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0B4":{type:5,data:{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1}},"\uE0B5":{type:5,data:{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1}},"\uE0B6":{type:5,data:{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1}},"\uE0B7":{type:5,data:{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1}},"\uE0B8":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0}},"\uE0B9":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BA":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0}},"\uE0BB":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BC":{type:5,data:{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0}},"\uE0BD":{type:5,data:{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0BE":{type:5,data:{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},"\uE0BF":{type:5,data:{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1}},"\uE0C0":{type:5,data:{d:"M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z",type:0}},"\uE0C1":{type:5,data:{d:"M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z",type:0}},"\uE0C2":{type:5,data:{d:"M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z",type:0}},"\uE0C3":{type:5,data:{d:"M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z",type:0}},"\uE0C4":{type:5,data:{d:"M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z",type:0}},"\uE0C5":{type:5,data:{d:"M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z",type:0}},"\uE0C6":{type:5,data:{d:"M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z",type:0}},"\uE0C7":{type:5,data:{d:"M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z",type:0}},"\uE0C8":{type:5,data:{d:"M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z",type:0}},"\uE0CA":{type:5,data:{d:"M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z",type:0}},"\uE0CC":{type:5,data:{d:"M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z",type:0}},"\uE0CD":{type:5,data:{d:"M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z",type:0}},"\uE0CE":{type:5,data:{d:"M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z",type:0}},"\uE0CF":{type:5,data:{d:"M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z",type:0}},"\uE0D0":{type:5,data:{d:"M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z",type:0}},"\uE0D1":{type:5,data:{d:"M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z",type:0}},"\uE0D2":{type:5,data:{d:"M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z",type:0}},"\uE0D4":{type:5,data:{d:"M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z",type:0}},"\uEE00":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z"},"\uEE01":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z"},"\uEE02":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z"},"\uEE03":{type:3,data:"M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z"},"\uEE04":{type:3,data:"M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z"},"\uEE05":{type:3,data:"M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z"},"\uEE06":{type:5,data:{d:"M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z",type:0},scaleType:1},"\uEE07":{type:5,data:{d:"M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z",type:0},scaleType:1},"\uEE08":{type:5,data:{d:"M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE09":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0A":{type:5,data:{d:"M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z",type:0},scaleType:1},"\uEE0B":{type:5,data:{d:"M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z",type:0},scaleType:1},"\uF5D0":l.LINE_H,"\uF5D1":l.LINE_V,"\uF5D2":l.FADE_RIGHT,"\uF5D3":l.FADE_LEFT,"\uF5D4":l.FADE_DOWN,"\uF5D5":l.FADE_UP,"\uF5D6":l.CURVE_DOWN_RIGHT,"\uF5D7":l.CURVE_DOWN_LEFT,"\uF5D8":l.CURVE_UP_RIGHT,"\uF5D9":l.CURVE_UP_LEFT,"\uF5DA":[l.LINE_V,l.CURVE_UP_RIGHT],"\uF5DB":[l.LINE_V,l.CURVE_DOWN_RIGHT],"\uF5DC":[l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5DD":[l.LINE_V,l.CURVE_UP_LEFT],"\uF5DE":[l.LINE_V,l.CURVE_DOWN_LEFT],"\uF5DF":[l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E0":[l.LINE_H,l.CURVE_DOWN_LEFT],"\uF5E1":[l.LINE_H,l.CURVE_DOWN_RIGHT],"\uF5E2":[l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E3":[l.LINE_H,l.CURVE_UP_LEFT],"\uF5E4":[l.LINE_H,l.CURVE_UP_RIGHT],"\uF5E5":[l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E6":[l.LINE_V,l.CURVE_UP_LEFT,l.CURVE_UP_RIGHT],"\uF5E7":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_DOWN_RIGHT],"\uF5E8":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_LEFT],"\uF5E9":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_RIGHT],"\uF5EA":[l.LINE_V,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5EB":[l.LINE_V,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EC":[l.LINE_H,l.CURVE_DOWN_RIGHT,l.CURVE_UP_LEFT],"\uF5ED":[l.LINE_H,l.CURVE_DOWN_LEFT,l.CURVE_UP_RIGHT],"\uF5EE":[l.NODE_FILL,l.NODE_STROKE],"\uF5EF":l.NODE_STROKE,"\uF5F0":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F1":[l.NODE_STROKE,l.NODE_LINE_RIGHT],"\uF5F2":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F3":[l.NODE_STROKE,l.NODE_LINE_LEFT],"\uF5F4":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F5":[l.NODE_STROKE,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF5F6":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F7":[l.NODE_STROKE,l.NODE_LINE_DOWN],"\uF5F8":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP],"\uF5F9":[l.NODE_STROKE,l.NODE_LINE_UP],"\uF5FA":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FB":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_UP],"\uF5FC":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FD":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF5FE":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF5FF":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF600":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF601":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_RIGHT],"\uF602":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF603":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT],"\uF604":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF605":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_RIGHT],"\uF606":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF607":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT],"\uF608":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF609":[l.NODE_STROKE,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60A":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60B":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60C":[l.NODE_FILL,l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\uF60D":[l.NODE_STROKE,l.NODE_LINE_UP,l.NODE_LINE_DOWN,l.NODE_LINE_LEFT,l.NODE_LINE_RIGHT],"\u{1FB00}":f(1),"\u{1FB01}":f(2),"\u{1FB02}":f(3),"\u{1FB03}":f(4),"\u{1FB04}":f(5),"\u{1FB05}":f(6),"\u{1FB06}":f(7),"\u{1FB07}":f(8),"\u{1FB08}":f(9),"\u{1FB09}":f(10),"\u{1FB0A}":f(11),"\u{1FB0B}":f(12),"\u{1FB0C}":f(13),"\u{1FB0D}":f(14),"\u{1FB0E}":f(15),"\u{1FB0F}":f(16),"\u{1FB10}":f(17),"\u{1FB11}":f(18),"\u{1FB12}":f(19),"\u{1FB13}":f(20),"\u{1FB14}":f(22),"\u{1FB15}":f(23),"\u{1FB16}":f(24),"\u{1FB17}":f(25),"\u{1FB18}":f(26),"\u{1FB19}":f(27),"\u{1FB1A}":f(28),"\u{1FB1B}":f(29),"\u{1FB1C}":f(30),"\u{1FB1D}":f(31),"\u{1FB1E}":f(32),"\u{1FB1F}":f(33),"\u{1FB20}":f(34),"\u{1FB21}":f(35),"\u{1FB22}":f(36),"\u{1FB23}":f(37),"\u{1FB24}":f(38),"\u{1FB25}":f(39),"\u{1FB26}":f(40),"\u{1FB27}":f(41),"\u{1FB28}":f(43),"\u{1FB29}":f(44),"\u{1FB2A}":f(45),"\u{1FB2B}":f(46),"\u{1FB2C}":f(47),"\u{1FB2D}":f(48),"\u{1FB2E}":f(49),"\u{1FB2F}":f(50),"\u{1FB30}":f(51),"\u{1FB31}":f(52),"\u{1FB32}":f(53),"\u{1FB33}":f(54),"\u{1FB34}":f(55),"\u{1FB35}":f(56),"\u{1FB36}":f(57),"\u{1FB37}":f(58),"\u{1FB38}":f(59),"\u{1FB39}":f(60),"\u{1FB3A}":f(61),"\u{1FB3B}":f(62),"\u{1FB3C}":{type:3,data:"M0,0.6667 L0,1 L0.5,1 Z"},"\u{1FB3D}":{type:3,data:"M0,0.6667 L0,1 L1,1 Z"},"\u{1FB3E}":{type:3,data:"M0,0.3333 L0,1 L0.5,1 Z"},"\u{1FB3F}":{type:3,data:"M0,0.3333 L0,1 L1,1 Z"},"\u{1FB40}":{type:3,data:"M0,0 L0,1 L0.5,1 Z"},"\u{1FB41}":{type:3,data:"M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB42}":{type:3,data:"M0,0.3333 L1,0 L1,1 L0,1 Z"},"\u{1FB43}":{type:3,data:"M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z"},"\u{1FB44}":{type:3,data:"M0,0.6667 L1,0 L1,1 L0,1 Z"},"\u{1FB45}":{type:3,data:"M0,1 L0.5,0 L1,0 L1,1 Z"},"\u{1FB46}":{type:3,data:"M0,0.6667 L1,0.3333 L1,1 L0,1 Z"},"\u{1FB47}":{type:3,data:"M0.5,1 L1,0.6667 L1,1 Z"},"\u{1FB48}":{type:3,data:"M0,1 L1,0.6667 L1,1 Z"},"\u{1FB49}":{type:3,data:"M0.5,1 L1,0.3333 L1,1 Z"},"\u{1FB4A}":{type:3,data:"M0,1 L1,0.3333 L1,1 Z"},"\u{1FB4B}":{type:3,data:"M0.5,1 L1,0 L1,1 Z"},"\u{1FB4C}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4D}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.3333 Z"},"\u{1FB4E}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB4F}":{type:3,data:"M0,0 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB50}":{type:3,data:"M0.5,0 L0,0 L0,1 L1,1 Z"},"\u{1FB51}":{type:3,data:"M0,0.3333 L0,1 L1,1 L1,0.6667 Z"},"\u{1FB52}":{type:3,data:"M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB53}":{type:3,data:"M0,0.6667 L1,1 L1,0 L0,0 Z"},"\u{1FB54}":{type:3,data:"M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z"},"\u{1FB55}":{type:3,data:"M0,0.3333 L1,1 L1,0 L0,0 Z"},"\u{1FB56}":{type:3,data:"M0,0 L0.5,1 L1,1 L1,0 Z"},"\u{1FB57}":{type:3,data:"M0,0.3333 L0,0 L0.5,0 Z"},"\u{1FB58}":{type:3,data:"M0,0.3333 L0,0 L1,0 Z"},"\u{1FB59}":{type:3,data:"M0,0.6667 L0,0 L0.5,0 Z"},"\u{1FB5A}":{type:3,data:"M0,0.6667 L0,0 L1,0 Z"},"\u{1FB5B}":{type:3,data:"M0,1 L0,0 L0.5,0 Z"},"\u{1FB5C}":{type:3,data:"M0,0.6667 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB5D}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5E}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.6667 Z"},"\u{1FB5F}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB60}":{type:3,data:"M0,1 L0,0 L1,0 L1,0.3333 Z"},"\u{1FB61}":{type:3,data:"M0.5,1 L0,1 L0,0 L1,0 Z"},"\u{1FB62}":{type:3,data:"M0.5,0 L1,0 L1,0.3333 Z"},"\u{1FB63}":{type:3,data:"M0,0 L1,0 L1,0.3333 Z"},"\u{1FB64}":{type:3,data:"M0.5,0 L1,0 L1,0.6667 Z"},"\u{1FB65}":{type:3,data:"M0,0 L1,0 L1,0.6667 Z"},"\u{1FB66}":{type:3,data:"M0.5,0 L1,0 L1,1 Z"},"\u{1FB67}":{type:3,data:"M0,0.3333 L1,0.6667 L1,0 L0,0 Z"},"\u{1FB68}":{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z"},"\u{1FB69}":{type:3,data:"M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z"},"\u{1FB6A}":{type:3,data:"M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z"},"\u{1FB6B}":{type:3,data:"M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z"},"\u{1FB6C}":{type:3,data:"M0,0 L0.5,0.5 L0,1 Z"},"\u{1FB6D}":{type:3,data:"M0,0 L1,0 L0.5,0.5 Z"},"\u{1FB6E}":{type:3,data:"M1,0 L1,1 L0.5,0.5 Z"},"\u{1FB6F}":{type:3,data:"M0,1 L1,1 L0.5,0.5 Z"},"\u{1FB70}":{type:0,data:[{x:1,y:0,w:1,h:8}]},"\u{1FB71}":{type:0,data:[{x:2,y:0,w:1,h:8}]},"\u{1FB72}":{type:0,data:[{x:3,y:0,w:1,h:8}]},"\u{1FB73}":{type:0,data:[{x:4,y:0,w:1,h:8}]},"\u{1FB74}":{type:0,data:[{x:5,y:0,w:1,h:8}]},"\u{1FB75}":{type:0,data:[{x:6,y:0,w:1,h:8}]},"\u{1FB76}":{type:0,data:[{x:0,y:1,w:8,h:1}]},"\u{1FB77}":{type:0,data:[{x:0,y:2,w:8,h:1}]},"\u{1FB78}":{type:0,data:[{x:0,y:3,w:8,h:1}]},"\u{1FB79}":{type:0,data:[{x:0,y:4,w:8,h:1}]},"\u{1FB7A}":{type:0,data:[{x:0,y:5,w:8,h:1}]},"\u{1FB7B}":{type:0,data:[{x:0,y:6,w:8,h:1}]},"\u{1FB7C}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB7D}":{type:0,data:[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7E}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}]},"\u{1FB7F}":{type:0,data:[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}]},"\u{1FB80}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB81}":{type:0,data:[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}]},"\u{1FB82}":{type:0,data:[{x:0,y:0,w:8,h:2}]},"\u{1FB83}":{type:0,data:[{x:0,y:0,w:8,h:3}]},"\u{1FB84}":{type:0,data:[{x:0,y:0,w:8,h:5}]},"\u{1FB85}":{type:0,data:[{x:0,y:0,w:8,h:6}]},"\u{1FB86}":{type:0,data:[{x:0,y:0,w:8,h:7}]},"\u{1FB87}":{type:0,data:[{x:6,y:0,w:2,h:8}]},"\u{1FB88}":{type:0,data:[{x:5,y:0,w:3,h:8}]},"\u{1FB89}":{type:0,data:[{x:3,y:0,w:5,h:8}]},"\u{1FB8A}":{type:0,data:[{x:2,y:0,w:6,h:8}]},"\u{1FB8B}":{type:0,data:[{x:1,y:0,w:7,h:8}]},"\u{1FB8C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},"\u{1FB8D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0.5,0 L1,0 L1,1 L0.5,1 Z"},"\u{1FB8E}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},"\u{1FB8F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},"\u{1FB90}":{type:1,data:[[0,1],[1,0]]},"\u{1FB91}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0.5 L1,0.5 L1,1 L0,1 Z"},{type:0,data:[{x:0,y:0,w:8,h:4}]}],"\u{1FB92}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L1,0 L1,0.5 L0,0.5 Z"},{type:0,data:[{x:0,y:4,w:8,h:4}]}],"\u{1FB94}":[{type:1,data:[[0,1],[1,0]],clipPath:"M0,0 L0.5,0 L0.5,1 L0,1 Z"},{type:0,data:[{x:4,y:0,w:4,h:8}]}],"\u{1FB95}":{type:0,data:[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}]},"\u{1FB96}":{type:0,data:[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}]},"\u{1FB97}":{type:0,data:[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]},"\u{1FB98}":{type:2,data:"M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25",strokeWidth:1},"\u{1FB99}":{type:2,data:"M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75",strokeWidth:1},"\u{1FB9A}":{type:5,data:{d:"M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0",type:0}},"\u{1FB9B}":{type:5,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1",type:0}},"\u{1FB9C}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L0,1 Z"},"\u{1FB9D}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,0 L1,1 Z"},"\u{1FB9E}":{type:1,data:[[1,0],[0,1]],clipPath:"M1,0 L1,1 L0,1 Z"},"\u{1FB9F}":{type:1,data:[[1,0],[0,1]],clipPath:"M0,0 L1,1 L0,1 Z"},"\u{1FBA0}":{type:2,data:"M.5,0 L0,.5",strokeWidth:1},"\u{1FBA1}":{type:2,data:"M.5,0 L1,.5",strokeWidth:1},"\u{1FBA2}":{type:2,data:"M0,.5 L.5,1",strokeWidth:1},"\u{1FBA3}":{type:2,data:"M1,.5 L.5,1",strokeWidth:1},"\u{1FBA4}":{type:2,data:"M.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBA5}":{type:2,data:"M.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBA6}":{type:2,data:"M0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBA7}":{type:2,data:"M0,.5 L.5,0 L1,.5",strokeWidth:1},"\u{1FBA8}":{type:2,data:"M.5,0 L0,.5 M1,.5 L.5,1",strokeWidth:1},"\u{1FBA9}":{type:2,data:"M.5,0 L1,.5 M0,.5 L.5,1",strokeWidth:1},"\u{1FBAA}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5",strokeWidth:1},"\u{1FBAB}":{type:2,data:"M.5,0 L0,.5 L.5,1 L1,.5",strokeWidth:1},"\u{1FBAC}":{type:2,data:"M0,.5 L.5,0 L1,.5 L.5,1",strokeWidth:1},"\u{1FBAD}":{type:2,data:"M1,.5 L.5,0 L0,.5 L.5,1",strokeWidth:1},"\u{1FBAE}":{type:2,data:"M.5,0 L1,.5 L.5,1 L0,.5 Z",strokeWidth:1},"\u{1FBAF}":{type:2,data:"M0,.5 L1,.5 M.5,.35 L.5,.65",strokeWidth:1},"\u{1FBB0}":{type:3,data:"M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z",scaleType:1},"\u{1FBB1}":{type:4,data:{d:"M.1,.525 L.35,.675 L.9,.35",type:1},scaleType:1},"\u{1FBB2}":{type:3,data:"M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13"},"\u{1FBB3}":{type:3,data:"M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6"},"\u{1FBB4}":{type:4,data:{d:"M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z",type:0},scaleType:1},"\u{1FBB5}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB6}":[{type:5,data:{d:"M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z",type:0}},{type:5,data:{d:"M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z",type:0},scaleType:1}],"\u{1FBB7}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB8}":[{type:5,data:{d:"M.875,0 L1,0 L1,1 L.875,1 Z",type:0}},{type:5,data:{d:"M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z",type:0},scaleType:1}],"\u{1FBB9}":{type:5,data:{d:"M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z",type:0}},"\u{1FBBA}":{type:5,data:{d:"M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z",type:0}},"\u{1FBBB}":{type:5,data:{d:"M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z",type:0},scaleType:1},"\u{1FBBC}":[{type:3,data:"M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z"},{type:3,data:"M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5",scaleType:1}],"\u{1FBBD}":{type:4,data:{d:"M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z",type:1}},"\u{1FBBE}":{type:4,data:{d:"M1,.5 L.5,1",type:1}},"\u{1FBBF}":{type:4,data:{d:"M.5,0 L1,.5 L.5,1 L0,.5 Z",type:1}},"\u{1FBC0}":{type:3,data:"M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",scaleType:1},"\u{1FBC1}":{type:3,data:"M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z"},"\u{1FBC2}":{type:3,data:"M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z"},"\u{1FBC3}":{type:3,data:"M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z"},"\u{1FBC4}":{type:3,data:"M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z",scaleType:1},"\u{1FBC5}":{type:5,data:{d:"M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC6}":{type:5,data:{d:"M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC7}":{type:5,data:{d:"M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC8}":{type:5,data:{d:"M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBC9}":{type:5,data:{d:"M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z",type:0},scaleType:1},"\u{1FBCA}":{type:5,data:{d:"M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z",type:0},scaleType:1},"\u{1FBCB}":{type:5,data:{d:"M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z",type:0},scaleType:1},"\u{1FBCC}":{type:5,data:{d:"M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z",type:0},scaleType:1},"\u{1FBCD}":{type:5,data:{d:"M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z",type:0},scaleType:1},"\u{1FBCE}":{type:3,data:"M0,0 L0.6667,0 L0.6667,1 L0,1 Z"},"\u{1FBCF}":{type:3,data:"M0,0 L0.3333,0 L0.3333,1 L0,1 Z"},"\u{1FBD0}":{type:2,data:"M1,.5 L0,1",strokeWidth:1},"\u{1FBD1}":{type:2,data:"M1,0 L0,.5",strokeWidth:1},"\u{1FBD2}":{type:2,data:"M0,0 L1,.5",strokeWidth:1},"\u{1FBD3}":{type:2,data:"M0,.5 L1,1",strokeWidth:1},"\u{1FBD4}":{type:2,data:"M0,0 L.5,1",strokeWidth:1},"\u{1FBD5}":{type:2,data:"M.5,0 L1,1",strokeWidth:1},"\u{1FBD6}":{type:2,data:"M1,0 L.5,1",strokeWidth:1},"\u{1FBD7}":{type:2,data:"M.5,0 L0,1",strokeWidth:1},"\u{1FBD8}":{type:2,data:"M0,0 L.5,.5 L1,0",strokeWidth:1},"\u{1FBD9}":{type:2,data:"M1,0 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDA}":{type:2,data:"M0,1 L.5,.5 L1,1",strokeWidth:1},"\u{1FBDB}":{type:2,data:"M0,0 L.5,.5 L0,1",strokeWidth:1},"\u{1FBDC}":{type:2,data:"M0,0 L.5,1 L1,0",strokeWidth:1},"\u{1FBDD}":{type:2,data:"M1,0 L0,.5 L1,1",strokeWidth:1},"\u{1FBDE}":{type:2,data:"M0,1 L.5,0 L1,1",strokeWidth:1},"\u{1FBDF}":{type:2,data:"M0,0 L1,.5 L0,1",strokeWidth:1},"\u{1FBE0}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0",type:1}},"\u{1FBE1}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1",type:1}},"\u{1FBE2}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1",type:1}},"\u{1FBE3}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1",type:1}},"\u{1FBE4}":{type:0,data:[{x:2,y:0,w:4,h:4}]},"\u{1FBE5}":{type:0,data:[{x:2,y:4,w:4,h:4}]},"\u{1FBE6}":{type:0,data:[{x:0,y:2,w:4,h:4}]},"\u{1FBE7}":{type:0,data:[{x:4,y:2,w:4,h:4}]},"\u{1FBE8}":{type:5,data:{d:"M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z",type:0}},"\u{1FBE9}":{type:5,data:{d:"M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z",type:0}},"\u{1FBEA}":{type:5,data:{d:"M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z",type:0}},"\u{1FBEB}":{type:5,data:{d:"M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z",type:0}},"\u{1FBEC}":{type:5,data:{d:"M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z",type:0}},"\u{1FBED}":{type:5,data:{d:"M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z",type:0}},"\u{1FBEE}":{type:5,data:{d:"M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z",type:0}},"\u{1FBEF}":{type:5,data:{d:"M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z",type:0}},"\u{1FBF0}":{type:5,data:{d:o0(126),type:0},scaleType:1},"\u{1FBF1}":{type:5,data:{d:o0(48),type:0},scaleType:1},"\u{1FBF2}":{type:5,data:{d:o0(109),type:0},scaleType:1},"\u{1FBF3}":{type:5,data:{d:o0(121),type:0},scaleType:1},"\u{1FBF4}":{type:5,data:{d:o0(51),type:0},scaleType:1},"\u{1FBF5}":{type:5,data:{d:o0(91),type:0},scaleType:1},"\u{1FBF6}":{type:5,data:{d:o0(95),type:0},scaleType:1},"\u{1FBF7}":{type:5,data:{d:o0(114),type:0},scaleType:1},"\u{1FBF8}":{type:5,data:{d:o0(127),type:0},scaleType:1},"\u{1FBF9}":{type:5,data:{d:o0(123),type:0},scaleType:1},"\u{1FBFA}":{type:5,data:{d:"M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z",type:0},scaleType:1},...Object.fromEntries(Array.from({length:256},(i,e)=>[String.fromCodePoint(10240+e),{type:6,data:e}]))},$e=new Set([9617,9618,9619,129932,129933,129934,129935,129936,129937,129938,129940,129948,129949,129950,129951]);function f(i){return{type:2,data:()=>{let e=[],r=[.375,.25,.375],s=[0,3/8,5/8];for(let a=0;a<3;a++){let o=i>>a*2&1,n=i>>a*2+1&1;o&&n?e.push(`M0,${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L0,${s[a]+r[a]} Z`):o?e.push(`M0,${s[a]} L${.5},${s[a]} L${.5},${s[a]+r[a]} L0,${s[a]+r[a]} Z`):n&&e.push(`M${.5},${s[a]} L1,${s[a]} L1,${s[a]+r[a]} L${.5},${s[a]+r[a]} Z`)}return e.join(" ")}}}function o0(i){let e=[];if(i&64){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.2125} L${Q+.075},${.175} L${m-.075},${.175} L${m},${.2125} L${m-.075},${.25} L${Q+.075},${.25} Z`)}if(i&32){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.175+.075+.015,m=.5-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&16){let c=.7999999999999999,u=.95-.15/2,C=.95,Q=.5+.015,m=.825-.075-.015;e.push(`M${u},${Q} L${C},${Q+.0375} L${C},${m-.0375} L${u},${m} L${c},${m-.0375} L${c},${Q+.0375} Z`)}if(i&8){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.7875} L${Q+.075},${.75} L${m-.075},${.75} L${m},${.7875} L${m-.075},${.825} L${Q+.075},${.825} Z`)}if(i&4&&e.push(`M${.125},${.515} L${.2},${.515+.0375} L${.2},${.735-.0375} L${.125},${.735} L${.05},${.735-.0375} L${.05},${.515+.0375} Z`),i&2&&e.push(`M${.125},${.265} L${.2},${.265+.0375} L${.2},${.485-.0375} L${.125},${.485} L${.05},${.485-.0375} L${.05},${.265+.0375} Z`),i&1){let Q=.21500000000000002,m=.95-.15-.015;e.push(`M${Q},${.5} L${Q+.075},${.4625} L${m-.075},${.4625} L${m},${.5} L${m-.075},${.5375} L${Q+.075},${.5375} Z`)}return e.join(" ")}var k=0,H=0,T0=!1,_0=!1,$0=!1,z,x0=0,G0=class{constructor(e,t,r,s,a,o){this._terminal=e;this._optionService=t;this._selectionRenderModel=r;this._decorationService=s;this._coreBrowserService=a;this._themeService=o;this.result={fg:0,bg:0,ext:0}}resolve(e,t,r,s,a){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=e.bg&268435456?e.extended.ext:0,H=0,k=0,_0=!1,T0=!1,$0=!1,z=this._themeService.colors,x0=0;let o=e.getCode();if(o!==0&&e.extended.underlineStyle===4){let n=Math.max(1,Math.floor(this._optionService.rawOptions.fontSize*this._coreBrowserService.dpr/15));x0=t*s%(Math.round(n)*2)}if(x0===0&&$e.has(o)&&(x0=t*s%2*2+r*a%2),this._decorationService.forEachDecorationAtCell(t,r,"bottom",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),$0=this._selectionRenderModel.isCellSelected(this._terminal,t,r),$0){if(this.result.fg&67108864||(this.result.bg&50331648)!==0){if(this.result.fg&67108864)switch(this.result.fg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:H=(this.result.fg&16777215)<<8|255;break;case 0:default:H=this._themeService.colors.foreground.rgba}else switch(this.result.bg&50331648){case 16777216:case 33554432:H=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:H=(this.result.bg&16777215)<<8|255;break}H=d0.blend(H,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}else H=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;if(_0=!0,z.selectionForeground&&(k=z.selectionForeground.rgba>>8&16777215,T0=!0),V0(e.getCode())){if(this.result.fg&67108864&&(this.result.bg&50331648)===0)k=(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba>>8&16777215;else{if(this.result.fg&67108864)switch(this.result.bg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.bg&255].rgba;break;case 50331648:k=(this.result.bg&16777215)<<8|255;break}else switch(this.result.fg&50331648){case 16777216:case 33554432:k=this._themeService.colors.ansi[this.result.fg&255].rgba;break;case 50331648:k=(this.result.fg&16777215)<<8|255;break;case 0:default:k=this._themeService.colors.foreground.rgba}k=d0.blend(k,(this._coreBrowserService.isFocused?z.selectionBackgroundOpaque:z.selectionInactiveBackgroundOpaque).rgba&4294967040|128)>>8&16777215}T0=!0}}this._decorationService.forEachDecorationAtCell(t,r,"top",n=>{n.backgroundColorRGB&&(H=n.backgroundColorRGB.rgba>>8&16777215,_0=!0),n.foregroundColorRGB&&(k=n.foregroundColorRGB.rgba>>8&16777215,T0=!0)}),_0&&($0?H=e.bg&-16777216&-134217729|H|50331648:H=e.bg&-16777216|H|50331648),T0&&(k=e.fg&-16777216&-67108865|k|50331648),this.result.fg&67108864&&(_0&&!T0&&((this.result.bg&50331648)===0?k=this.result.fg&-134217728|z.background.rgba>>8&16777215&16777215|50331648:k=this.result.fg&-134217728|this.result.bg&67108863,T0=!0),!_0&&T0&&((this.result.fg&50331648)===0?H=this.result.bg&-67108864|z.foreground.rgba>>8&16777215&16777215|50331648:H=this.result.bg&-67108864|this.result.fg&67108863,_0=!0)),z=void 0,this.result.bg=_0?H:this.result.bg,this.result.fg=T0?k:this.result.fg,this.result.ext&=536870911,this.result.ext|=x0<<29&3758096384}};var Ke=.5,K0=Be||we?"bottom":"ideographic";var Pt=typeof OffscreenCanvas>"u"?void 0:(i,e)=>new OffscreenCanvas(i,e),Bt=(i,e)=>{let t=document.createElement("canvas");return t.width=i,t.height=e,t};function wt(i,e,t=Pt,r=Bt){return t?.(i,e)??r(i,e)}function qe(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=Ve[e];if(p){let c=Array.isArray(p)?p:[p];for(let u of c)Ht(i,u,t,r,s,a,o,n,L,T,h,d,_);return!0}return!1}function Ht(i,e,t,r,s,a,o,n,L,T,h,d,_=0){let p=s,c=a,u=t,C=r;switch(e.scaleType===1&&(p=o,c=n,u=t+(s-o)/2,C=r+(a-n)/2),e.clipPath&&(i.save(),Kt(i,e.clipPath,u,C,p,c)),e.type){case 0:kt(i,e.data,u,C,p,c);break;case 1:$t(i,e.data,u,C,p,c,_);break;case 2:Gt(i,e.data,u,C,p,c,T,h,e.strokeWidth);break;case 3:Ut(i,e.data,u,C,p,c,T,e.strokeWidth);break;case 4:Vt(i,e.data,u,C,p,c,T,d);break;case 5:zt(i,e.data,u,C,p,c,L,T,h);break;case 6:Zt(i,e.data,u,C,p,c);break}e.clipPath&&i.restore()}function kt(i,e,t,r,s,a){for(let o=0;o{let F=parseFloat(m);return R%2===0?t+F*s:r+F*a});if(u==="M")i.moveTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="L")i.lineTo(Q[0],Q[1]),T=Q[0],h=Q[1],d=T,_=h;else if(u==="Q")i.quadraticCurveTo(Q[0],Q[1],Q[2],Q[3]),d=Q[0],_=Q[1],T=Q[2],h=Q[3];else if(u==="T"){let m,R;p==="Q"||p==="T"?(m=2*T-d,R=2*h-_):(m=T,R=h),i.quadraticCurveTo(m,R,Q[0],Q[1]),d=m,_=R,T=Q[0],h=Q[1]}else u==="C"&&(i.bezierCurveTo(Q[0],Q[1],Q[2],Q[3],Q[4],Q[5]),d=Q[2],_=Q[3],T=Q[4],h=Q[5]);p=u}n!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*n,i.stroke()):i.fill()}function Wt(i,e,t,r,s,a,o,n,L,T){if(r===0||s===0){i.lineTo(L,T);return}r=Math.abs(r),s=Math.abs(s);let h=Math.cos(a),d=Math.sin(a),_=(e-L)/2,p=(t-T)/2,c=h*_+d*p,u=-d*_+h*p,C=r*r,Q=s*s,m=c*c,R=u*u,F=m/C+R/Q;if(F>1){let I=Math.sqrt(F);r*=I,s*=I,C=r*r,Q=s*s}let E=(C*Q-C*R-Q*m)/(C*R+Q*m);E<0&&(E=0);let y=(o===n?-1:1)*Math.sqrt(E),X=y*(r*u/s),Y=y*-(s*c/r),M0=h*X-d*Y+(e+L)/2,t0=d*X+h*Y+(t+T)/2,L0=(c-X)/r,M=(u-Y)/s,n0=(-c-X)/r,a0=(-u-Y)/s,$=Math.atan2(M,L0),q=Math.atan2(a0,n0)-$;n===0&&q>0?q-=2*Math.PI:n===1&&q<0&&(q+=2*Math.PI);let A0=$+q;i.ellipse(M0,t0,r,s,a,$,A0,n===0)}function Vt(i,e,t,r,s,a,o,n){i.save(),i.fillRect(t,r,s,a),n&&(i.fillStyle=n,i.strokeStyle=n),i.lineWidth=o,i.lineCap="square",i.beginPath();for(let L of e.d.split(" ")){let T=L[0],h=L.substring(1).split(",");if(!h[0]||!h[1]){T==="Z"&&i.closePath();continue}let d=h.map((_,p)=>{let c=parseFloat(_);return p%2===0?t+c*s:r+c*a});T==="M"?i.moveTo(d[0],d[1]):T==="L"&&i.lineTo(d[0],d[1])}e.type===1?i.stroke():i.fill(),i.restore()}var Xe=new Map;function $t(i,e,t,r,s,a,o=0){let n=Xe.get(e);n||(n=new Map,Xe.set(e,n));let L=i.fillStyle;if(typeof L!="string")throw new Error(`Unexpected fillStyle type "${L}"`);let T=n.get(L);if(!T){let _=e[0].length,p=e.length,c=wt(_,p),u=A(c.getContext("2d")),C=new ImageData(_,p),Q,m,R,F;if(L.startsWith("#"))Q=parseInt(L.slice(1,3),16),m=parseInt(L.slice(3,5),16),R=parseInt(L.slice(5,7),16),F=L.length>7&&parseInt(L.slice(7,9),16)||1;else if(L.startsWith("rgba"))[Q,m,R,F]=L.substring(5,L.length-1).split(",").map(E=>parseFloat(E));else throw new Error(`Unexpected fillStyle color format "${L}" when drawing pattern glyph`);for(let E=0;E>1&1,d=o&1;h!==0||d!==0?T.setTransform(new DOMMatrix().translateSelf(-h,-d)):T.setTransform(new DOMMatrix),i.fillStyle=T,i.fillRect(t,r,s,a)}function Gt(i,e,t,r,s,a,o,n,L){i.save(),i.beginPath(),i.rect(t,r,s,a),i.clip(),i.beginPath();let T;if(typeof e=="function"){let _=.15/a*s;T=e(.15,_)}else T=e;let h={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let d of T.split(" ")){let _=d[0];if(_==="Z"){i.closePath(),h.lastCommand=_;continue}let p=je[_];if(!p){n.error(`Could not find drawing instructions for "${_}"`);continue}let c=d.substring(1).split(",");!c[0]||!c[1]||(p(i,Je(c,s,a,t,r,!0,o,0,0,!1),h),h.lastCommand=_)}L!==void 0?(i.strokeStyle=i.fillStyle,i.lineWidth=o*L,i.stroke()):i.fill(),i.closePath(),i.restore()}function Kt(i,e,t,r,s,a){i.beginPath();for(let o of e.split(" ")){let n=o[0];if(n==="Z"){i.closePath();continue}let L=o.substring(1).split(",");if(!L[0]||!L[1])continue;let T=t+parseFloat(L[0])*s,h=r+parseFloat(L[1])*a;n==="M"?i.moveTo(T,h):n==="L"&&i.lineTo(T,h)}i.clip()}function zt(i,e,t,r,s,a,o,n,L){let T=new Path2D;T.rect(t,r,s,a),i.clip(T),i.beginPath();let h=o/12;i.lineWidth=n*h;let d={currentX:0,currentY:0,lastControlX:0,lastControlY:0,lastCommand:""};for(let _ of e.d.split(" ")){let p=_[0];if(p==="Z"){i.closePath(),d.lastCommand=p;continue}let c=je[p];if(!c){L.error(`Could not find drawing instructions for "${p}"`);continue}let u=_.substring(1).split(",");!u[0]||!u[1]||(c(i,Je(u,s,a,t,r,!1,n,(e.leftPadding??0)*(h/2),(e.rightPadding??0)*(h/2)),d),d.lastCommand=p)}e.type===1?(i.strokeStyle=i.fillStyle,i.stroke()):i.fill(),i.closePath()}function Ye(i,e,t=0){return Math.max(Math.min(i,e),t)}var je={C:(i,e,t)=>{i.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]),t.lastControlX=e[2],t.lastControlY=e[3],t.currentX=e[4],t.currentY=e[5]},L:(i,e,t)=>{i.lineTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},M:(i,e,t)=>{i.moveTo(e[0],e[1]),t.lastControlX=t.currentX=e[0],t.lastControlY=t.currentY=e[1]},Q:(i,e,t)=>{i.quadraticCurveTo(e[0],e[1],e[2],e[3]),t.lastControlX=e[0],t.lastControlY=e[1],t.currentX=e[2],t.currentY=e[3]},T:(i,e,t)=>{let r,s;t.lastCommand==="Q"||t.lastCommand==="T"?(r=2*t.currentX-t.lastControlX,s=2*t.currentY-t.lastControlY):(r=t.currentX,s=t.currentY),i.quadraticCurveTo(r,s,e[0],e[1]),t.lastControlX=r,t.lastControlY=s,t.currentX=e[0],t.currentY=e[1]}};function Je(i,e,t,r,s,a,o,n=0,L=0,T=!0){let h=i.map(d=>parseFloat(d)||parseInt(d));if(h.length<2)throw new Error("Too few arguments for instruction");for(let d=0;da){s-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),this._start();return}s=a}this.clear()}},Ce=class extends X0{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){let t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}},Qe=class extends X0{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}},et="requestIdleCallback"in globalThis?Qe:Ce;var s0=class i{constructor(){this.fg=0;this.bg=0;this.extended=new P0}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},P0=class i{constructor(e=0,t=0){this._ext=0;this._urlId=0;this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new i(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var U=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(e,t,r)=>{if(this._disposed)return g(()=>{});let s={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(s);let a=g(()=>{let o=this._listeners.indexOf(s);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return r&&(Array.isArray(r)?r.push(a):r.add(a)),a},this._event)}fire(e){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,e);return}let t=this._listeners;for(let r=0,s=t.length;r{function i(a,o){return a(n=>o.fire(n))}s.forward=i;function e(a,o){return(n,L,T)=>a(h=>n.call(L,o(h)),void 0,T)}s.map=e;function t(...a){return(o,n,L)=>{let T=new R0;for(let h of a)T.add(h(d=>o.call(n,d)));return L&&(Array.isArray(L)?L.push(T):L.add(T)),T}}s.any=t;function r(a,o,n){return o(n),a(L=>o(L))}s.runAndSubscribe=r})(c0||={});var tt={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}},B0=2;var w0,J=class i{constructor(e,t,r,s){this._document=e;this._config=t;this._unicodeService=r;this._logService=s;this._didWarmUp=!1;this._cacheMap=new D0;this._cacheMapCombined=new D0;this._pages=[];this._activePages=[];this._workBoundingBox={top:0,left:0,bottom:0,right:0};this._workAttributeData=new s0;this._textureSize=512;this._onAddTextureAtlasCanvas=new U;this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=new U;this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._pageLayoutVersion=0;this.fontProbeMismatchCount=0;this._createNewPage(),this._tmpCanvas=it(e,this._config.deviceCellWidth*4+B0*2,this._config.deviceCellHeight+B0*2),this._tmpCtx=A(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}get pages(){return this._pages}dispose(){this._tmpCanvas.remove();for(let e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose(),this._onRemoveTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){let e=new et(this._logService);for(let t=33;t<126;t++)e.enqueue(()=>{if(!this._cacheMap.get(t,0,0,0)){let r=this._drawToCache(t,0,0,0,!1,void 0);this._cacheMap.set(t,0,0,0,r)}})}get pageLayoutVersion(){return this._pageLayoutVersion}clearTexture(){this._pages.every(e=>e.glyphs.length===0&&e.currentRow.x===0&&e.currentRow.y===0)||(this._evictAllPages(),this._createNewPage())}_createNewPage(){if(i.maxAtlasPages&&this._pages.length>=Math.max(4,i.maxAtlasPages)){let t=this._pages.filter(T=>T.canvas.width*2<=(i.maxTextureSize||4096)).sort((T,h)=>h.canvas.width!==T.canvas.width?h.canvas.width-T.canvas.width:h.percentageUsed-T.percentageUsed),r=-1,s=0;for(let T=0;TT.canvas.width!==a[0].canvas.width)){this._evictAllPages();let T=new u0(this._document,this._textureSize);return this._pages.push(T),this._activePages.push(T),this._onAddTextureAtlasCanvas.fire(T.canvas),T}let o=a.map(T=>T.glyphs[0].texturePage).sort((T,h)=>T-h),n=this.pages.length-a.length,L=this._mergePages(a,n);L.version=++u0.nextVersion;for(let T=o.length-1;T>=0;T--)this._deletePage(o[T]);this.pages.push(L),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(L.canvas)}let e=new u0(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){let r=e[0].canvas.width*2,s=new u0(this._document,r,e);for(let[a,o]of e.entries()){let n=a*o.canvas.width%r,L=Math.floor(a/2)*o.canvas.height;s.ctx.drawImage(o.canvas,n,L);for(let h of o.glyphs)h.texturePage=t,h.sizeClipSpace.x=h.size.x/r,h.sizeClipSpace.y=h.size.y/r,h.texturePosition.x+=n,h.texturePosition.y+=L,h.texturePositionClipSpace.x=h.texturePosition.x/r,h.texturePositionClipSpace.y=h.texturePosition.y/r;this._onRemoveTextureAtlasCanvas.fire(o.canvas);let T=this._activePages.indexOf(o);T!==-1&&this._activePages.splice(T,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,r,s){if(this._config.allowTransparency)return K;let a;switch(e){case 16777216:case 33554432:a=this._getColorFromAnsiIndex(t);break;case 50331648:let o=s0.toColorRGB(t);a=Z.toColor(o[0],o[1],o[2]);break;case 0:default:r?a=I0.opaque(this._config.colors.foreground):a=this._config.colors.background;break}return this._config.allowTransparency||(a=I0.opaque(a)),a}_getForegroundColor(e,t,r,s,a,o,n,L,T,h){let d=this._getMinimumContrastColor(e,t,r,s,a,o,n,T,L,h);if(d)return d;let _;switch(a){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&T&&o<8&&(o+=8),_=this._getColorFromAnsiIndex(o);break;case 50331648:let p=s0.toColorRGB(o);_=Z.toColor(p[0],p[1],p[2]);break;case 0:default:n?_=this._config.colors.background:_=this._config.colors.foreground}return this._config.allowTransparency&&(_=I0.opaque(_)),L&&(_=I0.multiplyOpacity(_,Ke)),_}_resolveBackgroundRgba(e,t,r){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,r,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;case 0:default:return r?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,r,s,a,o,n,L,T,h){if(this._config.minimumContrastRatio===1||h)return;let d=this._getContrastCache(T),_=d.getColor(e,s);if(_!==void 0)return _??void 0;let p=this._resolveBackgroundRgba(t,r,n),c=this._resolveForegroundRgba(a,o,n,L),u=d0.ensureContrastRatio(p,c,this._config.minimumContrastRatio/(T?2:1));if(!u){d.setColor(e,s,null);return}let C=Z.toColor(u>>24&255,u>>16&255,u>>8&255);return d.setColor(e,s,C),C}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_probeRasterizationFontWeight(e){let t=String(e);if(!/^(?:[1-8]\d{2}|900)$/.test(t))return;let r=this._tmpCtx.font.match(/(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/)?.[1]??"400";if((r==="normal"?"400":r==="bold"?"700":r)!==t){this.fontProbeMismatchCount++,this.fontProbeLastMismatch={desired:t,actual:this._tmpCtx.font};try{globalThis.__orcaAtlasFontProbe?.(this.fontProbeLastMismatch)}catch{}}}_drawToCache(e,t,r,s,a,o){let n=typeof e=="number"?String.fromCharCode(e):e;o&&this._tmpCanvas.parentElement!==o&&(this._tmpCanvas.style.display="none",o.append(this._tmpCanvas));let L=Math.min(this._config.deviceCellWidth*Math.max(n.length,2)+B0*2,this._config.deviceMaxTextureSize);this._tmpCanvas.width=b?b*2-f0:b-f0;!(f0>=b)===!1||Z0===0?(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j+Z0,G),this._tmpCtx.lineTo(Q0,G)):(this._tmpCtx.setLineDash([Math.round(b),Math.round(b)]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(j+Z0,G),this._tmpCtx.moveTo(j+Z0+b,G),this._tmpCtx.lineTo(Q0,G)),f0=We(Q0-j,b,f0);break;case 5:let vt=.6,Ot=.3,de=Q0-j,Se=Math.floor(vt*de),Re=Math.floor(Ot*de),It=de-Se-Re;this._tmpCtx.setLineDash([Se,Re,It]),this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break;case 1:default:this._tmpCtx.moveTo(j,G),this._tmpCtx.lineTo(Q0,G);break}y0||this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!n0&&this._config.fontSize>=12&&!this._config.allowTransparency&&n!==" "){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";let r0=this._tmpCtx.measureText(n);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in r0&&r0.actualBoundingBoxDescent>0){this._tmpCtx.save();let y0=new Path2D;y0.rect(i0,C0-Math.ceil(b/2),this._config.deviceCellWidth*$,v0-C0+Math.ceil(b/2)),this._tmpCtx.clip(y0),this._tmpCtx.lineWidth=this._config.devicePixelRatio*3,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(n,M,M+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(Q){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),D=b%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(M,M+D),this._tmpCtx.lineTo(M+this._config.deviceCharWidth*$,M+D),this._tmpCtx.stroke()}if(n0||this._tmpCtx.fillText(n,M,M+this._config.deviceCharHeight),n==="_"&&!this._config.allowTransparency){let b=fe(this._tmpCtx.getImageData(M,M,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0);if(b)for(let D=1;D<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(n,M,M+this._config.deviceCharHeight-D),b=fe(this._tmpCtx.getImageData(M,M,this._config.deviceCellWidth,this._config.deviceCellHeight),y,L0,a0),!!b);D++);}if(C){let b=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),D=this._tmpCtx.lineWidth%2===1?.5:0;this._tmpCtx.lineWidth=b,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(M,M+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.lineTo(M+this._config.deviceCharWidth*$,M+Math.floor(this._config.deviceCharHeight/2)-D),this._tmpCtx.stroke()}this._tmpCtx.restore();let q=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height),A0;if(this._config.allowTransparency?A0=Xt(q):A0=fe(q,y,L0,a0),A0)return tt;let I=this._findGlyphBoundingBox(q,this._workBoundingBox,L,t0,n0,M),O,v;for(;;){if(this._activePages.length===0){let b=this._createNewPage();O=b,v=b.currentRow,v.height=I.size.y;break}O=this._activePages[this._activePages.length-1],v=O.currentRow;for(let b of this._activePages)I.size.y<=b.currentRow.height&&(O=b,v=b.currentRow);for(let b=this._activePages.length-1;b>=0;b--)for(let D of this._activePages[b].fixedRows)D.height<=v.height&&I.size.y<=D.height&&(O=this._activePages[b],v=D);if(I.size.x>this._textureSize){this._overflowSizePage||(i.maxAtlasPages&&this._pages.length>=i.maxAtlasPages&&this._evictAllPages(),this._overflowSizePage=new u0(this._document,this._config.deviceMaxTextureSize),this.pages.push(this._overflowSizePage),this._pageLayoutVersion++,this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas)),O=this._overflowSizePage,v=this._overflowSizePage.currentRow,v.x+I.size.x>=O.canvas.width&&(v.x=0,v.y+=v.height,v.height=0);break}if(v.y+I.size.y>=O.canvas.height||v.height>I.size.y+2){let b=!1;if(O.currentRow.y+O.currentRow.height+I.size.y>=O.canvas.height){let D;for(let i0 of this._activePages)if(i0.currentRow.y+i0.currentRow.height+I.size.y=i.maxAtlasPages&&v.y+I.size.y<=O.canvas.height&&v.height>=I.size.y&&v.x+I.size.x<=O.canvas.width)b=!0;else{let i0=this._createNewPage();O=i0,v=i0.currentRow,v.height=I.size.y,b=!0}}b||(O.currentRow.height>0&&O.fixedRows.push(O.currentRow),v={x:0,y:O.currentRow.y+O.currentRow.height,height:I.size.y},O.fixedRows.push(v),O.currentRow={x:0,y:v.y+v.height,height:0})}if(v.x+I.size.x<=O.canvas.width)break;v===O.currentRow?(v.x=0,v.y+=v.height,v.height=0):O.fixedRows.splice(O.fixedRows.indexOf(v),1)}return I.texturePage=this._pages.indexOf(O),I.texturePosition.x=v.x,I.texturePosition.y=v.y,I.texturePositionClipSpace.x=v.x/O.canvas.width,I.texturePositionClipSpace.y=v.y/O.canvas.height,I.sizeClipSpace.x/=O.canvas.width,I.sizeClipSpace.y/=O.canvas.height,v.height=Math.max(v.height,I.size.y),v.x+=I.size.x,O.ctx.putImageData(q,I.texturePosition.x-this._workBoundingBox.left,I.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,I.size.x,I.size.y),O.addGlyph(I),O.version=++u0.nextVersion,I}_findGlyphBoundingBox(e,t,r,s,a,o){t.top=0;let n=s?this._config.deviceCellHeight:this._tmpCanvas.height,L=s?this._config.deviceCellWidth:r,T=!1;for(let h=0;h=o;h--){for(let d=0;d=0;h--){for(let d=0;d>>24,a=e.rgba>>>16&255,o=e.rgba>>>8&255,n=t.rgba>>>24,L=t.rgba>>>16&255,T=t.rgba>>>8&255,h=Math.floor((Math.abs(s-n)+Math.abs(a-L)+Math.abs(o-T))/12),d=!0;for(let _=0;_0)return!1;return!0}function it(i,e,t){let r=i.createElement("canvas");return r.width=e,r.height=t,r}function rt(i,e,t,r,s,a,o,n,L=!0){let T={foreground:a.foreground,background:a.background,cursor:K,cursorAccent:K,selectionForeground:K,selectionBackgroundTransparent:K,selectionBackgroundOpaque:K,selectionInactiveBackgroundTransparent:K,selectionInactiveBackgroundOpaque:K,overviewRulerBorder:K,scrollbarSliderBackground:K,scrollbarSliderHoverBackground:K,scrollbarSliderActiveBackground:K,ansi:a.ansi.slice(),contrastCache:a.contrastCache,halfContrastCache:a.halfContrastCache};return{customGlyphs:L,devicePixelRatio:o,deviceMaxTextureSize:n,letterSpacing:s.letterSpacing,lineHeight:s.lineHeight,deviceCellWidth:i,deviceCellHeight:e,deviceCharWidth:t,deviceCharHeight:r,fontFamily:s.fontFamily,fontSize:s.fontSize,fontWeight:s.fontWeight,fontWeightBold:s.fontWeightBold,allowTransparency:s.allowTransparency,drawBoldTextInBrightColors:s.drawBoldTextInBrightColors,minimumContrastRatio:s.minimumContrastRatio,colors:T}}function Ee(i,e){for(let t=0;t=0){if(Ee(u.config,h))return u.atlas;u.ownedBy.length===1?(u.atlas.dispose(),e0.splice(c,1)):u.ownedBy.splice(C,1);break}}for(let c=0;c{this._renderCallback(),this._animationFrame=void 0})))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,t>0){this._restartInterval(t);return}}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0}),this._blinkInterval=this._coreBrowserService.window.setInterval(()=>{if(this._animationTimeRestarted){let t=600-(Date.now()-this._animationTimeRestarted);this._animationTimeRestarted=void 0,this._restartInterval(t);return}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._renderCallback(),this._animationFrame=void 0})},600)},e)}pause(){this.isCursorVisible=!0,this._isIdlePaused=!1,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this._resetIdleTimer(),this.restartBlinkAnimation()}_resetIdleTimer(){this._isIdlePaused=!1,this._idleTimeout&&this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_stopBlinkingDueToIdle(){this.isCursorVisible=!0,this._isIdlePaused=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0),this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0,this._renderCallback()}};function ve(i,e,t){let r=new e.ResizeObserver(s=>{let a=s.find(L=>L.target===i);if(!a)return;if(!("devicePixelContentBoxSize"in a)){r?.disconnect(),r=void 0;return}let o=a.devicePixelContentBoxSize[0].inlineSize,n=a.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&t(o,n)});try{r.observe(i,{box:["device-pixel-content-box"]})}catch{r.disconnect(),r=void 0}return g(()=>r?.disconnect())}function nt(i){return i>65535?(i-=65536,String.fromCharCode((i>>10)+55296)+String.fromCharCode(i%1024+56320)):String.fromCharCode(i)}var j0=class i extends s0{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new P0;this.combinedData=""}static fromCharData(t){let r=new i;return r.setFromCharData(t),r}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?nt(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let r=!1;if(t[1].length>2)r=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let a=t[1].charCodeAt(1);56320<=a&&a<=57343?this.content=(s-55296)*1024+a-56320+65536|t[2]<<22:r=!0}else r=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;r&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(t){if(this.getFgColorMode()!==t.getFgColorMode()||this.getFgColor()!==t.getFgColor()||this.getBgColorMode()!==t.getBgColorMode()||this.getBgColor()!==t.getBgColor()||this.isInverse()!==t.isInverse()||this.isBold()!==t.isBold()||this.isUnderline()!==t.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==t.getUnderlineStyle())return!1;let r=this.isUnderlineColorDefault(),s=t.isUnderlineColorDefault();if(!(r&&s)&&(r!==s||this.getUnderlineColor()!==t.getUnderlineColor()||this.getUnderlineColorMode()!==t.getUnderlineColorMode()))return!1}return!(this.isOverline()!==t.isOverline()||this.isBlink()!==t.isBlink()||this.isInvisible()!==t.isInvisible()||this.isItalic()!==t.isItalic()||this.isDim()!==t.isDim()||this.isStrikethrough()!==t.isStrikethrough())}};var J0=class extends W{constructor(t,r,s){super();this._renderCallback=t;this._coreBrowserService=r;this._optionsService=s;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",a=>{this.setIntervalDuration(a)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(g(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(t){this._needsBlinkInViewport!==t&&(this._needsBlinkInViewport=t,this._updateIntervalState())}setViewportVisible(t){this._isViewportVisible!==t&&(this._isViewportVisible=t,this._updateIntervalState())}setIntervalDuration(t){t!==this._intervalDuration&&(this._intervalDuration=t,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let r=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),r||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var te=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]);function ie(i,e,t,r){let s=A(i.createProgram());if(i.attachShader(s,A(at(i,i.VERTEX_SHADER,e,r))),i.attachShader(s,A(at(i,i.FRAGMENT_SHADER,t,r))),i.linkProgram(s),i.getProgramParameter(s,i.LINK_STATUS))return s;r.error(i.getProgramInfoLog(s)),i.deleteProgram(s)}function at(i,e,t,r){let s=A(i.createShader(e));if(i.shaderSource(s,t),i.compileShader(s),i.getShaderParameter(s,i.COMPILE_STATUS))return s;r.error(i.getShaderInfoLog(s)),i.deleteShader(s)}function ot(i,e){let t=Math.min(i.length*2,e),r=new Float32Array(t);for(let s=0;sn.deleteProgram(this._program))),this._projectionLocation=A(n.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=A(n.getUniformLocation(this._program,"u_resolution")),this._textureLocation=A(n.getUniformLocation(this._program,"u_texture"));let L=this._vertexArrayObject=n.createVertexArray();this._register(g(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(g(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(g(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=A(n.createBuffer()),this._register(g(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,2,n.FLOAT,!1,44,0),n.vertexAttribDivisor(2,1),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,n.FLOAT,!1,44,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(3,1),n.enableVertexAttribArray(4),n.vertexAttribPointer(4,1,n.FLOAT,!1,44,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(4,1),n.enableVertexAttribArray(5),n.vertexAttribPointer(5,2,n.FLOAT,!1,44,5*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(5,1),n.enableVertexAttribArray(6),n.vertexAttribPointer(6,2,n.FLOAT,!1,44,7*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(6,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,44,9*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.useProgram(this._program);let p=new Int32Array(J.maxAtlasPages);for(let c=0;cn.deleteTexture(u.texture))),n.activeTexture(n.TEXTURE0+c),n.bindTexture(n.TEXTURE_2D,u.texture),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,1,1,0,n.RGBA,n.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[c]=u}n.enable(n.BLEND),n.blendFunc(n.SRC_ALPHA,n.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return this._atlas?this._atlas.pageLayoutVersion!==this._lastSeenPageLayoutVersion?(this._lastSeenPageLayoutVersion=this._atlas.pageLayoutVersion,!0):!1:!0}updateCell(t,r,s,a,o,n,L,T,h){this._updateCell(this._vertices.attributes,t,r,s,a,o,n,L,T,h)}_updateCell(t,r,s,a,o,n,L,T,h,d){if(N=(s*this._terminal.cols+r)*11,a===0||a===void 0){t.fill(0,N,N+11-1-2);return}this._atlas&&(T&&T.length>1?S=this._atlas.getRasterizedGlyphCombinedChar(T,o,n,L,!1,this._terminal.element):S=this._atlas.getRasterizedGlyph(a,o,n,L,!1,this._terminal.element),Ie=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),o!==d&&S.offset.x>Ie?(k0=S.offset.x-Ie,t[N]=-(S.offset.x-k0)+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=(S.size.x-k0)/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x+k0/this._atlas.pages[S.texturePage].canvas.width,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x-k0/this._atlas.pages[S.texturePage].canvas.width,t[N+8]=S.sizeClipSpace.y):(t[N]=-S.offset.x+this._dimensions.device.char.left,t[N+1]=-S.offset.y+this._dimensions.device.char.top,t[N+2]=S.size.x/this._dimensions.device.canvas.width,t[N+3]=S.size.y/this._dimensions.device.canvas.height,t[N+4]=S.texturePage,t[N+5]=S.texturePositionClipSpace.x,t[N+6]=S.texturePositionClipSpace.y,t[N+7]=S.sizeClipSpace.x,t[N+8]=S.sizeClipSpace.y),this._optionsService.rawOptions.rescaleOverlappingGlyphs&&Ze(a,h,S.size.x,this._dimensions.device.cell.width)&&(t[N+2]=(this._dimensions.device.cell.width-1)/this._dimensions.device.canvas.width))}clear(){let t=this._terminal,r=t.cols*t.rows*11;this._vertices.count!==r?this._vertices.attributes=new Float32Array(r):this._vertices.attributes.fill(0);let s=0;for(;sthis._atlasTextures.length&&!this._pageOverflowWarned&&(this._pageOverflowWarned=!0,this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`));for(let n=0;n=e.rows||T<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,this.viewportCappedStartRow=L,this.viewportCappedEndRow=T,this.startCol=t[0],this.endCol=r[0]}isCellSelected(e,t,r){return this.hasSelection?(r-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&r>=this.viewportCappedStartRow&&t=this.viewportCappedStartRow&&t>=this.endCol&&r<=this.viewportCappedEndRow:r>this.viewportStartRow&&r=this.startCol&&t=this.startCol):!1}};function Tt(){return new Fe}var lt=2147483648,se=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=Tt()}resize(e,t){let r=e*t*4;r!==this.cells.length&&(this.cells=new Uint32Array(r),this.lineLengths=new Uint32Array(t))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}};var t1=`#version 300 es + layout (location = 0) in vec2 a_position; + layout (location = 1) in vec2 a_size; +@@ -71,5 +71,5 @@ out vec4 outColor; + + void main() { + outColor = v_color; +-}`,l0=8,ge=l0*Float32Array.BYTES_PER_ELEMENT,r1=20*l0,ne=class{constructor(){this.attributes=new Float32Array(r1),this.count=0}},p0=0,Lt=0,ht=0,dt=0,_t=0,ct=0,ut=0,ae=class extends W{constructor(t,r,s,a,o){super();this._terminal=t;this._gl=r;this._dimensions=s;this._themeService=a;this._logService=o;this._vertices=new ne;this._verticesCursor=new ne;let n=this._gl;this._program=A(ie(n,t1,i1,this._logService)),this._register(g(()=>n.deleteProgram(this._program))),this._projectionLocation=A(n.getUniformLocation(this._program,"u_projection"));let L=this._vertexArrayObject=n.createVertexArray();this._register(g(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(g(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(g(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=A(n.createBuffer()),this._register(g(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,ge,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,ge,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,!1,ge,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(a.colors),this._register(this._themeService.onChangeColors(p=>{this._updateCachedColors(p),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){let r=this._gl;r.useProgram(this._program),r.bindVertexArray(this._vertexArrayObject),r.uniformMatrix4fv(this._projectionLocation,!1,te),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.bufferData(r.ARRAY_BUFFER,t.attributes,r.DYNAMIC_DRAW),r.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,r.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){let r=this._terminal,s=this._vertices,a=1,o,n,L,T,h,d,_,p,c,u,C;for(o=0;o>24&255)/255,_t=(p0>>16&255)/255,ct=(p0>>8&255)/255,ut=1,this._addRectangle(t.attributes,r,Lt,ht,(n-o)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,dt,_t,ct,ut)}_addRectangle(t,r,s,a,o,n,L,T,h,d){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L,t[r+5]=T,t[r+6]=h,t[r+7]=d}_addRectangleFloat(t,r,s,a,o,n,L){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L[0],t[r+5]=L[1],t[r+6]=L[2],t[r+7]=L[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(t.rgba&255)/255])}};var oe=class extends W{constructor(t,r,s,a,o,n,L,T){super();this._container=r;this._alpha=o;this._coreBrowserService=n;this._optionsService=L;this._themeService=T;this._deviceCharWidth=0;this._deviceCharHeight=0;this._deviceCellWidth=0;this._deviceCellHeight=0;this._deviceCharLeft=0;this._deviceCharTop=0;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${s}-layer`),this._canvas.style.zIndex=a.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this._register(this._themeService.onChangeColors(h=>{this._refreshCharAtlas(t,h),this.reset(t)})),this._register(g(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=A(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,r,s){}handleSelectionChanged(t,r,s,a=!1){}_setTransparency(t,r){if(r===this._alpha)return;let s=this._canvas;this._alpha=r,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,s),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,r){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=Y0(t,this._optionsService.rawOptions,r,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,r){this._deviceCellWidth=r.device.cell.width,this._deviceCellHeight=r.device.cell.height,this._deviceCharWidth=r.device.char.width,this._deviceCharHeight=r.device.char.height,this._deviceCharLeft=r.device.char.left,this._deviceCharTop=r.device.char.top,this._canvas.width=r.device.canvas.width,this._canvas.height=r.device.canvas.height,this._canvas.style.width=`${r.css.canvas.width}px`,this._canvas.style.height=`${r.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,r,s=1){this._ctx.fillRect(t*this._deviceCellWidth,(r+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,s*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,r,s,a){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight))}_fillCharTrueColor(t,r,s,a){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=K0,this._clipCell(s,a,r.getWidth()),this._ctx.fillText(r.getChars(),s*this._deviceCellWidth+this._deviceCharLeft,a*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,r,s){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,r,s){let a=r?t.options.fontWeightBold:t.options.fontWeight;return`${s?"italic":""} ${a} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}};var Te=class extends oe{constructor(e,t,r,s,a,o,n){super(r,e,"link",t,!0,a,o,n),this._register(s.onShowLinkUnderline(L=>this._handleShowLinkUnderline(L))),this._register(s.onHideLinkUnderline(L=>this._handleHideLinkUnderline(L)))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);let e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===257?this._ctx.fillStyle=this._themeService.colors.background.css:e.fg!==void 0&&st(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;tthis._handleColorChange())),this._cellColorResolver=new G0(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new Te(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,T,this._themeService)],this.dimensions=Ue(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(T.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new J0(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register(le(this._canvas,"webglcontextlost",c=>{this._logService.debug("webglcontextlost event received"),c.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(c)},3e3)})),this._register(le(this._canvas,"webglcontextrestored",c=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,be(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=ve(this._canvas,this._coreBrowserService.window,(c,u)=>this._setCanvasDevicePixelDimensions(c,u)),this._register(this._coreBrowserService.onWindowChange(c=>{this._observerDisposable.value=ve(this._canvas,c,(u,C)=>this._setCanvasDevicePixelDimensions(u,C))})),this._register(le(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register(g(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(let c of this._renderLayers)c.dispose();this._canvas.parentElement?.removeChild(this._canvas),be(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,r){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(let s of this._renderLayers)s.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(let t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(let t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,r,s){for(let a of this._renderLayers)a.handleSelectionChanged(this._terminal,t,r,s);this._model.selection.update(this._core,t,r,s),this._requestRedrawViewport()}handleCursorMove(){for(let t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new ae(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new re(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0){this._isAttached=!1;return}let t=Y0(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=De(c0.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),c0.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(let t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,r){if(!this._isAttached)if(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height)this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0;else return;for(let o of this._renderLayers)o.handleGridChanged(this._terminal,t,r);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,r);let s=!1,a=0;for(;this._charAtlas&&this._glyphRenderer.value.beginFrame()&&a++<32;)s=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);s&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible)&&this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new q0(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,r){let s=this._core,a=this._workCell,o,n,L,T,h,d,_,p,c,u,C,Q,m,R,F,E,y;t=pt(t,s.rows-1,0),r=pt(r,s.rows-1,0);let Y=this._coreService.decPrivateModes.cursorStyle??s.options.cursorStyle??"block",X=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,M0=X-s.buffer.ydisp,t0=Math.min(this._terminal.buffer.active.cursorX,s.cols-1),L0=-1,M=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let n0=!1;for(n=t;n<=r;n++){L=n+s.buffer.ydisp;let a0=s.buffer.lines.get(L);if(!a0){for(this._model.lineLengths[n]=0,E=0;E=_,c=E,h.length>0&&E===h[0][0]&&p){u=h.shift();let q=this._model.selection.isCellSelected(this._terminal,u[0],L);for(F=u[0]+1;F=u[1],p?(d=!0,a=new Ae(a,T.translateToString(!0,u[0],u[1]),u[1]-u[0]),c=u[1]-1):_=u[1]}if(Q=a.getChars(),m=a.getCode(),F=(n*s.cols+E)*4,!$&&a.isBlink()&&($=!0),this._cellColorResolver.resolve(a,E,L,this.dimensions.device.cell.width,this.dimensions.device.cell.height),M&&L===X&&(E===t0&&(this._model.cursor={x:t0,y:M0,width:a.getWidth(),style:this._coreBrowserService.isFocused?Y:s.options.cursorInactiveStyle,cursorWidth:s.options.cursorWidth,dpr:this._devicePixelRatio},L0=t0+a.getWidth()-1),E>=t0&&E<=L0&&(this._coreBrowserService.isFocused&&Y==="block"||this._coreBrowserService.isFocused===!1&&s.options.cursorInactiveStyle==="block")&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&a.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),m!==0&&(this._model.lineLengths[n]=E+1),!(this._model.cells[F]===m&&this._model.cells[F+1]===this._cellColorResolver.result.bg&&this._model.cells[F+2]===this._cellColorResolver.result.fg&&this._model.cells[F+3]===this._cellColorResolver.result.ext)&&(n0=!0,Q.length>1&&(m|=lt),this._model.cells[F]=m,this._model.cells[F+1]=this._cellColorResolver.result.bg,this._model.cells[F+2]=this._cellColorResolver.result.fg,this._model.cells[F+3]=this._cellColorResolver.result.ext,R=a.getWidth(),this._glyphRenderer.value.updateCell(E,n,m,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,Q,R,o),d)){for(a=this._workCell,E++;E<=c;E++)y=(n*s.cols+E)*4,this._nullModelCell(E,n,y,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);E--}}this._setRowBlinkState(n,$)}n0&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,r,s,a,o,n){this._glyphRenderer.value.updateCell(t,r,0,a,o,n,"",0,0),this._model.cells[s]=0,this._model.cells[s+1]=a,this._model.cells[s+2]=o,this._model.cells[s+3]=n}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,r){this._rowHasBlinkingCells[t]!==r&&(this._rowHasBlinkingCells[t]=r,this._rowHasBlinkingCellsCount+=r?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){!this._charSizeService.width||!this._charSizeService.height||(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=this._optionsService.rawOptions.lineHeight===1?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,r){this._canvas.width===t&&this._canvas.height===r||(this._canvas.width=t,this._canvas.height=r,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){let t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}},Ae=class extends s0{constructor(t,r,s){super();this.content=0;this.combinedData="";this.fg=t.fg,this.bg=t.bg,this.combinedData=r,this._width=s}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};function pt(i,e,t=0){return Math.max(Math.min(i,e),t)}var Ct=class extends W{constructor(t){if(ue&&He()<16){let r={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",r))throw new Error("WebGL2 is only supported on Safari 16 and above")}super();this._onChangeTextureAtlas=this._register(new U);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new U);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new U);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onContextLoss=this._register(new U);this.onContextLoss=this._onContextLoss.event;this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){let r=t._core;if(!t.element){this._register(r.onWillOpen(()=>this.activate(t)));return}this._terminal=t;let s=r.coreService,a=r.optionsService,o=r,n=o._renderService,L=o._characterJoinerService,T=o._charSizeService,h=o._coreBrowserService,d=o._decorationService,_=o._logService,p=o._themeService;this._renderer=this._register(new Le(t,L,T,h,s,d,_,a,p,this._customGlyphs,this._preserveDrawingBuffer)),this._register(c0.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(c0.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(c0.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(c0.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),n.setRenderer(this._renderer),this._register(g(()=>{if(this._terminal._core._store._isDisposed)return;let c=this._terminal._core._renderService;c.setRenderer(this._terminal._core._createRenderer()),c.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}};export{Ct as WebglAddon}; ++}`,l0=8,ge=l0*Float32Array.BYTES_PER_ELEMENT,r1=20*l0,ne=class{constructor(){this.attributes=new Float32Array(r1),this.count=0}},p0=0,Lt=0,ht=0,dt=0,_t=0,ct=0,ut=0,ae=class extends W{constructor(t,r,s,a,o){super();this._terminal=t;this._gl=r;this._dimensions=s;this._themeService=a;this._logService=o;this._vertices=new ne;this._verticesCursor=new ne;let n=this._gl;this._program=A(ie(n,t1,i1,this._logService)),this._register(g(()=>n.deleteProgram(this._program))),this._projectionLocation=A(n.getUniformLocation(this._program,"u_projection"));let L=this._vertexArrayObject=n.createVertexArray();this._register(g(()=>n.deleteVertexArray(L))),n.bindVertexArray(L);let T=new Float32Array([0,0,1,0,0,1,1,1]),h=n.createBuffer();this._register(g(()=>n.deleteBuffer(h))),n.bindBuffer(n.ARRAY_BUFFER,h),n.bufferData(n.ARRAY_BUFFER,T,n.STATIC_DRAW),n.enableVertexAttribArray(3),n.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);let d=new Uint8Array([0,1,2,3]),_=n.createBuffer();this._register(g(()=>n.deleteBuffer(_))),n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,_),n.bufferData(n.ELEMENT_ARRAY_BUFFER,d,n.STATIC_DRAW),this._attributesBuffer=A(n.createBuffer()),this._register(g(()=>n.deleteBuffer(this._attributesBuffer))),n.bindBuffer(n.ARRAY_BUFFER,this._attributesBuffer),n.enableVertexAttribArray(0),n.vertexAttribPointer(0,2,n.FLOAT,!1,ge,0),n.vertexAttribDivisor(0,1),n.enableVertexAttribArray(1),n.vertexAttribPointer(1,2,n.FLOAT,!1,ge,2*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(1,1),n.enableVertexAttribArray(2),n.vertexAttribPointer(2,4,n.FLOAT,!1,ge,4*Float32Array.BYTES_PER_ELEMENT),n.vertexAttribDivisor(2,1),this._updateCachedColors(a.colors),this._register(this._themeService.onChangeColors(p=>{this._updateCachedColors(p),this._updateViewportRectangle()}))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(t){let r=this._gl;r.useProgram(this._program),r.bindVertexArray(this._vertexArrayObject),r.uniformMatrix4fv(this._projectionLocation,!1,te),r.bindBuffer(r.ARRAY_BUFFER,this._attributesBuffer),r.bufferData(r.ARRAY_BUFFER,t.attributes,r.DYNAMIC_DRAW),r.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,r.UNSIGNED_BYTE,0,t.count)}handleResize(){this._updateViewportRectangle()}setDimensions(t){this._dimensions=t}_updateCachedColors(t){this._bgFloat=this._colorToFloat32Array(t.background),this._cursorFloat=this._colorToFloat32Array(t.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(t){let r=this._terminal,s=this._vertices,a=1,o,n,L,T,h,d,_,p,c,u,C;for(o=0;o>24&255)/255,_t=(p0>>16&255)/255,ct=(p0>>8&255)/255,ut=1,this._addRectangle(t.attributes,r,Lt,ht,(n-o)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,dt,_t,ct,ut)}_addRectangle(t,r,s,a,o,n,L,T,h,d){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L,t[r+5]=T,t[r+6]=h,t[r+7]=d}_addRectangleFloat(t,r,s,a,o,n,L){t[r]=s/this._dimensions.device.canvas.width,t[r+1]=a/this._dimensions.device.canvas.height,t[r+2]=o/this._dimensions.device.canvas.width,t[r+3]=n/this._dimensions.device.canvas.height,t[r+4]=L[0],t[r+5]=L[1],t[r+6]=L[2],t[r+7]=L[3]}_colorToFloat32Array(t){return new Float32Array([(t.rgba>>24&255)/255,(t.rgba>>16&255)/255,(t.rgba>>8&255)/255,(t.rgba&255)/255])}};var oe=class extends W{constructor(t,r,s,a,o,n,L,T){super();this._container=r;this._alpha=o;this._coreBrowserService=n;this._optionsService=L;this._themeService=T;this._deviceCharWidth=0;this._deviceCharHeight=0;this._deviceCellWidth=0;this._deviceCellHeight=0;this._deviceCharLeft=0;this._deviceCharTop=0;this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add(`xterm-${s}-layer`),this._canvas.style.zIndex=a.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this._register(this._themeService.onChangeColors(h=>{this._refreshCharAtlas(t,h),this.reset(t)})),this._register(g(()=>{this._canvas.remove()}))}_initCanvas(){this._ctx=A(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(t){}handleFocus(t){}handleCursorMove(t){}handleGridChanged(t,r,s){}handleSelectionChanged(t,r,s,a=!1){}_setTransparency(t,r){if(r===this._alpha)return;let s=this._canvas;this._alpha=r,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,s),this._refreshCharAtlas(t,this._themeService.colors),this.handleGridChanged(t,0,t.rows-1)}_refreshCharAtlas(t,r){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=Y0(t,this._optionsService.rawOptions,r,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr,2048),this._charAtlas.warmUp())}resize(t,r){this._deviceCellWidth=r.device.cell.width,this._deviceCellHeight=r.device.cell.height,this._deviceCharWidth=r.device.char.width,this._deviceCharHeight=r.device.char.height,this._deviceCharLeft=r.device.char.left,this._deviceCharTop=r.device.char.top,this._canvas.width=r.device.canvas.width,this._canvas.height=r.device.canvas.height,this._canvas.style.width=`${r.css.canvas.width}px`,this._canvas.style.height=`${r.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(t,this._themeService.colors)}_fillBottomLineAtCells(t,r,s=1){this._ctx.fillRect(t*this._deviceCellWidth,(r+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,s*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(t,r,s,a){this._alpha?this._ctx.clearRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,a*this._deviceCellHeight))}_fillCharTrueColor(t,r,s,a){this._ctx.font=this._getFont(t,!1,!1),this._ctx.textBaseline=K0,this._clipCell(s,a,r.getWidth()),this._ctx.fillText(r.getChars(),s*this._deviceCellWidth+this._deviceCharLeft,a*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(t,r,s){this._ctx.beginPath(),this._ctx.rect(t*this._deviceCellWidth,r*this._deviceCellHeight,s*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(t,r,s){let a=r?t.options.fontWeightBold:t.options.fontWeight;return`${s?"italic":""} ${a} ${t.options.fontSize*this._coreBrowserService.dpr}px ${t.options.fontFamily}`}};var Te=class extends oe{constructor(e,t,r,s,a,o,n){super(r,e,"link",t,!0,a,o,n),this._register(s.onShowLinkUnderline(L=>this._handleShowLinkUnderline(L))),this._register(s.onHideLinkUnderline(L=>this._handleHideLinkUnderline(L)))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);let e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===257?this._ctx.fillStyle=this._themeService.colors.background.css:e.fg!==void 0&&st(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;tthis._handleColorChange())),this._cellColorResolver=new G0(this._terminal,this._optionsService,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new Te(this._core.screenElement,2,this._terminal,this._core.linkifier,this._coreBrowserService,T,this._themeService)],this.dimensions=Ue(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this._register(T.onOptionChange(()=>this._handleOptionsChanged())),this._textBlinkStateManager=this._register(new J0(()=>this._requestRedrawViewport(),this._coreBrowserService,this._optionsService)),this._resetBlinkingRowState(),this._deviceMaxTextureSize=this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),this._register(le(this._canvas,"webglcontextlost",c=>{this._logService.debug("webglcontextlost event received"),c.preventDefault(),this._contextRestorationTimeout=setTimeout(()=>{this._contextRestorationTimeout=void 0,this._logService.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(c)},3e3)})),this._register(le(this._canvas,"webglcontextrestored",c=>{this._logService.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,be(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()})),this._observerDisposable.value=ve(this._canvas,this._coreBrowserService.window,(c,u)=>this._setCanvasDevicePixelDimensions(c,u)),this._register(this._coreBrowserService.onWindowChange(c=>{this._observerDisposable.value=ve(this._canvas,c,(u,C)=>this._setCanvasDevicePixelDimensions(u,C))})),this._register(le(this._coreBrowserService.mainDocument,"mousedown",()=>this._cursorBlinkStateManager.value?.restartBlinkAnimation())),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._core.screenElement.isConnected,this._register(g(()=>{clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0;for(let c of this._renderLayers)c.dispose();this._canvas.parentElement?.removeChild(this._canvas),be(this._terminal)}))}get textureAtlas(){return this._charAtlas?.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(t,r){this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows),this._resetBlinkingRowState();for(let s of this._renderLayers)s.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,this._rectangleRenderer.value?.setDimensions(this.dimensions),this._rectangleRenderer.value?.handleResize(),this._glyphRenderer.value?.setDimensions(this.dimensions),this._glyphRenderer.value?.handleResize(),this._refreshCharAtlas(),this._clearModel(!1),this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0})}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){for(let t of this._renderLayers)t.handleBlur(this._terminal);this._cursorBlinkStateManager.value?.pause(),this._requestRedrawViewport()}handleFocus(){for(let t of this._renderLayers)t.handleFocus(this._terminal);this._cursorBlinkStateManager.value?.resume(),this._requestRedrawViewport()}handleViewportVisibilityChange(t){this._textBlinkStateManager.setViewportVisible(t)}handleSelectionChanged(t,r,s){for(let a of this._renderLayers)a.handleSelectionChanged(this._terminal,t,r,s);this._model.selection.update(this._core,t,r,s),this._requestRedrawViewport()}handleCursorMove(){for(let t of this._renderLayers)t.handleCursorMove(this._terminal);this._cursorBlinkStateManager.value?.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new ae(this._terminal,this._gl,this.dimensions,this._themeService,this._logService),this._glyphRenderer.value=new re(this._terminal,this._gl,this.dimensions,this._optionsService,this._logService),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0){this._isAttached=!1;return}let t=Y0(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr,this._deviceMaxTextureSize,this._customGlyphs);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=De(c0.forward(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),c0.forward(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas))),this._charAtlas=t,this._charAtlas.warmUp(),this._glyphRenderer.value?.setAtlas(this._charAtlas)}_clearModel(t){this._model.clear(),t&&this._glyphRenderer.value?.clear()}clearTextureAtlas(){this._charAtlas?.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){this._clearModel(!0);for(let t of this._renderLayers)t.reset(this._terminal);this._resetBlinkingRowState(),this._textBlinkStateManager.setNeedsBlinkInViewport(!1),this._cursorBlinkStateManager.value?.restartBlinkAnimation(),this._updateCursorBlink()}renderRows(t,r){if(!this._isAttached)if(this._core.screenElement?.isConnected&&this._charSizeService.width&&this._charSizeService.height)this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0;else return;for(let o of this._renderLayers)o.handleGridChanged(this._terminal,t,r);if(!this._glyphRenderer.value||!this._rectangleRenderer.value)return;this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(t,r);let s=!1,a=0;for(;this._charAtlas&&a++<32&&this._glyphRenderer.value.beginFrame();)s=!0,this._clearModel(!0),this._updateModel(0,this._terminal.rows-1);s&&this._glyphRenderer.value.invalidateAtlasTextures(),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible)&&this._rectangleRenderer.value.renderCursor()}_updateCursorBlink(){this._coreService.decPrivateModes.cursorBlink??this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new q0(()=>{this._requestRedrawCursor()},this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(t,r){let s=this._core,a=this._workCell,o,n,L,T,h,d,_,p,c,u,C,Q,m,R,F,E,y;t=pt(t,s.rows-1,0),r=pt(r,s.rows-1,0);let X=this._coreService.decPrivateModes.cursorStyle??s.options.cursorStyle??"block",Y=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,M0=Y-s.buffer.ydisp,t0=Math.min(this._terminal.buffer.active.cursorX,s.cols-1),L0=-1,M=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let n0=!1;for(n=t;n<=r;n++){L=n+s.buffer.ydisp;let a0=s.buffer.lines.get(L);if(!a0){for(this._model.lineLengths[n]=0,E=0;E=_,c=E,h.length>0&&E===h[0][0]&&p){u=h.shift();let q=this._model.selection.isCellSelected(this._terminal,u[0],L);for(F=u[0]+1;F=u[1],p?(d=!0,a=new Ae(a,T.translateToString(!0,u[0],u[1]),u[1]-u[0]),c=u[1]-1):_=u[1]}if(Q=a.getChars(),m=a.getCode(),F=(n*s.cols+E)*4,!$&&a.isBlink()&&($=!0),this._cellColorResolver.resolve(a,E,L,this.dimensions.device.cell.width,this.dimensions.device.cell.height),M&&L===Y&&(E===t0&&(this._model.cursor={x:t0,y:M0,width:a.getWidth(),style:this._coreBrowserService.isFocused?X:s.options.cursorInactiveStyle,cursorWidth:s.options.cursorWidth,dpr:this._devicePixelRatio},L0=t0+a.getWidth()-1),E>=t0&&E<=L0&&(this._coreBrowserService.isFocused&&X==="block"||this._coreBrowserService.isFocused===!1&&s.options.cursorInactiveStyle==="block")&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),this._textBlinkStateManager.isEnabled&&!this._textBlinkStateManager.isBlinkOn&&a.isBlink()&&(this._cellColorResolver.result.fg|=1073741824),m!==0&&(this._model.lineLengths[n]=E+1),!(this._model.cells[F]===m&&this._model.cells[F+1]===this._cellColorResolver.result.bg&&this._model.cells[F+2]===this._cellColorResolver.result.fg&&this._model.cells[F+3]===this._cellColorResolver.result.ext)&&(n0=!0,Q.length>1&&(m|=lt),this._model.cells[F]=m,this._model.cells[F+1]=this._cellColorResolver.result.bg,this._model.cells[F+2]=this._cellColorResolver.result.fg,this._model.cells[F+3]=this._cellColorResolver.result.ext,R=a.getWidth(),this._glyphRenderer.value.updateCell(E,n,m,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,Q,R,o),d)){for(a=this._workCell,E++;E<=c;E++)y=(n*s.cols+E)*4,this._nullModelCell(E,n,y,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext);E--}}this._setRowBlinkState(n,$)}n0&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model),this._updateTextBlinkState()}_nullModelCell(t,r,s,a,o,n){this._glyphRenderer.value.updateCell(t,r,0,a,o,n,"",0,0),this._model.cells[s]=0,this._model.cells[s+1]=a,this._model.cells[s+2]=o,this._model.cells[s+3]=n}_resetBlinkingRowState(){this._rowHasBlinkingCells=new Array(this._terminal.rows).fill(!1),this._rowHasBlinkingCellsCount=0}_setRowBlinkState(t,r){this._rowHasBlinkingCells[t]!==r&&(this._rowHasBlinkingCells[t]=r,this._rowHasBlinkingCellsCount+=r?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}_updateDimensions(){!this._charSizeService.width||!this._charSizeService.height||(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=this._optionsService.rawOptions.lineHeight===1?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(t,r){this._canvas.width===t&&this._canvas.height===r||(this._canvas.width=t,this._canvas.height=r,this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1,sync:!0}))}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){let t=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:t,end:t})}},Ae=class extends s0{constructor(t,r,s){super();this.content=0;this.combinedData="";this.fg=t.fg,this.bg=t.bg,this.combinedData=r,this._width=s}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(t){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}};function pt(i,e,t=0){return Math.max(Math.min(i,e),t)}var Ct=class extends W{constructor(t){if(ue&&He()<16){let r={antialias:!1,depth:!1,preserveDrawingBuffer:!0};if(!document.createElement("canvas").getContext("webgl2",r))throw new Error("WebGL2 is only supported on Safari 16 and above")}super();this._onChangeTextureAtlas=this._register(new U);this.onChangeTextureAtlas=this._onChangeTextureAtlas.event;this._onAddTextureAtlasCanvas=this._register(new U);this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event;this._onRemoveTextureAtlasCanvas=this._register(new U);this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event;this._onContextLoss=this._register(new U);this.onContextLoss=this._onContextLoss.event;this._customGlyphs=t?.customGlyphs??!0,this._preserveDrawingBuffer=t?.preserveDrawingBuffer}activate(t){let r=t._core;if(!t.element){this._register(r.onWillOpen(()=>this.activate(t)));return}this._terminal=t;let s=r.coreService,a=r.optionsService,o=r,n=o._renderService,L=o._characterJoinerService,T=o._charSizeService,h=o._coreBrowserService,d=o._decorationService,_=o._logService,p=o._themeService;this._renderer=this._register(new Le(t,L,T,h,s,d,_,a,p,this._customGlyphs,this._preserveDrawingBuffer)),this._register(c0.forward(this._renderer.onContextLoss,this._onContextLoss)),this._register(c0.forward(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this._register(c0.forward(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this._register(c0.forward(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),n.setRenderer(this._renderer),this._register(g(()=>{if(this._terminal._core._store._isDisposed)return;let c=this._terminal._core._renderService;c.setRenderer(this._terminal._core._createRenderer()),c.handleResize(t.cols,t.rows)}))}get textureAtlas(){return this._renderer?.textureAtlas}clearTextureAtlas(){this._renderer?.clearTextureAtlas()}};export{Ct as WebglAddon}; + //# sourceMappingURL=addon-webgl.mjs.map +diff --git a/lib/addon-webgl.mjs.map b/lib/addon-webgl.mjs.map +index 03db5b52ad7972b7fa430748453da54eee9a100a..d96d115a1957e543c9c638d1be639aa840eb1aeb 100644 +--- a/lib/addon-webgl.mjs.map ++++ b/lib/addon-webgl.mjs.map +@@ -1,7 +1,7 @@ + { + "version": 3, + "sources": ["../../../src/common/Lifecycle.ts", "../../../src/common/Platform.ts", "../../../src/common/Color.ts", "../../../src/browser/renderer/shared/RendererUtils.ts", "../src/customGlyphs/CustomGlyphDefinitions.ts", "../src/CellColorResolver.ts", "../src/Constants.ts", "../src/customGlyphs/CustomGlyphRasterizer.ts", "../../../src/common/MultiKeyMap.ts", "../../../src/common/TaskQueue.ts", "../../../src/common/buffer/AttributeData.ts", "../../../src/common/Event.ts", "../src/TextureAtlas.ts", "../src/CharAtlasUtils.ts", "../src/CharAtlasCache.ts", "../src/CursorBlinkStateManager.ts", "../src/DevicePixelObserver.ts", "../../../src/common/input/TextDecoder.ts", "../../../src/common/buffer/CellData.ts", "../../../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/WebglUtils.ts", "../src/GlyphRenderer.ts", "../../../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/RenderModel.ts", "../src/RectangleRenderer.ts", "../src/renderLayer/BaseRenderLayer.ts", "../src/renderLayer/LinkRenderLayer.ts", "../../../src/browser/Dom.ts", "../src/WebglRenderer.ts", "../src/WebglAddon.ts"], +- "sourcesContent": ["/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types';\n\n/* oxlint-disable @stylistic/max-len -- generated glyph path data */\n\nconst enum Shapes {\n /** \u2502 */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** \u2500 */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** \u2514 */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** \u2518 */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** \u2510 */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** \u250C */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** \u2575 */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** \u2574 */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** \u2576 */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** \u2577 */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** \u2534 */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** \u2524 */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** \u251C */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** \u252C */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** \u253C */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** \u254C */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** \u2504 */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** \u2509 */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** \u254E */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** \u2506 */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** \u250A */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nnamespace GitBranchSymbolsParts {\n // Lines\n export const LINE_H: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 });\n export const LINE_V: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 });\n\n // Fading lines\n export const FADE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5', strokeWidth: 1 });\n export const FADE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5', strokeWidth: 1 });\n export const FADE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90', strokeWidth: 1 });\n export const FADE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1', strokeWidth: 1 });\n\n // Curved corners\n export const CURVE_DOWN_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_DOWN_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n export const CURVE_UP_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_UP_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n\n // Node parts\n export const NODE_FILL: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5' });\n export const NODE_STROKE: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5', strokeWidth: 1 });\n export const NODE_LINE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M1,.5 L.85,.5', strokeWidth: 1 });\n export const NODE_LINE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M0,.5 L.15,.5', strokeWidth: 1 });\n export const NODE_LINE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,1 L.5,.7', strokeWidth: 1 });\n export const NODE_LINE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,0 L.5,.3', strokeWidth: 1 });\n}\n\nexport const customGlyphDefinitions: { [index: string]: CustomGlyphCharacterDefinition | undefined } = {\n // #region Box Drawing (2500-257F)\n\n // https://www.unicode.org/charts/PDF/U2500.pdf\n\n // Light and heavy solid lines (2500-2503)\n '\u2500': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 },\n '\u2501': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 },\n '\u2502': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 },\n '\u2503': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 },\n\n // Light and heavy dashed lines (2504-250B)\n '\u2504': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u2505': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u2506': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 1 },\n '\u2507': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 3 },\n '\u2508': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u2509': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u250A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 1 },\n '\u250B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Light and heavy line box components (250C-254B)\n '\u250C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 },\n '\u250D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u250E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u250F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 },\n '\u2510': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 },\n '\u2511': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2512': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2513': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 },\n '\u2514': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 },\n '\u2515': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u2516': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2517': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 },\n '\u2518': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 },\n '\u2519': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u251A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u251B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 },\n '\u251C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 1 },\n '\u251D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u251E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u251F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2520': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2521': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u2522': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2523': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 3 },\n '\u2524': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 1 },\n '\u2525': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2526': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2527': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2528': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2529': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u252A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u252B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 3 },\n '\u252C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 1 },\n '\u252D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u252E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u252F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2530': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2531': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2532': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2533': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 3 },\n '\u2534': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 1 },\n '\u2535': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2536': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u2537': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2538': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2539': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u253A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u253B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 3 },\n '\u253C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 1 },\n '\u253D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u253E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u253F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2540': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2541': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2542': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2543': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u2544': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u2545': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2546': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2547': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 3 }],\n '\u2548': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 3 }],\n '\u2549': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 3 }],\n '\u254A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 3 }],\n '\u254B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 3 },\n\n // Light and heavy dashed lines (254C-254F)\n '\u254C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u254D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u254E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 1 },\n '\u254F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Double lines (2550-2551)\n '\u2550': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2551': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n\n // Light and double line box components (2552-256C)\n '\u2552': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2553': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2554': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2555': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '\u2556': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1`, strokeWidth: 1 },\n '\u2557': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2558': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}`, strokeWidth: 1 },\n '\u2559': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '\u255A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0`, strokeWidth: 1 },\n '\u255B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}`, strokeWidth: 1 },\n '\u255C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0`, strokeWidth: 1 },\n '\u255D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u255E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u255F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5`, strokeWidth: 1 },\n '\u2560': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u2561': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '\u2562': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2563': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0`, strokeWidth: 1 },\n '\u2564': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1`, strokeWidth: 1 },\n '\u2565': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2566': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2567': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2568': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '\u2569': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u256A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u256B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '\u256C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n\n // Character cell arcs (256D-2570)\n '\u256D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n '\u256E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '\u256F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '\u2570': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n\n // Character cell diagonals (2571-2573)\n '\u2571': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1', strokeWidth: 1 },\n '\u2572': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,1', strokeWidth: 1 },\n '\u2573': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1 M0,0 L1,1', strokeWidth: 1 },\n\n // Light and heavy half lines (2574-257B)\n '\u2574': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 },\n '\u2575': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 },\n '\u2576': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 },\n '\u2577': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 },\n '\u2578': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 },\n '\u2579': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 },\n '\u257A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 },\n '\u257B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 },\n\n // Mixed light and heavy lines (257C-257F)\n '\u257C': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u257D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u257E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u257F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n\n // #endregion\n\n // #region Block elements (2580-259F)\n\n // https://www.unicode.org/charts/PDF/U2580.pdf\n\n // Block elements (2580-2590)\n '\u2580': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }, // UPPER HALF BLOCK\n '\u2581': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 7, w: 8, h: 1 }] }, // LOWER ONE EIGHTH BLOCK\n '\u2582': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 2 }] }, // LOWER ONE QUARTER BLOCK\n '\u2583': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 3 }] }, // LOWER THREE EIGHTHS BLOCK\n '\u2584': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }, // LOWER HALF BLOCK\n '\u2585': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 5 }] }, // LOWER FIVE EIGHTHS BLOCK\n '\u2586': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 6 }] }, // LOWER THREE QUARTERS BLOCK\n '\u2587': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 7 }] }, // LOWER SEVEN EIGHTHS BLOCK\n '\u2588': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 8 }] }, // FULL BLOCK (=solid -> 25A0=black square)\n '\u2589': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 7, h: 8 }] }, // LEFT SEVEN EIGHTHS BLOCK\n '\u258A': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 6, h: 8 }] }, // LEFT THREE QUARTERS BLOCK\n '\u258B': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 5, h: 8 }] }, // LEFT FIVE EIGHTHS BLOCK\n '\u258C': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }] }, // LEFT HALF BLOCK\n '\u258D': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 3, h: 8 }] }, // LEFT THREE EIGHTHS BLOCK\n '\u258E': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 2, h: 8 }] }, // LEFT ONE QUARTER BLOCK\n '\u258F': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }] }, // LEFT ONE EIGHTH BLOCK\n '\u2590': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }, // RIGHT HALF BLOCK\n\n // Shade characters (2591-2593)\n '\u2591': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LIGHT SHADE (25%)\n [1, 0],\n [0, 0]\n ] },\n '\u2592': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // MEDIUM SHADE (=speckles fill, dotted fill, 50%, used in mapping to cp949, -> 1FB90 inverse medium shade)\n [1, 0],\n [0, 1]\n ] },\n '\u2593': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // DARK SHADE (75%)\n [1, 1],\n [1, 0]\n ] },\n\n // Block elements (2594-2595)\n '\u2594': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }] }, // UPPER ONE EIGHTH BLOCK\n '\u2595': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }] }, // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (2596-259F)\n '\u2596': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER LEFT\n '\u2597': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER RIGHT\n '\u2598': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT\n '\u2599': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT (-> 1F67F reverse checker board, -> 1FB95 checker board fill)\n '\u259A': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER RIGHT\n '\u259B': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '\u259C': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '\u259D': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT\n '\u259E': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT (-> 1F67E checker board, 1FB96 inverse checker board fill)\n '\u259F': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // #endregion\n\n // #region Powerline Symbols (E0A0-E0BF)\n\n // This contains the definitions of the primarily used box drawing characters as vector shapes.\n // The reason these characters are defined specially is to avoid common problems if a user's font\n // has not been patched with powerline characters and also to get pixel perfect rendering as\n // rendering issues can occur around AA/SPAA.\n //\n // The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n // visible.\n //\n // Original symbols defined in https://github.com/powerline/fontpatcher\n\n // Git branch\n '\\u{E0A0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: CustomGlyphVectorType.FILL } },\n // LN (Line Number)\n '\\u{E0A1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Lock\n '\\u{E0A2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: CustomGlyphVectorType.FILL } },\n // CN (Column Number)\n '\\u{E0A3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Right triangle solid\n '\\u{E0B0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,.5 L0,1', type: CustomGlyphVectorType.FILL, rightPadding: 2 } },\n // Right triangle line\n '\\u{E0B1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-1,-.5 L1,.5 L-1,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Left triangle solid\n '\\u{E0B2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L0,.5 L1,1', type: CustomGlyphVectorType.FILL, leftPadding: 2 } },\n // Left triangle line\n '\\u{E0B3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M2,-.5 L0,.5 L2,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n\n // Powerline Extra Symbols\n\n // Original symbols defined in https://github.com/ryanoasis/powerline-extra-symbols\n\n // Right semi-circle solid\n '\\u{E0B4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: CustomGlyphVectorType.FILL, rightPadding: 1 } },\n // Right semi-circle line\n '\\u{E0B5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: CustomGlyphVectorType.STROKE, rightPadding: 1 } },\n // Left semi-circle solid\n '\\u{E0B6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: CustomGlyphVectorType.FILL, leftPadding: 1 } },\n // Left semi-circle line\n '\\u{E0B7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: CustomGlyphVectorType.STROKE, leftPadding: 1 } },\n // Lower left triangle\n '\\u{E0B8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator\n '\\u{E0B9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Lower right triangle\n '\\u{E0BA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator redundant (identical to E0BD)\n '\\u{E0BB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper left triangle\n '\\u{E0BC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator\n '\\u{E0BD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper right triangle\n '\\u{E0BE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator redundant (identical to E0B9)\n '\\u{E0BF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n '\\u{E0C0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C8}' is unused\n '\\u{E0CA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0CB}' is unused\n '\\u{E0CC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C3}' is unused\n '\\u{E0D4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n\n // #endregion\n\n // #region Progress Indicators (EE00-EE0B)\n\n // initially added in Fira Code and later Nerd Fonts\n // https://github.com/ryanoasis/nerd-fonts/pull/1733\n\n // Progress bars (EE00-EE05)\n '\\u{EE00}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY START\n '\\u{EE01}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY MIDDLE\n '\\u{EE02}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z' }, // PROGRESS BAR EMPTY END\n '\\u{EE03}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z' }, // PROGRESS BAR FILLED START\n '\\u{EE04}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z' }, // PROGRESS BAR FILLED MIDDLE\n '\\u{EE05}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z' }, // PROGRESS BAR FILLED END\n\n // Progress spinners (EE06-EE0B) - 6-frame spinner animation using stroked arcs\n '\\u{EE06}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 1 (12 o'clock)\n '\\u{EE07}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 2 (2 o'clock)\n '\\u{EE08}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 3 (4 o'clock)\n '\\u{EE09}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 4 (6 o'clock)\n '\\u{EE0A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 5 (8 o'clock)\n '\\u{EE0B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 6 (10 o'clock)\n\n // #endregion\n\n // #region Git Branch Symbols (F5D0-F60D)\n\n // Initially added in Kitty (https://github.com/kovidgoyal/kitty/pull/7681)\n // then in Wezterm (https://github.com/wezterm/wezterm/issues/6328).\n\n // Straight lines (F5D0-F5D9)\n '\\u{F5D0}': GitBranchSymbolsParts.LINE_H, // Same as 2500\n '\\u{F5D1}': GitBranchSymbolsParts.LINE_V, // Same as 2502\n '\\u{F5D2}': GitBranchSymbolsParts.FADE_RIGHT,\n '\\u{F5D3}': GitBranchSymbolsParts.FADE_LEFT,\n '\\u{F5D4}': GitBranchSymbolsParts.FADE_DOWN,\n '\\u{F5D5}': GitBranchSymbolsParts.FADE_UP,\n\n // Curved lines (F5D6-F5D9)\n '\\u{F5D6}': GitBranchSymbolsParts.CURVE_DOWN_RIGHT, // Same as 256D)\n '\\u{F5D7}': GitBranchSymbolsParts.CURVE_DOWN_LEFT, // Same as 256E)\n '\\u{F5D8}': GitBranchSymbolsParts.CURVE_UP_RIGHT, // Same as 2570)\n '\\u{F5D9}': GitBranchSymbolsParts.CURVE_UP_LEFT, // Same as 256F)\n\n // Branching lines (F5DA-F5ED)\n '\\u{F5DA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5DC}': [GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DD}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5DE}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5DF}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E0}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5E1}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E2}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E3}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E4}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E5}': [GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E6}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E7}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E8}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E9}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5EB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EC}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5ED}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n\n // Nodes (F5EE-F5FB)\n '\\u{F5EE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE],\n '\\u{F5EF}': GitBranchSymbolsParts.NODE_STROKE,\n '\\u{F5F0}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F1}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F2}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F3}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F4}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F5}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F6}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F7}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F8}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5F9}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FA}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FB}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n\n // Extended Nodes (F5FC-F60D)\n // These were added a little later https://github.com/kovidgoyal/kitty/pull/7805\n '\\u{F5FC}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FD}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5FF}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F600}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F601}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F602}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F603}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F604}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F605}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F606}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F607}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F608}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F609}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60A}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60B}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60C}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60D}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n\n // #endregion\n\n // #region Symbols for Legacy Computing (1FB00-1FB3B)\n\n // https://www.unicode.org/charts/PDF/U1FB00.pdf\n\n // Block mosaic terminal graphic characters (1FB00-1FB3B)\n // The term \"sextant\" refers to block mosaics divided into six parts.\n '\\u{1FB00}': sextant(0b000001), // BLOCK SEXTANT-1\n '\\u{1FB01}': sextant(0b000010), // BLOCK SEXTANT-2\n '\\u{1FB02}': sextant(0b000011), // BLOCK SEXTANT-12 (upper one third block)\n '\\u{1FB03}': sextant(0b000100), // BLOCK SEXTANT-3\n '\\u{1FB04}': sextant(0b000101), // BLOCK SEXTANT-13\n '\\u{1FB05}': sextant(0b000110), // BLOCK SEXTANT-23\n '\\u{1FB06}': sextant(0b000111), // BLOCK SEXTANT-123\n '\\u{1FB07}': sextant(0b001000), // BLOCK SEXTANT-4\n '\\u{1FB08}': sextant(0b001001), // BLOCK SEXTANT-14\n '\\u{1FB09}': sextant(0b001010), // BLOCK SEXTANT-24\n '\\u{1FB0A}': sextant(0b001011), // BLOCK SEXTANT-124\n '\\u{1FB0B}': sextant(0b001100), // BLOCK SEXTANT-34 (middle one third block)\n '\\u{1FB0C}': sextant(0b001101), // BLOCK SEXTANT-134\n '\\u{1FB0D}': sextant(0b001110), // BLOCK SEXTANT-234\n '\\u{1FB0E}': sextant(0b001111), // BLOCK SEXTANT-1234 (upper two thirds block)\n '\\u{1FB0F}': sextant(0b010000), // BLOCK SEXTANT-5\n '\\u{1FB10}': sextant(0b010001), // BLOCK SEXTANT-15\n '\\u{1FB11}': sextant(0b010010), // BLOCK SEXTANT-25\n '\\u{1FB12}': sextant(0b010011), // BLOCK SEXTANT-125\n '\\u{1FB13}': sextant(0b010100), // BLOCK SEXTANT-35\n '\\u{1FB14}': sextant(0b010110), // BLOCK SEXTANT-235\n '\\u{1FB15}': sextant(0b010111), // BLOCK SEXTANT-1235\n '\\u{1FB16}': sextant(0b011000), // BLOCK SEXTANT-45\n '\\u{1FB17}': sextant(0b011001), // BLOCK SEXTANT-145\n '\\u{1FB18}': sextant(0b011010), // BLOCK SEXTANT-245\n '\\u{1FB19}': sextant(0b011011), // BLOCK SEXTANT-1245\n '\\u{1FB1A}': sextant(0b011100), // BLOCK SEXTANT-345\n '\\u{1FB1B}': sextant(0b011101), // BLOCK SEXTANT-1345\n '\\u{1FB1C}': sextant(0b011110), // BLOCK SEXTANT-2345\n '\\u{1FB1D}': sextant(0b011111), // BLOCK SEXTANT-12345\n '\\u{1FB1E}': sextant(0b100000), // BLOCK SEXTANT-6\n '\\u{1FB1F}': sextant(0b100001), // BLOCK SEXTANT-16\n '\\u{1FB20}': sextant(0b100010), // BLOCK SEXTANT-26\n '\\u{1FB21}': sextant(0b100011), // BLOCK SEXTANT-126\n '\\u{1FB22}': sextant(0b100100), // BLOCK SEXTANT-36\n '\\u{1FB23}': sextant(0b100101), // BLOCK SEXTANT-136\n '\\u{1FB24}': sextant(0b100110), // BLOCK SEXTANT-236\n '\\u{1FB25}': sextant(0b100111), // BLOCK SEXTANT-1236\n '\\u{1FB26}': sextant(0b101000), // BLOCK SEXTANT-46\n '\\u{1FB27}': sextant(0b101001), // BLOCK SEXTANT-146\n '\\u{1FB28}': sextant(0b101011), // BLOCK SEXTANT-1246\n '\\u{1FB29}': sextant(0b101100), // BLOCK SEXTANT-346\n '\\u{1FB2A}': sextant(0b101101), // BLOCK SEXTANT-1346\n '\\u{1FB2B}': sextant(0b101110), // BLOCK SEXTANT-2346\n '\\u{1FB2C}': sextant(0b101111), // BLOCK SEXTANT-12346\n '\\u{1FB2D}': sextant(0b110000), // BLOCK SEXTANT-56 (lower one third block)\n '\\u{1FB2E}': sextant(0b110001), // BLOCK SEXTANT-156\n '\\u{1FB2F}': sextant(0b110010), // BLOCK SEXTANT-256\n '\\u{1FB30}': sextant(0b110011), // BLOCK SEXTANT-1256 (upper and lower one third block)\n '\\u{1FB31}': sextant(0b110100), // BLOCK SEXTANT-356\n '\\u{1FB32}': sextant(0b110101), // BLOCK SEXTANT-1356\n '\\u{1FB33}': sextant(0b110110), // BLOCK SEXTANT-2356\n '\\u{1FB34}': sextant(0b110111), // BLOCK SEXTANT-12356\n '\\u{1FB35}': sextant(0b111000), // BLOCK SEXTANT-456\n '\\u{1FB36}': sextant(0b111001), // BLOCK SEXTANT-1456\n '\\u{1FB37}': sextant(0b111010), // BLOCK SEXTANT-2456\n '\\u{1FB38}': sextant(0b111011), // BLOCK SEXTANT-12456\n '\\u{1FB39}': sextant(0b111100), // BLOCK SEXTANT-3456 (lower two thirds block)\n '\\u{1FB3A}': sextant(0b111101), // BLOCK SEXTANT-13456\n '\\u{1FB3B}': sextant(0b111110), // BLOCK SEXTANT-23456\n\n // Smooth mosaic terminal graphic characters (1FB3C-1FB6F)\n '\\u{1FB3C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB3E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB40}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB41}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB42}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB43}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB44}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB45}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0.5,0 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB46}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0.3333 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB47}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB48}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB49}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB4C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB4F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB50}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB51}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB52}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB53}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB54}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB55}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB56}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,1 L1,1 L1,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB57}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB58}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB59}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB5A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB5B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB5C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB5D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB5E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB5F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB60}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB61}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB62}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB63}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB64}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB65}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB66}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,1 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB67}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0.6667 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB68}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z' }, // UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing left)\n '\\u{1FB69}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z' }, // LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing upper)\n '\\u{1FB6A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z' }, // UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing right)\n '\\u{1FB6B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z' }, // LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing lower)\n '\\u{1FB6C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L0,1 Z' }, // LEFT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 Z' }, // UPPER TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6E}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L1,1 L0.5,0.5 Z' }, // RIGHT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,1 L0.5,0.5 Z' }, // LOWER TRIANGULAR ONE QUARTER BLOCK\n\n // Block elements (1FB70-1FB80)\n '\\u{1FB70}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-2\n '\\u{1FB71}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-3\n '\\u{1FB72}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-4\n '\\u{1FB73}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-5\n '\\u{1FB74}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-6\n '\\u{1FB75}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-2\n '\\u{1FB77}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-3\n '\\u{1FB78}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-4\n '\\u{1FB79}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-5\n '\\u{1FB7A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-6\n '\\u{1FB7B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB7C}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7D}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7F}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // UPPER AND LOWER ONE EIGHTH BLOCK\n\n // Window title bar (1FB81-1FB81)\n '\\u{1FB81}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-1358\n\n // Block elements (1FB82-1FB8B)\n '\\u{1FB82}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 2 }] }, // UPPER ONE QUARTER BLOCK\n '\\u{1FB83}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 3 }] }, // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB84}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 5 }] }, // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB85}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 6 }] }, // UPPER THREE QUARTERS BLOCK\n '\\u{1FB86}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 7 }] }, // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB87}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 2, h: 8 }] }, // RIGHT ONE QUARTER BLOCK\n '\\u{1FB88}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 3, h: 8 }] }, // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB89}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 5, h: 8 }] }, // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB8A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 6, h: 8 }] }, // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 7, h: 8 }] }, // RIGHT SEVEN EIGHTHS B0OCK\n\n // Rectangular shade characters (1FB8C-1FB94)\n '\\u{1FB8C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LEFT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n '\\u{1FB8D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // RIGHT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0.5,0 L1,0 L1,1 L0.5,1 Z' },\n '\\u{1FB8E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n '\\u{1FB8F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n '\\u{1FB90}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // INVERSE MEDIUM SHADE\n [0, 1],\n [1, 0]\n ] },\n '\\u{1FB91}': [ // UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }\n ],\n '\\u{1FB92}': [ // UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }\n ],\n // 1FB93 is \n '\\u{1FB94}': [ // LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }\n ],\n\n // Fill characters (1FB95-1FB97)\n '\\u{1FB95}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // CHECKER BOARD FILL\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB96}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // INVERSE CHECKER BOARD FILL\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB97}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n { x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }\n ] },\n\n // Diagonal fill characters (1FB98-1FB99)\n '\\u{1FB98}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25', strokeWidth: 1 }, // UPPER LEFT TO LOWER RIGHT FILL\n '\\u{1FB99}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75', strokeWidth: 1 }, // UPPER RIGHT TO LOWER LEFT FILL\n\n // Smooth mosaic terminal graphic characters (1FB9A-1FB9B)\n '\\u{1FB9A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0', type: CustomGlyphVectorType.FILL } }, // UPPER AND LOWER TRIANGULAR HALF BLOCK\n '\\u{1FB9B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1', type: CustomGlyphVectorType.FILL } }, // LEFT AND RIGHT TRIANGULAR HALF BLOCK\n\n // Triangular shade characters (1FB9C-1FB9F)\n '\\u{1FB9C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L0,1 Z' },\n '\\u{1FB9D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,1 Z' },\n '\\u{1FB9E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M1,0 L1,1 L0,1 Z' },\n '\\u{1FB9F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,1 L0,1 Z' },\n\n // Character cell diagonals (1FBA0-1FBAE)\n '\\u{1FBA0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT\n '\\u{1FBA1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT\n '\\u{1FBAB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBAC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBAD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL DIAMOND\n\n // Light solid line with stroke (1FBAF-1FBAF)\n '\\u{1FBAF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} M.5,.35 L.5,.65`, strokeWidth: 1 }, // BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE\n\n // Terminal graphic characters (1FBB0-1FBB3)\n '\\u{1FBB0}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z', scaleType: CustomGlyphScaleType.CHAR }, // ARROWHEAD-SHAPED POINTER\n '\\u{1FBB1}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.1,.525 L.35,.675 L.9,.35', type: CustomGlyphVectorType.STROKE }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE CHECK MARK\n '\\u{1FBB2}': { type: CustomGlyphDefinitionType.PATH, data: 'M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13' }, // LEFT HALF RUNNING MAN\n '\\u{1FBB3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6' }, // RIGHT HALF RUNNING MAN\n\n // Arrows (1FBB4-1FBB8)\n // TODO: Improve all arrows, use hybrid approach\n '\\u{1FBB4}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS\n '\\u{1FBB5}': [ // LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB6}': [ // RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB7}': [ // DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB8}': [ // UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Terminal graphic characters (1FBB9-1FBBC)\n '\\u{1FBB9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z', type: CustomGlyphVectorType.FILL } }, // LEFT HALF FOLDER\n '\\u{1FBBA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT HALF FOLDER\n '\\u{1FBBB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // VOIDED GREEK CROSS\n '\\u{1FBBC}': [ // RIGHT OPEN SQUARED DOT\n { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z' },\n { type: CustomGlyphDefinitionType.PATH, data: 'M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5', scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Negative terminal graphic characters (1FBBD-1FBBF)\n '\\u{1FBBD}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL CROSS\n '\\u{1FBBE}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M1,.5 L.5,1', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBBF}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL DIAMOND\n\n // Terminal graphic characters (1FBC0-1FBCA)\n '\\u{1FBC0}': { type: CustomGlyphDefinitionType.PATH, data: 'M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', scaleType: CustomGlyphScaleType.CHAR }, // WHITE HEAVY SALTIRE WITH ROUNDED CORNERS\n // 1FBC1-1FBC4 is dervied from the Iosevka font (SIL OFL v1.1) https://github.com/be5invis/Iosevka\n '\\u{1FBC1}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z' }, // LEFT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC2}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z' }, // MIDDLE THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z' }, // RIGHT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC4}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z', scaleType: CustomGlyphScaleType.CHAR }, // NEGATIVE SQUARED QUESTION MARK\n '\\u{1FBC5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE\n '\\u{1FBC6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH ARMS RAISED\n '\\u{1FBC7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING LEFT\n '\\u{1FBC8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING RIGHT\n '\\u{1FBC9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH DRESS\n '\\u{1FBCA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE UP-POINTING CHEVRON\n\n // Terminal graphic characters (1FBCB-1FBCD)\n '\\u{1FBCB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE CROSS MARK\n '\\u{1FBCC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // RAISED SMALL LEFT SQUARE BRACKET\n '\\u{1FBCD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // BLACK SMALL UP-POINTING CHEVRON\n\n // Block elements (1FBCE-1FBCF)\n '\\u{1FBCE}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.6667,0 L0.6667,1 L0,1 Z' }, // LEFT TWO THIRDS BLOCK\n '\\u{1FBCF}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.3333,0 L0.3333,1 L0,1 Z' }, // LEFT ONE THIRD BLOCK\n\n // Character cell diagonals (1FBD0-1FBDF)\n '\\u{1FBD0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT\n '\\u{1FBD1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT\n '\\u{1FBD2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT\n '\\u{1FBD3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBD4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FBD5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBD6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE\n '\\u{1FBD7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT\n '\\u{1FBD8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT\n '\\u{1FBD9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT\n '\\u{1FBDC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT\n '\\u{1FBDD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBDE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBDF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT\n\n // Geometric shapes (1FBE0-1FBEF)\n '\\u{1FBE0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0', type: CustomGlyphVectorType.STROKE } }, // TOP JUSTIFIED LOWER HALF WHITE CIRCLE\n '\\u{1FBE1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1', type: CustomGlyphVectorType.STROKE } }, // RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE\n '\\u{1FBE2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1', type: CustomGlyphVectorType.STROKE } }, // BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE\n '\\u{1FBE3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1', type: CustomGlyphVectorType.STROKE } }, // LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE\n '\\u{1FBE4}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 4, h: 4 }] }, // UPPER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE5}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 4, w: 4, h: 4 }] }, // LOWER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE6}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 4, h: 4 }] }, // MIDDLE LEFT ONE QUARTER BLOCK\n '\\u{1FBE7}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 2, w: 4, h: 4 }] }, // MIDDLE RIGHT ONE QUARTER BLOCK\n '\\u{1FBE8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP JUSTIFIED LOWER HALF BLACK CIRCLE\n '\\u{1FBE9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE\n '\\u{1FBEA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE\n '\\u{1FBEB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z', type: CustomGlyphVectorType.FILL } }, // LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE\n '\\u{1FBEC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z', type: CustomGlyphVectorType.FILL } }, // TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBED}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE\n '\\u{1FBEE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBEF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE\n\n // Segmented digits (1FBF0-1FBF9)\n '\\u{1FBF0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111110), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ZERO (abcdef)\n '\\u{1FBF1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110000), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ONE (bc)\n '\\u{1FBF2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1101101), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT TWO (abdeg)\n '\\u{1FBF3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111001), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT THREE (abcdg)\n '\\u{1FBF4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FOUR (bcfg)\n '\\u{1FBF5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FIVE (acdfg)\n '\\u{1FBF6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SIX (acdefg)\n '\\u{1FBF7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1110010), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SEVEN (abcf)\n '\\u{1FBF8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT EIGHT (abcdefg)\n '\\u{1FBF9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT NINE (abcdfg)\n\n // Terminal graphic character (1FBFA-1FBFA)\n '\\u{1FBFA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // ALARM BELL SYMBOL\n\n // #endregion\n\n // #region Braille Patterns (2800-28FF)\n\n // https://www.unicode.org/charts/PDF/U2800.pdf\n\n // Braille patterns (2800-28FF)\n ...Object.fromEntries(\n Array.from({ length: 256 }, (_, i) => [\n String.fromCodePoint(0x2800 + i),\n { type: CustomGlyphDefinitionType.BRAILLE, data: i }\n ])\n ),\n\n // #endregion\n};\n\nexport const blockPatternCodepoints = new Set([\n // Shade characters (2591-2593)\n 0x2591,\n 0x2592,\n 0x2593,\n // Rectangular shade characters (1FB8C-1FB94)\n 0x1FB8C,\n 0x1FB8D,\n 0x1FB8E,\n 0x1FB8F,\n 0x1FB90,\n 0x1FB91,\n 0x1FB92,\n 0x1FB94,\n // Triangular shade characters (1FB9C-1FB9F)\n 0x1FB9C,\n 0x1FB9D,\n 0x1FB9E,\n 0x1FB9F\n]);\n\n/**\n * Generates a drawing function for sextant characters. Sextants are a 2x3 grid where each cell\n * can be on or off.\n * @param pattern A 6-bit pattern where bit 0 = top-left, bit 1 = top-right, bit 2 = middle-left,\n * bit 3 = middle-right, bit 4 = bottom-left, bit 5 = bottom-right\n */\nfunction sextant(pattern: number): { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: CustomGlyphPathDrawFunctionDefinition } {\n return {\n type: CustomGlyphDefinitionType.PATH_FUNCTION,\n data: () => {\n // Sextant grid: 2 columns, 3 rows\n // Row heights in 8ths: top=3, middle=2, bottom=3\n // Column widths: left=4, right=4\n const rects: string[] = [];\n const colW = 0.5; // Each column is half width\n const rowH = [3 / 8, 2 / 8, 3 / 8]; // Row heights as fractions\n const rowY = [0, 3 / 8, 5 / 8]; // Row Y positions\n\n for (let row = 0; row < 3; row++) {\n const leftBit = (pattern >> (row * 2)) & 1;\n const rightBit = (pattern >> (row * 2 + 1)) & 1;\n\n if (leftBit && rightBit) {\n // Full row\n rects.push(`M0,${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (leftBit) {\n rects.push(`M0,${rowY[row]} L${colW},${rowY[row]} L${colW},${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (rightBit) {\n rects.push(`M${colW},${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L${colW},${rowY[row] + rowH[row]} Z`);\n }\n }\n return rects.join(' ');\n }\n };\n}\n\n/**\n * Generates SVG path data for a 7-segment display digit.\n *\n * Segment mapping (bit positions):\n *\n * - bit 6: a (top)\n * - bit 5: b (upper right)\n * - bit 4: c (lower right)\n * - bit 3: d (bottom)\n * - bit 2: e (lower left)\n * - bit 1: f (upper left)\n * - bit 0: g (middle)\n *\n * ```\n * \u2500a\u2500\n * \u2502 \u2502\n * f b\n * \u2500g\u2500\n * e c\n * \u2502 \u2502\n * \u2500d\u2500\n * ```\n */\nfunction segmentedDigit(pattern: number): string {\n const paths: string[] = [];\n\n // Each segment should have approximately the same stroke width, this is somewhat difficult to be\n // precise since coordinates are 0-1 of the whole cell (percentage-based). To handle this, the\n // fact that terminal cells are typically sized at ~2:1 (height:width) is leveraged.\n // for horizontal vs vertical to make segments appear the same thickness\n const segW = 0.15; // Width of vertical segments (fraction of cell width)\n const segH = 0.075; // Height of horizontal segments (fraction of cell height, ~half of segW for 2:1 cells)\n const padX = 0.05; // Horizontal padding from edge\n const padY = 0.175; // Vertical padding from edge (35% total = 65% height)\n const gap = 0.015; // Gap between segments\n const taperX = segW / 2; // Horizontal taper for vertical segments\n const taperY = segH / 2; // Vertical taper for horizontal segments\n\n const left = padX;\n const right = 1 - padX;\n const top = padY;\n const bottom = 1 - padY;\n const midY = 0.5;\n\n // Segment a (top horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b1000000) {\n const y1 = top;\n const y2 = top + segH / 2;\n const y3 = top + segH;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment b (upper right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0100000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment c (lower right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0010000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment d (bottom horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0001000) {\n const y1 = bottom - segH;\n const y2 = bottom - segH / 2;\n const y3 = bottom;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment e (lower left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000100) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment f (upper left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000010) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment g (middle horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0000001) {\n const y1 = midY - segH / 2;\n const y2 = midY;\n const y3 = midY + segH / 2;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n\n return paths.join(' ');\n}\n\n", "import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/buffer/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\nimport { blockPatternCodepoints } from './customGlyphs/CustomGlyphDefinitions';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number, deviceCellHeight: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n if ($variantOffset === 0 && blockPatternCodepoints.has(code)) {\n $variantOffset = ((x * deviceCellWidth) % 2) * 2 + ((y * deviceCellHeight) % 2);\n }\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\nimport { customGlyphDefinitions } from './CustomGlyphDefinitions';\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition, type CustomGlyphPatternDefinition, type ICustomGlyphSolidOctantBlockVector, type ICustomGlyphVectorShape } from './Types';\n\ntype PatternCanvas = HTMLCanvasElement | OffscreenCanvas;\ntype PatternCanvasFactory = (width: number, height: number) => PatternCanvas;\n\nconst createOffscreenPatternCanvas: PatternCanvasFactory | undefined = typeof OffscreenCanvas === 'undefined'\n ? undefined\n : (width, height) => new OffscreenCanvas(width, height);\n\nconst createDomPatternCanvas: PatternCanvasFactory = (width, height) => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n};\n\nexport function createPatternCanvas(\n width: number,\n height: number,\n offscreenCanvasFactory: PatternCanvasFactory | undefined = createOffscreenPatternCanvas,\n domCanvasFactory: PatternCanvasFactory = createDomPatternCanvas\n): PatternCanvas {\n return offscreenCanvasFactory?.(width, height) ?? domCanvasFactory(width, height);\n}\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomGlyph(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): boolean {\n const unifiedCharDefinition = customGlyphDefinitions[c];\n if (unifiedCharDefinition) {\n // Normalize to array for uniform handling\n const parts = Array.isArray(unifiedCharDefinition) ? unifiedCharDefinition : [unifiedCharDefinition];\n for (const part of parts) {\n drawDefinitionPart(ctx, part, xOffset, yOffset, deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, fontSize, devicePixelRatio, logService, backgroundColor, variantOffset);\n }\n return true;\n }\n\n return false;\n}\n\nfunction drawDefinitionPart(\n ctx: CanvasRenderingContext2D,\n part: CustomGlyphDefinitionPart,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): void {\n // Handle scaleType - adjust dimensions and offset when scaling to character area\n let drawWidth = deviceCellWidth;\n let drawHeight = deviceCellHeight;\n let drawXOffset = xOffset;\n let drawYOffset = yOffset;\n if (part.scaleType === CustomGlyphScaleType.CHAR) {\n drawWidth = deviceCharWidth;\n drawHeight = deviceCharHeight;\n // Center the character within the cell\n drawXOffset = xOffset + (deviceCellWidth - deviceCharWidth) / 2;\n drawYOffset = yOffset + (deviceCellHeight - deviceCharHeight) / 2;\n }\n\n // Handle clipPath generically for any definition type\n if (part.clipPath) {\n ctx.save();\n applyClipPath(ctx, part.clipPath, drawXOffset, drawYOffset, drawWidth, drawHeight);\n }\n\n switch (part.type) {\n case CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR:\n drawBlockVectorChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n case CustomGlyphDefinitionType.BLOCK_PATTERN:\n drawPatternChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, variantOffset);\n break;\n case CustomGlyphDefinitionType.PATH_FUNCTION:\n drawPathFunctionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, logService, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH:\n drawPathDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH_NEGATIVE:\n drawPathNegativeDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, backgroundColor);\n break;\n case CustomGlyphDefinitionType.VECTOR_SHAPE:\n drawVectorShape(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, fontSize, devicePixelRatio, logService);\n break;\n case CustomGlyphDefinitionType.BRAILLE:\n drawBrailleCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n }\n\n if (part.clipPath) {\n ctx.restore();\n }\n}\n\nfunction drawBlockVectorChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphSolidOctantBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\n/**\n * Braille dot positions in octant coordinates (x, y for center of each dot area)\n * Columns: left=1-2, right=5-6 (leaving 0 and 7 as margins, 3-4 as gap)\n * Rows: 0-1, 2-3, 4-5, 6-7 for the 4 rows\n */\nconst brailleDotPositions = new Uint8Array([\n 1, 0, // dot 1 - bit 0\n 1, 2, // dot 2 - bit 1\n 1, 4, // dot 3 - bit 2\n 5, 0, // dot 4 - bit 3\n 5, 2, // dot 5 - bit 4\n 5, 4, // dot 6 - bit 5\n 1, 6, // dot 7 - bit 6\n 5, 6, // dot 8 - bit 7\n]);\n\n/**\n * Draws a braille pattern\n */\nfunction drawBrailleCharacter(\n ctx: CanvasRenderingContext2D,\n pattern: number,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n const xEighth = deviceCellWidth / 8;\n const paddingY = deviceCellHeight * 0.1;\n const usableHeight = deviceCellHeight * 0.8;\n const yEighth = usableHeight / 8;\n const radius = Math.min(xEighth, yEighth);\n\n for (let bit = 0; bit < 8; bit++) {\n if (pattern & (1 << bit)) {\n const x = brailleDotPositions[bit * 2];\n const y = brailleDotPositions[bit * 2 + 1];\n const cx = xOffset + (x + 1) * xEighth;\n const cy = yOffset + paddingY + (y + 1) * yEighth;\n ctx.beginPath();\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n}\n\nfunction drawPathDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: CustomGlyphPathDrawFunctionDefinition | string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n strokeWidth?: number\n): void {\n const instructions = typeof charDefinition === 'string' ? charDefinition : charDefinition(0, 0);\n ctx.beginPath();\n let currentX = 0;\n let currentY = 0;\n let lastControlX = 0;\n let lastControlY = 0;\n let lastCommand = '';\n for (const instruction of instructions.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (type === 'Z') {\n ctx.closePath();\n lastCommand = type;\n continue;\n }\n if (type === 'V') {\n const y = yOffset + parseFloat(args[0]) * deviceCellHeight;\n ctx.lineTo(currentX, y);\n currentY = y;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (type === 'H') {\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n ctx.lineTo(x, currentY);\n currentX = x;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (!args[0] || !args[1]) {\n continue;\n }\n if (type === 'A') {\n // SVG arc: A rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y\n const rx = parseFloat(args[0]) * deviceCellWidth;\n const ry = parseFloat(args[1]) * deviceCellHeight;\n const xAxisRotation = parseFloat(args[2]) * Math.PI / 180;\n const largeArcFlag = parseInt(args[3], 10);\n const sweepFlag = parseInt(args[4], 10);\n const x = xOffset + parseFloat(args[5]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[6]) * deviceCellHeight;\n drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);\n currentX = x;\n currentY = y;\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'Q') {\n ctx.quadraticCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3]);\n lastControlX = translatedArgs[0];\n lastControlY = translatedArgs[1];\n currentX = translatedArgs[2];\n currentY = translatedArgs[3];\n } else if (type === 'T') {\n // T uses reflection of last control point if previous command was Q or T\n let cpX: number;\n let cpY: number;\n if (lastCommand === 'Q' || lastCommand === 'T') {\n cpX = 2 * currentX - lastControlX;\n cpY = 2 * currentY - lastControlY;\n } else {\n cpX = currentX;\n cpY = currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, translatedArgs[0], translatedArgs[1]);\n lastControlX = cpX;\n lastControlY = cpY;\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n } else if (type === 'C') {\n ctx.bezierCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3], translatedArgs[4], translatedArgs[5]);\n lastControlX = translatedArgs[2];\n lastControlY = translatedArgs[3];\n currentX = translatedArgs[4];\n currentY = translatedArgs[5];\n }\n lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n}\n\n/**\n * Converts SVG arc parameters to canvas arc/ellipse calls.\n * Based on the SVG spec's endpoint to center parameterization conversion.\n */\nfunction drawSvgArc(\n ctx: CanvasRenderingContext2D,\n x1: number, y1: number,\n rx: number, ry: number,\n phi: number,\n largeArcFlag: number,\n sweepFlag: number,\n x2: number, y2: number\n): void {\n // Handle degenerate cases\n if (rx === 0 || ry === 0) {\n ctx.lineTo(x2, y2);\n return;\n }\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: Compute (x1', y1')\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Step 2: Compute (cx', cy')\n let rxSq = rx * rx;\n let rySq = ry * ry;\n const x1pSq = x1p * x1p;\n const y1pSq = y1p * y1p;\n\n // Correct radii if necessary\n const lambda = x1pSq / rxSq + y1pSq / rySq;\n if (lambda > 1) {\n const lambdaSqrt = Math.sqrt(lambda);\n rx *= lambdaSqrt;\n ry *= lambdaSqrt;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);\n if (sq < 0) sq = 0;\n const coef = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(sq);\n const cxp = coef * (rx * y1p / ry);\n const cyp = coef * -(ry * x1p / rx);\n\n // Step 3: Compute (cx, cy) from (cx', cy')\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: Compute angles\n const ux = (x1p - cxp) / rx;\n const uy = (y1p - cyp) / ry;\n const vx = (-x1p - cxp) / rx;\n const vy = (-y1p - cyp) / ry;\n\n const startAngle = Math.atan2(uy, ux);\n let dTheta = Math.atan2(vy, vx) - startAngle;\n\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta -= 2 * Math.PI;\n } else if (sweepFlag === 1 && dTheta < 0) {\n dTheta += 2 * Math.PI;\n }\n\n const endAngle = startAngle + dTheta;\n\n ctx.ellipse(cx, cy, rx, ry, phi, startAngle, endAngle, sweepFlag === 0);\n}\n\n/**\n * Draws a \"negative\" path where the background color is used to draw the shape on top of a\n * foreground-filled cell. This creates the appearance of a cutout without using actual\n * transparency, which allows SPAA (subpixel anti-aliasing) to work correctly.\n *\n * @param ctx The canvas rendering context (fillStyle should be set to foreground color)\n * @param charDefinition The vector shape definition for the negative shape\n * @param xOffset The x offset to draw at\n * @param yOffset The y offset to draw at\n * @param deviceCellWidth The width of the cell in device pixels\n * @param deviceCellHeight The height of the cell in device pixels\n * @param devicePixelRatio The device pixel ratio\n * @param backgroundColor The background color to use for the \"cutout\" portion\n */\nfunction drawPathNegativeDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n backgroundColor?: string\n): void {\n ctx.save();\n\n // First, fill the entire cell with foreground color\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n\n // Then draw the \"negative\" shape with the background color\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.strokeStyle = backgroundColor;\n }\n\n ctx.lineWidth = devicePixelRatio;\n ctx.lineCap = 'square';\n ctx.beginPath();\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n if (type === 'Z') {\n ctx.closePath();\n }\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n }\n }\n\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.stroke();\n } else {\n ctx.fill();\n }\n\n ctx.restore();\n}\n\nconst cachedPatterns: Map> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n variantOffset: number = 0\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n // The atlas canvas can be adopted into another document, so temporary resources must not use\n // its mutable ownerDocument.\n const tmpCanvas = createPatternCanvas(width, height);\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n // Apply pattern offset to ensure seamless tiling across cells when cell dimensions are odd.\n // variantOffset encodes: bit 1 = x pixel shift, bit 0 = y pixel shift.\n const dx = (variantOffset >> 1) & 1;\n const dy = variantOffset & 1;\n if (dx !== 0 || dy !== 0) {\n pattern.setTransform(new DOMMatrix().translateSelf(-dx, -dy));\n } else {\n pattern.setTransform(new DOMMatrix());\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\nfunction drawPathFunctionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: string | ((xp: number, yp: number) => string),\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n logService: ILogService,\n strokeWidth?: number\n): void {\n ctx.save();\n ctx.beginPath();\n ctx.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip();\n\n ctx.beginPath();\n let actualInstructions: string;\n if (typeof charDefinition === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = charDefinition(xp, yp);\n } else {\n actualInstructions = charDefinition;\n }\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio, 0, 0, false), state);\n state.lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n ctx.restore();\n}\n\n/**\n * Applies a clip path to the canvas context from SVG-like path instructions.\n */\nfunction applyClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n ctx.beginPath();\n for (const instruction of clipPath.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[1]) * deviceCellHeight;\n if (type === 'M') {\n ctx.moveTo(x, y);\n } else if (type === 'L') {\n ctx.lineTo(x, y);\n }\n }\n ctx.clip();\n}\n\nfunction drawVectorShape(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ), state);\n state.lastCommand = type;\n }\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\ninterface ISvgPathState {\n currentX: number;\n currentY: number;\n lastControlX: number;\n lastControlY: number;\n lastCommand: string;\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: (ctx: CanvasRenderingContext2D, args: number[], state: ISvgPathState) => void } = {\n 'C': (ctx, args, state) => {\n ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]);\n state.lastControlX = args[2];\n state.lastControlY = args[3];\n state.currentX = args[4];\n state.currentY = args[5];\n },\n 'L': (ctx, args, state) => {\n ctx.lineTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'M': (ctx, args, state) => {\n ctx.moveTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'Q': (ctx, args, state) => {\n ctx.quadraticCurveTo(args[0], args[1], args[2], args[3]);\n state.lastControlX = args[0];\n state.lastControlY = args[1];\n state.currentX = args[2];\n state.currentY = args[3];\n },\n 'T': (ctx, args, state) => {\n let cpX: number;\n let cpY: number;\n if (state.lastCommand === 'Q' || state.lastCommand === 'T') {\n cpX = 2 * state.currentX - state.lastControlX;\n cpY = 2 * state.currentY - state.lastControlY;\n } else {\n cpX = state.currentX;\n cpY = state.currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, args[0], args[1]);\n state.lastControlX = cpX;\n state.lastControlY = cpY;\n state.currentX = args[0];\n state.currentY = args[1];\n }\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0, clampToCell: boolean = true): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[x] !== 0) {\n const rounded = Math.round(result[x] + 0.5) - 0.5;\n result[x] = clampToCell ? clamp(rounded, cellWidth, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[y] !== 0) {\n const rounded = Math.round(result[y] + 0.5) - 0.5;\n result[y] = clampToCell ? clamp(rounded, cellHeight, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from './Constants';\nimport { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { ILogService, IUnicodeService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n private _overflowSizePage: AtlasPage | undefined;\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transferred to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new Emitter();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new Emitter();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService,\n private readonly _logService: ILogService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n this._tmpCanvas.remove();\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n this._onRemoveTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue(this._logService);\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, false, undefined);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _pageLayoutVersion = 0;\n public get pageLayoutVersion(): number { return this._pageLayoutVersion; }\n\n public clearTexture(): void {\n if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n return;\n }\n for (const page of this._pages) {\n page.clear();\n }\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n\n // Invalidate renderer models so all texture pages are refreshed. The atlas may be shared, in\n // which case the clearing renderer has cleared only its own model and every other owner still\n // holds texture coords into the rows just wiped.\n this._pageLayoutVersion++;\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n\n // Only proceed with merge if we have exactly 4 same-sized pages. If not, we cannot\n // effectively reduce page count and merging would cause issues.\n if (mergingPages.length < 4 || mergingPages.some(p => p.canvas.width !== mergingPages[0].canvas.width)) {\n // Evict instead of adding a page beyond the renderer's texture capacity.\n this._evictAllPages();\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version = ++AtlasPage.nextVersion;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version = ++AtlasPage.nextVersion;\n }\n }\n\n private _evictAllPages(): void {\n const startTime = performance.now();\n const pageCount = this._pages.length;\n for (const page of this._pages) {\n this._onRemoveTextureAtlasCanvas.fire(page.canvas);\n page.canvas.remove();\n }\n this._pages.length = 0;\n this._activePages.length = 0;\n this._overflowSizePage = undefined;\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n this._pageLayoutVersion++;\n this._logService.debug(`Evicted ${pageCount} WebGL atlas pages in ${(performance.now() - startTime).toFixed(2)}ms`);\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean,\n domContainer: HTMLElement | undefined\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight, domContainer);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n // Ignore alpha channel when allowTransparency is false\n if (!this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor ?? undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Attach the canvas to the DOM in order to inherit font-feature-settings\n // from the parent elements. This is necessary for ligatures and variants to\n // work.\n if (domContainer && this._tmpCanvas.parentElement !== domContainer) {\n this._tmpCanvas.style.display = 'none';\n domContainer.append(this._tmpCanvas);\n }\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._config.deviceMaxTextureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n const variantOffset = this._workAttributeData.getUnderlineVariantOffset();\n customGlyph = tryDrawCustomGlyph(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.deviceCharWidth, this._config.deviceCharHeight, this._config.fontSize, this._config.devicePixelRatio, this._logService, backgroundColor.css, variantOffset);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n this._tmpCtx.fillStyle = this._tmpCtx.strokeStyle;\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTopDefault = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yBotDefault = yTopDefault + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n let yTop = 0;\n let yBot = 0;\n\n for (let i = 0; i < chWidth; i++) {\n let wasFilled = false;\n this._tmpCtx.save();\n yTop = yTopDefault;\n yBot = yBotDefault;\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n this._tmpCtx.moveTo(xChLeft, yBotDefault);\n this._tmpCtx.lineTo(xChRight, yBotDefault);\n break;\n case UnderlineStyle.CURLY:\n yTop = this._config.deviceCharHeight + 1;\n yBot = yTop + 3 * this._config.devicePixelRatio;\n\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n\n // Draw a zigzag pattern, this is derived from the SVG used in monaco for the same\n // style. The viewbox is 6x3 so scale it using that.\n const cellW = this._config.deviceCellWidth;\n const curlyH = (yBot - yTop);\n const scaleX = cellW / 6;\n const scaleY = curlyH / 3;\n\n const polygons: number[][] = [\n [0, 2, 1, 3, 2.4, 3, 0, 0.6],\n [5.5, 0, 2.5, 3, 1.1, 3, 4.1, 0],\n [4, 0, 6, 2, 6, 0.6, 5.4, 0],\n ];\n\n for (const polygon of polygons) {\n this._tmpCtx.beginPath();\n for (let i = 0; i < polygon.length; i += 2) {\n const x = xChLeft + polygon[i] * scaleX;\n const y = yBot - polygon[i + 1] * scaleY;\n if (i === 0) {\n this._tmpCtx.moveTo(x, y);\n } else {\n this._tmpCtx.lineTo(x, y);\n }\n }\n this._tmpCtx.closePath();\n this._tmpCtx.fill();\n }\n wasFilled = true;\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n }\n if (!wasFilled) {\n this._tmpCtx.stroke();\n }\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page for oversized glyphs as they come up\n if (rasterizedGlyph.size.x > this._textureSize) {\n if (!this._overflowSizePage) {\n // Make room for the oversized page without exceeding texture capacity.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) {\n this._evictAllPages();\n }\n this._overflowSizePage = new AtlasPage(this._document, this._config.deviceMaxTextureSize);\n this.pages.push(this._overflowSizePage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas);\n }\n activePage = this._overflowSizePage;\n activeRow = this._overflowSizePage.currentRow;\n // Move to next row if necessary\n if (activeRow.x + rasterizedGlyph.size.x >= activePage.canvas.width) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n }\n break;\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version = ++AtlasPage.nextVersion;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Monotonically increasing across all atlas pages globally. Used to detect when the texture\n * unit at a given index needs to be re-uploaded \u2014 both for content changes within the same\n * page and for a page object swap at the same index (which happens after a page merge,\n * where a per-page counter could coincide with the previously-bound page's value).\n */\n public static nextVersion: number = 0;\n public version = ++AtlasPage.nextVersion;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n if (sourcePages) {\n if (sourcePages.length === 4) {\n // optimized for quadmerge\n this._glyphs = this._glyphs.concat(\n sourcePages[0].glyphs,\n sourcePages[1].glyphs,\n sourcePages[2].glyphs,\n sourcePages[3].glyphs\n );\n this._usedPixels = sourcePages[0]._usedPixels +\n sourcePages[1]._usedPixels +\n sourcePages[2]._usedPixels +\n sourcePages[3]._usedPixels;\n } else {\n // fallback for non quadmerges (should never be used)\n for (let i = 0; i < sourcePages.length; ++i) {\n this._glyphs = this._glyphs.concat(sourcePages[i].glyphs);\n this._usedPixels += sourcePages[i]._usedPixels;\n }\n\n }\n }\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version = ++AtlasPage.nextVersion;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevant pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required, colors: ReadonlyColorSet, devicePixelRatio: number, deviceMaxTextureSize: number, customGlyphs: boolean = true): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs,\n devicePixelRatio,\n deviceMaxTextureSize,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.deviceMaxTextureSize === b.deviceMaxTextureSize &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCellWidth === b.deviceCellWidth &&\n a.deviceCellHeight === b.deviceCellHeight &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from './TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from './Types';\nimport { generateConfig, configEquals } from './CharAtlasUtils';\nimport type { ILogService } from 'common/services/Services';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number,\n deviceMaxTextureSize: number,\n customGlyphs: boolean = true\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio, deviceMaxTextureSize, customGlyphs);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const logService = (core as any)._logService as ILogService;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService, logService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RendererConstants } from 'browser/renderer/shared/Constants';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\nconst enum Constants {\n /**\n * The time between cursor blinks.\n */\n BLINK_INTERVAL = 600,\n}\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n this._resetIdleTimer();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._resetIdleTimer();\n }\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = Constants.BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, Constants.BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n this._isIdlePaused = false;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this._resetIdleTimer();\n this.restartBlinkAnimation();\n }\n\n /**\n * Resets the idle timer. If the terminal is idle for the idle timeout period,\n * the cursor blinking will stop.\n */\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n }\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n /**\n * Stops cursor blinking due to idle timeout.\n */\n private _stopBlinkingDueToIdle(): void {\n // Make cursor visible and stop blinking\n this.isCursorVisible = true;\n this._isIdlePaused = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n // Clear the idle timeout as we've already acted on it\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n // Trigger a render to show the cursor in its final visible state\n this._renderCallback();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable, IDisposable } from 'common/Lifecycle';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string, logService: ILogService): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource, logService)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource, logService)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n logService.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string, logService: ILogService): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n logService.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { TextureAtlas } from './TextureAtlas';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { ILogService, IOptionsService } from 'common/services/Services';\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals}\n}`);\n}\n\nconst enum Constants {\n INDICES_PER_CELL = 11,\n BYTES_PER_CELL = INDICES_PER_CELL * 4/* Float32Array.BYTES_PER_ELEMENT */,\n CELL_POSITION_INDICES = 2\n}\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _lastSeenPageLayoutVersion: number = -1;\n private _pageOverflowWarned: boolean = false;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages), this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, Constants.BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this._register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n /**\n * Call when a frame is being drawn. Returns whether the full model must be rebuilt before\n * rendering this frame because the atlas page layout changed since this renderer last drew.\n */\n public beginFrame(): boolean {\n if (!this._atlas) {\n return true;\n }\n if (this._atlas.pageLayoutVersion !== this._lastSeenPageLayoutVersion) {\n this._lastSeenPageLayoutVersion = this._atlas.pageLayoutVersion;\n return true;\n }\n return false;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a one-off for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * Constants.INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + Constants.INDICES_PER_CELL - 1 - Constants.CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false, this._terminal.element);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false, this._terminal.element);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * Constants.INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += Constants.INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n gl.uniform2f(this._resolutionLocation, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * Constants.INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * Constants.INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed. AtlasPage.version is globally\n // monotonic, so a page object swap at the same index (which happens after a page merge)\n // is detected by the same comparison.\n // Clamp defensively in case the atlas unexpectedly exceeds texture capacity.\n const pageCount = Math.min(this._atlas.pages.length, this._atlasTextures.length);\n if (this._atlas.pages.length > this._atlasTextures.length && !this._pageOverflowWarned) {\n this._pageOverflowWarned = true;\n this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`);\n }\n for (let i = 0; i < pageCount; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / Constants.INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n this._lastSeenPageLayoutVersion = -1;\n this.invalidateAtlasTextures();\n }\n\n public invalidateAtlasTextures(): void {\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const enum RenderModelConstants {\n INDICIES_PER_CELL = 4,\n BG_OFFSET = 1,\n FG_OFFSET = 2,\n EXT_OFFSET = 3\n}\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RenderModelConstants.INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RenderModelConstants } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource, this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this._register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RenderModelConstants.BG_OFFSET];\n fg = model.cells[modelIndex + RenderModelConstants.FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + INDICES_PER_RECTANGLE) {\n // +1 for the viewport-clear rectangle at offset 0.\n vertices.attributes = expandFloat32Array(vertices.attributes, (this._terminal.rows * this._terminal.cols + 1) * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from '../CharAtlasCache';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TEXT_BASELINE } from '../Constants';\nimport type { ITextureAtlas } from '../Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this._register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this._register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr, 2048);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from '../CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this._register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this._register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from './CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from './CharAtlasCache';\nimport { CursorBlinkStateManager } from './CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from './DevicePixelObserver';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { CharData, IBufferLine, ICellData } from 'common/buffer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RenderModel, RenderModelConstants } from './RenderModel';\nimport { IWebGL2RenderingContext, type ITextureAtlas } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\n\nconst enum Constants {\n MERGE_RETRY_LIMIT = 32\n}\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable = this._register(new MutableDisposable());\n private _textBlinkStateManager: TextBlinkStateManager;\n private _charAtlasDisposable = this._register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _deviceMaxTextureSize: number;\n private _observerDisposable = this._register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n private _workCell: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable = this._register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable = this._register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n private readonly _customGlyphs: boolean = true,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n // IMPORTANT: Canvas initialization and fetching of the context must be first in order to\n // prevent possible listeners leaking and continuing to operate after the WebglRenderer has been\n // discarded.\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this._register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this._register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._requestRedrawViewport(),\n this._coreBrowserService,\n this._optionsService\n ));\n this._resetBlinkingRowState();\n\n this._deviceMaxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE);\n\n this._register(addDisposableListener(this._canvas, 'webglcontextlost', (e) => {\n this._logService.debug('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n this._logService.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this._register(addDisposableListener(this._canvas, 'webglcontextrestored', (e) => {\n this._logService.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this._register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._register(addDisposableListener(this._coreBrowserService.mainDocument, 'mousedown', () => this._cursorBlinkStateManager.value?.restartBlinkAnimation()));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._core.screenElement!.isConnected;\n\n this._register(toDisposable(() => {\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n this._resetBlinkingRowState();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService, this._logService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService, this._logService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr,\n this._deviceMaxTextureSize,\n this._customGlyphs\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = combinedDisposable(\n EventUtils.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n EventUtils.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n );\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._resetBlinkingRowState();\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._core.screenElement?.isConnected && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // A mid-update atlas page merge invalidates vertex data and may not bump the host\n // page's version, so re-run the update and force a full texture rebind.\n let merged = false;\n let mergeRetries = 0;\n while (this._charAtlas && this._glyphRenderer.value.beginFrame() && mergeRetries++ < Constants.MERGE_RETRY_LIMIT) {\n merged = true;\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n }\n if (merged) {\n this._glyphRenderer.value.invalidateAtlasTextures();\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._coreService.decPrivateModes.cursorBlink ?? this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let skipJoinedCheckUntilX: number;\n let isValidJoinRange: boolean;\n let lastCharX: number;\n let range: [number, number];\n let isCursorRow: boolean;\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? terminal.options.cursorStyle ?? 'block';\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n const bufferLine = terminal.buffer.lines.get(row);\n if (!bufferLine) {\n this._model.lineLengths[y] = 0;\n for (x = 0; x < terminal.cols; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n modelUpdated = true;\n this._nullModelCell(x, y, j, 0, 0, 0);\n }\n this._setRowBlinkState(y, false);\n continue;\n }\n line = bufferLine;\n let rowHasBlinkingCells = false;\n this._model.lineLengths[y] = 0;\n isCursorRow = cursorY === row;\n skipJoinedCheckUntilX = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n range = joinedRanges.shift()!;\n\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._model.selection.isCellSelected(this._terminal, range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._model.selection.isCellSelected(this._terminal, i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n\n if (!rowHasBlinkingCells && cell.isBlink()) {\n rowHasBlinkingCells = true;\n }\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width, this.dimensions.device.cell.height);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ? cursorStyle : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n cursorStyle === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))\n ) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (this._textBlinkStateManager.isEnabled && !this._textBlinkStateManager.isBlinkOn && cell.isBlink()) {\n this._cellColorResolver.result.fg |= FgFlags.INVISIBLE;\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RenderModelConstants.BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RenderModelConstants.FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RenderModelConstants.BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RenderModelConstants.FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x <= lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n // Don't re-resolve the cell color since multi-colored ligature backgrounds are not\n // supported\n this._nullModelCell(x, y, j, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext);\n }\n x--; // Go back to the previous update cell for next iteration\n }\n }\n this._setRowBlinkState(y, rowHasBlinkingCells);\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n this._updateTextBlinkState();\n }\n\n private _nullModelCell(x: number, y: number, cellIndex: number, bg: number, fg: number, ext: number): void {\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, bg, fg, ext, NULL_CELL_CHAR, 0, 0);\n this._model.cells[cellIndex] = NULL_CELL_CODE;\n this._model.cells[cellIndex + RenderModelConstants.BG_OFFSET] = bg;\n this._model.cells[cellIndex + RenderModelConstants.FG_OFFSET] = fg;\n this._model.cells[cellIndex + RenderModelConstants.EXT_OFFSET] = ext;\n }\n\n private _resetBlinkingRowState(): void {\n this._rowHasBlinkingCells = new Array(this._terminal.rows).fill(false);\n this._rowHasBlinkingCellsCount = 0;\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may cause blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IWebglAddonOptions, WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { Emitter, EventUtils } from 'common/Event';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon, IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n private readonly _customGlyphs: boolean;\n private readonly _preserveDrawingBuffer?: boolean;\n\n constructor(options?: IWebglAddonOptions) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('WebGL2 is only supported on Safari 16 and above');\n }\n }\n super();\n this._customGlyphs = options?.customGlyphs ?? true;\n this._preserveDrawingBuffer = options?.preserveDrawingBuffer;\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this._register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n this._renderer = this._register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n logService,\n optionsService,\n themeService,\n this._customGlyphs,\n this._preserveDrawingBuffer\n ));\n this._register(EventUtils.forward(this._renderer.onContextLoss, this._onContextLoss));\n this._register(EventUtils.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this._register(EventUtils.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this._register(EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this._register(toDisposable(() => {\n if ((this._terminal as any)._core._store._isDisposed) {\n return;\n }\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"], +- "mappings": "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", +- "names": ["toDisposable", "fn", "dispose", "arg", "d", "combinedDisposable", "disposables", "DisposableStore", "o", "Disposable", "MutableDisposable", "value", "isNode", "userAgent", "platform", "isFirefox", "isChrome", "isLegacyEdge", "isSafari", "getSafariVersion", "isSafari", "majorVersion", "userAgent", "isMac", "platform", "isWindows", "isLinux", "isChromeOS", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isRestrictedPowerlineGlyph", "isNerdFontGlyph", "isBoxOrBlockGlyph", "isEmoji", "allowRescaling", "width", "glyphSizeX", "deviceCellWidth", "treatGlyphAsBackgroundColor", "createRenderDimensions", "createDimension", "computeNextVariantOffset", "cellWidth", "lineWidth", "currentOffset", "GitBranchSymbolsParts", "xp", "yp", "customGlyphDefinitions", "sextant", "segmentedDigit", "_", "i", "blockPatternCodepoints", "pattern", "rects", "rowH", "rowY", "row", "leftBit", "rightBit", "paths", "x1", "x2", "x3", "y1", "y2", "$fg", "$bg", "$hasFg", "$hasBg", "$isSelected", "$colors", "$variantOffset", "CellColorResolver", "_terminal", "_optionService", "_selectionRenderModel", "_decorationService", "_coreBrowserService", "_themeService", "cell", "x", "y", "deviceCellWidth", "deviceCellHeight", "code", "lineWidth", "blockPatternCodepoints", "d", "rgba", "treatGlyphAsBackgroundColor", "DIM_OPACITY", "TEXT_BASELINE", "isFirefox", "isLegacyEdge", "createOffscreenPatternCanvas", "width", "height", "createDomPatternCanvas", "canvas", "createPatternCanvas", "offscreenCanvasFactory", "domCanvasFactory", "tryDrawCustomGlyph", "ctx", "c", "xOffset", "yOffset", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "fontSize", "devicePixelRatio", "logService", "backgroundColor", "variantOffset", "unifiedCharDefinition", "customGlyphDefinitions", "parts", "part", "drawDefinitionPart", "drawWidth", "drawHeight", "drawXOffset", "drawYOffset", "applyClipPath", "drawBlockVectorChar", "drawPatternChar", "drawPathFunctionCharacter", "drawPathDefinitionCharacter", "drawPathNegativeDefinitionCharacter", "drawVectorShape", "drawBrailleCharacter", "charDefinition", "i", "box", "xEighth", "yEighth", "brailleDotPositions", "pattern", "paddingY", "radius", "bit", "x", "y", "cx", "cy", "strokeWidth", "instructions", "currentX", "currentY", "lastControlX", "lastControlY", "lastCommand", "instruction", "type", "args", "rx", "ry", "xAxisRotation", "largeArcFlag", "sweepFlag", "drawSvgArc", "translatedArgs", "e", "val", "cpX", "cpY", "x1", "y1", "phi", "x2", "y2", "cosPhi", "sinPhi", "dx", "dy", "x1p", "y1p", "rxSq", "rySq", "x1pSq", "y1pSq", "lambda", "lambdaSqrt", "sq", "coef", "cxp", "cyp", "ux", "uy", "vx", "vy", "startAngle", "dTheta", "endAngle", "cachedPatterns", "patternSet", "fillStyle", "tmpCanvas", "tmpCtx", "throwIfFalsy", "imageData", "r", "g", "b", "a", "actualInstructions", "yp", "state", "f", "svgToCanvasInstructionMap", "translateArgs", "clipPath", "clipRegion", "cssLineWidth", "clamp", "value", "max", "min", "cellWidth", "cellHeight", "doClamp", "leftPadding", "rightPadding", "clampToCell", "result", "rounded", "TwoKeyMap", "first", "second", "value", "FourKeyMap", "third", "fourth", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "i", "len", "EventUtils", "forward", "from", "to", "e", "map", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "NULL_RASTERIZED_GLYPH", "TMP_CANVAS_GLYPH_PADDING", "$glyph", "TextureAtlas", "_TextureAtlas", "_document", "_config", "_unicodeService", "_logService", "FourKeyMap", "AttributeData", "Emitter", "createCanvas", "TMP_CANVAS_GLYPH_PADDING", "throwIfFalsy", "page", "queue", "IdleTaskQueue", "i", "rasterizedGlyph", "pagesBySize", "e", "a", "b", "sameSizeI", "size", "mergingPages", "p", "newPage", "AtlasPage", "sortedMergingPagesIndexes", "mergedPageIndex", "mergedPage", "mergedSize", "xOffset", "yOffset", "g", "index", "pageIndex", "j", "adjustingPage", "startTime", "pageCount", "chars", "bg", "fg", "ext", "restrictToCellHeight", "domContainer", "code", "cacheMap", "key", "idx", "bgColorMode", "bgColor", "inverse", "dim", "NULL_COLOR", "result", "arr", "channels", "color", "fgColorMode", "fgColor", "bold", "excludeFromContrastRatioDemands", "minimumContrastColor", "DIM_OPACITY", "cache", "adjustedColor", "bgRgba", "fgRgba", "rgba", "codeOrChars", "allowedWidth", "allowedHeight", "NULL_RASTERIZED_GLYPH", "italic", "underline", "strikethrough", "overline", "temp", "temp2", "backgroundColor", "fontWeight", "fontStyle", "TEXT_BASELINE", "powerlineGlyph", "isPowerlineGlyph", "restrictedPowerlineGlyph", "isRestrictedPowerlineGlyph", "foregroundColor", "treatGlyphAsBackgroundColor", "padding", "customGlyph", "variantOffset", "tryDrawCustomGlyph", "enableClearThresholdCheck", "chWidth", "lineWidth", "xLeft", "yTopDefault", "yBotDefault", "nextOffset", "yTop", "yBot", "wasFilled", "xChLeft", "xChRight", "clipRegion", "cellW", "curlyH", "scaleX", "scaleY", "polygons", "polygon", "x", "y", "offsetWidth", "computeNextVariantOffset", "lineRatio", "gapRatio", "xChWidth", "line", "gap", "end", "metrics", "isBeyondCellBounds", "clearColor", "offset", "imageData", "isEmpty", "checkCompletelyTransparent", "activePage", "activeRow", "row", "wasPageAndRowFound", "candidatePage", "boundingBox", "restrictedGlyph", "height", "width", "found", "alphaOffset", "_AtlasPage", "document", "sourcePages", "glyph", "enableThresholdCheck", "r", "fgR", "fgG", "fgB", "threshold", "canvas", "generateConfig", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "options", "colors", "devicePixelRatio", "deviceMaxTextureSize", "customGlyphs", "clonedColors", "NULL_COLOR", "configEquals", "a", "b", "i", "is256Color", "colorCode", "charAtlasCache", "acquireTextureAtlas", "terminal", "options", "colors", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "devicePixelRatio", "deviceMaxTextureSize", "customGlyphs", "newConfig", "generateConfig", "i", "entry", "ownedByIndex", "configEquals", "core", "logService", "newEntry", "TextureAtlas", "removeTerminalFromCache", "index", "CursorBlinkStateManager", "_renderCallback", "_coreBrowserService", "timeToStart", "time", "observeDevicePixelDimensions", "element", "parentWindow", "callback", "observer", "entries", "entry", "width", "height", "toDisposable", "stringFromCodePoint", "codePoint", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "PROJECTION_MATRIX", "createProgram", "gl", "vertexSource", "fragmentSource", "logService", "program", "throwIfFalsy", "createShader", "type", "source", "shader", "expandFloat32Array", "max", "newLength", "newArray", "i", "GLTexture", "texture", "vertexShaderSource", "createFragmentShaderSource", "maxFragmentShaderTextureUnits", "textureConditionals", "i", "$i", "$glyph", "$leftCellPadding", "$clippedPixels", "GlyphRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_optionsService", "_logService", "gl", "TextureAtlas", "throwIfFalsy", "createProgram", "vertexShaderSource", "createFragmentShaderSource", "toDisposable", "vertexArrayObject", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "textureUnits", "i", "PROJECTION_MATRIX", "glTexture", "GLTexture", "x", "y", "code", "bg", "fg", "ext", "chars", "width", "lastBg", "array", "allowRescaling", "terminal", "newCount", "renderModel", "activeBuffer", "bufferLength", "si", "sub", "pageCount", "atlas", "dimensions", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "COMBINED_CHAR_BIT_MASK", "RenderModel", "createSelectionRenderModel", "cols", "rows", "indexCount", "vertexShaderSource", "fragmentShaderSource", "INDICES_PER_RECTANGLE", "BYTES_PER_RECTANGLE", "INITIAL_BUFFER_RECTANGLE_CAPACITY", "Vertices", "$rgba", "$x1", "$y1", "$r", "$g", "$b", "$a", "RectangleRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_themeService", "_logService", "gl", "throwIfFalsy", "createProgram", "toDisposable", "vertexArrayObject", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "e", "vertices", "PROJECTION_MATRIX", "dimensions", "colors", "model", "terminal", "rectangleCount", "y", "x", "currentStartX", "currentBg", "currentFg", "currentInverse", "modelIndex", "bg", "fg", "inverse", "offset", "cursor", "startX", "endX", "expandFloat32Array", "array", "x1", "y1", "width", "height", "r", "g", "b", "a", "color", "BaseRenderLayer", "Disposable", "terminal", "_container", "id", "zIndex", "_alpha", "_coreBrowserService", "_optionsService", "_themeService", "e", "toDisposable", "throwIfFalsy", "startRow", "endRow", "start", "end", "columnSelectMode", "alpha", "oldCanvas", "colorSet", "acquireTextureAtlas", "dim", "x", "y", "width", "height", "cell", "TEXT_BASELINE", "isBold", "isItalic", "fontWeight", "LinkRenderLayer", "BaseRenderLayer", "container", "zIndex", "terminal", "linkifier2", "coreBrowserService", "optionsService", "themeService", "e", "dim", "middleRowCount", "is256Color", "y", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "WebglRenderer", "Disposable", "_terminal", "_characterJoinerService", "_charSizeService", "_coreBrowserService", "_coreService", "_decorationService", "_logService", "_optionsService", "_themeService", "_customGlyphs", "preserveDrawingBuffer", "MutableDisposable", "RenderModel", "CellData", "Emitter", "contextAttributes", "CellColorResolver", "LinkRenderLayer", "createRenderDimensions", "TextBlinkStateManager", "addDisposableListener", "e", "removeTerminalFromCache", "observeDevicePixelDimensions", "w", "h", "toDisposable", "l", "cols", "rows", "isVisible", "start", "end", "columnSelectMode", "RectangleRenderer", "GlyphRenderer", "atlas", "acquireTextureAtlas", "combinedDisposable", "EventUtils", "clearGlyphRenderer", "merged", "mergeRetries", "CursorBlinkStateManager", "terminal", "cell", "lastBg", "y", "row", "line", "joinedRanges", "isJoined", "skipJoinedCheckUntilX", "isValidJoinRange", "lastCharX", "range", "isCursorRow", "chars", "code", "width", "i", "x", "j", "clamp", "cursorStyle", "cursorY", "viewportRelativeCursorY", "cursorX", "lastCursorX", "isCursorVisible", "modelUpdated", "bufferLine", "rowHasBlinkingCells", "firstSelectionState", "JoinedCellData", "COMBINED_CHAR_BIT_MASK", "cellIndex", "bg", "fg", "ext", "hasBlinkingCells", "height", "AttributeData", "firstCell", "value", "max", "min", "WebglAddon", "Disposable", "options", "isSafari", "getSafariVersion", "contextAttributes", "Emitter", "terminal", "core", "coreService", "optionsService", "unsafeCore", "renderService", "characterJoinerService", "charSizeService", "coreBrowserService", "decorationService", "logService", "themeService", "WebglRenderer", "EventUtils", "toDisposable"] ++ "sourcesContent": ["/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types';\n\n/* oxlint-disable @stylistic/max-len -- generated glyph path data */\n\nconst enum Shapes {\n /** \u2502 */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** \u2500 */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** \u2514 */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** \u2518 */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** \u2510 */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** \u250C */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** \u2575 */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** \u2574 */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** \u2576 */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** \u2577 */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** \u2534 */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** \u2524 */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** \u251C */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** \u252C */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** \u253C */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** \u254C */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** \u2504 */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** \u2509 */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** \u254E */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** \u2506 */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** \u250A */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nnamespace GitBranchSymbolsParts {\n // Lines\n export const LINE_H: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 });\n export const LINE_V: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 });\n\n // Fading lines\n export const FADE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.28,.5 M.32,.5 L.52,.5 M.60,.5 L.72,.5 M.84,.5 L.90,.5', strokeWidth: 1 });\n export const FADE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.10,.5 L.16,.5 M.28,.5 L.40,.5 M.48,.5 L.68,.5 M.72,.5 L1,.5', strokeWidth: 1 });\n export const FADE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L.5,.28 M.5,.32 L.5,.52 M.5,.60 L.5,.72 M.5,.84 L.5,.90', strokeWidth: 1 });\n export const FADE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,.10 L.5,.16 M.5,.28 L.5,.40 M.5,.48 L.5,.68 M.5,.72 L.5,1', strokeWidth: 1 });\n\n // Curved corners\n export const CURVE_DOWN_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_DOWN_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n export const CURVE_UP_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 });\n export const CURVE_UP_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp: number, yp: number) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 });\n\n // Node parts\n export const NODE_FILL: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5' });\n export const NODE_STROKE: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.85,.5 A.35,.175,0,1,1,.15,.5 A.35,.175,0,1,1,.85,.5', strokeWidth: 1 });\n export const NODE_LINE_RIGHT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M1,.5 L.85,.5', strokeWidth: 1 });\n export const NODE_LINE_LEFT: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M0,.5 L.15,.5', strokeWidth: 1 });\n export const NODE_LINE_DOWN: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,1 L.5,.7', strokeWidth: 1 });\n export const NODE_LINE_UP: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH, data: 'M.5,0 L.5,.3', strokeWidth: 1 });\n}\n\nexport const customGlyphDefinitions: { [index: string]: CustomGlyphCharacterDefinition | undefined } = {\n // #region Box Drawing (2500-257F)\n\n // https://www.unicode.org/charts/PDF/U2500.pdf\n\n // Light and heavy solid lines (2500-2503)\n '\u2500': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 },\n '\u2501': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 },\n '\u2502': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 },\n '\u2503': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 },\n\n // Light and heavy dashed lines (2504-250B)\n '\u2504': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u2505': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u2506': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 1 },\n '\u2507': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.THREE_DASHES_VERTICAL, strokeWidth: 3 },\n '\u2508': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u2509': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u250A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 1 },\n '\u250B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.FOUR_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Light and heavy line box components (250C-254B)\n '\u250C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 },\n '\u250D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u250E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u250F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 },\n '\u2510': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 },\n '\u2511': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2512': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2513': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 },\n '\u2514': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 },\n '\u2515': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u2516': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2517': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 },\n '\u2518': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 },\n '\u2519': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u251A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u251B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 },\n '\u251C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 1 },\n '\u251D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u251E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u251F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2520': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2521': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u2522': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2523': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_RIGHT, strokeWidth: 3 },\n '\u2524': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 1 },\n '\u2525': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2526': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2527': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2528': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2529': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u252A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u252B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_LEFT, strokeWidth: 3 },\n '\u252C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 1 },\n '\u252D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u252E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u252F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2530': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2531': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2532': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2533': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_BOTTOM, strokeWidth: 3 },\n '\u2534': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 1 },\n '\u2535': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u2536': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u2537': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2538': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2539': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u253A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u253B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.T_TOP, strokeWidth: 3 },\n '\u253C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 1 },\n '\u253D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u253E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u253F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 3 }],\n '\u2540': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n '\u2541': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u2542': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_BOTTOM, strokeWidth: 3 }],\n '\u2543': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 3 }],\n '\u2544': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 3 }],\n '\u2545': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2546': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TOP_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.RIGHT_TO_BOTTOM, strokeWidth: 3 }],\n '\u2547': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, strokeWidth: 3 }],\n '\u2548': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, strokeWidth: 3 }],\n '\u2549': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, strokeWidth: 3 }],\n '\u254A': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, strokeWidth: 3 }],\n '\u254B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.CROSS, strokeWidth: 3 },\n\n // Light and heavy dashed lines (254C-254F)\n '\u254C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 1 },\n '\u254D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_HORIZONTAL, strokeWidth: 3 },\n '\u254E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 1 },\n '\u254F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.TWO_DASHES_VERTICAL, strokeWidth: 3 },\n\n // Double lines (2550-2551)\n '\u2550': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2551': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n\n // Light and double line box components (2552-256C)\n '\u2552': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2553': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2554': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2555': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '\u2556': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1`, strokeWidth: 1 },\n '\u2557': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2558': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}`, strokeWidth: 1 },\n '\u2559': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '\u255A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0`, strokeWidth: 1 },\n '\u255B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}`, strokeWidth: 1 },\n '\u255C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0`, strokeWidth: 1 },\n '\u255D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u255E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u255F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5`, strokeWidth: 1 },\n '\u2560': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u2561': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}`, strokeWidth: 1 },\n '\u2562': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2563': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0`, strokeWidth: 1 },\n '\u2564': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1`, strokeWidth: 1 },\n '\u2565': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1`, strokeWidth: 1 },\n '\u2566': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1`, strokeWidth: 1 },\n '\u2567': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u2568': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0`, strokeWidth: 1 },\n '\u2569': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n '\u256A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}`, strokeWidth: 1 },\n '\u256B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1`, strokeWidth: 1 },\n '\u256C': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0`, strokeWidth: 1 },\n\n // Character cell arcs (256D-2570)\n '\u256D': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n '\u256E': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '\u256F': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5`, strokeWidth: 1 },\n '\u2570': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5`, strokeWidth: 1 },\n\n // Character cell diagonals (2571-2573)\n '\u2571': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1', strokeWidth: 1 },\n '\u2572': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,1', strokeWidth: 1 },\n '\u2573': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,1 M0,0 L1,1', strokeWidth: 1 },\n\n // Light and heavy half lines (2574-257B)\n '\u2574': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 },\n '\u2575': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 },\n '\u2576': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 },\n '\u2577': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 },\n '\u2578': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 },\n '\u2579': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 },\n '\u257A': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 },\n '\u257B': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 },\n\n // Mixed light and heavy lines (257C-257F)\n '\u257C': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 3 }],\n '\u257D': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 3 }],\n '\u257E': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_RIGHT, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_LEFT, strokeWidth: 3 }],\n '\u257F': [{ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_BOTTOM, strokeWidth: 1 }, { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.MIDDLE_TO_TOP, strokeWidth: 3 }],\n\n // #endregion\n\n // #region Block elements (2580-259F)\n\n // https://www.unicode.org/charts/PDF/U2580.pdf\n\n // Block elements (2580-2590)\n '\u2580': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }, // UPPER HALF BLOCK\n '\u2581': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 7, w: 8, h: 1 }] }, // LOWER ONE EIGHTH BLOCK\n '\u2582': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 2 }] }, // LOWER ONE QUARTER BLOCK\n '\u2583': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 3 }] }, // LOWER THREE EIGHTHS BLOCK\n '\u2584': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }, // LOWER HALF BLOCK\n '\u2585': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 5 }] }, // LOWER FIVE EIGHTHS BLOCK\n '\u2586': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 6 }] }, // LOWER THREE QUARTERS BLOCK\n '\u2587': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 7 }] }, // LOWER SEVEN EIGHTHS BLOCK\n '\u2588': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 8 }] }, // FULL BLOCK (=solid -> 25A0=black square)\n '\u2589': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 7, h: 8 }] }, // LEFT SEVEN EIGHTHS BLOCK\n '\u258A': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 6, h: 8 }] }, // LEFT THREE QUARTERS BLOCK\n '\u258B': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 5, h: 8 }] }, // LEFT FIVE EIGHTHS BLOCK\n '\u258C': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }] }, // LEFT HALF BLOCK\n '\u258D': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 3, h: 8 }] }, // LEFT THREE EIGHTHS BLOCK\n '\u258E': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 2, h: 8 }] }, // LEFT ONE QUARTER BLOCK\n '\u258F': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }] }, // LEFT ONE EIGHTH BLOCK\n '\u2590': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }, // RIGHT HALF BLOCK\n\n // Shade characters (2591-2593)\n '\u2591': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LIGHT SHADE (25%)\n [1, 0],\n [0, 0]\n ] },\n '\u2592': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // MEDIUM SHADE (=speckles fill, dotted fill, 50%, used in mapping to cp949, -> 1FB90 inverse medium shade)\n [1, 0],\n [0, 1]\n ] },\n '\u2593': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // DARK SHADE (75%)\n [1, 1],\n [1, 0]\n ] },\n\n // Block elements (2594-2595)\n '\u2594': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }] }, // UPPER ONE EIGHTH BLOCK\n '\u2595': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }] }, // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (2596-259F)\n '\u2596': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER LEFT\n '\u2597': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT LOWER RIGHT\n '\u2598': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT\n '\u2599': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT (-> 1F67F reverse checker board, -> 1FB95 checker board fill)\n '\u259A': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND LOWER RIGHT\n '\u259B': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '\u259C': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }] }, // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '\u259D': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT\n '\u259E': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT (-> 1F67E checker board, 1FB96 inverse checker board fill)\n '\u259F': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }] }, // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // #endregion\n\n // #region Powerline Symbols (E0A0-E0BF)\n\n // This contains the definitions of the primarily used box drawing characters as vector shapes.\n // The reason these characters are defined specially is to avoid common problems if a user's font\n // has not been patched with powerline characters and also to get pixel perfect rendering as\n // rendering issues can occur around AA/SPAA.\n //\n // The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n // visible.\n //\n // Original symbols defined in https://github.com/powerline/fontpatcher\n\n // Git branch\n '\\u{E0A0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: CustomGlyphVectorType.FILL } },\n // LN (Line Number)\n '\\u{E0A1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Lock\n '\\u{E0A2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: CustomGlyphVectorType.FILL } },\n // CN (Column Number)\n '\\u{E0A3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.7,.03 L.7,.1 L.355,.1 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: CustomGlyphVectorType.FILL } },\n // Right triangle solid\n '\\u{E0B0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,.5 L0,1', type: CustomGlyphVectorType.FILL, rightPadding: 2 } },\n // Right triangle line\n '\\u{E0B1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-1,-.5 L1,.5 L-1,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Left triangle solid\n '\\u{E0B2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L0,.5 L1,1', type: CustomGlyphVectorType.FILL, leftPadding: 2 } },\n // Left triangle line\n '\\u{E0B3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M2,-.5 L0,.5 L2,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n\n // Powerline Extra Symbols\n\n // Original symbols defined in https://github.com/ryanoasis/powerline-extra-symbols\n\n // Right semi-circle solid\n '\\u{E0B4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: CustomGlyphVectorType.FILL, rightPadding: 1 } },\n // Right semi-circle line\n '\\u{E0B5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: CustomGlyphVectorType.STROKE, rightPadding: 1 } },\n // Left semi-circle solid\n '\\u{E0B6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: CustomGlyphVectorType.FILL, leftPadding: 1 } },\n // Left semi-circle line\n '\\u{E0B7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: CustomGlyphVectorType.STROKE, leftPadding: 1 } },\n // Lower left triangle\n '\\u{E0B8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator\n '\\u{E0B9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Lower right triangle\n '\\u{E0BA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator redundant (identical to E0BD)\n '\\u{E0BB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper left triangle\n '\\u{E0BC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Forward slash separator\n '\\u{E0BD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1.5,-.5 L-.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n // Upper right triangle\n '\\u{E0BE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: CustomGlyphVectorType.FILL } },\n // Backslash separator redundant (identical to E0B9)\n '\\u{E0BF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M-.5,-.5 L1.5,1.5', type: CustomGlyphVectorType.STROKE, leftPadding: 1, rightPadding: 1 } },\n '\\u{E0C0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8069,0.6075 Q0.7991,0.612,0.7815,0.6218 T0.7542,0.6369 T0.7282,0.6508 T0.7016,0.6644 T0.6778,0.6758 T0.6551,0.6854 T0.637,0.6911 T0.622,0.6936 Q0.6186,0.6936,0.6128,0.6942 T0.6018,0.6952 T0.5894,0.6956 T0.5757,0.6952 T0.561,0.693 T0.5451,0.6879 Q0.5342,0.6834,0.5193,0.6756 T0.4925,0.6614 T0.4673,0.6485 T0.4436,0.6389 T0.4239,0.6363 T0.4089,0.6422 Q0.4045,0.6467,0.3958,0.6554 T0.3843,0.6669 T0.3748,0.6746 T0.3613,0.683 T0.3442,0.6903 L0.3499,0.6956 Q0.3584,0.7042,0.3679,0.7177 T0.3836,0.7403 T0.4019,0.7583 T0.4295,0.7703 Q0.4688,0.7785,0.5203,0.7605 Q0.4902,0.7817,0.449,0.7911 T0.3696,0.8001 Q0.3567,0.7997,0.341,0.7942 T0.3111,0.7813 T0.2805,0.766 T0.2493,0.753 T0.218,0.7472 T0.187,0.754 Q0.1762,0.7589,0.1653,0.7681 T0.1453,0.7895 T0.1308,0.818 T0.1264,0.8507 L0.1264,0.858 Q0.1453,0.8462,0.1607,0.8433 T0.1899,0.8452 T0.2226,0.8625 Q0.2344,0.8707,0.2485,0.8752 T0.2813,0.8831 T0.3089,0.889 Q0.2981,0.8915,0.2846,0.8956 T0.2603,0.9037 T0.2368,0.9115 T0.2129,0.9174 T0.1894,0.9194 T0.1653,0.9155 Q0.1504,0.9115,0.1328,0.9196 T0.0986,0.9421 T0.0655,0.9708 T0.0317,0.9943 T0,1 Q0.001,0.94,0.0017,0.6508 T0.0024,0.2322 Q0.002,0.2109,0.0007,0.1379 T0,0.0249 Q0.0058,0.0253,0.009,0.0257 T0.0156,0.0288 T0.0203,0.0333 T0.0264,0.0422 T0.0349,0.0539 Q0.044,0.0657,0.0542,0.072 T0.0752,0.0789 T0.096,0.0775 T0.1175,0.0694 T0.1379,0.0573 T0.1579,0.0432 Q0.2141,0,0.2673,0.0318 Q0.2588,0.0318,0.2517,0.033 T0.239,0.0361 T0.2276,0.0424 T0.218,0.0504 T0.2085,0.0612 T0.1997,0.0732 T0.1899,0.0875 T0.1795,0.1028 Q0.1748,0.1093,0.1507,0.1234 T0.1186,0.1448 Q0.0999,0.1612,0.1108,0.1783 Q0.1162,0.1877,0.1238,0.1928 T0.1404,0.1979 T0.158,0.1967 T0.1775,0.1895 T0.1963,0.1791 T0.2151,0.1663 T0.2314,0.1534 T0.2458,0.141 T0.2561,0.1322 Q0.2815,0.1106,0.3017,0.101 T0.344,0.0926 T0.3919,0.1077 Q0.4099,0.1175,0.4265,0.1206 T0.4588,0.1202 T0.488,0.1098 T0.5176,0.0914 Q0.5071,0.1032,0.4963,0.1122 T0.4722,0.1285 T0.4497,0.1401 T0.4223,0.1518 T0.3943,0.1636 Q0.374,0.1726,0.3623,0.1863 T0.3482,0.2162 Q0.3445,0.2403,0.3608,0.2605 T0.4072,0.2876 Q0.4194,0.2909,0.4326,0.2899 T0.457,0.2856 T0.4805,0.2764 T0.5032,0.264 T0.5256,0.2497 T0.5478,0.2352 T0.5698,0.2222 T0.5921,0.2118 Q0.6982,0.173,0.81,0.2436 Q0.833,0.2583,0.8496,0.2674 T0.887,0.2846 T0.925,0.294 T0.9617,0.2911 T1,0.2746 Q0.9817,0.2946,0.96,0.3056 T0.9175,0.3191 T0.8731,0.3209 T0.8277,0.3164 T0.7818,0.3109 T0.7359,0.3101 T0.6907,0.3197 T0.647,0.3448 Q0.6443,0.3472,0.6333,0.3562 T0.6194,0.3674 T0.6076,0.3766 T0.594,0.386 T0.5815,0.3931 T0.5661,0.4007 T0.5501,0.4064 L0.5556,0.4121 Q0.5627,0.4198,0.5722,0.4251 T0.5926,0.4337 T0.6131,0.439 T0.6343,0.4431 T0.6521,0.4468 Q0.6762,0.4529,0.7056,0.4463 Q0.6772,0.4623,0.6543,0.471 T0.604,0.4814 Q0.5962,0.4818,0.5815,0.4825 T0.5591,0.4835 T0.5393,0.4857 T0.519,0.4908 T0.5007,0.4996 T0.4812,0.5141 T0.4627,0.5353 L0.4549,0.5451 L0.4661,0.543 Q0.4759,0.541,0.4909,0.55 T0.5315,0.5796 T0.5684,0.6083 Q0.5799,0.6161,0.5915,0.6212 T0.6181,0.6308 L0.6331,0.6353 Q0.6514,0.6418,0.7004,0.633 T0.8069,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.011,0.0469 Q0.0152,0.0412,0.02,0.0361 T0.0292,0.0281 T0.0365,0.0253 Q0.0426,0.0257,0.0461,0.0263 T0.0534,0.03 T0.0582,0.0345 T0.0645,0.0434 T0.0723,0.0546 Q0.0807,0.0653,0.0897,0.0712 T0.1081,0.0775 T0.1255,0.0765 T0.1438,0.0695 T0.1605,0.0593 T0.1772,0.0473 Q0.2388,0,0.2927,0.0326 L0.2614,0.0767 L0.2581,0.0767 Q0.2494,0.0767,0.2444,0.0773 T0.2359,0.0789 T0.2291,0.0842 T0.2233,0.0922 T0.2146,0.1054 T0.2026,0.1236 Q0.1943,0.1354,0.1843,0.1444 T0.1675,0.1574 T0.1526,0.1654 T0.1429,0.1701 Q0.1436,0.1717,0.1446,0.1733 Q0.1504,0.1823,0.1581,0.1866 T0.1733,0.1915 T0.1909,0.1884 T0.2085,0.1809 T0.2265,0.169 T0.2427,0.1564 T0.2575,0.1436 T0.2688,0.1338 Q0.2969,0.1101,0.3195,0.0995 T0.3643,0.0901 T0.4114,0.1048 Q0.4279,0.1138,0.4426,0.1168 T0.4705,0.117 T0.4945,0.1089 T0.5186,0.0942 L0.5211,0.0926 L0.5289,0.0922 Q0.5411,0.095,0.5189,0.1203 Q0.505,0.1358,0.4913,0.1474 T0.4634,0.167 T0.4389,0.1796 T0.4121,0.1909 T0.3866,0.2011 Q0.3782,0.2047,0.3727,0.2092 Q0.3717,0.2117,0.3714,0.2141 Q0.3695,0.2263,0.3751,0.2388 T0.394,0.2616 T0.4253,0.2761 Q0.4398,0.2785,0.4513,0.2779 T0.4756,0.2724 T0.4987,0.2616 T0.5216,0.2476 T0.5453,0.2321 T0.5703,0.217 T0.5976,0.2043 Q0.7015,0.166,0.8099,0.2345 Q0.8361,0.2512,0.8572,0.2616 T0.9006,0.2779 T0.9432,0.281 T0.9819,0.2663 L0.9887,0.2671 Q1,0.272,0.9768,0.2969 Q0.9558,0.3193,0.9319,0.333 T0.8858,0.3513 T0.8391,0.3569 T0.793,0.3546 T0.7485,0.3497 T0.7065,0.3473 T0.6681,0.3522 T0.6344,0.3699 Q0.5963,0.4005,0.5847,0.4082 Q0.595,0.4139,0.6079,0.4174 T0.6367,0.4237 T0.6586,0.4278 Q0.6793,0.4331,0.7044,0.4278 Q0.7057,0.4278,0.707,0.4274 Q0.7067,0.429,0.7062,0.4313 T0.7036,0.4398 T0.6993,0.4513 T0.6931,0.4619 T0.6851,0.4698 Q0.6573,0.4857,0.6336,0.4947 T0.5831,0.5053 Q0.577,0.5057,0.5615,0.5065 T0.5394,0.508 T0.5221,0.51 T0.5042,0.5139 T0.4905,0.5204 Q0.5008,0.5232,0.515,0.5328 T0.549,0.5585 T0.5799,0.5824 Q0.5905,0.5897,0.6013,0.5946 T0.6262,0.6036 T0.6409,0.6081 Q0.6567,0.6134,0.7035,0.605 T0.8028,0.5816 L0.7974,0.5922 T0.7867,0.6134 L0.7812,0.624 Q0.7799,0.6248,0.7786,0.6252 Q0.7709,0.6297,0.7573,0.6372 T0.7346,0.6499 T0.7123,0.6621 T0.6897,0.6741 T0.6686,0.6847 T0.648,0.6941 T0.6297,0.7013 T0.6129,0.7062 T0.5995,0.7076 Q0.5992,0.7076,0.5831,0.7092 T0.5529,0.7092 T0.525,0.7019 Q0.5105,0.6958,0.4824,0.6811 T0.4356,0.6586 T0.4079,0.6533 Q0.3872,0.6741,0.3827,0.6782 Q0.3872,0.6835,0.3934,0.6929 T0.4037,0.7078 T0.4142,0.7198 T0.4284,0.7304 T0.4466,0.7365 Q0.4824,0.7443,0.5292,0.728 L0.5292,0.7294 T0.529,0.7333 T0.5284,0.7392 T0.5266,0.7463 T0.5236,0.7539 T0.5186,0.7612 T0.5111,0.7679 Q0.5086,0.77,0.5056,0.7716 Q0.4466,0.8104,0.3591,0.8091 Q0.344,0.8091,0.3246,0.802 T0.2893,0.7863 T0.2543,0.77 T0.2206,0.76 T0.1894,0.7643 Q0.1804,0.7684,0.1733,0.7753 Q0.1591,0.7892,0.1601,0.8169 Q0.1784,0.8067,0.1938,0.8053 T0.2212,0.8087 T0.2507,0.825 Q0.2614,0.8324,0.2744,0.8365 T0.3053,0.844 T0.332,0.8499 L0.303,0.894 L0.2998,0.8948 Q0.2904,0.8968,0.278,0.9009 T0.2554,0.9086 T0.233,0.9158 T0.2099,0.9213 T0.1868,0.9229 T0.1633,0.9192 Q0.1517,0.916,0.1367,0.9241 T0.1065,0.9462 T0.0753,0.9737 T0.041,0.9955 T0.0061,1 Q0,0.9984,0.0068,0.9845 Q0.009,0.9804,0.0123,0.9755 Q0.0187,0.9666,0.0261,0.9606 T0.0374,0.9555 Q0.0481,0.958,0.0629,0.949 T0.0931,0.9262 T0.1247,0.8987 T0.1597,0.8777 T0.1949,0.8752 Q0.213,0.8805,0.2343,0.8772 Q0.2249,0.8736,0.2172,0.8683 Q0.1914,0.8511,0.1738,0.8497 T0.1349,0.8617 Q0.1304,0.865,0.1273,0.8646 T0.1242,0.8605 L0.1239,0.8536 Q0.1226,0.8295,0.1354,0.8016 T0.1723,0.7496 Q0.1914,0.7308,0.2104,0.7219 Q0.2259,0.7145,0.2425,0.7141 T0.273,0.7182 T0.3022,0.7296 T0.3301,0.7439 T0.3569,0.7571 T0.3821,0.7643 Q0.373,0.7561,0.3598,0.7367 T0.3382,0.7088 L0.3327,0.7035 Q0.3282,0.699,0.3353,0.6884 T0.3517,0.6692 L0.3611,0.6607 Q0.3711,0.657,0.3751,0.6554 T0.3837,0.6507 T0.3898,0.6458 T0.3979,0.637 T0.4111,0.6236 Q0.4172,0.6175,0.4234,0.6138 Q0.4327,0.6081,0.4439,0.6077 T0.4655,0.6105 T0.4884,0.6201 T0.5113,0.633 T0.5347,0.6468 T0.5573,0.6578 Q0.5705,0.6635,0.5833,0.665 T0.6112,0.665 T0.6286,0.6635 Q0.6421,0.6631,0.6718,0.6501 Q0.626,0.6578,0.6089,0.6517 Q0.6063,0.6509,0.6002,0.6491 T0.5884,0.6454 T0.5757,0.6409 T0.561,0.6344 T0.5466,0.6256 Q0.536,0.6183,0.5108,0.5989 T0.4722,0.5712 T0.4527,0.564 L0.4418,0.5661 Q0.4308,0.5681,0.4366,0.5563 Q0.4401,0.5485,0.4476,0.5392 L0.455,0.5298 Q0.4631,0.5188,0.4714,0.51 T0.4866,0.4947 T0.5021,0.4831 T0.516,0.4749 T0.53,0.4694 T0.5428,0.4657 T0.5558,0.4637 T0.5674,0.4629 T0.5795,0.4625 Q0.5489,0.4543,0.534,0.4384 L0.5286,0.4327 Q0.5244,0.4282,0.5318,0.4174 T0.5486,0.398 L0.5579,0.3899 Q0.567,0.387,0.5749,0.3834 T0.5878,0.3772 T0.6012,0.3687 T0.6126,0.3603 T0.6268,0.3487 T0.6421,0.3361 Q0.6567,0.3242,0.6712,0.3159 T0.7009,0.3034 T0.7277,0.2973 T0.7556,0.2961 T0.7809,0.2977 T0.8074,0.301 Q0.8096,0.3014,0.8109,0.3016 T0.8143,0.302 T0.818,0.3026 Q0.8012,0.2936,0.7767,0.2781 Q0.6718,0.2117,0.5744,0.2476 Q0.5637,0.2516,0.5492,0.2604 T0.5218,0.2779 T0.4923,0.2965 T0.461,0.3124 T0.4282,0.3216 T0.394,0.3206 Q0.3637,0.3136,0.3474,0.2936 T0.3353,0.2459 Q0.3385,0.2247,0.355,0.2023 Q0.3646,0.1892,0.3763,0.179 Q0.3898,0.1672,0.4063,0.1595 Q0.3927,0.1562,0.3785,0.1485 Q0.3604,0.1387,0.3453,0.1354 T0.3161,0.1354 T0.2899,0.1458 T0.2627,0.166 Q0.262,0.1664,0.254,0.1733 T0.2414,0.1841 T0.2267,0.196 T0.2094,0.2086 T0.1915,0.2196 T0.1725,0.2288 T0.1546,0.2337 T0.1373,0.2343 T0.1223,0.228 T0.1097,0.2145 Q0.0962,0.1929,0.1258,0.1582 Q0.131,0.1517,0.1371,0.1464 Q0.1462,0.1387,0.156,0.1321 T0.1752,0.1205 T0.1878,0.1134 Q0.1891,0.1117,0.1947,0.103 T0.2035,0.0899 T0.2125,0.0781 T0.2243,0.064 Q0.1949,0.0616,0.1672,0.0828 Q0.153,0.0934,0.1412,0.1009 T0.1146,0.1146 T0.0873,0.1213 T0.0616,0.116 T0.0374,0.0962 Q0.0339,0.0909,0.0295,0.0846 T0.024,0.0767 T0.0202,0.0728 T0.0148,0.0704 T0.0068,0.0697 Q0.0003,0.0693,0.0058,0.0567 Q0.0077,0.0522,0.011,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1934,0.6075 Q0.2012,0.612,0.2188,0.6218 T0.2459,0.6369 T0.2718,0.6508 T0.2983,0.6644 T0.322,0.6758 T0.3447,0.6854 T0.363,0.6911 T0.3783,0.6936 Q0.3796,0.6936,0.396,0.6952 T0.4265,0.6952 T0.4548,0.6879 Q0.4656,0.6834,0.4805,0.6756 T0.5073,0.6614 T0.5327,0.6485 T0.5564,0.6389 T0.5759,0.6363 T0.5909,0.6422 Q0.5953,0.6467,0.604,0.6554 T0.6155,0.6669 T0.6251,0.6746 T0.6387,0.683 T0.6556,0.6903 L0.6498,0.6956 Q0.6414,0.7042,0.6319,0.7177 T0.6162,0.7403 T0.5979,0.7583 T0.5703,0.7703 Q0.5313,0.7785,0.4799,0.7605 Q0.5097,0.7817,0.5508,0.7911 T0.6302,0.8001 Q0.6431,0.7997,0.659,0.7942 T0.6888,0.7813 T0.7194,0.766 T0.7506,0.753 T0.7819,0.7472 T0.8131,0.754 Q0.8239,0.7589,0.8346,0.7681 T0.8544,0.7895 T0.8689,0.818 T0.8737,0.8507 L0.8733,0.858 Q0.8591,0.849,0.8474,0.845 T0.8242,0.8421 T0.8021,0.8482 T0.7772,0.8625 Q0.7653,0.8707,0.7513,0.8752 T0.7184,0.8831 T0.6908,0.889 Q0.7017,0.8915,0.7152,0.8956 T0.7396,0.9037 T0.7633,0.9115 T0.7872,0.9174 T0.8107,0.9194 T0.8347,0.9155 Q0.8493,0.9115,0.8671,0.9196 T0.9015,0.9421 T0.9345,0.9708 T0.9682,0.9943 T0.9997,1 Q0.999,0.94,0.9983,0.6508 T0.9976,0.2322 Q0.9976,0.2109,0.9992,0.1379 T1,0.0249 Q0.9949,0.0249,0.9917,0.0257 T0.9863,0.0273 T0.9817,0.0308 T0.9776,0.0357 T0.9721,0.0437 T0.9651,0.0539 Q0.956,0.0657,0.9456,0.072 T0.9247,0.0789 T0.904,0.0775 T0.8823,0.0694 T0.862,0.0573 T0.8422,0.0432 Q0.7856,0,0.7328,0.0318 Q0.7392,0.0318,0.7452,0.0324 T0.756,0.0345 T0.7657,0.0386 T0.7741,0.0437 T0.7821,0.0506 T0.7894,0.0588 T0.7966,0.0683 T0.8039,0.0787 T0.8119,0.0904 T0.8202,0.1028 Q0.8249,0.1093,0.849,0.1234 T0.8811,0.1448 Q0.8998,0.1612,0.8893,0.1783 Q0.8835,0.1877,0.8759,0.1928 T0.8593,0.1979 T0.8417,0.1967 T0.8222,0.1895 T0.8034,0.1791 T0.7848,0.1663 T0.7687,0.1534 T0.7543,0.141 T0.744,0.1322 Q0.7186,0.1106,0.6984,0.101 T0.6559,0.0926 T0.6082,0.1077 Q0.5899,0.1175,0.5733,0.1206 T0.5411,0.1202 T0.5122,0.1098 T0.4822,0.0914 Q0.4927,0.1032,0.5036,0.1122 T0.5276,0.1285 T0.5503,0.1401 T0.5777,0.1518 T0.6055,0.1636 Q0.6258,0.1726,0.6375,0.1863 T0.6519,0.2162 Q0.6556,0.2403,0.6392,0.2605 T0.5926,0.2876 Q0.5804,0.2909,0.5672,0.2899 T0.5428,0.2856 T0.5193,0.2764 T0.4966,0.264 T0.4744,0.2497 T0.4523,0.2352 T0.4301,0.2222 T0.4077,0.2118 Q0.3021,0.173,0.1903,0.2436 Q0.1669,0.2583,0.1504,0.2674 T0.1129,0.2846 T0.075,0.294 T0.0384,0.2911 T0,0.2746 Q0.021,0.297,0.0459,0.3082 T0.0953,0.3207 T0.146,0.3193 T0.1988,0.3131 T0.2508,0.3095 T0.3029,0.3176 T0.3529,0.3448 Q0.3566,0.348,0.3652,0.355 T0.3771,0.3645 T0.3877,0.3731 T0.3993,0.3815 T0.4103,0.3884 T0.4226,0.3953 T0.4352,0.4009 T0.4497,0.4064 L0.4443,0.4121 Q0.4372,0.4198,0.4277,0.4251 T0.4072,0.4337 T0.3867,0.439 T0.3656,0.4431 T0.3481,0.4468 Q0.3241,0.4529,0.2943,0.4463 Q0.3227,0.4623,0.3458,0.471 T0.3959,0.4814 Q0.404,0.4818,0.4187,0.4825 T0.4409,0.4835 T0.4605,0.4857 T0.4809,0.4908 T0.4992,0.4996 T0.5186,0.5141 T0.5371,0.5353 L0.5449,0.5451 L0.5337,0.543 Q0.5242,0.541,0.5091,0.55 T0.4683,0.5796 T0.4314,0.6083 Q0.4203,0.6161,0.4086,0.6212 T0.382,0.6308 T0.3667,0.6353 Q0.3485,0.6418,0.2995,0.633 T0.1934,0.6075 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.989,0.0469 Q0.9829,0.0379,0.9753,0.0316 T0.9635,0.0253 Q0.9574,0.0257,0.9539,0.0263 T0.9466,0.03 T0.9418,0.0345 T0.9355,0.0434 T0.9277,0.0546 Q0.9193,0.0653,0.9103,0.0712 T0.8919,0.0775 T0.8745,0.0765 T0.8564,0.0695 T0.8396,0.0593 T0.8228,0.0473 Q0.7612,0,0.7073,0.0326 L0.7386,0.0767 L0.7419,0.0767 Q0.7506,0.0767,0.7556,0.0773 T0.7641,0.0789 T0.7709,0.0842 T0.7767,0.0922 T0.7854,0.1054 T0.7974,0.1236 Q0.8057,0.1354,0.8157,0.1444 T0.8325,0.1574 T0.8474,0.1654 T0.8571,0.1701 Q0.8564,0.1717,0.8554,0.1733 Q0.8503,0.1815,0.844,0.186 T0.8301,0.1909 T0.8153,0.1903 T0.7993,0.1845 T0.7836,0.1758 T0.768,0.1648 T0.754,0.1535 T0.741,0.1425 T0.7312,0.1338 Q0.7031,0.1101,0.6805,0.0995 T0.6357,0.0901 T0.5886,0.1048 Q0.5721,0.1138,0.5574,0.1168 T0.5295,0.117 T0.5055,0.1089 T0.4814,0.0942 L0.4789,0.0926 L0.4711,0.0922 Q0.4589,0.095,0.4811,0.1203 Q0.495,0.1358,0.5087,0.1474 T0.5366,0.167 T0.5611,0.1796 T0.5879,0.1909 T0.6134,0.2011 Q0.6218,0.2047,0.6273,0.2092 Q0.6283,0.2117,0.6286,0.2141 Q0.6305,0.2263,0.6249,0.2388 T0.606,0.2616 T0.5747,0.2761 Q0.5602,0.2785,0.5487,0.2779 T0.5245,0.2724 T0.5015,0.2616 T0.4784,0.2476 T0.4547,0.2321 T0.4297,0.217 T0.4024,0.2043 Q0.2985,0.166,0.1901,0.2345 Q0.1694,0.248,0.1523,0.2569 T0.1165,0.2726 T0.0818,0.2812 T0.0494,0.2796 T0.0181,0.2663 L0.0116,0.2671 Q0,0.272,0.0232,0.2969 Q0.0468,0.3222,0.0742,0.3365 T0.1278,0.3542 T0.1807,0.3564 T0.233,0.352 T0.2815,0.3473 T0.3269,0.3509 T0.3656,0.3699 Q0.4037,0.4005,0.4153,0.4082 Q0.405,0.4139,0.3921,0.4174 T0.3633,0.4237 T0.3414,0.4278 Q0.3207,0.4331,0.2956,0.4278 Q0.2943,0.4278,0.293,0.4274 Q0.2933,0.429,0.2938,0.4313 T0.2964,0.4398 T0.3007,0.4513 T0.3069,0.4619 T0.3149,0.4698 Q0.3427,0.4857,0.3664,0.4947 T0.4169,0.5053 Q0.423,0.5057,0.4385,0.5065 T0.4606,0.508 T0.4779,0.51 T0.4958,0.5139 T0.5095,0.5204 Q0.4992,0.5232,0.485,0.5328 T0.451,0.5585 T0.4201,0.5824 Q0.4095,0.5897,0.3987,0.5946 T0.3738,0.6036 T0.3591,0.6081 Q0.3433,0.6134,0.2965,0.605 T0.1972,0.5816 L0.2026,0.5922 T0.2133,0.6134 L0.2188,0.624 Q0.2201,0.6248,0.2214,0.6252 Q0.2291,0.6297,0.2486,0.6405 T0.2786,0.657 T0.3066,0.6721 T0.3353,0.6866 T0.3598,0.6972 T0.383,0.7051 T0.4005,0.7076 Q0.4008,0.7076,0.4169,0.7092 T0.4471,0.7092 T0.475,0.7019 Q0.4895,0.6958,0.5176,0.6811 T0.5644,0.6586 T0.5921,0.6533 Q0.6128,0.6741,0.6173,0.6782 Q0.6131,0.6835,0.6068,0.6929 T0.5963,0.7078 T0.5858,0.7198 T0.5716,0.7304 T0.5534,0.7365 Q0.5179,0.7443,0.4708,0.728 L0.4708,0.7294 T0.471,0.7333 T0.4716,0.7392 T0.4734,0.7463 T0.4764,0.7539 T0.4814,0.7612 T0.4889,0.7679 Q0.4914,0.77,0.4944,0.7716 Q0.5534,0.8104,0.6409,0.8091 Q0.6521,0.8091,0.6654,0.8053 T0.6907,0.7959 T0.7157,0.7838 T0.741,0.772 T0.7652,0.7631 T0.7888,0.7594 T0.8106,0.7643 Q0.8196,0.7684,0.8267,0.7753 Q0.8409,0.7892,0.8399,0.8169 Q0.8216,0.8067,0.8062,0.8053 T0.7788,0.8087 T0.7493,0.825 Q0.7386,0.8324,0.7256,0.8365 T0.6947,0.844 T0.668,0.8499 L0.697,0.894 L0.7002,0.8948 Q0.7099,0.8968,0.7222,0.9009 T0.7446,0.9086 T0.767,0.9158 T0.7901,0.9213 T0.8132,0.9229 T0.8367,0.9192 Q0.8483,0.916,0.8633,0.9241 T0.8937,0.9462 T0.9248,0.9737 T0.959,0.9955 T0.9939,1 Q1,0.9984,0.9932,0.9845 Q0.991,0.9804,0.9877,0.9755 Q0.9813,0.9666,0.9739,0.9606 T0.9626,0.9555 Q0.9519,0.958,0.9372,0.949 T0.9071,0.9262 T0.8753,0.8987 T0.8403,0.8777 T0.8051,0.8752 Q0.787,0.8805,0.7657,0.8772 Q0.7751,0.8736,0.7828,0.8683 Q0.8086,0.8511,0.8262,0.8497 T0.8651,0.8617 Q0.8696,0.865,0.8727,0.8646 T0.8758,0.8605 L0.8761,0.8536 Q0.8774,0.8295,0.8646,0.8016 T0.8277,0.7496 Q0.8086,0.7308,0.7896,0.7219 Q0.7741,0.7145,0.7575,0.7141 T0.727,0.7182 T0.6978,0.7296 T0.6699,0.7439 T0.6433,0.7571 T0.6179,0.7643 Q0.627,0.7561,0.6402,0.7367 T0.6618,0.7088 L0.6673,0.7035 Q0.6718,0.699,0.6647,0.6884 T0.6483,0.6692 L0.6389,0.6607 Q0.6289,0.657,0.6249,0.6554 T0.6163,0.6507 T0.6102,0.6458 T0.6021,0.637 T0.5889,0.6236 Q0.5828,0.6175,0.5766,0.6138 Q0.5673,0.6081,0.5561,0.6077 T0.5345,0.6105 T0.5116,0.6201 T0.4887,0.633 T0.4653,0.6468 T0.4427,0.6578 Q0.4295,0.6635,0.4167,0.665 T0.3888,0.665 T0.3714,0.6635 Q0.3579,0.6631,0.3282,0.6501 Q0.374,0.6578,0.3911,0.6517 Q0.3937,0.6509,0.4024,0.6482 T0.4179,0.6434 T0.4348,0.6364 T0.4534,0.6256 Q0.464,0.6183,0.4892,0.5989 T0.5278,0.5712 T0.5476,0.564 L0.5582,0.5661 Q0.5692,0.5681,0.5634,0.5563 Q0.5599,0.5485,0.5524,0.5392 L0.545,0.5298 Q0.5369,0.5188,0.5286,0.51 T0.5134,0.4947 T0.4979,0.4831 T0.484,0.4749 T0.47,0.4694 T0.4572,0.4657 T0.4442,0.4637 T0.4326,0.4629 T0.4205,0.4625 Q0.4511,0.4543,0.466,0.4384 L0.4714,0.4327 Q0.4795,0.4237,0.4469,0.394 L0.4421,0.3899 Q0.433,0.387,0.4251,0.3834 T0.4122,0.3772 T0.3988,0.3687 T0.3874,0.3603 T0.3732,0.3487 T0.3579,0.3361 Q0.3433,0.3242,0.3288,0.3159 T0.2993,0.3034 T0.2725,0.2973 T0.2446,0.2961 T0.2193,0.2977 T0.1926,0.301 Q0.1855,0.3022,0.182,0.3026 Q0.1991,0.2936,0.2233,0.2781 Q0.3282,0.2117,0.4256,0.2476 Q0.4363,0.2516,0.451,0.2604 T0.4784,0.2779 T0.5077,0.2965 T0.539,0.3124 T0.5718,0.3216 T0.606,0.3206 Q0.6363,0.3136,0.6526,0.2936 T0.6647,0.2459 Q0.6615,0.2247,0.645,0.2023 Q0.6354,0.1892,0.6237,0.179 Q0.6102,0.1672,0.5937,0.1595 Q0.6073,0.1562,0.6215,0.1485 Q0.6396,0.1387,0.6547,0.1354 T0.6839,0.1354 T0.7101,0.1458 T0.7373,0.166 Q0.738,0.1664,0.746,0.1733 T0.7586,0.1841 T0.7733,0.196 T0.7907,0.2086 T0.8086,0.2196 T0.8275,0.2288 T0.8454,0.2337 T0.8627,0.2343 T0.8777,0.228 T0.8903,0.2145 Q0.9038,0.1929,0.8742,0.1582 Q0.869,0.1517,0.8629,0.1464 Q0.8538,0.1387,0.844,0.1321 T0.8248,0.1205 T0.8122,0.1134 Q0.8109,0.1117,0.8053,0.103 T0.7965,0.0899 T0.7875,0.0781 T0.7757,0.064 Q0.8051,0.0616,0.8328,0.0828 Q0.847,0.0934,0.8588,0.1009 T0.8854,0.1146 T0.9127,0.1213 T0.9384,0.116 T0.9626,0.0962 Q0.9664,0.0909,0.9706,0.0846 T0.976,0.0767 T0.9798,0.0728 T0.9852,0.0704 T0.9932,0.0697 Q0.9997,0.0693,0.9942,0.0567 Q0.9923,0.0522,0.989,0.0469 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.4116,0.0126 L0.4116,0.0776 L0.4871,0.0776 L0.4871,0.0126 L0.4116,0.0126 Z M0.4043,0 L0.4944,0 Q0.4973,0,0.4995,0.0021 T0.5017,0.0063 L0.5017,0.0839 Q0.5017,0.0864,0.4993,0.0883 T0.4944,0.0902 L0.4043,0.0902 Q0.4014,0.0902,0.3992,0.0881 T0.397,0.0839 L0.397,0.0063 Q0.397,0.0038,0.3994,0.0019 T0.4043,0 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.9099,0.0084 L0.9099,0.0818 L0.9951,0.0818 L0.9951,0.0084 L0.9099,0.0084 Z M0.9075,0.0042 L0.9976,0.0042 Q1,0.0042,1,0.0063 L1,0.0839 Q1,0.086,0.9976,0.086 L0.9075,0.086 Q0.905,0.086,0.905,0.0839 L0.905,0.0063 Q0.905,0.0042,0.9075,0.0042 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.66,0.0063 L0.7501,0.0063 L0.7501,0.0839 L0.66,0.0839 L0.66,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.5309,0.0063 L0.621,0.0063 L0.621,0.0839 L0.5309,0.0839 L0.5309,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.2689,0.0063 L0.359,0.0063 L0.359,0.0839 L0.2689,0.0839 L0.2689,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0.1374,0.0063 L0.2275,0.0063 L0.2275,0.0839 L0.1374,0.0839 L0.1374,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0,0.0063 L0.0901,0.0063 L0.0901,0.0839 L0,0.0839 L0,0.0063 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.4087,0.9224 L0.4087,0.9958 L0.4939,0.9958 L0.4939,0.9224 L0.4087,0.9224 Z M0.4062,0.9182 L0.4963,0.9182 Q0.4988,0.9182,0.4988,0.9203 L0.4988,0.9979 Q0.4988,1,0.4963,1 L0.4062,1 Q0.4038,1,0.4038,0.9979 L0.4038,0.9203 Q0.4038,0.9182,0.4062,0.9182 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0.1374,0.9203 L0.2275,0.9203 L0.2275,0.9979 L0.1374,0.9979 L0.1374,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0,0.9203 L0.0901,0.9203 L0.0901,0.9979 L0,0.9979 L0,0.9203 Z M0.9099,0.1158 L0.9099,0.1888 L0.9951,0.1888 L0.9951,0.1158 L0.9099,0.1158 Z M0.9075,0.1116 L0.9976,0.1116 Q1,0.1116,1,0.1137 L1,0.1909 Q1,0.193,0.9976,0.193 L0.9075,0.193 Q0.905,0.193,0.905,0.1909 L0.905,0.1137 Q0.905,0.1116,0.9075,0.1116 Z M0.7852,0.6086 L0.7852,0.682 L0.8704,0.682 L0.8704,0.6086 L0.7852,0.6086 Z M0.7828,0.6044 L0.8729,0.6044 Q0.8753,0.6044,0.8753,0.6065 L0.8753,0.6841 Q0.8753,0.6862,0.8729,0.6862 L0.7828,0.6862 Q0.7803,0.6862,0.7803,0.6841 L0.7803,0.6065 Q0.7803,0.6044,0.7828,0.6044 Z M0.66,0.1137 L0.7501,0.1137 L0.7501,0.1909 L0.66,0.1909 L0.66,0.1137 Z M0.6624,0.4102 L0.6624,0.4836 L0.7477,0.4836 L0.7477,0.4102 L0.6624,0.4102 Z M0.66,0.406 L0.7501,0.406 Q0.7526,0.406,0.7526,0.4081 L0.7526,0.4857 Q0.7526,0.4878,0.7501,0.4878 L0.66,0.4878 Q0.6576,0.4878,0.6576,0.4857 L0.6576,0.4081 Q0.6576,0.406,0.66,0.406 Z M0.6624,0.7131 L0.6624,0.7865 L0.7477,0.7865 L0.7477,0.7131 L0.6624,0.7131 Z M0.66,0.7089 L0.7501,0.7089 Q0.7526,0.7089,0.7526,0.711 L0.7526,0.7886 Q0.7526,0.7907,0.7501,0.7907 L0.66,0.7907 Q0.6576,0.7907,0.6576,0.7886 L0.6576,0.711 Q0.6576,0.7089,0.66,0.7089 Z M0.5407,0.2227 L0.5407,0.2836 L0.6113,0.2836 L0.6113,0.2227 L0.5407,0.2227 Z M0.5309,0.206 L0.621,0.206 Q0.623,0.206,0.6249,0.2068 T0.6281,0.2089 T0.6301,0.2116 T0.6308,0.2143 L0.6308,0.2919 Q0.6308,0.2957,0.6276,0.298 T0.621,0.3003 L0.5309,0.3003 Q0.5265,0.3003,0.5239,0.2976 T0.5212,0.2919 L0.5212,0.2143 Q0.5212,0.211,0.5244,0.2085 T0.5309,0.206 Z M0.5407,0.3184 L0.5407,0.3792 L0.6113,0.3792 L0.6113,0.3184 L0.5407,0.3184 Z M0.5309,0.3016 L0.621,0.3016 Q0.6254,0.3016,0.6281,0.3043 T0.6308,0.31 L0.6308,0.3876 Q0.6308,0.3914,0.6276,0.3937 T0.621,0.396 L0.5309,0.396 Q0.5265,0.396,0.5239,0.3932 T0.5212,0.3876 L0.5212,0.31 Q0.5212,0.3062,0.5244,0.3039 T0.5309,0.3016 Z M0.5309,0.4081 L0.621,0.4081 L0.621,0.4857 L0.5309,0.4857 L0.5309,0.4081 Z M0.5309,0.5059 L0.621,0.5059 L0.621,0.5835 L0.5309,0.5835 L0.5309,0.5059 Z M0.5407,0.6149 L0.5407,0.6758 L0.6113,0.6758 L0.6113,0.6149 L0.5407,0.6149 Z M0.5309,0.5982 L0.621,0.5982 Q0.6254,0.5982,0.6281,0.6009 T0.6308,0.6065 L0.6308,0.6841 Q0.6308,0.6879,0.6276,0.6902 T0.621,0.6925 L0.5309,0.6925 Q0.5265,0.6925,0.5239,0.6898 T0.5212,0.6841 L0.5212,0.6065 Q0.5212,0.6028,0.5244,0.6005 T0.5309,0.5982 Z M0.4062,0.1137 L0.4963,0.1137 L0.4963,0.1909 L0.4062,0.1909 L0.4062,0.1137 Z M0.4062,0.2143 L0.4963,0.2143 L0.4963,0.2919 L0.4062,0.2919 L0.4062,0.2143 Z M0.4184,0.4186 L0.4184,0.4753 L0.4842,0.4753 L0.4842,0.4186 L0.4184,0.4186 Z M0.4062,0.3977 L0.4963,0.3977 Q0.5017,0.3977,0.5051,0.401 T0.5085,0.4081 L0.5085,0.4857 Q0.5085,0.4904,0.5046,0.4933 T0.4963,0.4962 L0.4062,0.4962 Q0.4009,0.4962,0.3975,0.4929 T0.3941,0.4857 L0.3941,0.4081 Q0.3941,0.4035,0.398,0.4006 T0.4062,0.3977 Z M0.4062,0.5059 L0.4963,0.5059 L0.4963,0.5835 L0.4062,0.5835 L0.4062,0.5059 Z M0.4087,0.7131 L0.4087,0.7865 L0.4939,0.7865 L0.4939,0.7131 L0.4087,0.7131 Z M0.4062,0.7089 L0.4963,0.7089 Q0.4988,0.7089,0.4988,0.711 L0.4988,0.7886 Q0.4988,0.7907,0.4963,0.7907 L0.4062,0.7907 Q0.4038,0.7907,0.4038,0.7886 L0.4038,0.711 Q0.4038,0.7089,0.4062,0.7089 Z M0.2689,0.1137 L0.359,0.1137 L0.359,0.1909 L0.2689,0.1909 L0.2689,0.1137 Z M0.2689,0.2143 L0.359,0.2143 L0.359,0.2919 L0.2689,0.2919 L0.2689,0.2143 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.31 L0.359,0.31 L0.359,0.3876 L0.2689,0.3876 L0.2689,0.31 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.2689,0.4081 L0.359,0.4081 L0.359,0.4857 L0.2689,0.4857 L0.2689,0.4081 Z M0.2689,0.5059 L0.359,0.5059 L0.359,0.5835 L0.2689,0.5835 L0.2689,0.5059 Z M0.2689,0.711 L0.359,0.711 L0.359,0.7886 L0.2689,0.7886 L0.2689,0.711 Z M0.2689,0.8154 L0.359,0.8154 L0.359,0.8926 L0.2689,0.8926 L0.2689,0.8154 Z M0.1374,0.1137 L0.2275,0.1137 L0.2275,0.1909 L0.1374,0.1909 L0.1374,0.1137 Z M0.1374,0.2143 L0.2275,0.2143 L0.2275,0.2919 L0.1374,0.2919 L0.1374,0.2143 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.31 L0.2275,0.31 L0.2275,0.3876 L0.1374,0.3876 L0.1374,0.31 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0.1374,0.4081 L0.2275,0.4081 L0.2275,0.4857 L0.1374,0.4857 L0.1374,0.4081 Z M0.1374,0.5059 L0.2275,0.5059 L0.2275,0.5835 L0.1374,0.5835 L0.1374,0.5059 Z M0.1374,0.6065 L0.2275,0.6065 L0.2275,0.6841 L0.1374,0.6841 L0.1374,0.6065 Z M0.1374,0.711 L0.2275,0.711 L0.2275,0.7886 L0.1374,0.7886 L0.1374,0.711 Z M0.1374,0.8154 L0.2275,0.8154 L0.2275,0.8926 L0.1374,0.8926 L0.1374,0.8154 Z M0,0.1137 L0.0901,0.1137 L0.0901,0.1909 L0,0.1909 L0,0.1137 Z M0,0.2143 L0.0901,0.2143 L0.0901,0.2919 L0,0.2919 L0,0.2143 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.31 L0.0901,0.31 L0.0901,0.3876 L0,0.3876 L0,0.31 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z M0,0.4081 L0.0901,0.4081 L0.0901,0.4857 L0,0.4857 L0,0.4081 Z M0,0.5059 L0.0901,0.5059 L0.0901,0.5835 L0,0.5835 L0,0.5059 Z M0,0.6065 L0.0901,0.6065 L0.0901,0.6841 L0,0.6841 L0,0.6065 Z M0,0.711 L0.0901,0.711 L0.0901,0.7886 L0,0.7886 L0,0.711 Z M0,0.8154 L0.0901,0.8154 L0.0901,0.8926 L0,0.8926 L0,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.5884,0.0126 L0.5884,0.0776 L0.5129,0.0776 L0.5129,0.0126 L0.5884,0.0126 Z M0.5957,0 L0.5056,0 Q0.5027,0,0.5005,0.0021 T0.4983,0.0063 L0.4983,0.0839 Q0.4983,0.0864,0.5007,0.0883 T0.5056,0.0902 L0.5957,0.0902 Q0.5986,0.0902,0.6008,0.0881 T0.603,0.0839 L0.603,0.0063 Q0.603,0.0038,0.6006,0.0019 T0.5957,0 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.0901,0.0084 L0.0901,0.0818 L0.0049,0.0818 L0.0049,0.0084 L0.0901,0.0084 Z M0.0925,0.0042 L0.0024,0.0042 Q0,0.0042,0,0.0063 L0,0.0839 Q0,0.086,0.0024,0.086 L0.0925,0.086 Q0.095,0.086,0.095,0.0839 L0.095,0.0063 Q0.095,0.0042,0.0925,0.0042 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.34,0.0063 L0.2499,0.0063 L0.2499,0.0839 L0.34,0.0839 L0.34,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.4691,0.0063 L0.379,0.0063 L0.379,0.0839 L0.4691,0.0839 L0.4691,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.7311,0.0063 L0.641,0.0063 L0.641,0.0839 L0.7311,0.0839 L0.7311,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M0.8626,0.0063 L0.7725,0.0063 L0.7725,0.0839 L0.8626,0.0839 L0.8626,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M1,0.0063 L0.9099,0.0063 L0.9099,0.0839 L1,0.0839 L1,0.0063 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.5913,0.9224 L0.5913,0.9958 L0.5061,0.9958 L0.5061,0.9224 L0.5913,0.9224 Z M0.5938,0.9182 L0.5037,0.9182 Q0.5012,0.9182,0.5012,0.9203 L0.5012,0.9979 Q0.5012,1,0.5037,1 L0.5938,1 Q0.5962,1,0.5962,0.9979 L0.5962,0.9203 Q0.5962,0.9182,0.5938,0.9182 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M0.8626,0.9203 L0.7725,0.9203 L0.7725,0.9979 L0.8626,0.9979 L0.8626,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M1,0.9203 L0.9099,0.9203 L0.9099,0.9979 L1,0.9979 L1,0.9203 Z M0.0901,0.1158 L0.0901,0.1888 L0.0049,0.1888 L0.0049,0.1158 L0.0901,0.1158 Z M0.0925,0.1116 L0.0024,0.1116 Q0,0.1116,0,0.1137 L0,0.1909 Q0,0.193,0.0024,0.193 L0.0925,0.193 Q0.095,0.193,0.095,0.1909 L0.095,0.1137 Q0.095,0.1116,0.0925,0.1116 Z M0.2148,0.6086 L0.2148,0.682 L0.1296,0.682 L0.1296,0.6086 L0.2148,0.6086 Z M0.2172,0.6044 L0.1271,0.6044 Q0.1247,0.6044,0.1247,0.6065 L0.1247,0.6841 Q0.1247,0.6862,0.1271,0.6862 L0.2172,0.6862 Q0.2197,0.6862,0.2197,0.6841 L0.2197,0.6065 Q0.2197,0.6044,0.2172,0.6044 Z M0.34,0.1137 L0.2499,0.1137 L0.2499,0.1909 L0.34,0.1909 L0.34,0.1137 Z M0.3376,0.4102 L0.3376,0.4836 L0.2523,0.4836 L0.2523,0.4102 L0.3376,0.4102 Z M0.34,0.406 L0.2499,0.406 Q0.2474,0.406,0.2474,0.4081 L0.2474,0.4857 Q0.2474,0.4878,0.2499,0.4878 L0.34,0.4878 Q0.3424,0.4878,0.3424,0.4857 L0.3424,0.4081 Q0.3424,0.406,0.34,0.406 Z M0.3376,0.7131 L0.3376,0.7865 L0.2523,0.7865 L0.2523,0.7131 L0.3376,0.7131 Z M0.34,0.7089 L0.2499,0.7089 Q0.2474,0.7089,0.2474,0.711 L0.2474,0.7886 Q0.2474,0.7907,0.2499,0.7907 L0.34,0.7907 Q0.3424,0.7907,0.3424,0.7886 L0.3424,0.711 Q0.3424,0.7089,0.34,0.7089 Z M0.4593,0.2227 L0.4593,0.2836 L0.3887,0.2836 L0.3887,0.2227 L0.4593,0.2227 Z M0.4691,0.206 L0.379,0.206 Q0.3746,0.206,0.3719,0.2087 T0.3692,0.2143 L0.3692,0.2919 Q0.3692,0.2957,0.3724,0.298 T0.379,0.3003 L0.4691,0.3003 Q0.4735,0.3003,0.4761,0.2976 T0.4788,0.2919 L0.4788,0.2143 Q0.4788,0.211,0.4756,0.2085 T0.4691,0.206 Z M0.4593,0.3184 L0.4593,0.3792 L0.3887,0.3792 L0.3887,0.3184 L0.4593,0.3184 Z M0.4691,0.3016 L0.379,0.3016 Q0.3746,0.3016,0.3719,0.3043 T0.3692,0.31 L0.3692,0.3876 Q0.3692,0.3914,0.3724,0.3937 T0.379,0.396 L0.4691,0.396 Q0.4735,0.396,0.4761,0.3932 T0.4788,0.3876 L0.4788,0.31 Q0.4788,0.3062,0.4756,0.3039 T0.4691,0.3016 Z M0.4691,0.4081 L0.379,0.4081 L0.379,0.4857 L0.4691,0.4857 L0.4691,0.4081 Z M0.4691,0.5059 L0.379,0.5059 L0.379,0.5835 L0.4691,0.5835 L0.4691,0.5059 Z M0.4593,0.6149 L0.4593,0.6758 L0.3887,0.6758 L0.3887,0.6149 L0.4593,0.6149 Z M0.4691,0.5982 L0.379,0.5982 Q0.3746,0.5982,0.3719,0.6009 T0.3692,0.6065 L0.3692,0.6841 Q0.3692,0.6879,0.3724,0.6902 T0.379,0.6925 L0.4691,0.6925 Q0.4735,0.6925,0.4761,0.6898 T0.4788,0.6841 L0.4788,0.6065 Q0.4788,0.6028,0.4756,0.6005 T0.4691,0.5982 Z M0.5938,0.1137 L0.5037,0.1137 L0.5037,0.1909 L0.5938,0.1909 L0.5938,0.1137 Z M0.5938,0.2143 L0.5037,0.2143 L0.5037,0.2919 L0.5938,0.2919 L0.5938,0.2143 Z M0.5816,0.4186 L0.5816,0.4753 L0.5158,0.4753 L0.5158,0.4186 L0.5816,0.4186 Z M0.5938,0.3977 L0.5037,0.3977 Q0.4983,0.3977,0.4949,0.401 T0.4915,0.4081 L0.4915,0.4857 Q0.4915,0.4904,0.4954,0.4933 T0.5037,0.4962 L0.5938,0.4962 Q0.5991,0.4962,0.6025,0.4929 T0.6059,0.4857 L0.6059,0.4081 Q0.6059,0.4035,0.602,0.4006 T0.5938,0.3977 Z M0.5938,0.5059 L0.5037,0.5059 L0.5037,0.5835 L0.5938,0.5835 L0.5938,0.5059 Z M0.5913,0.7131 L0.5913,0.7865 L0.5061,0.7865 L0.5061,0.7131 L0.5913,0.7131 Z M0.5938,0.7089 L0.5037,0.7089 Q0.5012,0.7089,0.5012,0.711 L0.5012,0.7886 Q0.5012,0.7907,0.5037,0.7907 L0.5938,0.7907 Q0.5962,0.7907,0.5962,0.7886 L0.5962,0.711 Q0.5962,0.7089,0.5938,0.7089 Z M0.7311,0.1137 L0.641,0.1137 L0.641,0.1909 L0.7311,0.1909 L0.7311,0.1137 Z M0.7311,0.2143 L0.641,0.2143 L0.641,0.2919 L0.7311,0.2919 L0.7311,0.2143 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.31 L0.641,0.31 L0.641,0.3876 L0.7311,0.3876 L0.7311,0.31 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.7311,0.4081 L0.641,0.4081 L0.641,0.4857 L0.7311,0.4857 L0.7311,0.4081 Z M0.7311,0.5059 L0.641,0.5059 L0.641,0.5835 L0.7311,0.5835 L0.7311,0.5059 Z M0.7311,0.711 L0.641,0.711 L0.641,0.7886 L0.7311,0.7886 L0.7311,0.711 Z M0.7311,0.8154 L0.641,0.8154 L0.641,0.8926 L0.7311,0.8926 L0.7311,0.8154 Z M0.8626,0.1137 L0.7725,0.1137 L0.7725,0.1909 L0.8626,0.1909 L0.8626,0.1137 Z M0.8626,0.2143 L0.7725,0.2143 L0.7725,0.2919 L0.8626,0.2919 L0.8626,0.2143 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.31 L0.7725,0.31 L0.7725,0.3876 L0.8626,0.3876 L0.8626,0.31 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M0.8626,0.4081 L0.7725,0.4081 L0.7725,0.4857 L0.8626,0.4857 L0.8626,0.4081 Z M0.8626,0.5059 L0.7725,0.5059 L0.7725,0.5835 L0.8626,0.5835 L0.8626,0.5059 Z M0.8626,0.6065 L0.7725,0.6065 L0.7725,0.6841 L0.8626,0.6841 L0.8626,0.6065 Z M0.8626,0.711 L0.7725,0.711 L0.7725,0.7886 L0.8626,0.7886 L0.8626,0.711 Z M0.8626,0.8154 L0.7725,0.8154 L0.7725,0.8926 L0.8626,0.8926 L0.8626,0.8154 Z M1,0.1137 L0.9099,0.1137 L0.9099,0.1909 L1,0.1909 L1,0.1137 Z M1,0.2143 L0.9099,0.2143 L0.9099,0.2919 L1,0.2919 L1,0.2143 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.31 L0.9099,0.31 L0.9099,0.3876 L1,0.3876 L1,0.31 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z M1,0.4081 L0.9099,0.4081 L0.9099,0.4857 L1,0.4857 L1,0.4081 Z M1,0.5059 L0.9099,0.5059 L0.9099,0.5835 L1,0.5835 L1,0.5059 Z M1,0.6065 L0.9099,0.6065 L0.9099,0.6841 L1,0.6841 L1,0.6065 Z M1,0.711 L0.9099,0.711 L0.9099,0.7886 L1,0.7886 L1,0.711 Z M1,0.8154 L0.9099,0.8154 L0.9099,0.8926 L1,0.8926 L1,0.8154 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.6529,0.018 L0.6529,0.112 L0.7724,0.112 L0.7724,0.018 L0.6529,0.018 Z M0.6411,0 L0.7837,0 Q0.7873,0,0.7902,0.0015 T0.7943,0.005 T0.7956,0.0092 L0.7956,0.1208 Q0.7956,0.125,0.7917,0.1275 T0.7837,0.13 L0.6411,0.13 Q0.6359,0.13,0.6326,0.1271 T0.6292,0.1208 L0.6292,0.0092 Q0.6292,0.005,0.6331,0.0025 T0.6411,0 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.4325,0.0143 L0.4325,0.1158 L0.5628,0.1158 L0.5628,0.0143 L0.4325,0.0143 Z M0.4264,0.0042 L0.5695,0.0042 Q0.5721,0.0042,0.5739,0.0057 T0.5757,0.0092 L0.5757,0.1208 Q0.5757,0.1221,0.5752,0.1231 T0.5736,0.1248 T0.5716,0.1256 T0.5695,0.1258 L0.4264,0.1258 Q0.4238,0.1258,0.422,0.1244 T0.4202,0.1208 L0.4202,0.0092 Q0.4202,0.008,0.4207,0.0069 T0.4222,0.0052 T0.4243,0.0044 T0.4264,0.0042 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0.2178,0.0092 L0.3605,0.0092 L0.3605,0.1208 L0.2178,0.1208 L0.2178,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0,0.0092 L0.1432,0.0092 L0.1432,0.1208 L0,0.1208 L0,0.0092 Z M0.8574,0.3217 L0.8574,0.4098 L0.9691,0.4098 L0.9691,0.3217 L0.8574,0.3217 Z M0.8419,0.2978 L0.9846,0.2978 Q0.9892,0.2978,0.9928,0.2997 T0.9982,0.3043 T1,0.31 L1,0.4216 Q1,0.427,0.9951,0.4304 T0.9846,0.4337 L0.8419,0.4337 Q0.8352,0.4337,0.8308,0.4299 T0.8265,0.4216 L0.8265,0.31 Q0.8265,0.3062,0.829,0.3035 T0.835,0.2993 T0.8419,0.2978 Z M0.8574,0.888 L0.8574,0.9757 L0.9691,0.9757 L0.9691,0.888 L0.8574,0.888 Z M0.8419,0.8637 L0.9846,0.8637 Q0.9892,0.8637,0.9928,0.8658 T0.9982,0.8706 T1,0.8758 L1,0.9878 Q1,0.9929,0.9951,0.9964 T0.9846,1 L0.8419,1 Q0.8352,1,0.8308,0.996 T0.8265,0.9878 L0.8265,0.8758 Q0.8265,0.8708,0.8314,0.8672 T0.8419,0.8637 Z M0.6509,0.169 L0.6509,0.2706 L0.7806,0.2706 L0.7806,0.169 L0.6509,0.169 Z M0.6442,0.159 L0.7868,0.159 Q0.7899,0.159,0.7917,0.1604 T0.7935,0.164 L0.7935,0.2756 Q0.7935,0.2781,0.7915,0.2796 T0.7868,0.281 L0.6442,0.281 Q0.6416,0.281,0.6395,0.2794 T0.6375,0.2756 L0.6375,0.164 Q0.6375,0.1619,0.6398,0.1604 T0.6442,0.159 Z M0.6632,0.6044 L0.6632,0.6858 L0.7678,0.6858 L0.7678,0.6044 L0.6632,0.6044 Z M0.6442,0.5742 L0.7868,0.5742 Q0.7951,0.5742,0.8007,0.5791 T0.8064,0.5893 L0.8064,0.7013 Q0.8064,0.7076,0.8002,0.712 T0.7868,0.7164 L0.6442,0.7164 Q0.6359,0.7164,0.6305,0.7114 T0.6251,0.7013 L0.6251,0.5893 Q0.6251,0.5847,0.6282,0.5812 T0.6357,0.5759 T0.6442,0.5742 Z M0.4264,0.164 L0.5695,0.164 L0.5695,0.2756 L0.4264,0.2756 L0.4264,0.164 Z M0.4325,0.315 L0.4325,0.4165 L0.5628,0.4165 L0.5628,0.315 L0.4325,0.315 Z M0.4264,0.3049 L0.5695,0.3049 Q0.5721,0.3049,0.5739,0.3064 T0.5757,0.31 L0.5757,0.4216 Q0.5757,0.4237,0.5736,0.4251 T0.5695,0.4266 L0.4264,0.4266 Q0.4238,0.4266,0.422,0.4251 T0.4202,0.4216 L0.4202,0.31 Q0.4202,0.3087,0.4207,0.3077 T0.4222,0.306 T0.4243,0.3052 T0.4264,0.3049 Z M0.4264,0.4476 L0.5695,0.4476 L0.5695,0.5596 L0.4264,0.5596 L0.4264,0.4476 Z M0.4392,0.7408 L0.4392,0.8326 L0.5561,0.8326 L0.5561,0.7408 L0.4392,0.7408 Z M0.4264,0.7206 L0.5695,0.7206 Q0.5747,0.7206,0.5783,0.724 T0.5819,0.7307 L0.5819,0.8427 Q0.5819,0.8469,0.5778,0.8498 T0.5695,0.8528 L0.4264,0.8528 Q0.4207,0.8528,0.4171,0.8496 T0.4135,0.8427 L0.4135,0.7307 Q0.4135,0.7265,0.4176,0.7236 T0.4264,0.7206 Z M0.2178,0.164 L0.3605,0.164 L0.3605,0.2756 L0.2178,0.2756 L0.2178,0.164 Z M0.2178,0.31 L0.3605,0.31 L0.3605,0.4216 L0.2178,0.4216 L0.2178,0.31 Z M0.2178,0.5893 L0.3605,0.5893 L0.3605,0.7013 L0.2178,0.7013 L0.2178,0.5893 Z M0.2178,0.7307 L0.3605,0.7307 L0.3605,0.8427 L0.2178,0.8427 L0.2178,0.7307 Z M0.2178,0.8758 L0.3605,0.8758 L0.3605,0.9878 L0.2178,0.9878 L0.2178,0.8758 Z M0,0.164 L0.1432,0.164 L0.1432,0.2756 L0,0.2756 L0,0.164 Z M0,0.31 L0.1432,0.31 L0.1432,0.4216 L0,0.4216 L0,0.31 Z M0,0.4476 L0.1432,0.4476 L0.1432,0.5596 L0,0.5596 L0,0.4476 Z M0,0.5893 L0.1432,0.5893 L0.1432,0.7013 L0,0.7013 L0,0.5893 Z M0,0.7307 L0.1432,0.7307 L0.1432,0.8427 L0,0.8427 L0,0.7307 Z M0,0.8758 L0.1432,0.8758 L0.1432,0.9878 L0,0.9878 L0,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.3476,0.018 L0.3476,0.112 L0.2276,0.112 L0.2276,0.018 L0.3476,0.018 Z M0.3594,0 L0.2163,0 Q0.2132,0,0.2104,0.0015 T0.2062,0.005 T0.2049,0.0092 L0.2049,0.1208 Q0.2049,0.1237,0.2067,0.1258 T0.2111,0.129 T0.2163,0.13 L0.3594,0.13 Q0.3641,0.13,0.3674,0.1271 T0.3708,0.1208 L0.3708,0.0092 Q0.3708,0.005,0.3669,0.0025 T0.3594,0 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.5675,0.0143 L0.5675,0.1158 L0.4377,0.1158 L0.4377,0.0143 L0.5675,0.0143 Z M0.5736,0.0042 L0.431,0.0042 Q0.4284,0.0042,0.4264,0.0057 T0.4243,0.0092 L0.4243,0.1208 Q0.4243,0.1221,0.4251,0.1231 T0.4269,0.1248 T0.4289,0.1256 T0.431,0.1258 L0.5736,0.1258 Q0.5767,0.1258,0.5785,0.1244 T0.5803,0.1208 L0.5803,0.0092 Q0.5803,0.008,0.5798,0.0069 T0.5783,0.0052 T0.5762,0.0044 T0.5736,0.0042 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M0.7827,0.0092 L0.6395,0.0092 L0.6395,0.1208 L0.7827,0.1208 L0.7827,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M1,0.0092 L0.8574,0.0092 L0.8574,0.1208 L1,0.1208 L1,0.0092 Z M0.1432,0.3217 L0.1432,0.4098 L0.0309,0.4098 L0.0309,0.3217 L0.1432,0.3217 Z M0.1586,0.2978 L0.0154,0.2978 Q0.0088,0.2978,0.0044,0.3016 T0,0.31 L0,0.4216 Q0,0.427,0.0049,0.4304 T0.0154,0.4337 L0.1586,0.4337 Q0.1648,0.4337,0.1694,0.4299 T0.174,0.4216 L0.174,0.31 Q0.174,0.3062,0.1715,0.3035 T0.1653,0.2993 T0.1586,0.2978 Z M0.1432,0.888 L0.1432,0.9757 L0.0309,0.9757 L0.0309,0.888 L0.1432,0.888 Z M0.1586,0.8637 L0.0154,0.8637 Q0.0108,0.8637,0.0072,0.8658 T0.0018,0.8706 T0,0.8758 L0,0.9878 Q0,0.9929,0.0049,0.9964 T0.0154,1 L0.1586,1 Q0.1648,1,0.1694,0.996 T0.174,0.9878 L0.174,0.8758 Q0.174,0.8725,0.1715,0.8695 T0.1653,0.8651 T0.1586,0.8637 Z M0.3496,0.169 L0.3496,0.2706 L0.2194,0.2706 L0.2194,0.169 L0.3496,0.169 Z M0.3563,0.159 L0.2132,0.159 Q0.2106,0.159,0.2088,0.1604 T0.207,0.164 L0.207,0.2756 Q0.207,0.2781,0.2091,0.2796 T0.2132,0.281 L0.3563,0.281 Q0.3589,0.281,0.3607,0.2794 T0.3625,0.2756 L0.3625,0.164 Q0.3625,0.1619,0.3605,0.1604 T0.3563,0.159 Z M0.3368,0.6044 L0.3368,0.6858 L0.2327,0.6858 L0.2327,0.6044 L0.3368,0.6044 Z M0.3563,0.5742 L0.2132,0.5742 Q0.2049,0.5742,0.1993,0.5791 T0.1936,0.5893 L0.1936,0.7013 Q0.1936,0.7076,0.2001,0.712 T0.2132,0.7164 L0.3563,0.7164 Q0.3641,0.7164,0.3697,0.7114 T0.3754,0.7013 L0.3754,0.5893 Q0.3754,0.5847,0.3723,0.5812 T0.3648,0.5759 T0.3563,0.5742 Z M0.5736,0.164 L0.431,0.164 L0.431,0.2756 L0.5736,0.2756 L0.5736,0.164 Z M0.5675,0.315 L0.5675,0.4165 L0.4377,0.4165 L0.4377,0.315 L0.5675,0.315 Z M0.5736,0.3049 L0.431,0.3049 Q0.4284,0.3049,0.4264,0.3064 T0.4243,0.31 L0.4243,0.4216 Q0.4243,0.4237,0.4266,0.4251 T0.431,0.4266 L0.5736,0.4266 Q0.5767,0.4266,0.5785,0.4251 T0.5803,0.4216 L0.5803,0.31 Q0.5803,0.3087,0.5798,0.3077 T0.5783,0.306 T0.5762,0.3052 T0.5736,0.3049 Z M0.5736,0.4476 L0.431,0.4476 L0.431,0.5596 L0.5736,0.5596 L0.5736,0.4476 Z M0.5613,0.7408 L0.5613,0.8326 L0.4439,0.8326 L0.4439,0.7408 L0.5613,0.7408 Z M0.5736,0.7206 L0.431,0.7206 Q0.4253,0.7206,0.4217,0.724 T0.4181,0.7307 L0.4181,0.8427 Q0.4181,0.8469,0.4222,0.8498 T0.431,0.8528 L0.5736,0.8528 Q0.5778,0.8528,0.5808,0.8511 T0.5855,0.8471 T0.587,0.8427 L0.587,0.7307 Q0.587,0.7265,0.5826,0.7236 T0.5736,0.7206 Z M0.7827,0.164 L0.6395,0.164 L0.6395,0.2756 L0.7827,0.2756 L0.7827,0.164 Z M0.7827,0.31 L0.6395,0.31 L0.6395,0.4216 L0.7827,0.4216 L0.7827,0.31 Z M0.7827,0.5893 L0.6395,0.5893 L0.6395,0.7013 L0.7827,0.7013 L0.7827,0.5893 Z M0.7827,0.7307 L0.6395,0.7307 L0.6395,0.8427 L0.7827,0.8427 L0.7827,0.7307 Z M0.7827,0.8758 L0.6395,0.8758 L0.6395,0.9878 L0.7827,0.9878 L0.7827,0.8758 Z M1,0.164 L0.8574,0.164 L0.8574,0.2756 L1,0.2756 L1,0.164 Z M1,0.31 L0.8574,0.31 L0.8574,0.4216 L1,0.4216 L1,0.31 Z M1,0.4476 L0.8574,0.4476 L0.8574,0.5596 L1,0.5596 L1,0.4476 Z M1,0.5893 L0.8574,0.5893 L0.8574,0.7013 L1,0.7013 L1,0.5893 Z M1,0.7307 L0.8574,0.7307 L0.8574,0.8427 L1,0.8427 L1,0.7307 Z M1,0.8758 L0.8574,0.8758 L0.8574,0.9878 L1,0.9878 L1,0.8758 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0C8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0008,0.9979 Q0.0008,1,0.0032,1 Q0.0482,1,0.0602,0.9975 Q0.0667,0.9963,0.0847,0.9917 T0.1084,0.9859 Q0.1124,0.9851,0.1221,0.9851 L0.1253,0.9851 L0.1285,0.9851 Q0.1518,0.9851,0.1655,0.9809 Q0.1695,0.9801,0.1731,0.9788 T0.1791,0.9766 T0.1839,0.9747 T0.1888,0.9732 L0.1936,0.972 T0.1988,0.9712 T0.2048,0.971 L0.2096,0.971 Q0.2201,0.9714,0.2233,0.9714 T0.2345,0.9693 Q0.2386,0.9685,0.2502,0.9674 T0.2715,0.966 L0.2811,0.9656 Q0.2916,0.9647,0.2916,0.9573 Q0.2916,0.954,0.2892,0.9515 T0.2819,0.9486 Q0.2755,0.9482,0.2683,0.9482 Q0.2643,0.9482,0.2582,0.9484 T0.2498,0.9486 Q0.2426,0.9486,0.2402,0.9473 Q0.2386,0.9469,0.2317,0.943 T0.2161,0.937 Q0.2104,0.9357,0.1992,0.933 T0.1831,0.9291 Q0.1807,0.9287,0.1783,0.9285 T0.1739,0.928 T0.1703,0.9276 T0.1675,0.9272 T0.1655,0.9266 T0.1639,0.9253 Q0.1598,0.9216,0.1462,0.9216 L0.143,0.9216 L0.1398,0.9216 L0.1365,0.9216 Q0.1197,0.9195,0.1197,0.9154 L0.1197,0.9154 Q0.1205,0.9121,0.1373,0.9088 T0.1703,0.9054 Q0.1791,0.9054,0.1863,0.904 T0.1984,0.9011 T0.2064,0.8992 Q0.2402,0.8967,0.2506,0.8934 Q0.2538,0.8926,0.2602,0.8899 T0.2707,0.8872 Q0.2715,0.8872,0.2731,0.8876 Q0.2795,0.8884,0.2884,0.8884 Q0.3068,0.8884,0.3092,0.8826 L0.3092,0.8797 Q0.3092,0.8772,0.3076,0.8747 T0.3044,0.8706 T0.3028,0.8681 Q0.3076,0.8656,0.3237,0.8656 Q0.3317,0.8656,0.3622,0.8623 Q0.3655,0.8623,0.3867,0.8617 T0.4217,0.8602 Q0.4241,0.8598,0.4289,0.8598 L0.4345,0.8598 L0.441,0.8598 Q0.4578,0.8598,0.4667,0.8586 Q0.4739,0.8573,0.4851,0.8567 T0.5004,0.8552 Q0.5012,0.8552,0.5108,0.855 T0.5269,0.853 T0.5333,0.8461 Q0.5333,0.8445,0.5325,0.8432 T0.5309,0.8409 T0.5289,0.8391 T0.5261,0.8378 L0.5229,0.837 T0.5185,0.8362 T0.5133,0.8355 T0.5076,0.8349 T0.502,0.8341 Q0.4932,0.8324,0.4859,0.8324 Q0.4827,0.8324,0.4787,0.8328 T0.4731,0.8333 Q0.4707,0.8333,0.4683,0.8324 Q0.4482,0.825,0.4394,0.825 Q0.4369,0.825,0.4345,0.8254 Q0.4225,0.827,0.4153,0.827 Q0.4088,0.827,0.4064,0.8258 Q0.3976,0.8204,0.3751,0.8204 Q0.3703,0.8204,0.3667,0.8214 T0.3622,0.8225 Q0.3598,0.8225,0.3558,0.82 Q0.351,0.8175,0.3402,0.8167 T0.3177,0.8156 T0.3028,0.8146 L0.2956,0.8121 T0.2871,0.8094 T0.2771,0.8073 T0.2635,0.8063 Q0.261,0.8063,0.2586,0.8067 Q0.2378,0.8071,0.2273,0.8071 Q0.2072,0.8071,0.2024,0.8051 Q0.1976,0.8034,0.1932,0.8026 T0.1867,0.8013 T0.1847,0.8001 L0.1847,0.7993 Q0.1855,0.7984,0.1855,0.7978 T0.1859,0.7966 T0.1867,0.7959 T0.188,0.7955 T0.1896,0.7951 T0.1916,0.7949 T0.1944,0.7945 T0.1984,0.7941 T0.2032,0.7939 Q0.212,0.7926,0.2325,0.7918 T0.2562,0.7905 Q0.2691,0.7893,0.2787,0.7847 Q0.2835,0.7827,0.2968,0.7791 T0.3149,0.7756 Q0.3189,0.7756,0.3305,0.7733 T0.3446,0.771 L0.3454,0.771 Q0.3462,0.771,0.3498,0.7721 T0.3574,0.774 T0.3655,0.7748 Q0.3703,0.7748,0.3743,0.7731 T0.3823,0.7708 T0.3916,0.77 T0.3992,0.7694 Q0.4008,0.7694,0.4076,0.7688 T0.4205,0.7675 L0.4305,0.7665 Q0.4345,0.7657,0.4402,0.7617 T0.4458,0.7545 Q0.4458,0.7503,0.4353,0.7487 Q0.4297,0.7478,0.4209,0.7462 T0.4044,0.7433 T0.3904,0.7416 L0.3847,0.7416 Q0.3807,0.7416,0.3747,0.7422 T0.3663,0.7428 T0.3606,0.7424 Q0.3582,0.742,0.3562,0.7418 T0.3522,0.7412 T0.3482,0.7406 T0.3446,0.7401 T0.341,0.7397 T0.3373,0.7393 T0.3341,0.7391 L0.3293,0.7391 Q0.3277,0.7395,0.3253,0.7395 Q0.3205,0.7395,0.3052,0.7387 T0.2835,0.7379 Q0.2755,0.7379,0.253,0.7325 Q0.2506,0.7316,0.2462,0.731 T0.2382,0.7296 T0.2305,0.7271 T0.2181,0.7234 T0.2048,0.7196 T0.2,0.7155 Q0.2,0.7142,0.2016,0.713 Q0.208,0.7059,0.2285,0.6978 T0.2618,0.6898 Q0.2739,0.6898,0.2831,0.6848 T0.2956,0.6794 Q0.3028,0.6786,0.3289,0.6765 T0.3566,0.674 Q0.3582,0.674,0.3855,0.6723 T0.4406,0.6688 T0.4755,0.6653 Q0.5004,0.6607,0.5124,0.6599 L0.5165,0.6599 Q0.5213,0.6599,0.5277,0.6605 T0.5373,0.6611 Q0.543,0.6611,0.5494,0.6599 Q0.592,0.6524,0.6,0.6524 Q0.6064,0.6524,0.61,0.6499 T0.6161,0.6474 Q0.6177,0.6474,0.6261,0.6495 T0.6418,0.6516 L0.6482,0.6516 Q0.653,0.6512,0.6651,0.6506 T0.6876,0.6493 T0.7084,0.6477 T0.7229,0.645 Q0.7269,0.6437,0.7333,0.6437 Q0.7373,0.6437,0.7458,0.6443 T0.7574,0.645 Q0.7614,0.645,0.7631,0.6445 T0.7655,0.6441 Q0.7671,0.6441,0.7723,0.6448 T0.7823,0.6454 Q0.788,0.6454,0.7952,0.6445 Q0.8233,0.6408,0.8723,0.6367 Q0.9012,0.6342,0.9092,0.6342 L0.9165,0.6342 L0.9205,0.6342 Q0.9277,0.6342,0.9382,0.6323 T0.9526,0.6304 Q0.9534,0.6304,0.9594,0.6307 T0.9695,0.6309 Q0.9976,0.6309,0.9992,0.6234 Q1,0.6201,1,0.618 Q1,0.6089,0.9775,0.608 Q0.9703,0.6076,0.9582,0.6076 Q0.9518,0.6076,0.9394,0.6078 T0.9213,0.608 Q0.9036,0.608,0.8972,0.6072 Q0.894,0.6068,0.8871,0.6058 T0.8751,0.6039 T0.8627,0.6024 T0.8506,0.6018 L0.8474,0.6018 Q0.841,0.6022,0.8281,0.6041 T0.8112,0.606 Q0.8096,0.606,0.808,0.6056 Q0.7783,0.6002,0.7647,0.6002 Q0.7598,0.6002,0.7454,0.6006 T0.7261,0.601 Q0.7221,0.601,0.7145,0.6022 T0.7036,0.6035 Q0.6996,0.6035,0.6964,0.6022 Q0.6723,0.5902,0.6442,0.5902 Q0.6426,0.5902,0.6386,0.5904 T0.6337,0.5906 Q0.6273,0.5906,0.6249,0.5894 L0.6177,0.5856 T0.6116,0.5838 T0.6016,0.5825 T0.5855,0.5823 Q0.5719,0.5823,0.5574,0.5798 T0.5373,0.5774 L0.5341,0.5774 Q0.5293,0.5778,0.5213,0.5786 T0.51,0.5794 Q0.5036,0.5794,0.4988,0.5769 Q0.4932,0.574,0.4771,0.574 Q0.4723,0.574,0.4631,0.5745 T0.4498,0.5749 Q0.4418,0.5749,0.4394,0.5736 Q0.4353,0.5724,0.4305,0.5715 T0.4225,0.5707 T0.4145,0.5705 T0.4056,0.5699 Q0.4008,0.5691,0.398,0.5689 T0.394,0.5689 T0.3908,0.5686 T0.3855,0.5674 Q0.3831,0.567,0.3811,0.5662 T0.3779,0.5645 T0.3743,0.563 T0.3695,0.5624 Q0.3655,0.5624,0.3594,0.5635 T0.3494,0.5645 T0.3406,0.5635 T0.3325,0.5624 Q0.3309,0.5624,0.3301,0.5628 L0.3141,0.5628 Q0.2635,0.5628,0.2506,0.5612 Q0.2474,0.5608,0.2434,0.5608 Q0.2402,0.5608,0.2349,0.561 T0.2273,0.5612 Q0.2209,0.5612,0.2177,0.5595 Q0.2145,0.557,0.2145,0.5558 Q0.2169,0.5537,0.2345,0.5521 Q0.2876,0.5475,0.3028,0.5425 Q0.3068,0.5413,0.3149,0.5396 T0.3309,0.5367 T0.3478,0.5338 T0.3606,0.5309 Q0.3631,0.5305,0.3755,0.5259 T0.3968,0.5214 Q0.3992,0.5214,0.4024,0.5218 T0.4096,0.5222 Q0.4161,0.5222,0.4213,0.5209 T0.4313,0.5185 T0.4402,0.5172 Q0.4418,0.5168,0.447,0.5168 L0.4558,0.5168 T0.4639,0.5162 T0.4707,0.5141 T0.4731,0.5102 Q0.4731,0.5089,0.4723,0.5081 Q0.4699,0.5019,0.4627,0.4994 T0.4369,0.4965 Q0.4273,0.4961,0.4193,0.4946 T0.4048,0.4915 T0.3952,0.4894 Q0.392,0.4886,0.388,0.4886 Q0.3847,0.4886,0.3775,0.4892 T0.3647,0.4898 Q0.3598,0.4898,0.355,0.4894 Q0.3165,0.4861,0.3141,0.4853 Q0.2779,0.4774,0.2715,0.4774 Q0.2699,0.4774,0.2683,0.4776 T0.2627,0.4778 Q0.2498,0.4778,0.2281,0.4762 Q0.2241,0.4749,0.2233,0.4737 Q0.2249,0.472,0.2321,0.4708 Q0.2402,0.4695,0.2554,0.4695 L0.2675,0.4695 L0.2795,0.4695 Q0.294,0.4695,0.2996,0.4679 Q0.3141,0.4629,0.3373,0.4616 Q0.3414,0.4612,0.3466,0.4606 T0.3582,0.4589 T0.3687,0.4562 T0.3727,0.4525 Q0.3727,0.4509,0.3703,0.4492 Q0.3639,0.4455,0.3474,0.4419 T0.3213,0.4384 L0.3157,0.4384 L0.31,0.4384 Q0.294,0.4384,0.2859,0.4363 Q0.2795,0.4347,0.2691,0.4347 L0.2618,0.4347 L0.2546,0.4347 Q0.2458,0.4347,0.2394,0.4338 Q0.2257,0.4318,0.2193,0.4303 T0.2092,0.4266 T0.2052,0.4224 T0.2024,0.4154 T0.196,0.4052 Q0.1912,0.3994,0.1867,0.3949 T0.1807,0.3884 T0.1791,0.3849 Q0.1791,0.3824,0.1839,0.3745 Q0.1871,0.3687,0.1944,0.3637 T0.2072,0.3561 T0.2221,0.3501 T0.2321,0.3463 Q0.2353,0.3455,0.241,0.3445 T0.2522,0.3428 T0.2639,0.3411 T0.2731,0.3384 T0.2956,0.3351 T0.3197,0.3326 Q0.3213,0.3322,0.3237,0.3322 T0.3325,0.3331 T0.3414,0.3339 Q0.3478,0.3339,0.3518,0.3314 Q0.3606,0.3264,0.3703,0.3264 Q0.3775,0.3264,0.3847,0.3293 Q0.3888,0.331,0.396,0.331 Q0.4024,0.331,0.4116,0.3295 T0.4265,0.3266 T0.4414,0.3227 T0.4514,0.3202 Q0.4578,0.3181,0.4839,0.3152 T0.5112,0.3123 T0.5177,0.3119 T0.5285,0.3111 T0.5398,0.3096 T0.549,0.3065 T0.5526,0.3015 Q0.5526,0.2999,0.5518,0.2982 Q0.547,0.2903,0.5386,0.2883 T0.5165,0.2862 Q0.5116,0.2862,0.5056,0.2866 T0.4972,0.287 Q0.4884,0.287,0.4787,0.2833 Q0.4594,0.2758,0.4265,0.2758 Q0.4169,0.2758,0.4129,0.2766 Q0.4112,0.2771,0.4104,0.2771 Q0.4088,0.2771,0.4056,0.2748 T0.3968,0.2721 Q0.3695,0.2696,0.359,0.2659 Q0.355,0.2646,0.351,0.2646 T0.3426,0.2661 T0.3365,0.2675 T0.3333,0.2659 Q0.3277,0.2605,0.3116,0.2553 T0.2859,0.2501 L0.2843,0.2501 L0.2819,0.2501 Q0.2779,0.2501,0.2723,0.2493 T0.2586,0.2472 T0.2474,0.2455 Q0.1799,0.236,0.1719,0.236 Q0.1663,0.236,0.1606,0.235 T0.1502,0.2316 T0.1454,0.2265 Q0.1454,0.2223,0.1558,0.2173 Q0.1679,0.2115,0.1859,0.2092 T0.2185,0.207 T0.2353,0.2057 Q0.2369,0.2049,0.2502,0.2041 T0.2799,0.2022 T0.302,0.2007 Q0.3084,0.1999,0.3245,0.1954 T0.347,0.1908 Q0.3502,0.1908,0.3534,0.1916 Q0.3663,0.197,0.388,0.197 Q0.404,0.197,0.4088,0.1929 Q0.4096,0.192,0.4108,0.192 T0.4177,0.1945 T0.4277,0.197 T0.4369,0.1949 Q0.4442,0.1908,0.4843,0.1875 Q0.4892,0.1871,0.4968,0.1839 T0.5084,0.1808 L0.5108,0.1808 Q0.5213,0.1825,0.5454,0.1825 Q0.5823,0.1825,0.5992,0.1779 Q0.6096,0.1746,0.6217,0.1746 Q0.6249,0.1746,0.6309,0.1748 T0.6394,0.175 Q0.6434,0.175,0.6466,0.1746 Q0.6474,0.1746,0.6594,0.1738 T0.6787,0.1713 T0.6892,0.1659 Q0.6924,0.1634,0.6924,0.1593 Q0.6924,0.1547,0.6888,0.151 T0.6795,0.1472 Q0.6779,0.1472,0.6763,0.1477 Q0.6699,0.1493,0.6667,0.1493 Q0.661,0.1493,0.6506,0.1456 Q0.6329,0.1394,0.6129,0.1394 Q0.6048,0.1394,0.5992,0.1377 T0.5888,0.136 T0.5803,0.1377 T0.5751,0.1394 Q0.5711,0.1394,0.5639,0.1369 Q0.5365,0.1273,0.5116,0.1273 Q0.4876,0.1273,0.4667,0.1253 Q0.4627,0.1248,0.4542,0.1211 T0.4337,0.1174 L0.4305,0.1174 Q0.4217,0.1178,0.4153,0.119 T0.408,0.1203 Q0.4056,0.1203,0.4,0.117 Q0.3976,0.1153,0.396,0.1136 T0.3932,0.1112 T0.39,0.1099 T0.3847,0.1095 Q0.3799,0.1095,0.3687,0.1103 Q0.355,0.1112,0.3434,0.1141 T0.3301,0.117 Q0.3261,0.117,0.3229,0.1145 Q0.3181,0.1116,0.3052,0.1087 T0.2787,0.1043 T0.2546,0.1029 Q0.2506,0.1029,0.2474,0.1033 Q0.2418,0.1037,0.2349,0.1054 T0.2249,0.107 Q0.2225,0.107,0.2193,0.1066 Q0.2024,0.1024,0.1863,0.1024 Q0.1823,0.1024,0.1562,0.0971 T0.1269,0.0917 T0.1161,0.0896 T0.106,0.0854 Q0.1076,0.0846,0.11,0.0842 Q0.1173,0.0821,0.1261,0.0821 Q0.1301,0.0821,0.1369,0.0825 T0.1462,0.083 Q0.1494,0.083,0.151,0.0825 T0.1831,0.0813 T0.2201,0.0784 T0.243,0.074 T0.2667,0.0718 Q0.2707,0.0718,0.2755,0.0724 T0.2843,0.073 T0.2936,0.0724 T0.3024,0.0705 T0.3072,0.068 T0.3092,0.0657 T0.3108,0.0647 Q0.3116,0.0643,0.3133,0.0643 L0.3157,0.0643 L0.3181,0.0643 Q0.3446,0.0643,0.3446,0.0556 T0.3205,0.0469 L0.3189,0.0469 Q0.3157,0.0469,0.3157,0.0465 Q0.3084,0.0427,0.2835,0.0386 Q0.2739,0.0369,0.2675,0.0342 T0.2538,0.0299 Q0.249,0.029,0.245,0.029 T0.2378,0.0303 T0.2321,0.0315 Q0.2305,0.0315,0.2273,0.0307 Q0.2201,0.0286,0.2004,0.0272 T0.1775,0.0245 Q0.1735,0.0228,0.1663,0.0226 T0.1522,0.0197 T0.1345,0.0145 T0.1124,0.0079 Q0.0996,0.0033,0.0671,0.0044 T0.0297,0.0041 Q0.0169,0,0.0024,0.0017 Q0,0.0021,0,0.0037 Z M0.0064,0.9954 L0.0056,0.0058 Q0.0177,0.005,0.0281,0.0083 Q0.0345,0.01,0.0675,0.0089 T0.1108,0.012 Q0.1221,0.0162,0.1329,0.0187 T0.1498,0.0236 T0.1606,0.0268 T0.1691,0.0274 T0.1759,0.0286 Q0.1807,0.0303,0.2,0.0315 T0.2257,0.0348 Q0.2305,0.0361,0.2337,0.0361 Q0.2361,0.0361,0.2398,0.0348 T0.2466,0.0336 Q0.249,0.0336,0.2522,0.034 Q0.2586,0.0353,0.2655,0.0382 T0.2827,0.0427 Q0.3068,0.0469,0.3124,0.0502 Q0.3157,0.0523,0.3237,0.0523 L0.3277,0.0523 L0.3309,0.0523 Q0.3398,0.0523,0.3398,0.0556 Q0.3398,0.0581,0.3341,0.0587 T0.3205,0.0593 T0.3092,0.0603 T0.3036,0.0643 T0.2932,0.068 Q0.2884,0.0684,0.2843,0.0684 Q0.2811,0.0684,0.2763,0.0678 T0.2667,0.0672 Q0.2586,0.0672,0.2422,0.0697 T0.2177,0.0747 Q0.2137,0.0759,0.1831,0.0767 T0.1494,0.0784 L0.1474,0.0784 T0.1398,0.078 T0.1285,0.0776 Q0.1173,0.0776,0.1084,0.08 Q0.1004,0.0817,0.1004,0.0846 Q0.1004,0.0867,0.104,0.0888 T0.1124,0.0923 T0.1213,0.0948 T0.1269,0.0958 T0.155,0.1014 T0.1863,0.107 Q0.2016,0.107,0.2185,0.1107 Q0.2217,0.1116,0.2257,0.1116 Q0.2289,0.1116,0.2365,0.1099 T0.2482,0.1074 L0.2538,0.1074 Q0.2683,0.1074,0.2912,0.1107 T0.3197,0.1182 Q0.3245,0.1215,0.3301,0.1215 Q0.3333,0.1215,0.3454,0.1184 T0.3687,0.1145 Q0.3735,0.1141,0.3779,0.1139 T0.3843,0.1134 T0.3871,0.1132 Q0.3896,0.1132,0.39,0.1136 T0.392,0.1161 T0.3968,0.1203 Q0.404,0.1248,0.408,0.1248 Q0.4096,0.1248,0.4165,0.1234 T0.4305,0.1215 L0.4337,0.1215 Q0.4442,0.1215,0.4518,0.1251 T0.4659,0.1294 Q0.4876,0.1319,0.5116,0.1319 T0.5622,0.141 Q0.5703,0.1439,0.5751,0.1439 Q0.5791,0.1439,0.5831,0.1423 T0.5888,0.1406 Q0.592,0.1406,0.5944,0.1412 T0.6012,0.1427 T0.6129,0.1435 Q0.6313,0.1435,0.649,0.1497 Q0.6602,0.1535,0.6667,0.1535 Q0.6715,0.1535,0.6779,0.1522 Q0.6787,0.1518,0.6795,0.1518 Q0.6827,0.1518,0.6847,0.1541 T0.6867,0.1593 Q0.6867,0.1618,0.6851,0.1634 Q0.6835,0.1655,0.6775,0.1667 T0.6598,0.169 T0.6458,0.1705 T0.6402,0.1709 Q0.6378,0.1709,0.6321,0.1705 T0.6225,0.1701 Q0.6096,0.1701,0.5968,0.1738 Q0.5823,0.1779,0.5446,0.1779 Q0.5205,0.1779,0.5116,0.1767 Q0.51,0.1763,0.5084,0.1763 Q0.5028,0.1763,0.4944,0.1796 T0.4835,0.1829 L0.4771,0.1833 T0.4659,0.1844 L0.4546,0.1858 T0.443,0.1881 T0.4337,0.1912 Q0.4321,0.1916,0.4305,0.1916 Q0.4273,0.1916,0.4209,0.1895 T0.412,0.1875 Q0.408,0.1875,0.4056,0.19 Q0.4024,0.1925,0.388,0.1925 Q0.3663,0.1925,0.3558,0.1879 Q0.3518,0.1862,0.3462,0.1862 Q0.3373,0.1862,0.3213,0.191 T0.3012,0.1962 Q0.2964,0.1966,0.2799,0.1976 T0.2494,0.1997 T0.2313,0.2024 L0.2313,0.2024 L0.2293,0.2024 L0.2261,0.2024 L0.2217,0.2024 Q0.204,0.2024,0.1851,0.2047 T0.1526,0.2136 Q0.1406,0.2198,0.1406,0.226 Q0.1406,0.2319,0.1518,0.2362 T0.1719,0.2406 Q0.1791,0.2406,0.2466,0.2497 Q0.2498,0.2501,0.2574,0.2516 T0.2711,0.2538 T0.2819,0.2547 L0.2851,0.2547 Q0.2851,0.2543,0.2859,0.2543 Q0.294,0.2543,0.3096,0.2592 T0.3285,0.2684 Q0.3317,0.2721,0.3373,0.2721 Q0.3406,0.2721,0.3462,0.2708 T0.3542,0.2696 Q0.3558,0.2696,0.3574,0.27 Q0.3679,0.2737,0.3968,0.2762 Q0.3984,0.2766,0.4004,0.2779 L0.4044,0.2804 T0.4096,0.2816 Q0.412,0.2816,0.4145,0.2808 Q0.4177,0.2804,0.4249,0.2804 Q0.4586,0.2804,0.4763,0.287 Q0.4867,0.2912,0.4972,0.2912 Q0.5004,0.2912,0.5064,0.2908 T0.5165,0.2903 Q0.5293,0.2903,0.5361,0.2922 T0.547,0.3003 L0.547,0.3011 Q0.547,0.3036,0.5414,0.3049 T0.5249,0.3067 T0.51,0.3082 Q0.5092,0.3082,0.4831,0.3111 T0.4498,0.3161 Q0.408,0.3264,0.3952,0.3264 Q0.3896,0.3264,0.3863,0.3252 Q0.3783,0.3223,0.3703,0.3223 Q0.359,0.3223,0.3494,0.3277 Q0.347,0.3293,0.343,0.3293 Q0.3414,0.3293,0.3353,0.3285 T0.3253,0.3277 T0.3181,0.3285 Q0.3149,0.3289,0.2952,0.3306 T0.2699,0.3347 Q0.2675,0.3364,0.2598,0.3372 T0.2434,0.3395 T0.2297,0.3426 L0.2205,0.3461 T0.2048,0.3523 T0.1908,0.3606 T0.1791,0.3725 Q0.1743,0.3803,0.1743,0.3845 Q0.1743,0.3874,0.1763,0.3901 T0.1827,0.3976 T0.1912,0.4073 T0.198,0.4189 T0.2032,0.4276 T0.2137,0.4326 T0.2386,0.438 Q0.2458,0.4392,0.2562,0.4392 L0.2639,0.4392 L0.2699,0.4392 Q0.2795,0.4392,0.2843,0.4405 Q0.2932,0.443,0.3092,0.443 L0.3157,0.443 L0.3213,0.443 Q0.3293,0.443,0.3458,0.4463 T0.3671,0.4525 Q0.3598,0.4558,0.3373,0.4571 Q0.3124,0.4587,0.298,0.4637 Q0.294,0.465,0.2811,0.465 L0.2703,0.465 L0.2586,0.465 Q0.241,0.465,0.2305,0.4666 Q0.2185,0.4687,0.2185,0.4728 Q0.2185,0.4745,0.2205,0.4764 T0.2241,0.4791 L0.2265,0.4803 L0.2273,0.4803 Q0.2506,0.4824,0.261,0.4824 Q0.2675,0.4824,0.2699,0.482 Q0.2699,0.4815,0.2707,0.4815 Q0.2771,0.4815,0.3124,0.4898 Q0.3173,0.4907,0.3229,0.4913 T0.3386,0.4925 T0.3542,0.4936 T0.3663,0.494 Q0.3711,0.494,0.3787,0.4936 T0.3888,0.4932 Q0.392,0.4932,0.3944,0.4936 T0.4032,0.4959 T0.4181,0.499 T0.4369,0.5006 Q0.449,0.501,0.455,0.5021 T0.4639,0.5048 T0.4675,0.5093 L0.4675,0.5097 Q0.4675,0.5106,0.4663,0.511 T0.4622,0.5116 L0.4566,0.512 T0.4486,0.5124 T0.4402,0.5127 Q0.4345,0.5131,0.4257,0.5153 T0.4096,0.5176 Q0.4064,0.5176,0.4024,0.5172 L0.3968,0.5172 Q0.3863,0.5172,0.3731,0.522 T0.359,0.5268 Q0.355,0.528,0.3317,0.5321 T0.3004,0.5388 Q0.2867,0.5433,0.2337,0.5479 Q0.2096,0.55,0.2096,0.5562 Q0.2096,0.5591,0.2145,0.5628 Q0.2193,0.5662,0.2289,0.5662 Q0.2313,0.5662,0.2373,0.5657 T0.2458,0.5653 L0.2498,0.5653 Q0.2635,0.5674,0.3124,0.5674 Q0.3261,0.5674,0.3301,0.567 L0.3317,0.567 Q0.3341,0.567,0.3394,0.568 T0.3486,0.5691 Q0.3542,0.5691,0.3606,0.5678 T0.3699,0.5666 T0.3759,0.5686 T0.3839,0.5718 T0.3908,0.573 T0.3964,0.5734 T0.4048,0.5742 T0.4165,0.5751 T0.4277,0.5757 T0.4369,0.5778 Q0.4426,0.5794,0.4538,0.5794 Q0.4586,0.5794,0.4679,0.5792 T0.4811,0.579 Q0.4924,0.579,0.4956,0.5807 Q0.502,0.584,0.5108,0.584 L0.5137,0.584 T0.5173,0.5838 L0.5205,0.5834 L0.5237,0.583 L0.5269,0.5825 T0.5305,0.5821 T0.5341,0.5819 L0.5365,0.5819 Q0.5414,0.5819,0.5562,0.5842 T0.5855,0.5865 Q0.5912,0.5865,0.5948,0.5867 T0.6012,0.5869 T0.6064,0.5873 T0.61,0.5877 T0.6133,0.5886 T0.6157,0.5896 L0.6185,0.591 T0.6217,0.5931 Q0.6265,0.5952,0.6369,0.5952 L0.6418,0.5952 L0.6466,0.5952 Q0.6723,0.5952,0.6932,0.606 Q0.698,0.608,0.7044,0.608 Q0.7084,0.608,0.7161,0.6068 T0.7261,0.6056 Q0.7309,0.6056,0.7454,0.6051 T0.7647,0.6047 Q0.7775,0.6047,0.8072,0.6101 Q0.8096,0.6105,0.812,0.6105 Q0.8177,0.6105,0.8297,0.6085 T0.8474,0.606 L0.8506,0.606 Q0.8562,0.606,0.8647,0.607 T0.8831,0.6095 T0.8964,0.6118 Q0.9036,0.6122,0.9221,0.6122 L0.9406,0.6122 L0.959,0.6122 L0.9767,0.6122 Q0.9952,0.613,0.9952,0.6172 Q0.9952,0.6176,0.9944,0.6221 Q0.9936,0.6259,0.9574,0.6259 L0.955,0.6259 L0.9526,0.6259 Q0.9478,0.6259,0.9373,0.628 T0.9205,0.63 L0.9173,0.63 Q0.9133,0.6296,0.9084,0.6296 Q0.9004,0.6296,0.8715,0.6321 Q0.8233,0.6367,0.7944,0.64 Q0.7888,0.6408,0.7839,0.6408 T0.7739,0.6402 T0.7671,0.6396 Q0.7639,0.6396,0.7622,0.64 Q0.7614,0.6404,0.759,0.6404 Q0.7574,0.6404,0.749,0.6398 T0.7357,0.6392 Q0.7261,0.6392,0.7213,0.6412 Q0.7173,0.6425,0.7032,0.6437 T0.6711,0.6458 T0.6474,0.647 Q0.645,0.6474,0.6418,0.6474 Q0.6353,0.6474,0.6277,0.6454 T0.6161,0.6433 Q0.6104,0.6433,0.6072,0.6456 T0.6,0.6479 Q0.5912,0.6479,0.5486,0.6557 Q0.5422,0.657,0.5373,0.657 Q0.5349,0.657,0.5289,0.6564 T0.5173,0.6557 L0.5124,0.6557 Q0.4996,0.6562,0.4739,0.6611 Q0.4675,0.6624,0.4398,0.6645 T0.3851,0.668 T0.3558,0.6698 Q0.355,0.6698,0.3285,0.6721 T0.2948,0.6752 Q0.2892,0.6761,0.2843,0.6786 T0.2747,0.6831 T0.2618,0.6852 Q0.253,0.6852,0.2394,0.6893 T0.2141,0.6993 T0.1968,0.7105 Q0.1944,0.713,0.1944,0.7155 Q0.1944,0.7196,0.2012,0.7229 T0.2177,0.7285 T0.2281,0.7308 Q0.2321,0.7329,0.2365,0.7339 T0.245,0.7356 T0.2514,0.7366 Q0.2522,0.737,0.2554,0.7379 T0.2614,0.7393 T0.2679,0.7406 T0.2755,0.7416 T0.2835,0.742 Q0.29,0.742,0.3048,0.7428 T0.3253,0.7437 L0.3301,0.7437 L0.3333,0.7437 Q0.3341,0.7437,0.3598,0.7466 Q0.3639,0.7474,0.3671,0.7474 T0.3759,0.7466 T0.3855,0.7457 Q0.388,0.7457,0.3904,0.7462 Q0.3984,0.7466,0.4137,0.7495 T0.4349,0.7532 T0.441,0.7557 Q0.441,0.7599,0.4289,0.7619 Q0.4257,0.7628,0.4197,0.7634 T0.4072,0.7644 T0.3984,0.7652 Q0.3968,0.7652,0.3912,0.7655 T0.3811,0.7665 T0.3719,0.7694 Q0.3695,0.7702,0.3655,0.7702 T0.3546,0.7686 T0.3462,0.7665 L0.3446,0.7665 Q0.3406,0.7665,0.3293,0.769 T0.3149,0.7715 Q0.3084,0.7715,0.2952,0.7748 T0.2763,0.781 Q0.2675,0.7847,0.2554,0.7864 Q0.253,0.7864,0.2325,0.7874 T0.2024,0.7893 Q0.2008,0.7893,0.1984,0.7897 T0.1948,0.7901 T0.1916,0.7903 T0.1888,0.7908 T0.1867,0.7914 T0.1847,0.7922 L0.1831,0.793 T0.1819,0.7943 L0.1811,0.7959 T0.1799,0.7976 Q0.1791,0.7993,0.1791,0.8001 Q0.1791,0.8034,0.1831,0.8051 T0.1932,0.8078 T0.2,0.8092 Q0.2072,0.8117,0.2257,0.8117 Q0.2337,0.8117,0.2586,0.8109 L0.2635,0.8109 Q0.2707,0.8109,0.2767,0.8117 T0.2859,0.8136 T0.2936,0.8163 T0.3012,0.8187 Q0.3068,0.82,0.3277,0.8206 T0.3526,0.8237 Q0.3582,0.8266,0.3622,0.8266 Q0.3647,0.8266,0.3687,0.8258 T0.3751,0.825 Q0.396,0.825,0.404,0.8291 Q0.408,0.8316,0.4161,0.8316 Q0.4217,0.8316,0.4353,0.8295 L0.4394,0.8295 Q0.4466,0.8295,0.4659,0.8366 Q0.4699,0.8378,0.4747,0.8378 Q0.4763,0.8378,0.4807,0.8374 T0.4884,0.837 Q0.494,0.837,0.5004,0.8382 Q0.5052,0.8391,0.5124,0.8399 Q0.5221,0.8411,0.5249,0.8422 T0.5277,0.8461 Q0.5277,0.8482,0.5233,0.849 T0.5112,0.8501 T0.4996,0.8511 Q0.4964,0.8519,0.4851,0.8523 T0.4659,0.8544 Q0.4578,0.8557,0.4402,0.8557 L0.4349,0.8557 L0.4297,0.8557 L0.4209,0.8557 Q0.408,0.8565,0.3867,0.8571 T0.3614,0.8582 Q0.3317,0.8611,0.3237,0.8611 L0.3225,0.8611 L0.3213,0.8611 Q0.2972,0.8611,0.2972,0.8681 Q0.2972,0.8714,0.3008,0.8747 T0.3044,0.8805 Q0.3044,0.881,0.3036,0.8814 Q0.3012,0.8839,0.2851,0.8839 Q0.2779,0.8839,0.2739,0.883 Q0.2723,0.8826,0.2699,0.8826 T0.2643,0.8835 T0.259,0.8853 T0.2542,0.8876 T0.249,0.8893 Q0.2386,0.8922,0.2056,0.8946 Q0.2016,0.8951,0.1916,0.898 T0.1703,0.9009 Q0.1518,0.9009,0.1337,0.9044 T0.1149,0.9146 L0.1149,0.9158 Q0.1149,0.9175,0.1157,0.9187 T0.1173,0.921 T0.1201,0.9226 T0.1233,0.9237 T0.1269,0.9245 L0.1305,0.9251 T0.1337,0.9255 L0.1357,0.9258 Q0.139,0.9262,0.1446,0.9262 T0.1542,0.9266 T0.1598,0.9282 Q0.1614,0.9303,0.1647,0.9314 T0.1739,0.9328 T0.1815,0.9336 Q0.1863,0.9345,0.1976,0.9372 T0.2145,0.9415 Q0.2225,0.9432,0.2285,0.9467 T0.2378,0.9515 Q0.2426,0.9531,0.2514,0.9531 Q0.2538,0.9531,0.2602,0.9529 T0.2707,0.9527 Q0.2763,0.9527,0.2815,0.9531 T0.2867,0.9569 T0.2811,0.9614 Q0.2434,0.9627,0.2329,0.9652 Q0.2249,0.9672,0.2241,0.9672 L0.2096,0.9668 L0.2056,0.9668 Q0.2,0.9668,0.196,0.9672 T0.1884,0.9687 T0.1815,0.9708 T0.1731,0.9737 T0.1639,0.9772 Q0.1518,0.9805,0.1285,0.9805 L0.1253,0.9805 Q0.1124,0.9805,0.1076,0.9818 Q0.1012,0.983,0.0831,0.9876 T0.0594,0.9934 Q0.049,0.9954,0.0064,0.9954 Z M0.0032,0.9979 L0.0024,0.0037 Q0.0161,0.0021,0.0289,0.0062 Q0.0337,0.0075,0.0671,0.0066 T0.1116,0.01 T0.1337,0.0166 T0.151,0.022 Q0.1582,0.0249,0.1659,0.0251 T0.1767,0.0265 Q0.1807,0.0278,0.2,0.0292 T0.2265,0.0328 Q0.2305,0.034,0.2329,0.034 T0.239,0.0326 T0.2458,0.0311 T0.253,0.0319 Q0.2578,0.0332,0.2614,0.0342 T0.2667,0.0363 T0.2723,0.0384 T0.2827,0.0406 Q0.3084,0.0448,0.3141,0.0485 Q0.3149,0.0494,0.3225,0.0494 T0.3361,0.0504 T0.3422,0.0554 T0.3357,0.0606 T0.3205,0.0618 T0.31,0.0626 Q0.3092,0.0626,0.3056,0.0659 T0.2932,0.0701 Q0.2884,0.0709,0.2843,0.0709 Q0.2811,0.0709,0.2759,0.0701 T0.2667,0.0693 Q0.2586,0.0693,0.2422,0.0718 T0.2193,0.0763 Q0.2137,0.0784,0.1831,0.079 T0.1502,0.0805 Q0.1494,0.0809,0.147,0.0809 Q0.1454,0.0809,0.1386,0.0803 T0.1277,0.0796 Q0.1173,0.0796,0.1092,0.0821 Q0.1036,0.0834,0.1036,0.0854 Q0.1036,0.0879,0.1129,0.0908 T0.1269,0.0937 Q0.1293,0.0937,0.1558,0.0991 T0.1863,0.1045 Q0.2016,0.1045,0.2193,0.1087 Q0.2225,0.1091,0.2249,0.1091 Q0.2289,0.1091,0.2357,0.1076 T0.2482,0.1054 Q0.2506,0.1049,0.2546,0.1049 Q0.2699,0.1049,0.2924,0.1085 T0.3213,0.1165 Q0.3253,0.119,0.3301,0.119 Q0.3325,0.119,0.3446,0.1161 T0.3687,0.1124 Q0.3831,0.1112,0.3863,0.1112 T0.3908,0.1118 T0.3936,0.1145 T0.3984,0.1186 Q0.4048,0.1228,0.408,0.1228 Q0.4096,0.1228,0.4161,0.1213 T0.4305,0.1195 L0.4337,0.1195 Q0.4426,0.1195,0.4474,0.1211 T0.4566,0.1246 T0.4667,0.1273 Q0.4876,0.1298,0.5116,0.1298 Q0.5365,0.1298,0.5631,0.1389 Q0.5703,0.1414,0.5751,0.1414 Q0.5783,0.1414,0.5819,0.1398 T0.5888,0.1381 Q0.5928,0.1381,0.5984,0.1398 T0.6129,0.1414 Q0.6321,0.1414,0.6498,0.1477 Q0.661,0.1514,0.6667,0.1514 Q0.6707,0.1514,0.6771,0.1501 Q0.6787,0.1497,0.6795,0.1497 Q0.6835,0.1497,0.6863,0.1526 T0.6892,0.1593 Q0.6892,0.1626,0.6876,0.1647 Q0.6851,0.1672,0.6799,0.1686 T0.6695,0.1705 T0.6566,0.1715 T0.6458,0.1725 Q0.6434,0.173,0.6402,0.173 Q0.6378,0.173,0.6317,0.1727 T0.6225,0.1725 Q0.6096,0.1725,0.5984,0.1759 Q0.5823,0.1804,0.5454,0.1804 Q0.5205,0.1804,0.5116,0.1788 L0.5084,0.1788 Q0.5036,0.1788,0.4956,0.1819 T0.4843,0.185 Q0.4434,0.1887,0.4353,0.1929 Q0.4321,0.1945,0.4289,0.1945 T0.4197,0.1922 T0.4112,0.19 T0.4072,0.1912 Q0.4032,0.1949,0.388,0.1949 Q0.3663,0.1949,0.3542,0.19 Q0.351,0.1883,0.3462,0.1883 Q0.3406,0.1883,0.3321,0.1906 T0.3153,0.1954 T0.302,0.1983 Q0.2972,0.1991,0.2859,0.1997 T0.2643,0.201 T0.245,0.2024 T0.2337,0.2041 Q0.2321,0.2045,0.2181,0.2045 T0.1851,0.207 T0.1542,0.2157 Q0.143,0.2211,0.143,0.226 Q0.143,0.2314,0.153,0.2348 T0.1719,0.2381 Q0.1791,0.2381,0.2474,0.2476 Q0.2506,0.248,0.2558,0.2489 T0.2651,0.2505 T0.2739,0.252 T0.2819,0.2526 Q0.2835,0.2526,0.2851,0.2522 L0.2859,0.2522 Q0.2948,0.2522,0.3104,0.2574 T0.3309,0.2671 Q0.3333,0.2696,0.3365,0.2696 Q0.339,0.2696,0.3442,0.2684 T0.3526,0.2671 T0.3582,0.2679 Q0.3687,0.2717,0.3968,0.2742 Q0.4,0.2746,0.4036,0.2771 T0.4096,0.2796 Q0.4112,0.2796,0.4137,0.2787 Q0.4169,0.2779,0.4257,0.2779 Q0.4594,0.2779,0.4779,0.2849 Q0.4876,0.2891,0.4972,0.2891 Q0.4996,0.2891,0.506,0.2887 T0.5165,0.2883 Q0.5253,0.2883,0.5305,0.2889 T0.541,0.292 T0.5494,0.299 L0.5494,0.3015 Q0.5494,0.3036,0.5466,0.3051 T0.5386,0.3073 T0.5285,0.3086 T0.5181,0.3094 T0.5108,0.3102 Q0.5068,0.3107,0.494,0.3121 L0.4683,0.315 T0.4506,0.3181 Q0.449,0.3181,0.4426,0.32 T0.4313,0.3229 T0.4197,0.3256 T0.4064,0.3281 T0.3952,0.3289 Q0.3888,0.3289,0.3855,0.3273 Q0.3783,0.3243,0.3703,0.3243 Q0.3598,0.3243,0.351,0.3297 Q0.3478,0.3314,0.3422,0.3314 Q0.3398,0.3314,0.3337,0.3306 T0.3245,0.3297 T0.3189,0.3306 Q0.3149,0.3314,0.2956,0.3328 T0.2715,0.3368 Q0.2691,0.338,0.2635,0.3391 T0.2522,0.3407 T0.2406,0.3424 T0.2313,0.3447 Q0.2305,0.3447,0.2213,0.348 T0.206,0.354 T0.1924,0.3621 T0.1815,0.3733 Q0.1767,0.3816,0.1767,0.3849 Q0.1767,0.387,0.1783,0.3893 T0.1847,0.3961 T0.1936,0.4063 T0.2004,0.4181 T0.2052,0.4264 T0.2145,0.4309 T0.2386,0.4359 Q0.2458,0.4372,0.2554,0.4372 Q0.2578,0.4372,0.2627,0.437 T0.2699,0.4367 Q0.2795,0.4367,0.2851,0.4384 Q0.294,0.4409,0.3092,0.4409 Q0.3116,0.4409,0.3157,0.4407 T0.3213,0.4405 Q0.3301,0.4405,0.3466,0.444 T0.3687,0.4509 Q0.3703,0.4517,0.3703,0.4525 Q0.3703,0.4575,0.3373,0.4596 Q0.3133,0.4608,0.2988,0.4658 Q0.294,0.4674,0.2803,0.4674 Q0.2763,0.4674,0.2687,0.4672 T0.257,0.467 Q0.2402,0.467,0.2313,0.4687 Q0.2209,0.4708,0.2209,0.4737 Q0.2209,0.4741,0.2213,0.4749 T0.2229,0.4764 L0.2249,0.4774 T0.2265,0.4778 L0.2273,0.4782 Q0.2498,0.4803,0.2618,0.4803 Q0.2667,0.4803,0.2691,0.4799 Q0.2699,0.4795,0.2715,0.4795 Q0.2779,0.4795,0.3133,0.4873 Q0.3181,0.4886,0.3233,0.4892 T0.3386,0.4905 T0.3542,0.4915 T0.3655,0.4919 Q0.3703,0.4919,0.3779,0.4915 T0.3888,0.4911 T0.3952,0.4915 Q0.3976,0.4919,0.4008,0.4927 L0.4072,0.4944 T0.4149,0.4961 T0.4249,0.4975 T0.4369,0.4985 Q0.449,0.499,0.4554,0.5 T0.4651,0.5031 T0.4699,0.5085 Q0.4707,0.5093,0.4707,0.5097 Q0.4707,0.5114,0.4687,0.5124 T0.4631,0.5139 T0.4562,0.5145 T0.4478,0.5147 L0.4402,0.5147 Q0.4353,0.5151,0.4265,0.5174 T0.4096,0.5197 L0.4024,0.5197 Q0.4,0.5193,0.3968,0.5193 Q0.3896,0.5193,0.3831,0.5209 T0.3703,0.5253 T0.3598,0.5288 Q0.3558,0.5301,0.3321,0.5342 T0.302,0.5409 Q0.2876,0.5454,0.2337,0.55 Q0.2112,0.5521,0.2112,0.5558 Q0.2112,0.5574,0.2161,0.5612 Q0.2201,0.5637,0.2281,0.5637 Q0.2305,0.5637,0.2361,0.5633 T0.2442,0.5628 Q0.2474,0.5628,0.2498,0.5633 Q0.2635,0.5653,0.3133,0.5653 Q0.3261,0.5653,0.3301,0.5649 L0.3325,0.5649 Q0.3349,0.5649,0.3402,0.5657 T0.3494,0.5666 Q0.3542,0.5666,0.3598,0.5657 Q0.3663,0.5645,0.3695,0.5645 Q0.3735,0.5645,0.3775,0.5666 T0.3847,0.5695 Q0.3888,0.5707,0.3912,0.5709 T0.3968,0.5711 T0.4048,0.572 Q0.4096,0.5724,0.4165,0.5726 T0.4281,0.5734 T0.4378,0.5757 Q0.4418,0.5774,0.4522,0.5774 Q0.4562,0.5774,0.4655,0.5769 T0.4795,0.5765 Q0.4932,0.5765,0.4972,0.579 Q0.5028,0.5819,0.51,0.5819 Q0.5141,0.5819,0.5221,0.5809 T0.5341,0.5798 L0.5373,0.5798 Q0.5422,0.5798,0.557,0.5821 T0.5855,0.5844 L0.5936,0.5844 L0.5992,0.5844 T0.604,0.5848 T0.6076,0.5852 T0.6108,0.5859 T0.6137,0.5865 T0.6161,0.5873 T0.6181,0.5881 T0.6209,0.5896 L0.6233,0.591 Q0.6265,0.5927,0.6353,0.5927 L0.6402,0.5927 L0.645,0.5927 Q0.6723,0.5927,0.6948,0.6039 Q0.6988,0.606,0.7036,0.606 Q0.7076,0.606,0.7153,0.6045 T0.7261,0.6031 Q0.7309,0.6031,0.7454,0.6027 T0.7647,0.6022 Q0.7783,0.6022,0.808,0.608 L0.812,0.608 Q0.8169,0.608,0.8293,0.6062 T0.8474,0.6039 L0.8506,0.6039 Q0.857,0.6039,0.8655,0.6049 T0.8835,0.6074 T0.8972,0.6093 Q0.9036,0.6101,0.9213,0.6101 L0.9398,0.6101 L0.959,0.6101 L0.9767,0.6101 Q0.9976,0.6109,0.9976,0.6176 Q0.9976,0.6188,0.9968,0.6226 Q0.9952,0.6284,0.9671,0.6284 L0.959,0.6284 L0.9526,0.6284 Q0.9486,0.6284,0.9382,0.6302 T0.9205,0.6321 L0.9173,0.6321 Q0.9133,0.6317,0.9092,0.6317 Q0.9012,0.6317,0.8715,0.6346 Q0.8233,0.6387,0.7944,0.6421 Q0.7888,0.6429,0.7831,0.6429 Q0.7783,0.6429,0.7731,0.6425 T0.7663,0.6421 L0.7622,0.6421 Q0.7614,0.6425,0.7586,0.6425 T0.7474,0.6421 T0.7349,0.6416 Q0.7261,0.6416,0.7221,0.6429 Q0.7173,0.645,0.7032,0.646 T0.6711,0.6479 T0.6482,0.6491 Q0.645,0.6495,0.6418,0.6495 Q0.6353,0.6495,0.6273,0.6474 T0.6161,0.6454 Q0.612,0.6454,0.6088,0.6477 T0.6,0.6499 Q0.5912,0.6499,0.5494,0.6578 Q0.5422,0.6591,0.5373,0.6591 Q0.5341,0.6591,0.5281,0.6584 T0.5173,0.6578 L0.5124,0.6578 Q0.5004,0.6582,0.4747,0.6632 Q0.4675,0.6649,0.4398,0.6667 T0.3851,0.6703 T0.3566,0.6719 Q0.3534,0.6723,0.3406,0.6734 T0.3141,0.6757 T0.2948,0.6773 Q0.2908,0.6781,0.2819,0.6829 T0.2618,0.6877 Q0.2482,0.6877,0.2273,0.6958 T0.1992,0.7117 Q0.1976,0.7138,0.1976,0.7155 Q0.1976,0.7188,0.2032,0.7213 T0.2181,0.7258 T0.2289,0.7292 Q0.2337,0.7308,0.2378,0.7316 L0.2458,0.7333 T0.2522,0.7345 Q0.2747,0.7399,0.2835,0.7399 Q0.29,0.7399,0.3048,0.7408 T0.3253,0.7416 Q0.3277,0.7416,0.3297,0.7414 T0.3341,0.7412 L0.3598,0.7445 Q0.3639,0.7449,0.3663,0.7449 Q0.3695,0.7449,0.3751,0.7443 T0.3855,0.7437 L0.3904,0.7437 Q0.3984,0.7441,0.4141,0.7472 T0.4353,0.7507 Q0.4434,0.752,0.4434,0.7553 Q0.4434,0.7578,0.439,0.7605 T0.4297,0.764 Q0.4257,0.7648,0.4201,0.7655 T0.4076,0.7665 T0.3984,0.7673 Q0.3968,0.7673,0.3912,0.7677 T0.3815,0.7688 T0.3735,0.771 T0.3655,0.7727 Q0.3606,0.7727,0.3534,0.7708 T0.3458,0.769 L0.3446,0.769 Q0.3414,0.769,0.3297,0.7713 T0.3149,0.7735 Q0.3092,0.7735,0.296,0.7771 T0.2771,0.7831 Q0.2683,0.7872,0.2554,0.7885 Q0.253,0.7889,0.2325,0.7897 T0.2032,0.7914 Q0.2008,0.7918,0.198,0.792 T0.194,0.7924 T0.1912,0.7928 T0.1888,0.793 T0.1867,0.7934 T0.1851,0.7943 T0.1843,0.7953 T0.1835,0.7968 T0.1823,0.7984 T0.1815,0.8001 Q0.1815,0.8022,0.1847,0.8032 T0.1932,0.8053 T0.2008,0.8071 Q0.2072,0.8092,0.2265,0.8092 Q0.2361,0.8092,0.2586,0.8088 L0.2635,0.8088 Q0.2731,0.8088,0.2795,0.8098 T0.2928,0.8134 T0.302,0.8167 Q0.306,0.8179,0.3277,0.8183 T0.3542,0.8221 Q0.359,0.8246,0.3622,0.8246 Q0.3639,0.8246,0.3675,0.8237 T0.3751,0.8229 Q0.3968,0.8229,0.4048,0.8275 Q0.4088,0.8291,0.4161,0.8291 Q0.4225,0.8291,0.4353,0.8275 Q0.4369,0.827,0.4394,0.827 Q0.4474,0.827,0.4675,0.8345 Q0.4707,0.8358,0.4739,0.8358 Q0.4755,0.8358,0.4799,0.8353 T0.4876,0.8349 Q0.494,0.8349,0.5012,0.8362 L0.5076,0.837 T0.5133,0.8376 T0.5181,0.8382 T0.5221,0.8391 L0.5253,0.8399 T0.5277,0.8409 L0.5293,0.8422 T0.5301,0.8438 L0.5301,0.8461 Q0.5301,0.8499,0.5249,0.8511 T0.5112,0.8526 T0.5004,0.8532 Q0.4964,0.854,0.4851,0.8546 T0.4667,0.8565 Q0.4578,0.8577,0.441,0.8577 L0.4345,0.8577 L0.4289,0.8577 L0.4209,0.8577 Q0.4153,0.8582,0.4088,0.8586 T0.3968,0.8592 T0.3855,0.8594 T0.3755,0.8596 T0.3675,0.86 T0.3622,0.8602 Q0.3317,0.8635,0.3237,0.8635 Q0.2996,0.8635,0.2996,0.8681 Q0.2996,0.8698,0.3032,0.8733 T0.3068,0.8797 L0.3068,0.8822 Q0.3052,0.8859,0.2859,0.8859 Q0.2787,0.8859,0.2739,0.8851 L0.2699,0.8851 Q0.2659,0.8851,0.259,0.888 T0.2498,0.8913 Q0.2394,0.8946,0.2056,0.8971 Q0.2032,0.8971,0.1928,0.9002 T0.1703,0.9034 Q0.1526,0.9034,0.1353,0.9067 T0.1173,0.915 L0.1173,0.9158 Q0.1173,0.9166,0.1177,0.9175 T0.1189,0.9191 T0.1205,0.9204 T0.1229,0.9212 T0.1257,0.922 T0.1285,0.9226 T0.1309,0.9231 T0.1337,0.9235 T0.1365,0.9237 L0.1446,0.9237 T0.1554,0.9243 T0.1614,0.9268 T0.1659,0.9293 T0.1743,0.9303 T0.1823,0.9316 Q0.1863,0.932,0.1912,0.9332 T0.2028,0.9361 T0.2153,0.939 Q0.2233,0.9411,0.2297,0.9448 T0.2386,0.9494 Q0.2426,0.9506,0.2506,0.9506 Q0.253,0.9506,0.2594,0.9504 T0.2699,0.9502 Q0.2763,0.9502,0.2819,0.9511 Q0.2851,0.9511,0.2871,0.9529 T0.2892,0.9573 Q0.2892,0.9627,0.2811,0.9635 Q0.2434,0.9652,0.2337,0.9672 Q0.2257,0.9693,0.2241,0.9693 Q0.2217,0.9693,0.2096,0.9689 L0.2056,0.9689 Q0.1976,0.9689,0.1924,0.9699 T0.1787,0.9741 L0.1647,0.9793 Q0.1518,0.983,0.1285,0.983 L0.1261,0.983 L0.1237,0.983 Q0.1124,0.983,0.1076,0.9838 Q0.102,0.9851,0.0839,0.9896 T0.0602,0.9954 T0.0406,0.9971 T0.0153,0.9979 L0.0032,0.9979 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C8}' is unused\n '\\u{E0CA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9992,0.998 Q0.9992,1,0.9968,1 Q0.9521,1,0.9392,0.998 Q0.9335,0.997,0.9152,0.9921 T0.8913,0.9862 Q0.8873,0.9852,0.8783,0.9852 L0.8747,0.9852 L0.871,0.9852 Q0.8483,0.9852,0.8345,0.9812 Q0.8289,0.9792,0.8228,0.9773 T0.8135,0.9743 T0.8054,0.9723 T0.7948,0.9713 L0.7908,0.9713 L0.777,0.9713 T0.7656,0.9693 Q0.7616,0.9683,0.7498,0.9674 T0.7283,0.9664 L0.7186,0.9654 Q0.708,0.9644,0.708,0.9575 Q0.708,0.9545,0.7109,0.952 T0.7178,0.9486 L0.7315,0.9486 L0.7417,0.9486 L0.7502,0.9486 Q0.7575,0.9486,0.7599,0.9476 Q0.7616,0.9466,0.7685,0.9426 T0.7843,0.9377 Q0.7899,0.9357,0.8009,0.9332 T0.8175,0.9298 Q0.82,0.9288,0.8228,0.9283 T0.8277,0.9278 T0.8313,0.9273 T0.8341,0.9263 T0.8362,0.9258 Q0.8402,0.9219,0.854,0.9219 L0.8569,0.9219 L0.8597,0.9219 L0.8637,0.9219 Q0.88,0.9199,0.88,0.9159 L0.88,0.9149 Q0.88,0.913,0.8719,0.911 T0.852,0.9075 T0.8297,0.906 Q0.8224,0.906,0.8167,0.905 T0.8074,0.9031 T0.8001,0.9006 T0.794,0.8991 Q0.7599,0.8971,0.7494,0.8942 Q0.7461,0.8932,0.7397,0.8902 T0.7299,0.8872 L0.7267,0.8872 Q0.721,0.8882,0.7121,0.8882 Q0.6926,0.8882,0.691,0.8833 L0.691,0.8803 Q0.691,0.8773,0.6922,0.8749 T0.6955,0.8704 L0.6975,0.8684 Q0.6926,0.8655,0.6764,0.8655 Q0.6683,0.8655,0.6375,0.8625 Q0.6358,0.8625,0.629,0.862 T0.6148,0.8615 T0.5973,0.861 T0.5791,0.8605 L0.5718,0.8605 L0.5661,0.8605 L0.5596,0.8605 Q0.5426,0.8605,0.5337,0.8586 Q0.5264,0.8576,0.515,0.8571 T0.4996,0.8556 Q0.498,0.8556,0.4947,0.8551 T0.4882,0.8546 T0.4809,0.8541 T0.474,0.8531 T0.4692,0.8506 T0.4672,0.8467 Q0.4672,0.8437,0.468,0.8422 T0.4704,0.8398 T0.4736,0.8383 T0.4781,0.8368 T0.4838,0.8358 T0.4911,0.8353 T0.4988,0.8338 Q0.5069,0.8328,0.5142,0.8328 Q0.5174,0.8328,0.5215,0.8333 T0.5264,0.8338 Q0.5296,0.8338,0.532,0.8328 Q0.5523,0.8249,0.5604,0.8249 L0.5653,0.8249 Q0.5775,0.8269,0.5848,0.8269 Q0.5912,0.8269,0.5937,0.8259 Q0.6026,0.821,0.6253,0.821 Q0.6294,0.821,0.6334,0.822 T0.6383,0.8229 Q0.6399,0.8229,0.644,0.82 Q0.6504,0.817,0.6723,0.816 T0.6975,0.814 Q0.6999,0.814,0.7048,0.8121 T0.7129,0.8091 T0.7226,0.8071 T0.7372,0.8061 L0.7421,0.8061 Q0.7624,0.8071,0.7721,0.8071 Q0.7924,0.8071,0.7981,0.8051 Q0.8021,0.8032,0.807,0.8027 T0.8135,0.8017 T0.8151,0.8002 L0.8151,0.7992 Q0.8143,0.7962,0.8127,0.7957 T0.8045,0.7943 Q0.7997,0.7943,0.7964,0.7933 Q0.7883,0.7933,0.7676,0.7923 T0.7437,0.7903 Q0.7307,0.7893,0.7218,0.7844 Q0.7194,0.7834,0.7141,0.7819 L0.7036,0.7789 T0.693,0.7765 T0.6853,0.7755 Q0.6805,0.7755,0.6691,0.773 T0.6553,0.7705 Q0.6545,0.7705,0.6545,0.7715 Q0.6537,0.7715,0.65,0.7725 T0.6423,0.774 T0.635,0.7745 Q0.6294,0.7745,0.6257,0.773 T0.618,0.771 T0.6083,0.77 T0.601,0.7695 Q0.5985,0.7695,0.5921,0.769 T0.5795,0.7676 T0.5702,0.7666 Q0.5653,0.7656,0.5596,0.7616 T0.5539,0.7547 Q0.5539,0.7498,0.5645,0.7488 Q0.5693,0.7478,0.5852,0.7448 T0.6099,0.7418 L0.6148,0.7418 Q0.6196,0.7418,0.6253,0.7423 T0.6338,0.7428 L0.6399,0.7428 Q0.6431,0.7418,0.6488,0.7409 T0.6586,0.7394 T0.6659,0.7389 L0.6707,0.7389 Q0.6723,0.7399,0.6748,0.7399 Q0.6796,0.7399,0.6946,0.7389 T0.7161,0.7379 Q0.7251,0.7379,0.7478,0.7319 Q0.7494,0.7319,0.7539,0.7315 T0.762,0.73 T0.7697,0.727 T0.7818,0.723 T0.7948,0.7196 T0.7997,0.7151 Q0.7997,0.7141,0.7989,0.7132 Q0.7924,0.7062,0.7717,0.6978 T0.738,0.6894 Q0.7267,0.6894,0.717,0.6845 T0.7048,0.6795 Q0.6975,0.6785,0.6711,0.6766 T0.6431,0.6746 Q0.6415,0.6736,0.6144,0.6721 T0.5596,0.6686 T0.5247,0.6657 Q0.4996,0.6607,0.4874,0.6597 L0.4834,0.6597 Q0.4785,0.6597,0.4724,0.6607 T0.4631,0.6617 Q0.4574,0.6617,0.4501,0.6597 Q0.4088,0.6518,0.4006,0.6518 Q0.3933,0.6518,0.3901,0.6499 T0.3844,0.6479 T0.3739,0.6499 T0.3585,0.6518 L0.352,0.6518 Q0.3471,0.6508,0.335,0.6503 T0.3122,0.6494 T0.2912,0.6479 T0.2766,0.6449 Q0.2733,0.6439,0.2668,0.6439 Q0.2628,0.6439,0.2543,0.6444 T0.2425,0.6449 T0.2368,0.6439 L0.2344,0.6439 Q0.2336,0.6439,0.2283,0.6444 T0.2182,0.6449 Q0.2117,0.6449,0.2052,0.6439 Q0.1768,0.6409,0.1281,0.637 Q0.0989,0.634,0.0916,0.634 L0.0835,0.634 L0.0795,0.634 Q0.0722,0.634,0.0616,0.632 T0.0479,0.6301 Q0.0462,0.6301,0.0406,0.6306 T0.0308,0.6311 Q0.0032,0.6311,0.0008,0.6231 Q0,0.6202,0,0.6182 Q0,0.6083,0.0227,0.6083 Q0.03,0.6073,0.0422,0.6073 Q0.0487,0.6073,0.0608,0.6078 T0.0787,0.6083 Q0.0973,0.6083,0.103,0.6073 Q0.1062,0.6063,0.1131,0.6053 T0.1253,0.6039 T0.1375,0.6024 T0.1492,0.6014 L0.1533,0.6014 Q0.1598,0.6024,0.1723,0.6044 T0.189,0.6063 Q0.1906,0.6063,0.1922,0.6053 Q0.2214,0.6004,0.236,0.6004 Q0.2409,0.6004,0.2551,0.6009 T0.2741,0.6014 Q0.2782,0.6014,0.2859,0.6024 T0.2968,0.6034 Q0.3009,0.6034,0.3041,0.6024 Q0.3277,0.5905,0.356,0.5905 L0.3613,0.5905 L0.3666,0.5905 Q0.3731,0.5905,0.3755,0.5895 Q0.382,0.5856,0.3844,0.5846 T0.3938,0.5831 T0.4144,0.5826 T0.4428,0.5801 T0.4631,0.5776 L0.4663,0.5776 Q0.4704,0.5776,0.4785,0.5786 T0.4899,0.5796 Q0.4964,0.5796,0.5012,0.5767 Q0.5069,0.5737,0.5223,0.5737 Q0.5272,0.5737,0.5369,0.5742 T0.5499,0.5747 Q0.558,0.5747,0.5612,0.5737 Q0.5661,0.5717,0.5714,0.5712 T0.5835,0.5702 T0.5945,0.5692 T0.6018,0.5687 L0.6062,0.5687 T0.6095,0.5682 T0.6148,0.5678 Q0.6172,0.5668,0.6196,0.5653 T0.6245,0.5633 T0.631,0.5628 T0.6407,0.5638 T0.6504,0.5648 T0.6594,0.5638 T0.6675,0.5628 L0.6707,0.5628 L0.6861,0.5628 Q0.7364,0.5628,0.7494,0.5608 L0.7567,0.5608 L0.7652,0.5608 L0.7729,0.5608 Q0.7794,0.5608,0.7818,0.5589 Q0.7851,0.5569,0.7859,0.5559 Q0.7835,0.5539,0.7656,0.5519 Q0.7121,0.547,0.6975,0.543 Q0.6934,0.541,0.6853,0.5396 L0.6691,0.5366 T0.6525,0.5336 T0.6391,0.5312 Q0.6367,0.5302,0.6245,0.5257 T0.6034,0.5213 L0.5977,0.5213 Q0.5945,0.5223,0.5904,0.5223 Q0.5839,0.5223,0.5787,0.5208 T0.5685,0.5183 T0.5596,0.5173 Q0.558,0.5173,0.5552,0.5168 T0.5495,0.5163 L0.5434,0.5163 T0.5373,0.5158 T0.532,0.5148 T0.5284,0.5129 T0.5272,0.5104 L0.5272,0.5074 Q0.5304,0.5015,0.5377,0.499 T0.5629,0.4965 Q0.5734,0.4955,0.5811,0.4946 T0.5953,0.4916 T0.605,0.4896 Q0.6083,0.4886,0.6123,0.4886 Q0.6148,0.4886,0.6225,0.4891 T0.635,0.4896 L0.6456,0.4896 Q0.6837,0.4857,0.6861,0.4857 Q0.7226,0.4768,0.7283,0.4768 Q0.7307,0.4768,0.732,0.4773 T0.7372,0.4777 Q0.7502,0.4777,0.7721,0.4758 Q0.7753,0.4748,0.777,0.4738 Q0.7745,0.4718,0.768,0.4708 Q0.7599,0.4688,0.7445,0.4688 Q0.7405,0.4688,0.7324,0.4693 T0.721,0.4698 Q0.7056,0.4698,0.6999,0.4679 Q0.6861,0.4629,0.6626,0.4619 Q0.6586,0.4609,0.6533,0.4604 T0.6419,0.459 T0.6314,0.456 T0.6269,0.452 Q0.6269,0.451,0.6302,0.4491 Q0.6358,0.4451,0.6525,0.4416 T0.6788,0.4382 L0.6845,0.4382 L0.6902,0.4382 Q0.7064,0.4382,0.7145,0.4362 Q0.7202,0.4342,0.7307,0.4342 L0.7356,0.4342 L0.7409,0.4342 L0.7453,0.4342 Q0.7543,0.4342,0.7607,0.4332 Q0.7778,0.4313,0.7847,0.4288 T0.7932,0.4248 T0.7972,0.4169 T0.8045,0.4045 L0.8094,0.3986 T0.8135,0.3942 L0.8167,0.3912 T0.8191,0.3887 T0.8204,0.3867 T0.8208,0.3848 Q0.8208,0.3818,0.8167,0.3739 Q0.8127,0.3689,0.8054,0.3635 T0.7924,0.3556 T0.7778,0.3497 T0.768,0.3462 Q0.764,0.3442,0.7478,0.3427 T0.7267,0.3383 Q0.7234,0.3363,0.7044,0.3348 T0.6805,0.3323 L0.6764,0.3323 T0.6679,0.3328 T0.6586,0.3333 Q0.6521,0.3333,0.648,0.3314 Q0.6391,0.3264,0.6294,0.3264 Q0.6229,0.3264,0.6156,0.3294 Q0.6115,0.3304,0.6042,0.3304 Q0.5977,0.3304,0.5888,0.3289 T0.5738,0.3264 T0.5584,0.3225 L0.5491,0.3195 Q0.5418,0.3185,0.5162,0.3155 T0.4895,0.3121 T0.4826,0.3116 T0.4716,0.3111 T0.4607,0.3096 T0.4513,0.3066 T0.4477,0.3017 Q0.4477,0.2997,0.4485,0.2977 Q0.4526,0.2898,0.4611,0.2878 T0.4842,0.2859 Q0.4882,0.2859,0.4943,0.2864 T0.5028,0.2868 Q0.5118,0.2868,0.5215,0.2829 Q0.5401,0.276,0.5734,0.276 Q0.5831,0.276,0.5872,0.277 L0.5904,0.277 T0.5949,0.2745 T0.6034,0.272 Q0.631,0.269,0.6407,0.2661 Q0.6448,0.2641,0.6488,0.2641 T0.6573,0.2656 T0.6634,0.2671 Q0.6659,0.2671,0.6675,0.2651 Q0.6723,0.2601,0.6886,0.2552 T0.7137,0.2502 L0.7153,0.2502 L0.7178,0.2502 Q0.7218,0.2502,0.7279,0.2493 T0.7417,0.2468 T0.7526,0.2453 Q0.8208,0.2354,0.8281,0.2354 Q0.8337,0.2354,0.8394,0.2344 T0.8496,0.2315 T0.854,0.2265 Q0.854,0.2216,0.8443,0.2176 Q0.8354,0.2127,0.8216,0.2102 T0.7972,0.2072 T0.777,0.2067 T0.7648,0.2057 Q0.7632,0.2047,0.7498,0.2038 T0.7202,0.2018 T0.6983,0.1998 Q0.6918,0.1998,0.676,0.1949 T0.6537,0.1899 Q0.6496,0.1899,0.6472,0.1919 Q0.6342,0.1968,0.6123,0.1968 Q0.5961,0.1968,0.5912,0.1929 Q0.5904,0.1919,0.5892,0.1919 T0.5823,0.1944 T0.5722,0.1968 T0.5637,0.1949 Q0.5556,0.1909,0.5158,0.1869 Q0.5109,0.1869,0.5032,0.1835 T0.4915,0.18 Q0.4907,0.18,0.4891,0.181 Q0.4793,0.182,0.455,0.182 Q0.4177,0.182,0.4015,0.1771 Q0.3901,0.1741,0.3779,0.1741 Q0.3747,0.1741,0.369,0.1746 T0.3609,0.1751 Q0.3569,0.1751,0.3536,0.1741 Q0.3512,0.1741,0.3459,0.1736 T0.3358,0.1726 T0.3256,0.1716 T0.3167,0.1696 T0.3106,0.1662 Q0.3082,0.1632,0.3082,0.1592 Q0.3082,0.1543,0.3114,0.1508 T0.3204,0.1474 L0.3236,0.1474 Q0.3301,0.1494,0.3333,0.1494 Q0.339,0.1494,0.3496,0.1454 Q0.3674,0.1385,0.3869,0.1385 Q0.395,0.1385,0.4011,0.137 T0.4116,0.1355 T0.4197,0.1375 T0.425,0.1395 Q0.429,0.1395,0.4355,0.1365 Q0.4631,0.1266,0.4882,0.1266 Q0.5126,0.1266,0.5337,0.1246 Q0.5369,0.1246,0.5458,0.1207 T0.5661,0.1167 L0.5693,0.1167 Q0.5791,0.1177,0.5852,0.1187 T0.5921,0.1197 Q0.5945,0.1197,0.6002,0.1167 Q0.6026,0.1147,0.605,0.1123 T0.6091,0.1093 T0.6156,0.1088 T0.6318,0.1098 Q0.6456,0.1108,0.6569,0.1137 T0.6707,0.1167 Q0.674,0.1167,0.6772,0.1147 Q0.6821,0.1108,0.6946,0.1083 T0.721,0.1044 T0.7453,0.1029 L0.7526,0.1029 Q0.7583,0.1039,0.7652,0.1053 T0.7753,0.1068 Q0.7778,0.1068,0.7802,0.1058 Q0.7981,0.1019,0.8143,0.1019 Q0.8175,0.1019,0.8439,0.0964 T0.8735,0.091 Q0.8759,0.091,0.8836,0.089 T0.8938,0.0851 Q0.8929,0.0841,0.8905,0.0841 Q0.8832,0.0821,0.8735,0.0821 Q0.8694,0.0821,0.8629,0.0826 T0.854,0.0831 Q0.8508,0.0831,0.8491,0.0821 Q0.8475,0.0821,0.8171,0.0811 T0.7802,0.0781 T0.7571,0.0737 T0.7332,0.0712 Q0.7299,0.0712,0.7247,0.0717 T0.7161,0.0722 L0.7064,0.0722 Q0.7032,0.0712,0.7003,0.0707 T0.6959,0.0692 T0.693,0.0678 T0.6914,0.0663 T0.6902,0.0648 T0.689,0.0643 L0.6869,0.0643 L0.6845,0.0643 L0.6821,0.0643 Q0.6553,0.0643,0.6553,0.0554 T0.6796,0.0465 L0.6813,0.0465 L0.6845,0.0465 Q0.6918,0.0425,0.717,0.0376 Q0.7226,0.0366,0.7267,0.0356 T0.7324,0.0336 T0.7376,0.0317 T0.747,0.0297 Q0.7518,0.0287,0.7551,0.0287 T0.762,0.0297 T0.768,0.0307 L0.7729,0.0307 Q0.7802,0.0277,0.7997,0.0267 T0.8224,0.0237 Q0.8273,0.0227,0.8341,0.0223 T0.8475,0.0193 T0.8654,0.0143 T0.8873,0.0079 Q0.9002,0.003,0.9331,0.004 T0.97,0.004 Q0.9838,0,0.9976,0.001 Q1,0.001,1,0.003 Z M0.9935,0.996 L0.9951,0.0049 Q0.9822,0.0049,0.9716,0.0079 Q0.9659,0.0099,0.9327,0.0089 T0.8897,0.0119 Q0.8775,0.0158,0.8666,0.0183 T0.85,0.0237 Q0.8418,0.0267,0.8341,0.0272 T0.8248,0.0277 Q0.82,0.0297,0.8001,0.0312 T0.7745,0.0346 Q0.7697,0.0356,0.7664,0.0356 Q0.764,0.0356,0.7603,0.0341 T0.7534,0.0326 Q0.751,0.0326,0.7478,0.0336 Q0.7429,0.0346,0.7397,0.0356 T0.7344,0.0376 T0.7283,0.0401 T0.7178,0.0425 Q0.6926,0.0465,0.6878,0.0495 Q0.6845,0.0514,0.6764,0.0514 L0.6723,0.0514 L0.6691,0.0514 Q0.6602,0.0514,0.6602,0.0554 Q0.6602,0.0574,0.6659,0.0579 T0.6796,0.0589 T0.691,0.0603 T0.6967,0.0643 T0.7072,0.0673 Q0.7121,0.0682,0.7153,0.0682 T0.7238,0.0678 T0.7332,0.0673 Q0.7413,0.0673,0.7579,0.0692 T0.7818,0.0742 Q0.7867,0.0752,0.8171,0.0762 T0.8508,0.0781 L0.852,0.0781 T0.8601,0.0776 T0.8719,0.0772 Q0.8832,0.0772,0.8921,0.0791 Q0.8994,0.0811,0.8994,0.0841 T0.8933,0.0895 T0.8812,0.094 T0.8735,0.0959 T0.8451,0.1014 T0.8143,0.1068 Q0.7989,0.1068,0.7818,0.1098 Q0.7778,0.1108,0.7745,0.1108 T0.768,0.1103 T0.7603,0.1088 T0.7518,0.1068 L0.7461,0.1068 Q0.7315,0.1068,0.7088,0.1103 T0.6805,0.1177 Q0.6756,0.1207,0.6699,0.1207 Q0.6667,0.1207,0.6545,0.1177 T0.631,0.1147 Q0.6269,0.1137,0.6225,0.1133 T0.616,0.1128 L0.6123,0.1128 T0.6103,0.1133 L0.6083,0.1157 T0.6034,0.1197 Q0.5961,0.1246,0.5921,0.1246 Q0.5904,0.1246,0.5835,0.1231 T0.5693,0.1217 L0.5661,0.1217 Q0.558,0.1217,0.5535,0.1231 T0.5446,0.1266 T0.5345,0.1296 Q0.5126,0.1316,0.4882,0.1316 T0.438,0.1405 Q0.4298,0.1434,0.425,0.1434 Q0.4209,0.1434,0.4173,0.1419 T0.4112,0.1405 T0.4027,0.1419 T0.3869,0.1434 Q0.3682,0.1434,0.3512,0.1494 Q0.3398,0.1533,0.3333,0.1533 Q0.3285,0.1533,0.3228,0.1513 L0.3212,0.1513 Q0.3179,0.1513,0.3155,0.1538 T0.3131,0.1592 Q0.3131,0.1612,0.3147,0.1632 Q0.3171,0.1652,0.3232,0.1667 T0.3406,0.1691 T0.3544,0.1701 L0.3601,0.1701 L0.3678,0.1701 L0.3771,0.1701 Q0.3909,0.1701,0.4031,0.1731 Q0.4177,0.178,0.4558,0.178 Q0.4793,0.178,0.4882,0.1761 L0.4915,0.1761 Q0.498,0.1761,0.5061,0.179 T0.5158,0.183 Q0.5166,0.183,0.5231,0.1835 T0.5341,0.1845 T0.545,0.1855 T0.5572,0.1874 T0.5661,0.1909 Q0.5677,0.1919,0.5702,0.1919 T0.5791,0.1894 T0.588,0.1869 Q0.5921,0.1869,0.5945,0.1899 Q0.5977,0.1919,0.6123,0.1919 Q0.6334,0.1919,0.6448,0.1879 Q0.6488,0.186,0.6537,0.186 Q0.6626,0.186,0.6784,0.1909 T0.6983,0.1958 Q0.704,0.1968,0.7206,0.1973 T0.7506,0.1993 T0.7689,0.2018 L0.7705,0.2018 L0.7741,0.2018 L0.7786,0.2018 Q0.8248,0.2018,0.8475,0.2136 Q0.8597,0.2196,0.8597,0.2255 T0.8483,0.2359 T0.8281,0.2404 Q0.8208,0.2404,0.7534,0.2493 Q0.7502,0.2502,0.7425,0.2512 T0.7287,0.2532 T0.7178,0.2542 L0.7153,0.2542 L0.7137,0.2542 Q0.7064,0.2542,0.6906,0.2591 T0.6715,0.2681 T0.6626,0.272 Q0.6594,0.272,0.6541,0.2705 T0.6464,0.269 T0.6431,0.27 Q0.6318,0.273,0.6034,0.276 Q0.6018,0.276,0.5998,0.2774 T0.5957,0.2799 T0.5904,0.2809 L0.5856,0.2809 Q0.5823,0.2799,0.575,0.2799 Q0.541,0.2799,0.5239,0.2868 Q0.5134,0.2908,0.5028,0.2908 Q0.4996,0.2908,0.4935,0.2903 T0.4842,0.2898 Q0.4704,0.2898,0.4635,0.2918 T0.4534,0.2997 L0.4534,0.3007 Q0.4534,0.3037,0.459,0.3046 T0.4753,0.3066 T0.4899,0.3076 Q0.4907,0.3076,0.5166,0.3106 T0.5507,0.3155 Q0.5921,0.3264,0.605,0.3264 Q0.6107,0.3264,0.6131,0.3254 Q0.6212,0.3225,0.6294,0.3225 Q0.6407,0.3225,0.6513,0.3274 Q0.6529,0.3294,0.6569,0.3294 Q0.6594,0.3294,0.665,0.3284 T0.6748,0.3274 T0.6821,0.3284 Q0.6861,0.3294,0.6967,0.3299 T0.7165,0.3314 T0.7299,0.3343 Q0.7324,0.3363,0.7486,0.3383 T0.7697,0.3422 Q0.7713,0.3432,0.7774,0.3452 T0.7887,0.3492 T0.8005,0.3546 T0.8127,0.3625 T0.8208,0.3719 Q0.8256,0.3798,0.8256,0.3848 Q0.8256,0.3877,0.8236,0.3902 T0.8171,0.3976 T0.809,0.4075 T0.8021,0.4189 T0.7968,0.4273 T0.7867,0.4322 T0.7616,0.4382 Q0.7543,0.4392,0.7437,0.4392 L0.7364,0.4392 L0.7299,0.4392 Q0.7202,0.4392,0.7161,0.4402 Q0.7072,0.4431,0.691,0.4431 L0.6845,0.4431 L0.6788,0.4431 Q0.6707,0.4431,0.6545,0.4461 T0.6334,0.452 Q0.6399,0.456,0.6626,0.457 Q0.6878,0.458,0.7024,0.4639 Q0.7064,0.4649,0.7186,0.4649 L0.7295,0.4649 L0.7413,0.4649 Q0.7591,0.4649,0.7697,0.4669 Q0.7818,0.4688,0.7818,0.4728 Q0.7818,0.4748,0.7798,0.4763 T0.7753,0.4787 L0.7737,0.4797 L0.7729,0.4797 Q0.7494,0.4827,0.7388,0.4827 Q0.7332,0.4827,0.7307,0.4817 L0.7291,0.4817 Q0.7226,0.4817,0.6878,0.4896 Q0.6829,0.4906,0.6772,0.4911 T0.6618,0.4921 T0.646,0.4931 T0.6342,0.4936 T0.6212,0.4931 T0.6115,0.4926 Q0.6083,0.4926,0.6058,0.4931 T0.5969,0.4955 T0.5819,0.499 T0.5629,0.5005 Q0.5572,0.5005,0.5527,0.501 T0.545,0.502 T0.5397,0.503 T0.5361,0.5045 T0.5337,0.5064 T0.5328,0.5094 L0.532,0.5094 Q0.532,0.5104,0.5337,0.5109 T0.5381,0.5114 T0.5438,0.5119 T0.5515,0.5124 L0.5604,0.5124 Q0.5661,0.5134,0.5746,0.5153 T0.5912,0.5173 L0.5977,0.5173 L0.6026,0.5173 Q0.6139,0.5173,0.6273,0.5218 T0.6407,0.5272 Q0.6448,0.5282,0.6683,0.5321 T0.6991,0.5381 Q0.7137,0.543,0.7664,0.548 Q0.7908,0.55,0.7908,0.5559 Q0.7908,0.5589,0.7859,0.5628 Q0.781,0.5658,0.7713,0.5658 Q0.7689,0.5658,0.7628,0.5653 T0.7543,0.5648 T0.7502,0.5658 Q0.7364,0.5678,0.6878,0.5678 Q0.674,0.5678,0.6699,0.5668 L0.6683,0.5668 Q0.6659,0.5668,0.6606,0.5678 T0.6513,0.5687 Q0.6464,0.5687,0.6391,0.5678 Q0.6334,0.5668,0.6302,0.5668 T0.6241,0.5687 T0.6164,0.5717 Q0.6123,0.5727,0.6099,0.5727 L0.6062,0.5727 T0.6022,0.5732 T0.5953,0.5737 Q0.5904,0.5747,0.5839,0.5747 T0.5726,0.5752 T0.5629,0.5776 T0.5458,0.5796 Q0.5418,0.5796,0.5324,0.5791 T0.5191,0.5786 Q0.5077,0.5786,0.5045,0.5806 Q0.498,0.5836,0.4899,0.5836 Q0.4858,0.5836,0.4777,0.5826 T0.4655,0.5816 L0.4631,0.5816 Q0.4582,0.5816,0.4436,0.5841 T0.4144,0.5865 L0.4051,0.5865 L0.3986,0.5865 T0.3933,0.587 T0.3897,0.5875 T0.3869,0.5885 T0.3844,0.5895 T0.3812,0.591 T0.3779,0.5925 Q0.3739,0.5955,0.3633,0.5955 L0.3585,0.5955 L0.3536,0.5955 Q0.3277,0.5955,0.3066,0.6053 Q0.3017,0.6083,0.296,0.6083 Q0.2912,0.6083,0.2839,0.6068 T0.2741,0.6053 Q0.2693,0.6053,0.2547,0.6048 T0.236,0.6044 Q0.2222,0.6044,0.193,0.6103 L0.1882,0.6103 Q0.1825,0.6103,0.1703,0.6083 T0.1525,0.6063 L0.15,0.6063 Q0.1436,0.6063,0.135,0.6073 T0.1168,0.6098 T0.1038,0.6113 Q0.0973,0.6123,0.0787,0.6123 L0.06,0.6123 L0.0414,0.6123 L0.0235,0.6123 Q0.0049,0.6133,0.0049,0.6172 L0.0057,0.6222 Q0.0073,0.6261,0.043,0.6261 L0.0454,0.6261 L0.0479,0.6261 Q0.0527,0.6261,0.0633,0.6281 T0.0803,0.6301 L0.0835,0.6301 L0.0916,0.6301 Q0.0998,0.6301,0.129,0.632 Q0.1768,0.636,0.206,0.64 Q0.2117,0.6409,0.2165,0.6409 Q0.2206,0.6409,0.2263,0.6405 T0.2336,0.64 L0.2384,0.64 L0.2409,0.64 T0.251,0.6395 T0.2644,0.639 Q0.2741,0.639,0.279,0.6409 Q0.283,0.6429,0.2972,0.6439 T0.3293,0.6459 T0.3528,0.6469 L0.3577,0.6469 Q0.3642,0.6469,0.3723,0.6449 T0.3844,0.6429 Q0.3901,0.6429,0.3933,0.6454 T0.4006,0.6479 Q0.4088,0.6479,0.4517,0.6558 Q0.4582,0.6568,0.4623,0.6568 Q0.4655,0.6568,0.4716,0.6563 T0.4826,0.6558 L0.4882,0.6558 Q0.5004,0.6558,0.5255,0.6607 Q0.5328,0.6627,0.5604,0.6647 T0.6152,0.6682 T0.644,0.6696 T0.6719,0.6721 T0.7056,0.6756 Q0.7113,0.6756,0.7198,0.6805 T0.738,0.6855 Q0.7453,0.6855,0.7551,0.6879 T0.7741,0.6939 T0.7912,0.7018 T0.8029,0.7102 Q0.8054,0.7132,0.8054,0.7151 Q0.8054,0.7191,0.8009,0.7216 T0.7908,0.7255 T0.779,0.7285 T0.7721,0.731 Q0.7672,0.7329,0.7632,0.7339 T0.7551,0.7354 T0.7486,0.7369 Q0.7478,0.7369,0.7445,0.7379 T0.7388,0.7394 T0.7324,0.7404 L0.7242,0.7413 T0.7161,0.7418 Q0.7105,0.7418,0.6955,0.7428 T0.6748,0.7438 L0.6699,0.7438 L0.6667,0.7438 Q0.6659,0.7438,0.6407,0.7468 Q0.6367,0.7478,0.6334,0.7478 T0.6245,0.7468 T0.6148,0.7458 L0.6099,0.7458 Q0.6018,0.7468,0.5864,0.7498 T0.5653,0.7532 T0.5596,0.7557 Q0.5596,0.7596,0.571,0.7616 Q0.5742,0.7626,0.5803,0.7631 T0.5929,0.7641 T0.6018,0.7656 L0.6087,0.7656 T0.6192,0.7666 T0.6277,0.7695 Q0.631,0.7705,0.6342,0.7705 Q0.6383,0.7705,0.6452,0.7685 T0.6537,0.7666 L0.6553,0.7666 Q0.6602,0.7666,0.6711,0.769 T0.6853,0.7715 Q0.691,0.7715,0.7048,0.775 T0.7242,0.7814 Q0.7324,0.7854,0.7445,0.7864 Q0.7478,0.7864,0.768,0.7873 T0.7972,0.7893 Q0.7989,0.7893,0.8017,0.7898 T0.8054,0.7903 L0.8082,0.7903 T0.811,0.7908 T0.8131,0.7913 T0.8151,0.7918 L0.8167,0.7928 T0.8179,0.7943 T0.8191,0.7957 T0.8204,0.7977 T0.8208,0.8002 Q0.8208,0.8032,0.8171,0.8051 T0.8074,0.8081 T0.7997,0.8091 Q0.7932,0.8121,0.7737,0.8121 Q0.7664,0.8121,0.7413,0.8111 L0.7364,0.8111 Q0.7275,0.8111,0.7214,0.8121 T0.7084,0.8155 T0.6991,0.819 Q0.6934,0.82,0.6723,0.8205 T0.6472,0.8239 Q0.6423,0.8269,0.6375,0.8269 Q0.6358,0.8269,0.6338,0.8264 T0.6294,0.8254 T0.6253,0.8249 Q0.6042,0.8249,0.5961,0.8289 Q0.5921,0.8318,0.5839,0.8318 Q0.5783,0.8318,0.5645,0.8299 L0.5604,0.8299 Q0.5531,0.8299,0.5337,0.8368 Q0.5296,0.8378,0.5255,0.8378 Q0.5239,0.8378,0.5195,0.8373 T0.5118,0.8368 Q0.5061,0.8368,0.4996,0.8388 Q0.4947,0.8388,0.4882,0.8398 Q0.4777,0.8417,0.4753,0.8427 T0.4728,0.8467 Q0.4728,0.8487,0.4769,0.8492 T0.4886,0.8501 T0.5004,0.8516 Q0.5036,0.8516,0.515,0.8521 T0.5345,0.8546 Q0.5426,0.8556,0.5596,0.8556 L0.5649,0.8556 L0.5702,0.8556 L0.5791,0.8556 Q0.5921,0.8566,0.6135,0.8571 T0.6383,0.8586 Q0.6683,0.8615,0.6764,0.8615 L0.6776,0.8615 L0.6788,0.8615 Q0.7032,0.8615,0.7032,0.8684 Q0.7032,0.8714,0.6995,0.8749 T0.6959,0.8803 L0.6959,0.8813 Q0.6991,0.8843,0.7153,0.8843 Q0.7218,0.8843,0.7259,0.8833 L0.7299,0.8833 Q0.7324,0.8833,0.7348,0.8838 T0.7393,0.8848 T0.7433,0.8863 L0.7474,0.8882 T0.751,0.8892 Q0.7616,0.8922,0.7948,0.8952 Q0.7981,0.8952,0.8082,0.8981 T0.8297,0.9011 T0.8528,0.9026 T0.8747,0.907 T0.8856,0.9149 L0.8856,0.9159 Q0.8856,0.9179,0.8848,0.9189 T0.8828,0.9209 T0.88,0.9228 T0.8767,0.9243 T0.8731,0.9248 T0.8698,0.9253 T0.8666,0.9258 L0.8646,0.9258 Q0.8621,0.9258,0.8577,0.9263 T0.85,0.9268 T0.8439,0.9273 T0.8402,0.9278 Q0.8386,0.9298,0.8358,0.9308 T0.8305,0.9322 T0.8244,0.9332 T0.8183,0.9337 Q0.8135,0.9347,0.8025,0.9372 T0.7859,0.9416 Q0.7778,0.9436,0.7717,0.9471 T0.7624,0.9515 Q0.7575,0.9535,0.7486,0.9535 Q0.7461,0.9535,0.7397,0.953 T0.7291,0.9525 Q0.7234,0.9525,0.7186,0.953 T0.7137,0.957 T0.7194,0.9614 Q0.7567,0.9634,0.7664,0.9654 Q0.7745,0.9674,0.7762,0.9674 L0.7908,0.9674 Q0.7924,0.9664,0.7948,0.9664 Q0.8029,0.9664,0.8082,0.9679 T0.8224,0.9723 T0.8362,0.9773 Q0.8483,0.9812,0.871,0.9812 L0.8751,0.9812 Q0.8873,0.9812,0.8929,0.9822 T0.9165,0.9876 T0.9408,0.9931 Q0.9513,0.996,0.9935,0.996 Z M0.9968,0.998 L0.9976,0.003 Q0.9838,0.002,0.9708,0.0059 Q0.9659,0.0069,0.9327,0.0059 T0.8881,0.0099 Q0.8767,0.0138,0.8658,0.0163 T0.8491,0.0218 Q0.8418,0.0247,0.8341,0.0247 T0.8232,0.0257 Q0.8191,0.0277,0.7997,0.0292 T0.7737,0.0326 Q0.7697,0.0336,0.7672,0.0336 T0.7612,0.0321 T0.7543,0.0307 T0.747,0.0317 Q0.7397,0.0326,0.7336,0.0356 T0.717,0.0406 Q0.6918,0.0445,0.6861,0.0475 Q0.6845,0.0485,0.6772,0.0485 T0.6638,0.05 T0.6577,0.0549 T0.6642,0.0598 T0.6796,0.0613 T0.6902,0.0623 Q0.691,0.0623,0.6946,0.0658 T0.7064,0.0702 L0.7161,0.0702 Q0.7194,0.0702,0.7242,0.0697 T0.7332,0.0692 Q0.7413,0.0692,0.7579,0.0717 T0.781,0.0762 Q0.7867,0.0781,0.8171,0.0786 T0.85,0.0801 L0.8532,0.0801 Q0.8548,0.0801,0.8613,0.0796 T0.8727,0.0791 Q0.8832,0.0791,0.8913,0.0811 Q0.897,0.0831,0.897,0.0851 Q0.897,0.088,0.8873,0.0905 T0.8735,0.093 Q0.871,0.093,0.8447,0.0984 T0.8143,0.1039 Q0.7981,0.1039,0.781,0.1078 Q0.7778,0.1088,0.7745,0.1088 T0.7644,0.1073 T0.7518,0.1048 L0.7453,0.1048 Q0.7299,0.1048,0.7076,0.1083 T0.6788,0.1157 Q0.6748,0.1187,0.6699,0.1187 Q0.6675,0.1187,0.6557,0.1157 T0.6318,0.1118 Q0.6164,0.1108,0.6135,0.1108 T0.6095,0.1113 T0.6067,0.1142 T0.6018,0.1187 Q0.5953,0.1227,0.5921,0.1227 Q0.5904,0.1227,0.5839,0.1212 T0.5693,0.1187 L0.5661,0.1187 Q0.558,0.1187,0.5527,0.1207 T0.5434,0.1246 T0.5337,0.1266 Q0.5126,0.1296,0.4882,0.1296 T0.4371,0.1385 Q0.4298,0.1414,0.425,0.1414 Q0.4225,0.1414,0.4189,0.1395 T0.4112,0.1375 Q0.4079,0.1375,0.4019,0.1395 T0.3869,0.1414 Q0.3682,0.1414,0.3504,0.1474 Q0.3398,0.1513,0.3333,0.1513 Q0.3293,0.1513,0.3228,0.1494 L0.3204,0.1494 Q0.3179,0.1494,0.3155,0.1508 T0.3118,0.1543 T0.3106,0.1592 T0.3127,0.1642 T0.32,0.1677 T0.3305,0.1701 T0.3435,0.1716 T0.3544,0.1721 Q0.3569,0.1731,0.3601,0.1731 Q0.3625,0.1731,0.3686,0.1726 T0.3779,0.1721 Q0.3901,0.1721,0.4023,0.1751 Q0.4177,0.18,0.455,0.18 Q0.4793,0.18,0.4882,0.178 L0.4915,0.178 Q0.4964,0.178,0.5045,0.1815 T0.5158,0.185 Q0.5564,0.1889,0.5645,0.1929 Q0.5677,0.1939,0.571,0.1939 Q0.575,0.1939,0.5807,0.1919 T0.5888,0.1899 T0.5929,0.1909 Q0.5969,0.1949,0.6123,0.1949 Q0.6334,0.1949,0.6456,0.1899 Q0.6488,0.1879,0.6537,0.1879 Q0.661,0.1879,0.6772,0.1929 T0.6983,0.1978 Q0.704,0.1988,0.7206,0.1998 T0.7502,0.2018 T0.7664,0.2038 Q0.7672,0.2038,0.7818,0.2043 T0.8151,0.2067 T0.8459,0.2156 Q0.8573,0.2206,0.8573,0.2255 Q0.8573,0.2295,0.8516,0.2324 T0.8394,0.2369 T0.8281,0.2384 Q0.8208,0.2384,0.7526,0.2473 Q0.7494,0.2483,0.7421,0.2493 T0.7287,0.2512 T0.7178,0.2522 L0.7153,0.2522 L0.7137,0.2522 Q0.7056,0.2522,0.6898,0.2572 T0.6691,0.2671 Q0.6667,0.269,0.6634,0.269 Q0.661,0.269,0.6557,0.2681 T0.6472,0.2671 Q0.6448,0.2671,0.6415,0.2681 Q0.631,0.271,0.6034,0.274 Q0.5994,0.274,0.5961,0.2765 T0.5904,0.2789 L0.5864,0.2789 Q0.5831,0.2779,0.5742,0.2779 Q0.541,0.2779,0.5223,0.2849 Q0.5126,0.2888,0.5028,0.2888 Q0.5004,0.2888,0.4943,0.2883 T0.4842,0.2878 Q0.4704,0.2878,0.4627,0.2898 T0.4509,0.2987 Q0.4501,0.2997,0.4501,0.3007 Q0.4501,0.3046,0.4574,0.3066 T0.4765,0.3091 T0.4899,0.3096 Q0.4931,0.3106,0.5061,0.3121 T0.5316,0.315 T0.5499,0.3175 Q0.5507,0.3175,0.5572,0.3195 T0.5685,0.3225 T0.5803,0.3254 T0.5933,0.3279 T0.605,0.3284 T0.6148,0.3274 Q0.6221,0.3244,0.6294,0.3244 Q0.6399,0.3244,0.6496,0.3294 Q0.6529,0.3314,0.6577,0.3314 Q0.6602,0.3314,0.6663,0.3304 T0.6756,0.3294 T0.6813,0.3304 Q0.6837,0.3304,0.6873,0.3309 L0.6946,0.3318 T0.7024,0.3323 T0.7105,0.3328 T0.7178,0.3338 T0.7238,0.3348 T0.7283,0.3363 Q0.7324,0.3383,0.7482,0.3403 T0.7689,0.3442 Q0.7697,0.3442,0.779,0.3477 T0.794,0.3536 T0.8074,0.3615 T0.8183,0.3729 Q0.8232,0.3808,0.8232,0.3848 Q0.8232,0.3867,0.8216,0.3892 T0.8151,0.3961 T0.8062,0.406 T0.7997,0.4179 T0.7952,0.4263 T0.7855,0.4308 T0.7616,0.4362 Q0.7543,0.4372,0.7445,0.4372 L0.7372,0.4372 L0.7307,0.4372 Q0.7202,0.4372,0.7153,0.4382 Q0.7064,0.4402,0.691,0.4402 L0.6845,0.4402 L0.6788,0.4402 Q0.6699,0.4402,0.6533,0.4436 T0.6318,0.451 Q0.6302,0.451,0.6302,0.452 Q0.6302,0.457,0.6626,0.459 Q0.6869,0.4609,0.7015,0.4659 Q0.7064,0.4669,0.7202,0.4669 L0.7311,0.4669 L0.7429,0.4669 Q0.7599,0.4669,0.7689,0.4688 Q0.7794,0.4708,0.7794,0.4738 L0.7786,0.4748 T0.777,0.4763 T0.7749,0.4773 L0.7737,0.4777 L0.7729,0.4777 Q0.7502,0.4797,0.738,0.4797 L0.7315,0.4797 L0.7291,0.4797 Q0.7226,0.4797,0.6869,0.4876 Q0.6821,0.4886,0.6768,0.4891 T0.6614,0.4901 T0.6456,0.4916 L0.6342,0.4916 Q0.6294,0.4916,0.6217,0.4911 T0.6115,0.4906 Q0.6083,0.4906,0.6054,0.4911 T0.5961,0.4936 T0.5815,0.4965 T0.5629,0.4985 Q0.5507,0.4985,0.5442,0.4995 T0.5345,0.5025 T0.5304,0.5084 L0.5296,0.5094 Q0.5296,0.5114,0.5316,0.5124 T0.5373,0.5138 T0.5442,0.5143 L0.5523,0.5143 L0.5604,0.5143 Q0.5637,0.5153,0.5677,0.5158 T0.5742,0.5173 T0.5811,0.5188 T0.5904,0.5193 L0.5977,0.5193 L0.6026,0.5193 Q0.6107,0.5193,0.6168,0.5208 T0.6294,0.5252 T0.6399,0.5292 Q0.6448,0.5302,0.6679,0.5341 T0.6983,0.541 Q0.7129,0.545,0.7664,0.55 Q0.7883,0.5519,0.7883,0.5559 Q0.7883,0.5579,0.7843,0.5608 T0.7721,0.5638 Q0.7697,0.5638,0.764,0.5633 T0.7559,0.5628 L0.7502,0.5628 Q0.7364,0.5648,0.6869,0.5648 L0.6699,0.5648 L0.6675,0.5648 Q0.665,0.5648,0.6602,0.5658 T0.6513,0.5668 Q0.6464,0.5668,0.6399,0.5658 Q0.6342,0.5648,0.6302,0.5648 T0.6225,0.5668 T0.6156,0.5697 Q0.6107,0.5707,0.6087,0.5707 T0.6034,0.5712 T0.5953,0.5717 Q0.5904,0.5727,0.5835,0.5727 T0.5718,0.5732 T0.562,0.5757 Q0.558,0.5767,0.5483,0.5767 L0.5349,0.5767 L0.5207,0.5767 Q0.5069,0.5767,0.5028,0.5786 Q0.4972,0.5816,0.4899,0.5816 Q0.4858,0.5816,0.4781,0.5806 T0.4663,0.5796 L0.4631,0.5796 Q0.4582,0.5796,0.4432,0.5821 T0.4144,0.5846 L0.4071,0.5846 L0.4011,0.5846 T0.3958,0.5851 T0.3921,0.5856 T0.3889,0.5861 T0.3865,0.5865 T0.384,0.5875 L0.382,0.5885 L0.3796,0.5895 L0.3771,0.5905 Q0.3731,0.5925,0.365,0.5925 L0.3601,0.5925 L0.3552,0.5925 Q0.3277,0.5925,0.3049,0.6044 Q0.3017,0.6053,0.296,0.6053 Q0.292,0.6053,0.2847,0.6044 T0.2741,0.6034 Q0.2693,0.6034,0.2547,0.6029 T0.236,0.6024 Q0.2222,0.6024,0.1922,0.6073 Q0.1906,0.6083,0.1882,0.6083 Q0.1833,0.6083,0.1711,0.6063 T0.1533,0.6044 Q0.1517,0.6034,0.1492,0.6034 Q0.1436,0.6034,0.135,0.6048 T0.1168,0.6078 T0.103,0.6093 Q0.0973,0.6103,0.0787,0.6103 L0.0604,0.6103 L0.0414,0.6103 L0.0235,0.6103 Q0.0024,0.6113,0.0024,0.6172 Q0.0024,0.6192,0.0032,0.6231 Q0.0049,0.6281,0.0333,0.6281 L0.0414,0.6281 L0.0479,0.6281 Q0.0519,0.6281,0.0624,0.6301 T0.0803,0.632 L0.0835,0.632 L0.0916,0.632 Q0.0989,0.632,0.1281,0.634 L0.206,0.6419 Q0.2117,0.6429,0.2174,0.6429 Q0.2214,0.6429,0.2271,0.6424 T0.2344,0.6419 L0.2376,0.6419 Q0.2393,0.6429,0.2417,0.6429 T0.2526,0.6419 T0.2652,0.6409 Q0.2741,0.6409,0.2782,0.6429 T0.2968,0.6459 T0.3293,0.6479 T0.352,0.6489 Q0.3552,0.6499,0.3585,0.6499 Q0.365,0.6499,0.3731,0.6474 T0.3844,0.6449 Q0.3885,0.6449,0.3917,0.6474 T0.4006,0.6499 Q0.4088,0.6499,0.4509,0.6578 Q0.4574,0.6588,0.4631,0.6588 Q0.4655,0.6588,0.4716,0.6583 T0.4834,0.6578 L0.4874,0.6578 Q0.5004,0.6588,0.5255,0.6637 Q0.532,0.6647,0.56,0.6667 T0.6148,0.6701 T0.644,0.6716 Q0.6464,0.6726,0.6594,0.6736 T0.6861,0.6756 T0.7048,0.6775 Q0.7097,0.6775,0.7186,0.6825 T0.738,0.6874 Q0.7518,0.6874,0.7729,0.6958 T0.8005,0.7122 Q0.8029,0.7141,0.8029,0.7151 Q0.8029,0.7191,0.7968,0.7216 T0.7818,0.726 T0.7705,0.729 L0.764,0.731 T0.7583,0.7324 T0.753,0.7334 T0.7486,0.7349 Q0.7251,0.7399,0.7161,0.7399 Q0.7097,0.7399,0.6951,0.7409 T0.6748,0.7418 L0.6703,0.7418 L0.6667,0.7418 Q0.6659,0.7418,0.6399,0.7448 L0.6334,0.7448 Q0.631,0.7448,0.6249,0.7443 T0.6148,0.7438 L0.6099,0.7438 Q0.601,0.7448,0.5856,0.7473 T0.5645,0.7507 Q0.5572,0.7517,0.5572,0.7547 T0.5616,0.7606 T0.5702,0.7646 Q0.5734,0.7646,0.5779,0.7651 T0.5864,0.7661 T0.5949,0.7671 T0.6018,0.7676 L0.6071,0.7676 T0.6135,0.7681 T0.62,0.769 T0.6269,0.771 T0.6342,0.7725 Q0.6391,0.7725,0.6464,0.7705 T0.6541,0.7685 L0.6553,0.7685 Q0.6586,0.7685,0.6699,0.771 T0.6853,0.7735 Q0.6902,0.7735,0.704,0.777 T0.7226,0.7834 Q0.7315,0.7873,0.7445,0.7883 Q0.747,0.7883,0.7676,0.7893 T0.7972,0.7913 Q0.7989,0.7913,0.8017,0.7918 T0.8058,0.7923 T0.809,0.7928 T0.8114,0.7933 T0.8131,0.7938 T0.8147,0.7943 T0.8159,0.7953 L0.8171,0.7967 T0.8175,0.7982 Q0.8183,0.7992,0.8183,0.8002 Q0.8183,0.8022,0.8155,0.8032 T0.807,0.8051 T0.7989,0.8071 Q0.7932,0.8091,0.7737,0.8091 L0.7413,0.8091 L0.7372,0.8091 Q0.7275,0.8091,0.721,0.8101 T0.7072,0.8136 T0.6983,0.817 Q0.6942,0.818,0.6825,0.818 T0.6602,0.819 T0.6456,0.822 Q0.6415,0.8249,0.6375,0.8249 Q0.6367,0.8249,0.6326,0.8239 T0.6253,0.8229 Q0.6034,0.8229,0.5953,0.8279 Q0.5912,0.8289,0.5848,0.8289 Q0.5775,0.8289,0.5645,0.8279 Q0.5629,0.8269,0.5604,0.8269 Q0.5523,0.8269,0.5328,0.8348 Q0.5296,0.8358,0.5264,0.8358 Q0.5247,0.8358,0.5203,0.8353 T0.5126,0.8348 Q0.5061,0.8348,0.4988,0.8358 Q0.4947,0.8368,0.4882,0.8378 Q0.4826,0.8388,0.4797,0.8388 T0.474,0.8398 T0.4704,0.8422 T0.4696,0.8462 T0.472,0.8501 T0.4781,0.8521 T0.4854,0.8526 L0.4935,0.8526 T0.4996,0.8536 Q0.5036,0.8536,0.515,0.8546 T0.5337,0.8566 Q0.5426,0.8576,0.5596,0.8576 L0.5657,0.8576 L0.571,0.8576 L0.5791,0.8576 Q0.5921,0.8586,0.6135,0.8591 T0.6383,0.8605 Q0.6683,0.8635,0.6764,0.8635 Q0.6999,0.8635,0.6999,0.8684 Q0.6999,0.8694,0.6967,0.8734 T0.6934,0.8803 L0.6934,0.8823 Q0.6951,0.8863,0.7137,0.8863 Q0.7218,0.8863,0.7267,0.8853 L0.7299,0.8853 Q0.734,0.8853,0.7409,0.8882 T0.7502,0.8912 Q0.7607,0.8942,0.794,0.8971 Q0.7972,0.8971,0.8078,0.9001 T0.8297,0.9031 Q0.8475,0.9031,0.8646,0.9065 T0.8824,0.9149 L0.8824,0.9159 Q0.8824,0.9169,0.882,0.9179 T0.8808,0.9194 L0.8792,0.9204 T0.8767,0.9214 T0.8743,0.9224 T0.8715,0.9228 L0.8686,0.9228 T0.8662,0.9233 T0.8637,0.9238 L0.8556,0.9238 T0.8447,0.9243 T0.8386,0.9268 Q0.837,0.9278,0.835,0.9288 T0.8305,0.9303 T0.8244,0.9308 T0.8175,0.9318 Q0.8127,0.9327,0.8017,0.9352 T0.7851,0.9397 Q0.777,0.9416,0.7705,0.9451 T0.7616,0.9496 Q0.7575,0.9505,0.7494,0.9505 L0.7405,0.9505 L0.7307,0.9505 Q0.7234,0.9505,0.7178,0.9515 Q0.7145,0.9515,0.7125,0.9535 T0.7105,0.9575 Q0.7105,0.9624,0.7194,0.9634 Q0.7567,0.9654,0.7664,0.9674 Q0.7745,0.9693,0.7762,0.9693 L0.7908,0.9693 L0.7948,0.9693 Q0.8005,0.9693,0.8058,0.9698 T0.8143,0.9718 T0.824,0.9753 T0.8354,0.9792 Q0.8483,0.9832,0.871,0.9832 L0.8739,0.9832 L0.8767,0.9832 Q0.8873,0.9832,0.8921,0.9842 Q0.8978,0.9852,0.9157,0.9896 T0.94,0.996 Q0.9424,0.996,0.9469,0.9965 T0.9566,0.997 T0.9676,0.9975 T0.9781,0.998 L0.9874,0.998 L0.9943,0.998 L0.9968,0.998 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0CB}' is unused\n '\\u{E0CC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.5071 L0.8623,0.7102 L0.5865,0.7102 L0.4489,0.5071 L0.5865,0.3045 L0.8623,0.3045 Z M0.4135,0.7974 L0.2758,1 L0,1 L0,0.5944 L0.2758,0.5944 Z M0.4135,0.2026 L0.2758,0.4056 L0,0.4056 L0,0 L0.2758,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9726,0.5071 L0.8451,0.3184 L0.59,0.3184 L0.4624,0.5071 L0.59,0.6955 L0.8451,0.6955 Z M1,0.5071 L0.8588,0.716 L0.5768,0.716 L0.4355,0.5071 L0.5768,0.2982 L0.8588,0.2982 Z M0.401,0.7911 L0.2735,0.6028 L0.0236,0.6028 L0.0236,0.9799 L0.2735,0.9799 Z M0.4284,0.7911 L0.2872,1 L0,1 L0,0.5826 L0.2872,0.5826 Z M0.401,0.2089 L0.2735,0.0201 L0.0236,0.0201 L0.0236,0.3972 L0.2735,0.3972 Z M0.4284,0.2089 L0.2872,0.4174 L0,0.4174 L0,0 L0.2872,0 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0.4996 Q1,0.5365,0.9924,0.568 T0.9718,0.6177 T0.9433,0.6363 L0.9425,0.6367 Q0.9355,0.6367,0.9285,0.6326 L0.9308,0.6326 Q0.9129,0.6195,0.9013,0.587 T0.8871,0.5164 T0.8943,0.4373 T0.9254,0.3687 L0.9254,0.3691 Q0.9339,0.3628,0.9425,0.3628 Q0.9584,0.3628,0.9716,0.3811 T0.9924,0.431 T1,0.4996 Z M0.9234,0.6321 L0.8776,0.7169 Q0.8791,0.732,0.8791,0.7441 Q0.8791,0.781,0.8716,0.8123 T0.8508,0.862 T0.8224,0.8809 L0.8216,0.8809 Q0.8154,0.8809,0.8092,0.8775 L0.8088,0.8775 Q0.7905,0.8633,0.7792,0.8297 T0.766,0.7571 T0.775,0.6768 T0.8088,0.6086 L0.7431,0.6065 Q0.719,0.6313,0.7072,0.6705 T0.6965,0.7487 T0.7097,0.823 T0.7423,0.8763 L0.7913,0.8775 L0.7314,0.9895 L0.4648,0.5038 L0.7299,0.0176 L0.7882,0.1229 L0.7404,0.1212 Q0.7244,0.138,0.7136,0.1617 T0.6982,0.2108 T0.6943,0.2632 T0.7003,0.3144 T0.7159,0.3586 T0.7396,0.3909 L0.8072,0.3926 Q0.7894,0.3796,0.7777,0.3479 T0.7635,0.2789 T0.7697,0.2011 T0.7987,0.1326 Q0.8092,0.1225,0.8204,0.1225 Q0.8321,0.1225,0.8426,0.1332 T0.8609,0.1623 T0.8731,0.2062 T0.8776,0.2592 Q0.8776,0.268,0.8768,0.2815 L0.9219,0.3628 L0.8644,0.3612 Q0.8403,0.3855,0.8284,0.4247 T0.8177,0.5029 T0.8309,0.5772 T0.8632,0.6305 Z M0.6759,0.6384 Q0.6576,0.625,0.6457,0.5914 T0.6319,0.5185 T0.6407,0.4375 T0.6751,0.3691 L0.609,0.367 Q0.5849,0.3918,0.5731,0.431 T0.5626,0.509 T0.5758,0.5833 T0.6082,0.6367 Z M0.6459,0.0025 L0.391,0.4551 L0.0035,0.4551 L0.246,0 Z M0.6553,1 L0.2421,1 L0,0.5449 L0.3875,0.5449 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0CF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.4996,0 Q0.5562,0,0.5961,0.0166 T0.6364,0.0566 L0.6368,0.0575 Q0.6368,0.0646,0.6324,0.0713 L0.6324,0.0692 Q0.6196,0.0868,0.5872,0.0986 T0.5166,0.1128 T0.4373,0.1057 T0.3689,0.0747 L0.3694,0.0747 Q0.3627,0.0663,0.3627,0.0575 Q0.3627,0.0336,0.4028,0.0168 T0.4996,0 Z M0.6324,0.0768 L0.717,0.1225 Q0.7321,0.1212,0.744,0.1212 Q0.8007,0.1212,0.8406,0.1378 T0.8809,0.1779 L0.8813,0.1783 Q0.8813,0.1846,0.8778,0.1909 Q0.8636,0.2093,0.8299,0.2208 T0.7573,0.2343 T0.6769,0.2253 T0.6089,0.1913 L0.6067,0.2567 Q0.6315,0.281,0.6707,0.2928 T0.7489,0.3035 T0.8231,0.2903 T0.8764,0.258 L0.8778,0.2085 L0.9898,0.2685 L0.504,0.5352 L0.0177,0.2701 L0.1227,0.2118 L0.1213,0.2596 Q0.1457,0.2836,0.1851,0.2955 T0.2635,0.3062 T0.3377,0.293 T0.3911,0.2605 L0.3928,0.193 Q0.38,0.2106,0.3483,0.2221 T0.2792,0.2364 T0.2013,0.2303 T0.1324,0.2013 Q0.1222,0.1909,0.1222,0.1795 Q0.1222,0.156,0.1623,0.1393 T0.2591,0.1225 Q0.2679,0.1225,0.2817,0.1233 L0.3627,0.078 L0.3609,0.1359 Q0.3857,0.1598,0.4249,0.1718 T0.5031,0.1825 T0.5773,0.1693 T0.6306,0.1367 Z M0.6386,0.3242 Q0.6253,0.3427,0.5917,0.3544 T0.5186,0.3683 T0.4376,0.3595 T0.3689,0.3251 L0.3671,0.3909 Q0.3915,0.4148,0.4309,0.4268 T0.5093,0.4375 T0.5835,0.4243 T0.6368,0.3918 Z M0.0027,0.354 L0.4553,0.6091 L0.4553,0.9962 L0,0.7542 Z M1,0.3448 L1,0.7576 L0.5447,1 L0.5447,0.6128 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0.7699 Q0,0.7172,0.0277,0.6731 T0.103,0.6032 T0.2066,0.5774 Q0.2487,0.5774,0.2865,0.5922 T0.3526,0.6339 L0.3935,0.6715 Q0.4218,0.6984,0.438,0.7336 T0.4541,0.8075 Q0.4541,0.8602,0.4264,0.9046 T0.3511,0.9745 T0.2475,1 Q0.2054,1,0.1676,0.9852 T0.1016,0.9435 L0.0606,0.9059 Q0.0317,0.879,0.0159,0.8438 T0,0.7699 Z M0.5459,0.7699 Q0.5459,0.7172,0.5736,0.6731 T0.6489,0.6032 T0.7525,0.5774 Q0.7946,0.5774,0.8324,0.5922 T0.8984,0.6339 L0.9394,0.6715 Q0.9579,0.6892,0.9714,0.7105 T0.9925,0.7567 T1,0.8075 Q1,0.8602,0.9723,0.9046 T0.897,0.9745 T0.7934,1 Q0.7513,1,0.7135,0.9852 T0.6474,0.9435 L0.6065,0.9059 Q0.5776,0.879,0.5617,0.8438 T0.5459,0.7699 Z M0,0.1925 Q0,0.1398,0.0277,0.0957 T0.103,0.0258 T0.2066,0 Q0.2487,0,0.2865,0.0148 T0.3526,0.0565 L0.3935,0.0941 Q0.4218,0.121,0.438,0.1562 T0.4541,0.2301 Q0.4541,0.2828,0.4264,0.3269 T0.3511,0.3968 T0.2475,0.4226 Q0.2054,0.4226,0.1676,0.4078 T0.1016,0.3661 L0.0606,0.3285 Q0.0317,0.3016,0.0159,0.2664 T0,0.1925 Z M0.5459,0.1925 Q0.5459,0.1398,0.5736,0.0957 T0.6489,0.0258 T0.7525,0 Q0.7946,0,0.8324,0.0148 T0.8984,0.0565 L0.9394,0.0941 Q0.9677,0.121,0.9838,0.1562 T1,0.2301 Q1,0.2828,0.9723,0.3269 T0.897,0.3968 T0.7934,0.4226 Q0.7513,0.4226,0.7135,0.4078 T0.6474,0.3661 L0.6065,0.3285 Q0.5874,0.3108,0.5741,0.2895 T0.5534,0.2433 T0.5459,0.1925 Z M0.3301,0.6403 Q0.3306,0.6403,0.3312,0.6409 L0.3272,0.6371 L0.3272,0.6371 Z M0.8759,0.6403 Q0.8765,0.6403,0.8771,0.6409 Q0.8748,0.6387,0.8725,0.6371 L0.8731,0.6371 Z M0.3301,0.0629 Q0.3306,0.0629,0.3312,0.0634 L0.3272,0.0597 L0.3272,0.0602 Z M0.8759,0.0629 Q0.8765,0.0629,0.8771,0.0634 Q0.8748,0.0613,0.8725,0.0597 Q0.8731,0.0597,0.8731,0.0602 Z M0.779,0.4113 L0.7501,0.3849 Q0.7046,0.3844,0.6636,0.3661 Q0.7132,0.407,0.779,0.4113 Z M0.7957,0.4118 Q0.8477,0.4113,0.8918,0.3874 T0.9619,0.3223 T0.9885,0.2323 L0.9585,0.2048 Q0.9538,0.2769,0.8987,0.3282 T0.7657,0.3844 Z M0.9879,0.2167 Q0.9827,0.1554,0.9388,0.1097 Q0.9585,0.1478,0.959,0.1898 Z M0.2331,0.4113 L0.2043,0.3849 Q0.1587,0.3844,0.1177,0.3661 Q0.1673,0.407,0.2331,0.4113 Z M0.2499,0.4118 Q0.2885,0.4118,0.324,0.3973 T0.3852,0.3589 T0.4264,0.3019 T0.4426,0.2323 L0.4126,0.2048 Q0.408,0.2769,0.3529,0.3282 T0.2198,0.3844 Z M0.442,0.2167 Q0.4368,0.1554,0.393,0.1097 Q0.4126,0.1478,0.4132,0.1903 Z M0.779,0.9887 L0.7501,0.9624 Q0.7046,0.9618,0.6636,0.9435 Q0.7132,0.9844,0.779,0.9887 Z M0.7957,0.9892 Q0.8477,0.9887,0.8918,0.9648 T0.9619,0.8997 T0.9885,0.8097 L0.9585,0.7823 Q0.9538,0.8543,0.8987,0.9056 T0.7657,0.9618 Z M0.9879,0.7941 Q0.9827,0.7328,0.9388,0.6871 Q0.9585,0.7253,0.959,0.7672 Z M0.2331,0.9887 L0.2043,0.9624 Q0.1587,0.9618,0.1177,0.9435 Q0.1673,0.9844,0.2331,0.9887 Z M0.2499,0.9892 Q0.3018,0.9887,0.3459,0.9648 T0.416,0.8997 T0.4426,0.8102 L0.4126,0.7823 Q0.408,0.8543,0.3529,0.9056 T0.2198,0.9618 Z M0.442,0.7941 Q0.4368,0.7328,0.393,0.6871 Q0.4126,0.7253,0.4132,0.7672 Z M0.3191,0.6452 Q0.2943,0.622,0.2643,0.6091 T0.2066,0.5962 Q0.1795,0.5962,0.1497,0.6091 T0.0949,0.6441 T0.0537,0.6995 T0.0375,0.7699 Q0.0375,0.8419,0.0941,0.8941 Q0.1189,0.9172,0.1489,0.9304 T0.2066,0.9435 Q0.2337,0.9435,0.2634,0.9304 T0.3182,0.8952 T0.3595,0.8398 T0.3756,0.7699 Q0.3756,0.6978,0.3191,0.6452 Z M0.026,0.7731 L0.026,0.7699 Q0.026,0.6935,0.0854,0.6376 Q0.0658,0.6538,0.0514,0.6739 T0.0289,0.718 T0.0202,0.7677 Z M0.0271,0.7892 L0.0208,0.7833 Q0.0254,0.8419,0.0681,0.886 Q0.0664,0.8828,0.0646,0.879 Q0.0329,0.8382,0.0271,0.7892 Z M0.3866,0.7823 Q0.382,0.8511,0.3278,0.9016 Q0.3843,0.8565,0.3918,0.7871 Z M0.3872,0.7677 L0.393,0.7726 L0.393,0.7699 Q0.393,0.7349,0.3791,0.7038 Q0.3739,0.6973,0.3681,0.6914 Q0.3866,0.7274,0.3872,0.7677 Z M0.865,0.6452 Q0.8402,0.622,0.8102,0.6091 T0.7525,0.5962 Q0.7305,0.5962,0.7072,0.6043 T0.6619,0.628 T0.6223,0.6642 T0.5941,0.7124 T0.5834,0.7699 Q0.5834,0.8419,0.6399,0.8941 Q0.6561,0.9097,0.6757,0.9207 T0.7149,0.9376 T0.7525,0.9435 Q0.7796,0.9435,0.8093,0.9304 T0.8641,0.8952 T0.9054,0.8398 T0.9215,0.7699 Q0.9215,0.6978,0.865,0.6452 Z M0.5718,0.7731 L0.5718,0.7699 Q0.5718,0.6935,0.6313,0.6376 Q0.6013,0.6618,0.584,0.6954 T0.5661,0.7677 Z M0.573,0.7892 L0.5666,0.7833 Q0.5713,0.8419,0.614,0.886 Q0.6122,0.8828,0.6105,0.879 Q0.5788,0.8382,0.573,0.7892 Z M0.9325,0.7823 Q0.9279,0.8511,0.8736,0.9016 Q0.9308,0.8565,0.9377,0.7871 Z M0.9331,0.7672 L0.9388,0.7726 L0.9388,0.7699 Q0.9388,0.7349,0.925,0.7038 Q0.9198,0.6973,0.914,0.6914 Q0.9325,0.7274,0.9331,0.7672 Z M0.3191,0.0677 Q0.2943,0.0446,0.2643,0.0317 T0.2066,0.0188 Q0.1795,0.0188,0.1497,0.0317 T0.0949,0.0667 T0.0537,0.122 T0.0375,0.1925 Q0.0375,0.2645,0.0941,0.3167 Q0.1189,0.3398,0.1489,0.353 T0.2066,0.3661 Q0.2337,0.3661,0.2634,0.353 T0.3182,0.3177 T0.3595,0.2624 T0.3756,0.1925 Q0.3756,0.1204,0.3191,0.0677 Z M0.026,0.1957 L0.026,0.1925 Q0.026,0.1161,0.0854,0.0602 Q0.0554,0.0844,0.0381,0.118 T0.0202,0.1903 Z M0.0271,0.2118 L0.0208,0.2059 Q0.0254,0.2645,0.0681,0.3086 Q0.0664,0.3054,0.0646,0.3016 Q0.0329,0.2608,0.0271,0.2118 Z M0.3866,0.2048 Q0.382,0.2737,0.3278,0.3242 Q0.3849,0.279,0.3918,0.2097 Z M0.3872,0.1903 L0.393,0.1952 L0.393,0.1925 Q0.393,0.1581,0.3791,0.1263 Q0.3739,0.1199,0.3681,0.114 Q0.3866,0.15,0.3872,0.1903 Z M0.865,0.0677 Q0.8402,0.0446,0.8102,0.0317 T0.7525,0.0188 Q0.7253,0.0188,0.6956,0.0317 T0.6408,0.0667 T0.5995,0.122 T0.5834,0.1925 Q0.5834,0.2645,0.6399,0.3167 Q0.6647,0.3398,0.6947,0.353 T0.7525,0.3661 Q0.7796,0.3661,0.8093,0.353 T0.8641,0.3177 T0.9054,0.2624 T0.9215,0.1925 Q0.9215,0.1204,0.865,0.0677 Z M0.5718,0.1957 L0.5718,0.1925 Q0.5718,0.1161,0.6313,0.0602 Q0.6013,0.0844,0.584,0.118 T0.5661,0.1903 Z M0.573,0.2118 L0.5666,0.2059 Q0.5713,0.2645,0.614,0.3086 Q0.6122,0.3054,0.6105,0.3016 Q0.5788,0.2608,0.573,0.2118 Z M0.9325,0.2048 Q0.9279,0.2737,0.8736,0.3242 Q0.9308,0.279,0.9377,0.2097 Z M0.9331,0.1898 L0.9388,0.1952 L0.9388,0.1925 Q0.9388,0.1575,0.925,0.1263 Q0.9198,0.1199,0.914,0.114 Q0.9325,0.15,0.9331,0.1898 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.7639,0.1974 L0.9593,0.1974 L0.9593,0.1443 L0.7639,0.1443 L0.7639,0.1974 Z M0.7586,0.109 L0.9727,0.109 Q0.9839,0.109,0.992,0.1153 T1,0.1291 L1,0.382 Q1,0.3906,0.9912,0.3964 T0.9727,0.4021 L0.7586,0.4021 Q0.7468,0.4021,0.739,0.3956 T0.7313,0.382 L0.7313,0.1291 Q0.7313,0.1246,0.7339,0.1207 T0.7406,0.1143 T0.7495,0.1104 T0.7586,0.109 Z M0.7639,0.6575 L0.9593,0.6575 L0.9593,0.6044 L0.7639,0.6044 L0.7639,0.6575 Z M0.7313,0.8347 L0.7313,0.5843 Q0.7313,0.5757,0.7401,0.5699 T0.7586,0.5641 L0.9706,0.5641 Q0.9818,0.5641,0.9898,0.5705 T0.9979,0.5843 L0.9979,0.8347 Q0.9979,0.8433,0.989,0.8491 T0.9706,0.8549 L0.7586,0.8549 Q0.7468,0.8549,0.739,0.8483 T0.7313,0.8347 Z M0,1 L0,0 L0.7607,0 L0.7607,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n '\\u{E0D2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.9764,0.0029 L0.3179,0.4552 L0,0.4552 L0,0 Z M1,1 L0,1 L0,0.5448 L0.3091,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n // '\\u{E0C3}' is unused\n '\\u{E0D4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.0236,0.0029 L0.6824,0.4552 L1,0.4552 L1,0 Z M0,1 L1,1 L1,0.5448 L0.6912,0.5448 Z', type: CustomGlyphVectorType.FILL } },\n\n // #endregion\n\n // #region Progress Indicators (EE00-EE0B)\n\n // initially added in Fira Code and later Nerd Fonts\n // https://github.com/ryanoasis/nerd-fonts/pull/1733\n\n // Progress bars (EE00-EE05)\n '\\u{EE00}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY START\n '\\u{EE01}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z' }, // PROGRESS BAR EMPTY MIDDLE\n '\\u{EE02}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z' }, // PROGRESS BAR EMPTY END\n '\\u{EE03}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L.1,.05 L.1,.95 L1,.95 L1,1 L0,1 Z M.25,.15 L1,.15 L1,.85 L.25,.85 Z' }, // PROGRESS BAR FILLED START\n '\\u{EE04}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,.05 L0,.05 Z M0,.95 L1,.95 L1,1 L0,1 Z M0,.15 L1,.15 L1,.85 L0,.85 Z' }, // PROGRESS BAR FILLED MIDDLE\n '\\u{EE05}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L0,0 L0,.05 L.9,.05 L.9,.95 L0,.95 L0,1 L1,1 Z M0,.15 L.75,.15 L.75,.85 L0,.85 Z' }, // PROGRESS BAR FILLED END\n\n // Progress spinners (EE06-EE0B) - 6-frame spinner animation using stroked arcs\n '\\u{EE06}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.6574,0.303 Q0.623,0.291,0.5852,0.285 T0.5082,0.279 T0.4311,0.285 T0.359,0.303 L0.3082,0.248 Q0.3525,0.232,0.4041,0.2235 T0.5082,0.215 T0.6123,0.2235 T0.7082,0.248 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 1 (12 o'clock)\n '\\u{EE07}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.8557,0.582 L0.7656,0.551 Q0.7852,0.53,0.7951,0.507 T0.8049,0.46 Q0.8049,0.424,0.782,0.3905 T0.718,0.332 T0.6221,0.293 T0.5082,0.279 L0.5082,0.215 Q0.5607,0.215,0.6123,0.2235 T0.709,0.248 T0.7918,0.287 T0.8557,0.3375 T0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.582 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 2 (2 o'clock)\n '\\u{EE08}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.482,0.705,0.4557,0.703 T0.4049,0.697 L0.4311,0.635 Q0.4508,0.638,0.4697,0.6395 T0.5082,0.641 Q0.5672,0.641,0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 Q0.8049,0.436,0.7951,0.413 T0.7656,0.369 L0.8557,0.338 Q0.882,0.365,0.8959,0.3965 T0.9098,0.46 T0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 3 (4 o'clock)\n '\\u{EE09}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 L0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 T0.6221,0.627 T0.718,0.588 T0.782,0.5295 T0.8049,0.46 L0.9098,0.46 Q0.9098,0.492,0.8959,0.5235 T0.8557,0.5825 T0.7918,0.633 T0.709,0.672 T0.6123,0.6965 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 4 (6 o'clock)\n '\\u{EE0A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.5082,0.705 Q0.4557,0.705,0.4041,0.6965 T0.3074,0.672 T0.2246,0.633 T0.1607,0.5825 T0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.338 L0.2508,0.369 Q0.2311,0.39,0.2213,0.413 T0.2115,0.46 Q0.2115,0.496,0.2344,0.5295 T0.2984,0.588 T0.3943,0.627 T0.5082,0.641 Q0.5279,0.641,0.5467,0.6395 T0.5852,0.635 L0.6115,0.697 Q0.5869,0.701,0.5607,0.703 T0.5082,0.705 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 5 (8 o'clock)\n '\\u{EE0B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0.1607,0.582 Q0.1344,0.555,0.1205,0.5235 T0.1066,0.46 T0.1205,0.3965 T0.1607,0.3375 T0.2246,0.287 T0.3074,0.248 T0.4041,0.2235 T0.5082,0.215 L0.5082,0.279 Q0.4492,0.279,0.3943,0.293 T0.2984,0.332 T0.2344,0.3905 T0.2115,0.46 Q0.2115,0.484,0.2213,0.507 T0.2508,0.551 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SPINNER FRAME 6 (10 o'clock)\n\n // #endregion\n\n // #region Git Branch Symbols (F5D0-F60D)\n\n // Initially added in Kitty (https://github.com/kovidgoyal/kitty/pull/7681)\n // then in Wezterm (https://github.com/wezterm/wezterm/issues/6328).\n\n // Straight lines (F5D0-F5D9)\n '\\u{F5D0}': GitBranchSymbolsParts.LINE_H, // Same as 2500\n '\\u{F5D1}': GitBranchSymbolsParts.LINE_V, // Same as 2502\n '\\u{F5D2}': GitBranchSymbolsParts.FADE_RIGHT,\n '\\u{F5D3}': GitBranchSymbolsParts.FADE_LEFT,\n '\\u{F5D4}': GitBranchSymbolsParts.FADE_DOWN,\n '\\u{F5D5}': GitBranchSymbolsParts.FADE_UP,\n\n // Curved lines (F5D6-F5D9)\n '\\u{F5D6}': GitBranchSymbolsParts.CURVE_DOWN_RIGHT, // Same as 256D)\n '\\u{F5D7}': GitBranchSymbolsParts.CURVE_DOWN_LEFT, // Same as 256E)\n '\\u{F5D8}': GitBranchSymbolsParts.CURVE_UP_RIGHT, // Same as 2570)\n '\\u{F5D9}': GitBranchSymbolsParts.CURVE_UP_LEFT, // Same as 256F)\n\n // Branching lines (F5DA-F5ED)\n '\\u{F5DA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5DC}': [GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5DD}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5DE}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5DF}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E0}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT],\n '\\u{F5E1}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E2}': [GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E3}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E4}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E5}': [GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E6}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_UP_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5E7}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_DOWN_RIGHT],\n '\\u{F5E8}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5E9}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EA}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5EB}': [GitBranchSymbolsParts.LINE_V, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n '\\u{F5EC}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_RIGHT, GitBranchSymbolsParts.CURVE_UP_LEFT],\n '\\u{F5ED}': [GitBranchSymbolsParts.LINE_H, GitBranchSymbolsParts.CURVE_DOWN_LEFT, GitBranchSymbolsParts.CURVE_UP_RIGHT],\n\n // Nodes (F5EE-F5FB)\n '\\u{F5EE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE],\n '\\u{F5EF}': GitBranchSymbolsParts.NODE_STROKE,\n '\\u{F5F0}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F1}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F2}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F3}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5F4}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F5}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5F6}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F7}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN],\n '\\u{F5F8}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5F9}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FA}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n '\\u{F5FB}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_UP],\n\n // Extended Nodes (F5FC-F60D)\n // These were added a little later https://github.com/kovidgoyal/kitty/pull/7805\n '\\u{F5FC}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FD}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F5FE}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F5FF}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F600}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F601}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F602}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F603}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F604}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F605}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F606}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F607}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT],\n '\\u{F608}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F609}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60A}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60B}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60C}': [GitBranchSymbolsParts.NODE_FILL, GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n '\\u{F60D}': [GitBranchSymbolsParts.NODE_STROKE, GitBranchSymbolsParts.NODE_LINE_UP, GitBranchSymbolsParts.NODE_LINE_DOWN, GitBranchSymbolsParts.NODE_LINE_LEFT, GitBranchSymbolsParts.NODE_LINE_RIGHT],\n\n // #endregion\n\n // #region Symbols for Legacy Computing (1FB00-1FB3B)\n\n // https://www.unicode.org/charts/PDF/U1FB00.pdf\n\n // Block mosaic terminal graphic characters (1FB00-1FB3B)\n // The term \"sextant\" refers to block mosaics divided into six parts.\n '\\u{1FB00}': sextant(0b000001), // BLOCK SEXTANT-1\n '\\u{1FB01}': sextant(0b000010), // BLOCK SEXTANT-2\n '\\u{1FB02}': sextant(0b000011), // BLOCK SEXTANT-12 (upper one third block)\n '\\u{1FB03}': sextant(0b000100), // BLOCK SEXTANT-3\n '\\u{1FB04}': sextant(0b000101), // BLOCK SEXTANT-13\n '\\u{1FB05}': sextant(0b000110), // BLOCK SEXTANT-23\n '\\u{1FB06}': sextant(0b000111), // BLOCK SEXTANT-123\n '\\u{1FB07}': sextant(0b001000), // BLOCK SEXTANT-4\n '\\u{1FB08}': sextant(0b001001), // BLOCK SEXTANT-14\n '\\u{1FB09}': sextant(0b001010), // BLOCK SEXTANT-24\n '\\u{1FB0A}': sextant(0b001011), // BLOCK SEXTANT-124\n '\\u{1FB0B}': sextant(0b001100), // BLOCK SEXTANT-34 (middle one third block)\n '\\u{1FB0C}': sextant(0b001101), // BLOCK SEXTANT-134\n '\\u{1FB0D}': sextant(0b001110), // BLOCK SEXTANT-234\n '\\u{1FB0E}': sextant(0b001111), // BLOCK SEXTANT-1234 (upper two thirds block)\n '\\u{1FB0F}': sextant(0b010000), // BLOCK SEXTANT-5\n '\\u{1FB10}': sextant(0b010001), // BLOCK SEXTANT-15\n '\\u{1FB11}': sextant(0b010010), // BLOCK SEXTANT-25\n '\\u{1FB12}': sextant(0b010011), // BLOCK SEXTANT-125\n '\\u{1FB13}': sextant(0b010100), // BLOCK SEXTANT-35\n '\\u{1FB14}': sextant(0b010110), // BLOCK SEXTANT-235\n '\\u{1FB15}': sextant(0b010111), // BLOCK SEXTANT-1235\n '\\u{1FB16}': sextant(0b011000), // BLOCK SEXTANT-45\n '\\u{1FB17}': sextant(0b011001), // BLOCK SEXTANT-145\n '\\u{1FB18}': sextant(0b011010), // BLOCK SEXTANT-245\n '\\u{1FB19}': sextant(0b011011), // BLOCK SEXTANT-1245\n '\\u{1FB1A}': sextant(0b011100), // BLOCK SEXTANT-345\n '\\u{1FB1B}': sextant(0b011101), // BLOCK SEXTANT-1345\n '\\u{1FB1C}': sextant(0b011110), // BLOCK SEXTANT-2345\n '\\u{1FB1D}': sextant(0b011111), // BLOCK SEXTANT-12345\n '\\u{1FB1E}': sextant(0b100000), // BLOCK SEXTANT-6\n '\\u{1FB1F}': sextant(0b100001), // BLOCK SEXTANT-16\n '\\u{1FB20}': sextant(0b100010), // BLOCK SEXTANT-26\n '\\u{1FB21}': sextant(0b100011), // BLOCK SEXTANT-126\n '\\u{1FB22}': sextant(0b100100), // BLOCK SEXTANT-36\n '\\u{1FB23}': sextant(0b100101), // BLOCK SEXTANT-136\n '\\u{1FB24}': sextant(0b100110), // BLOCK SEXTANT-236\n '\\u{1FB25}': sextant(0b100111), // BLOCK SEXTANT-1236\n '\\u{1FB26}': sextant(0b101000), // BLOCK SEXTANT-46\n '\\u{1FB27}': sextant(0b101001), // BLOCK SEXTANT-146\n '\\u{1FB28}': sextant(0b101011), // BLOCK SEXTANT-1246\n '\\u{1FB29}': sextant(0b101100), // BLOCK SEXTANT-346\n '\\u{1FB2A}': sextant(0b101101), // BLOCK SEXTANT-1346\n '\\u{1FB2B}': sextant(0b101110), // BLOCK SEXTANT-2346\n '\\u{1FB2C}': sextant(0b101111), // BLOCK SEXTANT-12346\n '\\u{1FB2D}': sextant(0b110000), // BLOCK SEXTANT-56 (lower one third block)\n '\\u{1FB2E}': sextant(0b110001), // BLOCK SEXTANT-156\n '\\u{1FB2F}': sextant(0b110010), // BLOCK SEXTANT-256\n '\\u{1FB30}': sextant(0b110011), // BLOCK SEXTANT-1256 (upper and lower one third block)\n '\\u{1FB31}': sextant(0b110100), // BLOCK SEXTANT-356\n '\\u{1FB32}': sextant(0b110101), // BLOCK SEXTANT-1356\n '\\u{1FB33}': sextant(0b110110), // BLOCK SEXTANT-2356\n '\\u{1FB34}': sextant(0b110111), // BLOCK SEXTANT-12356\n '\\u{1FB35}': sextant(0b111000), // BLOCK SEXTANT-456\n '\\u{1FB36}': sextant(0b111001), // BLOCK SEXTANT-1456\n '\\u{1FB37}': sextant(0b111010), // BLOCK SEXTANT-2456\n '\\u{1FB38}': sextant(0b111011), // BLOCK SEXTANT-12456\n '\\u{1FB39}': sextant(0b111100), // BLOCK SEXTANT-3456 (lower two thirds block)\n '\\u{1FB3A}': sextant(0b111101), // BLOCK SEXTANT-13456\n '\\u{1FB3B}': sextant(0b111110), // BLOCK SEXTANT-23456\n\n // Smooth mosaic terminal graphic characters (1FB3C-1FB6F)\n '\\u{1FB3C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB3E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB3F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB40}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L0.5,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB41}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB42}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB43}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,0 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB44}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB45}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0.5,0 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB46}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,0.3333 L1,1 L0,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB47}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB48}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.6667 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB49}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,0.3333 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L1,0 L1,1 Z' }, // LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB4C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB4D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.3333 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB4E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB4F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB50}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L0,0 L0,1 L1,1 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB51}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,1 L1,1 L1,0.6667 Z' }, // LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB52}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB53}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB54}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0.5,1 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FB55}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,1 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FB56}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,1 L1,1 L1,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FB57}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB58}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB59}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE\n '\\u{1FB5A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT\n '\\u{1FB5B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L0.5,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE\n '\\u{1FB5C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.6667 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB5D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB5E}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.6667 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB5F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB60}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L0,0 L1,0 L1,0.3333 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB61}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,1 L0,1 L0,0 L1,0 Z' }, // UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT\n '\\u{1FB62}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT\n '\\u{1FB63}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.3333 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT\n '\\u{1FB64}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT\n '\\u{1FB65}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,0.6667 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB66}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.5,0 L1,0 L1,1 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FB67}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.3333 L1,0.6667 L1,0 L0,0 Z' }, // UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT\n '\\u{1FB68}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0.5,0.5 Z' }, // UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing left)\n '\\u{1FB69}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L1,0 L1,1 L0,1 Z' }, // LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing upper)\n '\\u{1FB6A}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 L1,1 L0,1 Z' }, // UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK (missing right)\n '\\u{1FB6B}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0.5,0.5 L0,1 Z' }, // LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK (missing lower)\n '\\u{1FB6C}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.5,0.5 L0,1 Z' }, // LEFT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6D}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L0.5,0.5 Z' }, // UPPER TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6E}': { type: CustomGlyphDefinitionType.PATH, data: 'M1,0 L1,1 L0.5,0.5 Z' }, // RIGHT TRIANGULAR ONE QUARTER BLOCK\n '\\u{1FB6F}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,1 L1,1 L0.5,0.5 Z' }, // LOWER TRIANGULAR ONE QUARTER BLOCK\n\n // Block elements (1FB70-1FB80)\n '\\u{1FB70}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-2\n '\\u{1FB71}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-3\n '\\u{1FB72}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-4\n '\\u{1FB73}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-5\n '\\u{1FB74}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-6\n '\\u{1FB75}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 1, h: 8 }] }, // VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 1, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-2\n '\\u{1FB77}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-3\n '\\u{1FB78}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 3, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-4\n '\\u{1FB79}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-5\n '\\u{1FB7A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 5, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-6\n '\\u{1FB7B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 6, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB7C}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7D}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }] }, // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7F}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }] }, // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // UPPER AND LOWER ONE EIGHTH BLOCK\n\n // Window title bar (1FB81-1FB81)\n '\\u{1FB81}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }] }, // HORIZONTAL ONE EIGHTH BLOCK-1358\n\n // Block elements (1FB82-1FB8B)\n '\\u{1FB82}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 2 }] }, // UPPER ONE QUARTER BLOCK\n '\\u{1FB83}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 3 }] }, // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB84}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 5 }] }, // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB85}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 6 }] }, // UPPER THREE QUARTERS BLOCK\n '\\u{1FB86}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 7 }] }, // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB87}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 6, y: 0, w: 2, h: 8 }] }, // RIGHT ONE QUARTER BLOCK\n '\\u{1FB88}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 5, y: 0, w: 3, h: 8 }] }, // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB89}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 3, y: 0, w: 5, h: 8 }] }, // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB8A}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 6, h: 8 }] }, // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8B}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 1, y: 0, w: 7, h: 8 }] }, // RIGHT SEVEN EIGHTHS B0OCK\n\n // Rectangular shade characters (1FB8C-1FB94)\n '\\u{1FB8C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LEFT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n '\\u{1FB8D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // RIGHT HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0.5,0 L1,0 L1,1 L0.5,1 Z' },\n '\\u{1FB8E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n '\\u{1FB8F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER HALF MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n '\\u{1FB90}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // INVERSE MEDIUM SHADE\n [0, 1],\n [1, 0]\n ] },\n '\\u{1FB91}': [ // UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0.5 L1,0.5 L1,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 0, w: 8, h: 4 }] }\n ],\n '\\u{1FB92}': [ // UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L1,0 L1,0.5 L0,0.5 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 4, w: 8, h: 4 }] }\n ],\n // 1FB93 is \n '\\u{1FB94}': [ // LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK\n { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [\n [0, 1],\n [1, 0]\n ], clipPath: 'M0,0 L0.5,0 L0.5,1 L0,1 Z' },\n { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 0, w: 4, h: 8 }] }\n ],\n\n // Fill characters (1FB95-1FB97)\n '\\u{1FB95}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // CHECKER BOARD FILL\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB96}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // INVERSE CHECKER BOARD FILL\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ] },\n '\\u{1FB97}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [ // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n { x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }\n ] },\n\n // Diagonal fill characters (1FB98-1FB99)\n '\\u{1FB98}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,-0.25 L1.25,1.25 M-0.25,0 L1,1.25 M-0.25,0.25 L0.75,1.25 M-0.25,0.5 L0.5,1.25 M0,-0.25 L1.25,1 M0.25,-0.25 L1.25,0.75 M0.5,-0.25 L1.25,0.5 M-0.25,0.75 L0.25,1.25 M0.75,-0.25 L1.25,0.25', strokeWidth: 1 }, // UPPER LEFT TO LOWER RIGHT FILL\n '\\u{1FB99}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M-0.25,0.5 L0.5,-0.25 M-0.25,0.75 L0.75,-0.25 M-0.25,1 L1,-0.25 M-0.25,1.25 L1.25,-0.25 M0,1.25 L1.25,0 M0.25,1.25 L1.25,0.25 M0.5,1.25 L1.25,0.5 M-0.25,0.25 L0.25,-0.25 M0.75,1.25 L1.25,0.75', strokeWidth: 1 }, // UPPER RIGHT TO LOWER LEFT FILL\n\n // Smooth mosaic terminal graphic characters (1FB9A-1FB9B)\n '\\u{1FB9A}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L0,1 L1,1 L.5,.5 L1,0', type: CustomGlyphVectorType.FILL } }, // UPPER AND LOWER TRIANGULAR HALF BLOCK\n '\\u{1FB9B}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1', type: CustomGlyphVectorType.FILL } }, // LEFT AND RIGHT TRIANGULAR HALF BLOCK\n\n // Triangular shade characters (1FB9C-1FB9F)\n '\\u{1FB9C}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L0,1 Z' },\n '\\u{1FB9D}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // UPPER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,0 L1,1 Z' },\n '\\u{1FB9E}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER RIGHT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M1,0 L1,1 L0,1 Z' },\n '\\u{1FB9F}': { type: CustomGlyphDefinitionType.BLOCK_PATTERN, data: [ // LOWER LEFT TRIANGULAR MEDIUM SHADE\n [1, 0],\n [0, 1]\n ], clipPath: 'M0,0 L1,1 L0,1 Z' },\n\n // Character cell diagonals (1FBA0-1FBAE)\n '\\u{1FBA0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT\n '\\u{1FBA1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBA5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT\n '\\u{1FBA8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 M1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBA9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 M0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT\n '\\u{1FBAB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,.5 L.5,1 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT\n '\\u{1FBAC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L.5,0 L1,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBAD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L.5,0 L0,.5 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE\n '\\u{1FBAE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL DIAMOND\n\n // Light solid line with stroke (1FBAF-1FBAF)\n '\\u{1FBAF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: `${Shapes.LEFT_TO_RIGHT} M.5,.35 L.5,.65`, strokeWidth: 1 }, // BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE\n\n // Terminal graphic characters (1FBB0-1FBB3)\n '\\u{1FBB0}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.1,0.2 L0.1,.8 L.4,.6 L.9,0.6 Z', scaleType: CustomGlyphScaleType.CHAR }, // ARROWHEAD-SHAPED POINTER\n '\\u{1FBB1}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.1,.525 L.35,.675 L.9,.35', type: CustomGlyphVectorType.STROKE }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE CHECK MARK\n '\\u{1FBB2}': { type: CustomGlyphDefinitionType.PATH, data: 'M.29,.27 L0.13,.56 L.22,.59 L.35,0.35 L.67,.35 L.57,.57 L.71,.76 L.22,.76 L.42,1 L.53,.98 L.43,.86 L.9,.86 L.71,.6 L1,.6 L1,.52 L.83,.52 L.92,.36 L1,.36 L1,.27Z M.99,.13 A.12,.12,0,1,1,.75,.13 A.12,.12,0,1,1,.99,.13' }, // LEFT HALF RUNNING MAN\n '\\u{1FBB3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,.27 L.3,.27 L.55,.12 L.63,.18 L.33,.36 L0,.36 M0,.52 L.33,.52 L.59,.89 L.73,.89 L.73,.98 L.53,.98 L.28,.6 L0,.6' }, // RIGHT HALF RUNNING MAN\n\n // Arrows (1FBB4-1FBB8)\n // TODO: Improve all arrows, use hybrid approach\n '\\u{1FBB4}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.15,.55 L.5,.4 L.5,.45 L.65,.45 L.65,.35 L.85,.35 L.85,.625 L.5,.625 L.5,.7 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS\n '\\u{1FBB5}': [ // LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.15,.5 L.5,.35 L.5,.425 L.85,.425 L.85,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB6}': [ // RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L1,0 L1,.0625 L0,.0625 Z M0,.9375 L1,.9375 L1,1 L0,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.85,.5 L.5,.35 L.5,.425 L.15,.425 L.15,.575 L.5,.575 L.5,.65 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB7}': [ // DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.675 L.2,.5 L.35,.5 L.35,.325 L.65,.325 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n '\\u{1FBB8}': [ // UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.875,0 L1,0 L1,1 L.875,1 Z', type: CustomGlyphVectorType.FILL } },\n { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.325 L.2,.5 L.35,.5 L.35,.675 L.65,.675 L.65,.5 L.8,.5 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Terminal graphic characters (1FBB9-1FBBC)\n '\\u{1FBB9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,.89 L.11,.89 L.11,.37 L.36,.12 L.74,.12 L.96,.34 L1,.34 L1,.405 L.92,.405 L.69,.185 L.41,.185 L.21,.42 L.21,.825 L1,.825 Z', type: CustomGlyphVectorType.FILL } }, // LEFT HALF FOLDER\n '\\u{1FBBA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,.89 L0,.825 L.78,.825 L.78,.53 L.7,.415 L0,.415 L0,.35 L.75,.35 L.88,.48 L.88,.89 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT HALF FOLDER\n '\\u{1FBBB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.31,.275 L.44,.275 L.44,.47 L.05,.47 L.05,.405 L.31,.405 Z M.56,.275 L.69,.275 L.69,.405 L.95,.405 L.95,.47 L.56,.47 Z M.05,.53 L.44,.53 L.44,.725 L.31,.725 L.31,.595 L.05,.595 Z M.56,.53 L.95,.53 L.95,.595 L.69,.595 L.69,.725 L.56,.725 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // VOIDED GREEK CROSS\n '\\u{1FBBC}': [ // RIGHT OPEN SQUARED DOT\n { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L1,0 L1,1 L0,1 L0,.935 L.885,.935 L.885,.065 L0,.065 Z' },\n { type: CustomGlyphDefinitionType.PATH, data: 'M.67,.5 A.17,.085,0,1,1,.33,.5 A.17,.085,0,1,1,.67,.5', scaleType: CustomGlyphScaleType.CHAR }\n ],\n\n // Negative terminal graphic characters (1FBBD-1FBBF)\n '\\u{1FBBD}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M0,0 L.5,.5 L1,0 L1,1 L.5,.5 L0,1 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL CROSS\n '\\u{1FBBE}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M1,.5 L.5,1', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE\n '\\u{1FBBF}': { type: CustomGlyphDefinitionType.PATH_NEGATIVE, data: { d: 'M.5,0 L1,.5 L.5,1 L0,.5 Z', type: CustomGlyphVectorType.STROKE } }, // NEGATIVE DIAGONAL DIAMOND\n\n // Terminal graphic characters (1FBC0-1FBCA)\n '\\u{1FBC0}': { type: CustomGlyphDefinitionType.PATH, data: 'M.16,.445 A.02,.01,0,0,1,.39,.33 L.5,.375 L.61,.33 A.02,.01,0,0,1,.84,.445 L.75,.5 L.84,.555 A.02,.01,0,0,1,.61,.67 L.5,.625 L.39,.67 A.02,.01,0,0,1,.16,.555 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', scaleType: CustomGlyphScaleType.CHAR }, // WHITE HEAVY SALTIRE WITH ROUNDED CORNERS\n // 1FBC1-1FBC4 is dervied from the Iosevka font (SIL OFL v1.1) https://github.com/be5invis/Iosevka\n '\\u{1FBC1}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.142308,0.924 Q0.130770,0.924,0.120193,0.922 T0.101924,0.916 T0.089424,0.9065 T0.084616,0.895 V0.025 Q0.084616,0.019,0.089424,0.0135 T0.101924,0.004 T0.120193,-0.002 T0.142308,-0.004 Q0.150000,-0.004,0.157693,-0.003 T0.173078,0.000 L0.430770,0.085 Q0.451924,0.059,0.494232,0.041 T0.587501,0.013 T0.692309,-0.0005 T0.800001,-0.004 H1 V0.055 H0.800001 Q0.771155,0.055,0.742309,0.056 T0.685578,0.060 T0.630770,0.0685 T0.580770,0.0825 T0.543270,0.1045 T0.528847,0.133 V0.647 H0.530770 Q0.596155,0.645,0.659616,0.638 T0.782693,0.6165 T0.893270,0.5805 T1,0.531 V0.623 Q0.934616,0.644,0.880770,0.6595 T0.769232,0.685 T0.650963,0.700 T0.528847,0.707 V0.787 Q0.528847,0.802,0.543270,0.8155 T0.580770,0.8375 T0.630770,0.8515 T0.685578,0.860 T0.742309,0.864 T0.800001,0.865 H1 V0.924 H0.800001 Q0.746155,0.924,0.692309,0.9205 T0.587501,0.907 T0.494232,0.879 T0.430770,0.835 L0.173078,0.920 Q0.165386,0.922,0.157693,0.923 T0.142308,0.924 Z M0.2,0.841 L0.415385,0.770 V0.150 L0.2,0.079 V0.841 Z M1,0.698 Q0.973077,0.694,0.969231,0.6885 T0.965385,0.677 Q0.965385,0.672,0.969231,0.6665 T1,0.657 V0.698 Z' }, // LEFT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC2}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.623 V0.531 Q0.044231,0.512,0.0625,0.4905 T0.092308,0.4465 T0.108654,0.4005 T0.113462,0.354 V0.351 Q0.113462,0.345,0.117308,0.3395 T0.129808,0.3305 T0.148846,0.3245 T0.171154,0.323 H0.501923 Q0.532692,0.323,0.563462,0.3185 T0.617308,0.303 T0.651923,0.2765 T0.663462,0.2435 V0.241 Q0.663462,0.219,0.657692,0.197 T0.639423,0.1545 T0.604808,0.115 T0.549615,0.082 T0.475577,0.0615 T0.392308,0.055 H0 V-0.004 H1 V0.055 H0.667308 Q0.694231,0.071,0.713462,0.09 T0.746154,0.129 T0.766346,0.1705 T0.775,0.213 H1 V0.316 Q0.971154,0.305,0.955769,0.2965 T0.920192,0.2825 T0.876923,0.2745 T0.830769,0.272 H0.773077 Q0.767308,0.297,0.743269,0.319 T0.680769,0.355 T0.595192,0.375 T0.501923,0.381 H0.227308 Q0.223462,0.415,0.211,0.4485 T0.172692,0.5135 T0.108269,0.573 T0,0.623 Z M0.611538,0.924 H0 V0.865 H0.611538 Q0.642308,0.865,0.673077,0.8605 T0.727885,0.845 T0.762308,0.8185 T0.773077,0.787 V0.785 Q0.773077,0.769,0.762308,0.7535 T0.727885,0.727 T0.673077,0.7115 T0.611538,0.707 H0.059615 Q0.048077,0.707,0.037115,0.7045 T0,0.694 V0.653 Q0.026923,0.648,0.037115,0.646 T0.059615,0.644 H0.722692 Q0.753462,0.644,0.784231,0.6395 T0.839038,0.624 T0.873846,0.5975 T0.884615,0.566 V0.564 Q0.884615,0.548,0.873846,0.532 T0.839038,0.5055 T0.784231,0.49 T0.722692,0.4855 H0.392308 Q0.380769,0.4855,0.370192,0.483 T0.351923,0.4765 T0.339423,0.467 T0.334615,0.4555 T0.339423,0.444 T0.351923,0.4345 T0.370192,0.428 T0.392308,0.4255 H0.832692 Q0.855769,0.4255,0.878846,0.4235 T0.922115,0.416 T0.957692,0.4015 T1,0.3815 V0.4685 Q0.975,0.4705,0.966346,0.4725 T0.95,0.4765 Q0.961538,0.4835,0.969231,0.4915 T1,0.5075 V0.6205 Q0.965385,0.6455,0.926923,0.665 T0.84,0.6935 Q0.866923,0.7115,0.877596,0.7345 T0.894231,0.7855 V0.787 Q0.894231,0.815,0.876923,0.8425 T0.820192,0.8895 T0.726923,0.916 T0.611538,0.924 Z' }, // MIDDLE THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC3}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0.473 V0.386 Q0.025490,0.378,0.028431,0.3695 T0.031373,0.352 V0.35 Q0.031373,0.342,0.028431,0.333 T0,0.316 V0.213 H0.652941 Q0.684314,0.213,0.715686,0.2085 T0.770588,0.193 T0.804902,0.1665 T0.815686,0.135 V0.133 Q0.815686,0.117,0.804902,0.101 T0.770588,0.0745 T0.715686,0.0595 T0.652941,0.055 H0 V-0.004 H0.652941 Q0.707843,-0.004,0.761765,0.004 T0.856863,0.031 T0.915686,0.0775 T0.933333,0.133 V0.135 Q0.933333,0.163,0.915686,0.1905 T0.856863,0.237 T0.761765,0.264 T0.652941,0.272 H0.109804 Q0.131373,0.29,0.140196,0.31 T0.149020,0.35 V0.352 Q0.149020,0.37,0.142157,0.388 T0.118627,0.4225 T0.076471,0.452 T0,0.473 Z M0,0.625 V0.513 Q0.029412,0.526,0.032353,0.54 T0.035294,0.568 V0.57 Q0.035294,0.584,0.032353,0.598 T0,0.625 Z' }, // RIGHT THIRD WHITE RIGHT POINTING INDEX\n '\\u{1FBC4}': { type: CustomGlyphDefinitionType.PATH, data: 'M0.019231,1.085 V-0.165 H0.980769 V1.085 H0.019231 Z M0.446154,0.527 H0.553846 Q0.553846,0.511,0.5625,0.495 T0.591346,0.466 T0.631731,0.4405 T0.666346,0.4135 T0.688462,0.3825 T0.696154,0.35 Q0.696154,0.33,0.682692,0.311 T0.641346,0.2785 T0.575,0.259 T0.498077,0.253 T0.421154,0.259 T0.356731,0.279 T0.315385,0.3125 T0.301923,0.352 V0.357 H0.409615 V0.354 Q0.409615,0.345,0.414423,0.335 T0.431731,0.318 T0.4625,0.3075 T0.498077,0.304 Q0.517308,0.304,0.534615,0.307 T0.564423,0.3165 T0.582692,0.332 T0.588462,0.35 Q0.588462,0.366,0.572115,0.3805 T0.535577,0.4075 T0.496154,0.4335 T0.465385,0.4625 T0.45,0.4945 T0.446154,0.527 Z M0.5,0.667 Q0.519231,0.667,0.5375,0.664 T0.569231,0.654 T0.588462,0.637 T0.594231,0.617 T0.588462,0.5975 T0.569231,0.581 T0.5375,0.571 T0.5,0.568 T0.4625,0.571 T0.430769,0.581 T0.411538,0.5975 T0.405769,0.617 T0.411538,0.637 T0.430769,0.654 T0.4625,0.664 T0.5,0.667 Z', scaleType: CustomGlyphScaleType.CHAR }, // NEGATIVE SQUARED QUESTION MARK\n '\\u{1FBC5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.51 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.51 L.56,.425 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE\n '\\u{1FBC6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.46 L.23,.385 L.19,.43 L.44,.51 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.61,.735 L.7,.71 L.56,.56 L.56,.51 L.81,.43 L.77,.385 L.56,.46 L.56,.425 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH ARMS RAISED\n '\\u{1FBC7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.29,.71 L.38,.735 L.5,.605 L.74,.72 L.81,.685 L.56,.56 L.56,.425 Z M.18,.53 L.23,.575 L.81,.43 L.77,.385 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING LEFT\n '\\u{1FBC8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.44,.56 L.19,.685 L.26,.72 L.5,.605 L.62,.735 L.71,.71 L.56,.56 L.56,.425 Z M.23,.385 L.18,.43 L.77,.575 L.81,.53 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE LEANING RIGHT\n '\\u{1FBC9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.44,.425 L.45,.495 L.15,.645 L.34,.645 L.34,.7 L.44,.7 L.44,.645 L.56,.645 L.56,.7 L.66,.7 L.66,.645 L.84,.645 L.54,.495 L.56,.425 Z M.39,.6 L.5,.55 L.60,.6 Z M.17,.46 L.17,.51 L.83,.51 L.83,.46 Z M.67,.35 C.67,.303,.594,.265,.5,.265 C.406,.265,.33,.303,.33,.35 C.33,.397,.406,.435,.5,.435 C.594,.435,.67,.397,.67,.35 Z M.56,.35 C.56,.3665,.533,.38,.5,.38 C.467,.38,.44,.3665,.44,.35 C.44,.3335,.467,.32,.5,.32 C.533,.32,.56,.3335,.56,.35 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // STICK FIGURE WITH DRESS\n '\\u{1FBCA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.26,.375 L.5,.255 L.74,.375 L.74,.665 L.5,.55 L.26,.665 Z M.37,.395 L.37,.54 L.5,.475 L.63,.54 L.63,.395 L.5,.33 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE UP-POINTING CHEVRON\n\n // Terminal graphic characters (1FBCB-1FBCD)\n '\\u{1FBCB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.09,.41 L.32,.295 L.5,.375 L.68,.295 L.91,.41 L.75,.5 L.91,.59 L.68,.705 L.5,.625 L.32,.705 L.09,.59 L.25,.5 Z M.24,.41 L.39,.5 L.24,.59 L.32,.63 L.5,.555 L.68,.63 L.76,.59 L.61,.5 L.76,.41 L.68,.37 L.5,.445 L.32,.37 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // WHITE CROSS MARK\n '\\u{1FBCC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.55,.305 L.88,.305 L.88,.355 L.65,.355 L.65,.47 L.88,.47 L.88,.52 L.55,.52 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // RAISED SMALL LEFT SQUARE BRACKET\n '\\u{1FBCD}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.38,.39 L.5,.33 L.62,.39 L.62,.53 L.5,.47 L.38,.53 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // BLACK SMALL UP-POINTING CHEVRON\n\n // Block elements (1FBCE-1FBCF)\n '\\u{1FBCE}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.6667,0 L0.6667,1 L0,1 Z' }, // LEFT TWO THIRDS BLOCK\n '\\u{1FBCF}': { type: CustomGlyphDefinitionType.PATH, data: 'M0,0 L0.3333,0 L0.3333,1 L0,1 Z' }, // LEFT ONE THIRD BLOCK\n\n // Character cell diagonals (1FBD0-1FBDF)\n '\\u{1FBD0}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER LEFT\n '\\u{1FBD1}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT\n '\\u{1FBD2}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT\n '\\u{1FBD3}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBD4}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE\n '\\u{1FBD5}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBD6}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER CENTRE\n '\\u{1FBD7}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M.5,0 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO LOWER LEFT\n '\\u{1FBD8}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO UPPER RIGHT\n '\\u{1FBD9}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDA}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO MIDDLE CENTRE TO LOWER RIGHT\n '\\u{1FBDB}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE CENTRE TO LOWER LEFT\n '\\u{1FBDC}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L.5,1 L1,0', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER CENTRE TO UPPER RIGHT\n '\\u{1FBDD}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M1,0 L0,.5 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO MIDDLE LEFT TO LOWER RIGHT\n '\\u{1FBDE}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,1 L.5,0 L1,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL LOWER LEFT TO UPPER CENTRE TO LOWER RIGHT\n '\\u{1FBDF}': { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: 'M0,0 L1,.5 L0,1', strokeWidth: 1 }, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO MIDDLE RIGHT TO LOWER LEFT\n\n // Geometric shapes (1FBE0-1FBEF)\n '\\u{1FBE0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0', type: CustomGlyphVectorType.STROKE } }, // TOP JUSTIFIED LOWER HALF WHITE CIRCLE\n '\\u{1FBE1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1', type: CustomGlyphVectorType.STROKE } }, // RIGHT JUSTIFIED LEFT HALF WHITE CIRCLE\n '\\u{1FBE2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1', type: CustomGlyphVectorType.STROKE } }, // BOTTOM JUSTIFIED UPPER HALF WHITE CIRCLE\n '\\u{1FBE3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1', type: CustomGlyphVectorType.STROKE } }, // LEFT JUSTIFIED RIGHT HALF WHITE CIRCLE\n '\\u{1FBE4}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 0, w: 4, h: 4 }] }, // UPPER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE5}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 2, y: 4, w: 4, h: 4 }] }, // LOWER CENTRE ONE QUARTER BLOCK\n '\\u{1FBE6}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 0, y: 2, w: 4, h: 4 }] }, // MIDDLE LEFT ONE QUARTER BLOCK\n '\\u{1FBE7}': { type: CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR, data: [{ x: 4, y: 2, w: 4, h: 4 }] }, // MIDDLE RIGHT ONE QUARTER BLOCK\n '\\u{1FBE8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C0,.276,.224,.5,.5,.5 C.776,.5,1,.276,1,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP JUSTIFIED LOWER HALF BLACK CIRCLE\n '\\u{1FBE9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 C.724,0,.5,.224,.5,.5 C.5,.776,.724,1,1,1 Z', type: CustomGlyphVectorType.FILL } }, // RIGHT JUSTIFIED LEFT HALF BLACK CIRCLE\n '\\u{1FBEA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 C0,.724,.224,.5,.5,.5 C.776,.5,1,.724,1,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM JUSTIFIED UPPER HALF BLACK CIRCLE\n '\\u{1FBEB}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 C.276,0,.5,.224,.5,.5 C.5,.776,.276,1,0,1 Z', type: CustomGlyphVectorType.FILL } }, // LEFT JUSTIFIED RIGHT HALF BLACK CIRCLE\n '\\u{1FBEC}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,0 L.5,0 C.5,.276,.724,.5,1,.5 Z', type: CustomGlyphVectorType.FILL } }, // TOP RIGHT JUSTIFIED LOWER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBED}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,1 L.5,1 C.5,.724,.276,.5,0,.5 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM LEFT JUSTIFIED UPPER RIGHT QUARTER BLACK CIRCLE\n '\\u{1FBEE}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M1,1 L1,.5 C.724,.5,.5,.724,.5,1 Z', type: CustomGlyphVectorType.FILL } }, // BOTTOM RIGHT JUSTIFIED UPPER LEFT QUARTER BLACK CIRCLE\n '\\u{1FBEF}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M0,0 L0,.5 C.276,.5,.5,.276,.5,0 Z', type: CustomGlyphVectorType.FILL } }, // TOP LEFT JUSTIFIED LOWER RIGHT QUARTER BLACK CIRCLE\n\n // Segmented digits (1FBF0-1FBF9)\n '\\u{1FBF0}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111110), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ZERO (abcdef)\n '\\u{1FBF1}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110000), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT ONE (bc)\n '\\u{1FBF2}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1101101), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT TWO (abdeg)\n '\\u{1FBF3}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111001), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT THREE (abcdg)\n '\\u{1FBF4}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b0110011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FOUR (bcfg)\n '\\u{1FBF5}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT FIVE (acdfg)\n '\\u{1FBF6}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1011111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SIX (acdefg)\n '\\u{1FBF7}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1110010), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT SEVEN (abcf)\n '\\u{1FBF8}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111111), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT EIGHT (abcdefg)\n '\\u{1FBF9}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: segmentedDigit(0b1111011), type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // SEGMENTED DIGIT NINE (abcdfg)\n\n // Terminal graphic character (1FBFA-1FBFA)\n '\\u{1FBFA}': { type: CustomGlyphDefinitionType.VECTOR_SHAPE, data: { d: 'M.5,.175 C.2,.175,.15,.305,.15,.435 L.05,.63 L.35,.63 C.35,.682,.42,.76,.5,.76 C.58,.76,.65,.682,.65,.63 L.95,.63 L.85,.435 C.85,.305,.8,.175,.5,.175 Z', type: CustomGlyphVectorType.FILL }, scaleType: CustomGlyphScaleType.CHAR }, // ALARM BELL SYMBOL\n\n // #endregion\n\n // #region Braille Patterns (2800-28FF)\n\n // https://www.unicode.org/charts/PDF/U2800.pdf\n\n // Braille patterns (2800-28FF)\n ...Object.fromEntries(\n Array.from({ length: 256 }, (_, i) => [\n String.fromCodePoint(0x2800 + i),\n { type: CustomGlyphDefinitionType.BRAILLE, data: i }\n ])\n ),\n\n // #endregion\n};\n\nexport const blockPatternCodepoints = new Set([\n // Shade characters (2591-2593)\n 0x2591,\n 0x2592,\n 0x2593,\n // Rectangular shade characters (1FB8C-1FB94)\n 0x1FB8C,\n 0x1FB8D,\n 0x1FB8E,\n 0x1FB8F,\n 0x1FB90,\n 0x1FB91,\n 0x1FB92,\n 0x1FB94,\n // Triangular shade characters (1FB9C-1FB9F)\n 0x1FB9C,\n 0x1FB9D,\n 0x1FB9E,\n 0x1FB9F\n]);\n\n/**\n * Generates a drawing function for sextant characters. Sextants are a 2x3 grid where each cell\n * can be on or off.\n * @param pattern A 6-bit pattern where bit 0 = top-left, bit 1 = top-right, bit 2 = middle-left,\n * bit 3 = middle-right, bit 4 = bottom-left, bit 5 = bottom-right\n */\nfunction sextant(pattern: number): { type: CustomGlyphDefinitionType.PATH_FUNCTION, data: CustomGlyphPathDrawFunctionDefinition } {\n return {\n type: CustomGlyphDefinitionType.PATH_FUNCTION,\n data: () => {\n // Sextant grid: 2 columns, 3 rows\n // Row heights in 8ths: top=3, middle=2, bottom=3\n // Column widths: left=4, right=4\n const rects: string[] = [];\n const colW = 0.5; // Each column is half width\n const rowH = [3 / 8, 2 / 8, 3 / 8]; // Row heights as fractions\n const rowY = [0, 3 / 8, 5 / 8]; // Row Y positions\n\n for (let row = 0; row < 3; row++) {\n const leftBit = (pattern >> (row * 2)) & 1;\n const rightBit = (pattern >> (row * 2 + 1)) & 1;\n\n if (leftBit && rightBit) {\n // Full row\n rects.push(`M0,${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (leftBit) {\n rects.push(`M0,${rowY[row]} L${colW},${rowY[row]} L${colW},${rowY[row] + rowH[row]} L0,${rowY[row] + rowH[row]} Z`);\n } else if (rightBit) {\n rects.push(`M${colW},${rowY[row]} L1,${rowY[row]} L1,${rowY[row] + rowH[row]} L${colW},${rowY[row] + rowH[row]} Z`);\n }\n }\n return rects.join(' ');\n }\n };\n}\n\n/**\n * Generates SVG path data for a 7-segment display digit.\n *\n * Segment mapping (bit positions):\n *\n * - bit 6: a (top)\n * - bit 5: b (upper right)\n * - bit 4: c (lower right)\n * - bit 3: d (bottom)\n * - bit 2: e (lower left)\n * - bit 1: f (upper left)\n * - bit 0: g (middle)\n *\n * ```\n * \u2500a\u2500\n * \u2502 \u2502\n * f b\n * \u2500g\u2500\n * e c\n * \u2502 \u2502\n * \u2500d\u2500\n * ```\n */\nfunction segmentedDigit(pattern: number): string {\n const paths: string[] = [];\n\n // Each segment should have approximately the same stroke width, this is somewhat difficult to be\n // precise since coordinates are 0-1 of the whole cell (percentage-based). To handle this, the\n // fact that terminal cells are typically sized at ~2:1 (height:width) is leveraged.\n // for horizontal vs vertical to make segments appear the same thickness\n const segW = 0.15; // Width of vertical segments (fraction of cell width)\n const segH = 0.075; // Height of horizontal segments (fraction of cell height, ~half of segW for 2:1 cells)\n const padX = 0.05; // Horizontal padding from edge\n const padY = 0.175; // Vertical padding from edge (35% total = 65% height)\n const gap = 0.015; // Gap between segments\n const taperX = segW / 2; // Horizontal taper for vertical segments\n const taperY = segH / 2; // Vertical taper for horizontal segments\n\n const left = padX;\n const right = 1 - padX;\n const top = padY;\n const bottom = 1 - padY;\n const midY = 0.5;\n\n // Segment a (top horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b1000000) {\n const y1 = top;\n const y2 = top + segH / 2;\n const y3 = top + segH;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment b (upper right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0100000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment c (lower right vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0010000) {\n const x1 = right - segW;\n const x2 = right - segW / 2;\n const x3 = right;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment d (bottom horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0001000) {\n const y1 = bottom - segH;\n const y2 = bottom - segH / 2;\n const y3 = bottom;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n // Segment e (lower left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000100) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = midY + gap;\n const y2 = bottom - segH - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment f (upper left vertical) - hexagonal with pointed top/bottom ends\n if (pattern & 0b0000010) {\n const x1 = left;\n const x2 = left + segW / 2;\n const x3 = left + segW;\n const y1 = top + segH + gap;\n const y2 = midY - gap;\n paths.push(`M${x2},${y1} L${x3},${y1 + taperY} L${x3},${y2 - taperY} L${x2},${y2} L${x1},${y2 - taperY} L${x1},${y1 + taperY} Z`);\n }\n // Segment g (middle horizontal) - hexagonal with pointed left/right ends\n if (pattern & 0b0000001) {\n const y1 = midY - segH / 2;\n const y2 = midY;\n const y3 = midY + segH / 2;\n const x1 = left + segW + gap;\n const x2 = right - segW - gap;\n paths.push(`M${x1},${y2} L${x1 + taperX},${y1} L${x2 - taperX},${y1} L${x2},${y2} L${x2 - taperX},${y3} L${x1 + taperX},${y3} Z`);\n }\n\n return paths.join(' ');\n}\n\n", "import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/buffer/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\nimport { blockPatternCodepoints } from './customGlyphs/CustomGlyphDefinitions';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number, deviceCellHeight: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n if ($variantOffset === 0 && blockPatternCodepoints.has(code)) {\n $variantOffset = ((x * deviceCellWidth) % 2) * 2 + ((y * deviceCellHeight) % 2);\n }\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\nimport { customGlyphDefinitions } from './CustomGlyphDefinitions';\nimport { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition, type CustomGlyphPatternDefinition, type ICustomGlyphSolidOctantBlockVector, type ICustomGlyphVectorShape } from './Types';\n\ntype PatternCanvas = HTMLCanvasElement | OffscreenCanvas;\ntype PatternCanvasFactory = (width: number, height: number) => PatternCanvas;\n\nconst createOffscreenPatternCanvas: PatternCanvasFactory | undefined = typeof OffscreenCanvas === 'undefined'\n ? undefined\n : (width, height) => new OffscreenCanvas(width, height);\n\nconst createDomPatternCanvas: PatternCanvasFactory = (width, height) => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n};\n\nexport function createPatternCanvas(\n width: number,\n height: number,\n offscreenCanvasFactory: PatternCanvasFactory | undefined = createOffscreenPatternCanvas,\n domCanvasFactory: PatternCanvasFactory = createDomPatternCanvas\n): PatternCanvas {\n return offscreenCanvasFactory?.(width, height) ?? domCanvasFactory(width, height);\n}\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomGlyph(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): boolean {\n const unifiedCharDefinition = customGlyphDefinitions[c];\n if (unifiedCharDefinition) {\n // Normalize to array for uniform handling\n const parts = Array.isArray(unifiedCharDefinition) ? unifiedCharDefinition : [unifiedCharDefinition];\n for (const part of parts) {\n drawDefinitionPart(ctx, part, xOffset, yOffset, deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, fontSize, devicePixelRatio, logService, backgroundColor, variantOffset);\n }\n return true;\n }\n\n return false;\n}\n\nfunction drawDefinitionPart(\n ctx: CanvasRenderingContext2D,\n part: CustomGlyphDefinitionPart,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService,\n backgroundColor?: string,\n variantOffset: number = 0\n): void {\n // Handle scaleType - adjust dimensions and offset when scaling to character area\n let drawWidth = deviceCellWidth;\n let drawHeight = deviceCellHeight;\n let drawXOffset = xOffset;\n let drawYOffset = yOffset;\n if (part.scaleType === CustomGlyphScaleType.CHAR) {\n drawWidth = deviceCharWidth;\n drawHeight = deviceCharHeight;\n // Center the character within the cell\n drawXOffset = xOffset + (deviceCellWidth - deviceCharWidth) / 2;\n drawYOffset = yOffset + (deviceCellHeight - deviceCharHeight) / 2;\n }\n\n // Handle clipPath generically for any definition type\n if (part.clipPath) {\n ctx.save();\n applyClipPath(ctx, part.clipPath, drawXOffset, drawYOffset, drawWidth, drawHeight);\n }\n\n switch (part.type) {\n case CustomGlyphDefinitionType.SOLID_OCTANT_BLOCK_VECTOR:\n drawBlockVectorChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n case CustomGlyphDefinitionType.BLOCK_PATTERN:\n drawPatternChar(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, variantOffset);\n break;\n case CustomGlyphDefinitionType.PATH_FUNCTION:\n drawPathFunctionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, logService, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH:\n drawPathDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, part.strokeWidth);\n break;\n case CustomGlyphDefinitionType.PATH_NEGATIVE:\n drawPathNegativeDefinitionCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, devicePixelRatio, backgroundColor);\n break;\n case CustomGlyphDefinitionType.VECTOR_SHAPE:\n drawVectorShape(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight, fontSize, devicePixelRatio, logService);\n break;\n case CustomGlyphDefinitionType.BRAILLE:\n drawBrailleCharacter(ctx, part.data, drawXOffset, drawYOffset, drawWidth, drawHeight);\n break;\n }\n\n if (part.clipPath) {\n ctx.restore();\n }\n}\n\nfunction drawBlockVectorChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphSolidOctantBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\n/**\n * Braille dot positions in octant coordinates (x, y for center of each dot area)\n * Columns: left=1-2, right=5-6 (leaving 0 and 7 as margins, 3-4 as gap)\n * Rows: 0-1, 2-3, 4-5, 6-7 for the 4 rows\n */\nconst brailleDotPositions = new Uint8Array([\n 1, 0, // dot 1 - bit 0\n 1, 2, // dot 2 - bit 1\n 1, 4, // dot 3 - bit 2\n 5, 0, // dot 4 - bit 3\n 5, 2, // dot 5 - bit 4\n 5, 4, // dot 6 - bit 5\n 1, 6, // dot 7 - bit 6\n 5, 6, // dot 8 - bit 7\n]);\n\n/**\n * Draws a braille pattern\n */\nfunction drawBrailleCharacter(\n ctx: CanvasRenderingContext2D,\n pattern: number,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n const xEighth = deviceCellWidth / 8;\n const paddingY = deviceCellHeight * 0.1;\n const usableHeight = deviceCellHeight * 0.8;\n const yEighth = usableHeight / 8;\n const radius = Math.min(xEighth, yEighth);\n\n for (let bit = 0; bit < 8; bit++) {\n if (pattern & (1 << bit)) {\n const x = brailleDotPositions[bit * 2];\n const y = brailleDotPositions[bit * 2 + 1];\n const cx = xOffset + (x + 1) * xEighth;\n const cy = yOffset + paddingY + (y + 1) * yEighth;\n ctx.beginPath();\n ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n}\n\nfunction drawPathDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: CustomGlyphPathDrawFunctionDefinition | string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n strokeWidth?: number\n): void {\n const instructions = typeof charDefinition === 'string' ? charDefinition : charDefinition(0, 0);\n ctx.beginPath();\n let currentX = 0;\n let currentY = 0;\n let lastControlX = 0;\n let lastControlY = 0;\n let lastCommand = '';\n for (const instruction of instructions.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (type === 'Z') {\n ctx.closePath();\n lastCommand = type;\n continue;\n }\n if (type === 'V') {\n const y = yOffset + parseFloat(args[0]) * deviceCellHeight;\n ctx.lineTo(currentX, y);\n currentY = y;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (type === 'H') {\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n ctx.lineTo(x, currentY);\n currentX = x;\n lastControlX = currentX;\n lastControlY = currentY;\n lastCommand = type;\n continue;\n }\n if (!args[0] || !args[1]) {\n continue;\n }\n if (type === 'A') {\n // SVG arc: A rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y\n const rx = parseFloat(args[0]) * deviceCellWidth;\n const ry = parseFloat(args[1]) * deviceCellHeight;\n const xAxisRotation = parseFloat(args[2]) * Math.PI / 180;\n const largeArcFlag = parseInt(args[3], 10);\n const sweepFlag = parseInt(args[4], 10);\n const x = xOffset + parseFloat(args[5]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[6]) * deviceCellHeight;\n drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);\n currentX = x;\n currentY = y;\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n lastControlX = currentX;\n lastControlY = currentY;\n } else if (type === 'Q') {\n ctx.quadraticCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3]);\n lastControlX = translatedArgs[0];\n lastControlY = translatedArgs[1];\n currentX = translatedArgs[2];\n currentY = translatedArgs[3];\n } else if (type === 'T') {\n // T uses reflection of last control point if previous command was Q or T\n let cpX: number;\n let cpY: number;\n if (lastCommand === 'Q' || lastCommand === 'T') {\n cpX = 2 * currentX - lastControlX;\n cpY = 2 * currentY - lastControlY;\n } else {\n cpX = currentX;\n cpY = currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, translatedArgs[0], translatedArgs[1]);\n lastControlX = cpX;\n lastControlY = cpY;\n currentX = translatedArgs[0];\n currentY = translatedArgs[1];\n } else if (type === 'C') {\n ctx.bezierCurveTo(translatedArgs[0], translatedArgs[1], translatedArgs[2], translatedArgs[3], translatedArgs[4], translatedArgs[5]);\n lastControlX = translatedArgs[2];\n lastControlY = translatedArgs[3];\n currentX = translatedArgs[4];\n currentY = translatedArgs[5];\n }\n lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n}\n\n/**\n * Converts SVG arc parameters to canvas arc/ellipse calls.\n * Based on the SVG spec's endpoint to center parameterization conversion.\n */\nfunction drawSvgArc(\n ctx: CanvasRenderingContext2D,\n x1: number, y1: number,\n rx: number, ry: number,\n phi: number,\n largeArcFlag: number,\n sweepFlag: number,\n x2: number, y2: number\n): void {\n // Handle degenerate cases\n if (rx === 0 || ry === 0) {\n ctx.lineTo(x2, y2);\n return;\n }\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: Compute (x1', y1')\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Step 2: Compute (cx', cy')\n let rxSq = rx * rx;\n let rySq = ry * ry;\n const x1pSq = x1p * x1p;\n const y1pSq = y1p * y1p;\n\n // Correct radii if necessary\n const lambda = x1pSq / rxSq + y1pSq / rySq;\n if (lambda > 1) {\n const lambdaSqrt = Math.sqrt(lambda);\n rx *= lambdaSqrt;\n ry *= lambdaSqrt;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);\n if (sq < 0) sq = 0;\n const coef = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt(sq);\n const cxp = coef * (rx * y1p / ry);\n const cyp = coef * -(ry * x1p / rx);\n\n // Step 3: Compute (cx, cy) from (cx', cy')\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: Compute angles\n const ux = (x1p - cxp) / rx;\n const uy = (y1p - cyp) / ry;\n const vx = (-x1p - cxp) / rx;\n const vy = (-y1p - cyp) / ry;\n\n const startAngle = Math.atan2(uy, ux);\n let dTheta = Math.atan2(vy, vx) - startAngle;\n\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta -= 2 * Math.PI;\n } else if (sweepFlag === 1 && dTheta < 0) {\n dTheta += 2 * Math.PI;\n }\n\n const endAngle = startAngle + dTheta;\n\n ctx.ellipse(cx, cy, rx, ry, phi, startAngle, endAngle, sweepFlag === 0);\n}\n\n/**\n * Draws a \"negative\" path where the background color is used to draw the shape on top of a\n * foreground-filled cell. This creates the appearance of a cutout without using actual\n * transparency, which allows SPAA (subpixel anti-aliasing) to work correctly.\n *\n * @param ctx The canvas rendering context (fillStyle should be set to foreground color)\n * @param charDefinition The vector shape definition for the negative shape\n * @param xOffset The x offset to draw at\n * @param yOffset The y offset to draw at\n * @param deviceCellWidth The width of the cell in device pixels\n * @param deviceCellHeight The height of the cell in device pixels\n * @param devicePixelRatio The device pixel ratio\n * @param backgroundColor The background color to use for the \"cutout\" portion\n */\nfunction drawPathNegativeDefinitionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n backgroundColor?: string\n): void {\n ctx.save();\n\n // First, fill the entire cell with foreground color\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n\n // Then draw the \"negative\" shape with the background color\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.strokeStyle = backgroundColor;\n }\n\n ctx.lineWidth = devicePixelRatio;\n ctx.lineCap = 'square';\n ctx.beginPath();\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n if (type === 'Z') {\n ctx.closePath();\n }\n continue;\n }\n const translatedArgs = args.map((e, i) => {\n const val = parseFloat(e);\n return i % 2 === 0\n ? xOffset + val * deviceCellWidth\n : yOffset + val * deviceCellHeight;\n });\n if (type === 'M') {\n ctx.moveTo(translatedArgs[0], translatedArgs[1]);\n } else if (type === 'L') {\n ctx.lineTo(translatedArgs[0], translatedArgs[1]);\n }\n }\n\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.stroke();\n } else {\n ctx.fill();\n }\n\n ctx.restore();\n}\n\nconst cachedPatterns: Map> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n variantOffset: number = 0\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n // The atlas canvas can be adopted into another document, so temporary resources must not use\n // its mutable ownerDocument.\n const tmpCanvas = createPatternCanvas(width, height);\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n // Apply pattern offset to ensure seamless tiling across cells when cell dimensions are odd.\n // variantOffset encodes: bit 1 = x pixel shift, bit 0 = y pixel shift.\n const dx = (variantOffset >> 1) & 1;\n const dy = variantOffset & 1;\n if (dx !== 0 || dy !== 0) {\n pattern.setTransform(new DOMMatrix().translateSelf(-dx, -dy));\n } else {\n pattern.setTransform(new DOMMatrix());\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\nfunction drawPathFunctionCharacter(\n ctx: CanvasRenderingContext2D,\n charDefinition: string | ((xp: number, yp: number) => string),\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number,\n logService: ILogService,\n strokeWidth?: number\n): void {\n ctx.save();\n ctx.beginPath();\n ctx.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip();\n\n ctx.beginPath();\n let actualInstructions: string;\n if (typeof charDefinition === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = charDefinition(xp, yp);\n } else {\n actualInstructions = charDefinition;\n }\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio, 0, 0, false), state);\n state.lastCommand = type;\n }\n if (strokeWidth !== undefined) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = devicePixelRatio * strokeWidth;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n ctx.restore();\n}\n\n/**\n * Applies a clip path to the canvas context from SVG-like path instructions.\n */\nfunction applyClipPath(\n ctx: CanvasRenderingContext2D,\n clipPath: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n ctx.beginPath();\n for (const instruction of clipPath.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n const x = xOffset + parseFloat(args[0]) * deviceCellWidth;\n const y = yOffset + parseFloat(args[1]) * deviceCellHeight;\n if (type === 'M') {\n ctx.moveTo(x, y);\n } else if (type === 'L') {\n ctx.lineTo(x, y);\n }\n }\n ctx.clip();\n}\n\nfunction drawVectorShape(\n ctx: CanvasRenderingContext2D,\n charDefinition: ICustomGlyphVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number,\n logService: ILogService\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n const state: ISvgPathState = { currentX: 0, currentY: 0, lastControlX: 0, lastControlY: 0, lastCommand: '' };\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n if (type === 'Z') {\n ctx.closePath();\n state.lastCommand = type;\n continue;\n }\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n logService.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ), state);\n state.lastCommand = type;\n }\n if (charDefinition.type === CustomGlyphVectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\ninterface ISvgPathState {\n currentX: number;\n currentY: number;\n lastControlX: number;\n lastControlY: number;\n lastCommand: string;\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: (ctx: CanvasRenderingContext2D, args: number[], state: ISvgPathState) => void } = {\n 'C': (ctx, args, state) => {\n ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]);\n state.lastControlX = args[2];\n state.lastControlY = args[3];\n state.currentX = args[4];\n state.currentY = args[5];\n },\n 'L': (ctx, args, state) => {\n ctx.lineTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'M': (ctx, args, state) => {\n ctx.moveTo(args[0], args[1]);\n state.lastControlX = state.currentX = args[0];\n state.lastControlY = state.currentY = args[1];\n },\n 'Q': (ctx, args, state) => {\n ctx.quadraticCurveTo(args[0], args[1], args[2], args[3]);\n state.lastControlX = args[0];\n state.lastControlY = args[1];\n state.currentX = args[2];\n state.currentY = args[3];\n },\n 'T': (ctx, args, state) => {\n let cpX: number;\n let cpY: number;\n if (state.lastCommand === 'Q' || state.lastCommand === 'T') {\n cpX = 2 * state.currentX - state.lastControlX;\n cpY = 2 * state.currentY - state.lastControlY;\n } else {\n cpX = state.currentX;\n cpY = state.currentY;\n }\n ctx.quadraticCurveTo(cpX, cpY, args[0], args[1]);\n state.lastControlX = cpX;\n state.lastControlY = cpY;\n state.currentX = args[0];\n state.currentY = args[1];\n }\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0, clampToCell: boolean = true): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[x] !== 0) {\n const rounded = Math.round(result[x] + 0.5) - 0.5;\n result[x] = clampToCell ? clamp(rounded, cellWidth, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Round to the nearest 0.5 to ensure a crisp line at 100% devicePixelRatio, and optionally\n // clamp to the cell bounds.\n if (doClamp && result[y] !== 0) {\n const rounded = Math.round(result[y] + 0.5) - 0.5;\n result[y] = clampToCell ? clamp(rounded, cellHeight, 0) : rounded;\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { FontWeight } from '@xterm/xterm';\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from './Constants';\nimport { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from './Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { ILogService, IUnicodeService } from 'common/services/Services';\nimport { Emitter } from 'common/Event';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n private _overflowSizePage: AtlasPage | undefined;\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transferred to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new Emitter();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new Emitter();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService,\n private readonly _logService: ILogService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n this._tmpCanvas.remove();\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n this._onRemoveTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue(this._logService);\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, false, undefined);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _pageLayoutVersion = 0;\n public get pageLayoutVersion(): number { return this._pageLayoutVersion; }\n\n // Orca diagnostics: read by terminal-render-desync-weight-probe.ts to tell a real\n // bold-collapse from a repaint problem. Canvas silently keeps its previous font when an\n // assignment fails to parse, which rasterizes glyphs at a stale weight.\n public fontProbeMismatchCount = 0;\n public fontProbeLastMismatch: { desired: string, actual: string } | undefined;\n\n public clearTexture(): void {\n // Guard on every page rather than pages[0]: a merged page is never written through\n // currentRow, so once one lands at index 0 the old check made every later clear a no-op.\n if (this._pages.every(page => page.glyphs.length === 0 && page.currentRow.x === 0 && page.currentRow.y === 0)) {\n return;\n }\n // Return the atlas to its constructor state instead of clearing in place: page.clear() leaves\n // page.glyphs populated, which would keep the guard above from ever firing again. Eviction\n // also bumps _pageLayoutVersion, so every renderer sharing this atlas rebuilds its model.\n this._evictAllPages();\n this._createNewPage();\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n\n // Only proceed with merge if we have exactly 4 same-sized pages. If not, we cannot\n // effectively reduce page count and merging would cause issues.\n if (mergingPages.length < 4 || mergingPages.some(p => p.canvas.width !== mergingPages[0].canvas.width)) {\n // Evict instead of adding a page beyond the renderer's texture capacity.\n this._evictAllPages();\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a - b);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version = ++AtlasPage.nextVersion;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version = ++AtlasPage.nextVersion;\n }\n }\n\n private _evictAllPages(): void {\n const startTime = performance.now();\n const pageCount = this._pages.length;\n for (const page of this._pages) {\n this._onRemoveTextureAtlasCanvas.fire(page.canvas);\n page.canvas.remove();\n }\n this._pages.length = 0;\n this._activePages.length = 0;\n this._overflowSizePage = undefined;\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n this._pageLayoutVersion++;\n this._logService.debug(`Evicted ${pageCount} WebGL atlas pages in ${(performance.now() - startTime).toFixed(2)}ms`);\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight, domContainer);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean,\n domContainer: HTMLElement | undefined\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight, domContainer);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n // Ignore alpha channel when allowTransparency is false\n if (!this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor ?? undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n /**\n * Orca diagnostic. Canvas ignores a font assignment it cannot parse and silently keeps the\n * previous value, so a bad family or weight rasterizes every glyph at a stale weight. Record\n * the mismatch rather than correcting it: the goal is to tell that failure apart from a\n * repaint bug when a terminal renders bold-collapsed.\n */\n private _probeRasterizationFontWeight(fontWeight: FontWeight): void {\n const desired = String(fontWeight);\n // Only numeric weights are comparable; keywords round-trip through Canvas unchanged.\n if (!/^(?:[1-8]\\d{2}|900)$/.test(desired)) {\n return;\n }\n // Canvas normalizes font serialization: Chromium omits 400 and emits the keyword bold for 700.\n const token = this._tmpCtx.font.match(\n /(?:^|\\s)(normal|bold|[1-9]\\d{0,3})(?=\\s+\\d+(?:\\.\\d+)?px(?:\\s|$))/\n )?.[1] ?? '400';\n const actual = token === 'normal' ? '400' : token === 'bold' ? '700' : token;\n if (actual === desired) {\n return;\n }\n this.fontProbeMismatchCount++;\n this.fontProbeLastMismatch = { desired, actual: this._tmpCtx.font };\n try {\n (globalThis as { __orcaAtlasFontProbe?: (mismatch: { desired: string, actual: string }) => void })\n .__orcaAtlasFontProbe?.(this.fontProbeLastMismatch);\n } catch {\n // Diagnostics only; a throwing listener must never break rasterization.\n }\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Attach the canvas to the DOM in order to inherit font-feature-settings\n // from the parent elements. This is necessary for ligatures and variants to\n // work.\n if (domContainer && this._tmpCanvas.parentElement !== domContainer) {\n this._tmpCanvas.style.display = 'none';\n domContainer.append(this._tmpCanvas);\n }\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._config.deviceMaxTextureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._probeRasterizationFontWeight(fontWeight);\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n const variantOffset = this._workAttributeData.getUnderlineVariantOffset();\n customGlyph = tryDrawCustomGlyph(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.deviceCharWidth, this._config.deviceCharHeight, this._config.fontSize, this._config.devicePixelRatio, this._logService, backgroundColor.css, variantOffset);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n this._tmpCtx.fillStyle = this._tmpCtx.strokeStyle;\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTopDefault = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yBotDefault = yTopDefault + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n let yTop = 0;\n let yBot = 0;\n\n for (let i = 0; i < chWidth; i++) {\n let wasFilled = false;\n this._tmpCtx.save();\n yTop = yTopDefault;\n yBot = yBotDefault;\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n this._tmpCtx.moveTo(xChLeft, yBotDefault);\n this._tmpCtx.lineTo(xChRight, yBotDefault);\n break;\n case UnderlineStyle.CURLY:\n yTop = this._config.deviceCharHeight + 1;\n yBot = yTop + 3 * this._config.devicePixelRatio;\n\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n\n // Draw a zigzag pattern, this is derived from the SVG used in monaco for the same\n // style. The viewbox is 6x3 so scale it using that.\n const cellW = this._config.deviceCellWidth;\n const curlyH = (yBot - yTop);\n const scaleX = cellW / 6;\n const scaleY = curlyH / 3;\n\n const polygons: number[][] = [\n [0, 2, 1, 3, 2.4, 3, 0, 0.6],\n [5.5, 0, 2.5, 3, 1.1, 3, 4.1, 0],\n [4, 0, 6, 2, 6, 0.6, 5.4, 0],\n ];\n\n for (const polygon of polygons) {\n this._tmpCtx.beginPath();\n for (let i = 0; i < polygon.length; i += 2) {\n const x = xChLeft + polygon[i] * scaleX;\n const y = yBot - polygon[i + 1] * scaleY;\n if (i === 0) {\n this._tmpCtx.moveTo(x, y);\n } else {\n this._tmpCtx.lineTo(x, y);\n }\n }\n this._tmpCtx.closePath();\n this._tmpCtx.fill();\n }\n wasFilled = true;\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTopDefault);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTopDefault);\n this._tmpCtx.lineTo(xChRight, yTopDefault);\n break;\n }\n if (!wasFilled) {\n this._tmpCtx.stroke();\n }\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page for oversized glyphs as they come up\n if (rasterizedGlyph.size.x > this._textureSize) {\n if (!this._overflowSizePage) {\n // Make room for the oversized page without exceeding texture capacity.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= TextureAtlas.maxAtlasPages) {\n this._evictAllPages();\n }\n this._overflowSizePage = new AtlasPage(this._document, this._config.deviceMaxTextureSize);\n this.pages.push(this._overflowSizePage);\n\n // Invalidate renderer models so all texture pages are refreshed.\n this._pageLayoutVersion++;\n this._onAddTextureAtlasCanvas.fire(this._overflowSizePage.canvas);\n }\n activePage = this._overflowSizePage;\n activeRow = this._overflowSizePage.currentRow;\n // Move to next row if necessary\n if (activeRow.x + rasterizedGlyph.size.x >= activePage.canvas.width) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n }\n break;\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version = ++AtlasPage.nextVersion;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Monotonically increasing across all atlas pages globally. Used to detect when the texture\n * unit at a given index needs to be re-uploaded \u2014 both for content changes within the same\n * page and for a page object swap at the same index (which happens after a page merge,\n * where a per-page counter could coincide with the previously-bound page's value).\n */\n public static nextVersion: number = 0;\n public version = ++AtlasPage.nextVersion;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n if (sourcePages) {\n if (sourcePages.length === 4) {\n // optimized for quadmerge\n this._glyphs = this._glyphs.concat(\n sourcePages[0].glyphs,\n sourcePages[1].glyphs,\n sourcePages[2].glyphs,\n sourcePages[3].glyphs\n );\n this._usedPixels = sourcePages[0]._usedPixels +\n sourcePages[1]._usedPixels +\n sourcePages[2]._usedPixels +\n sourcePages[3]._usedPixels;\n } else {\n // fallback for non quadmerges (should never be used)\n for (let i = 0; i < sourcePages.length; ++i) {\n this._glyphs = this._glyphs.concat(sourcePages[i].glyphs);\n this._usedPixels += sourcePages[i]._usedPixels;\n }\n\n }\n }\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version = ++AtlasPage.nextVersion;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevant pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required, colors: ReadonlyColorSet, devicePixelRatio: number, deviceMaxTextureSize: number, customGlyphs: boolean = true): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs,\n devicePixelRatio,\n deviceMaxTextureSize,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.deviceMaxTextureSize === b.deviceMaxTextureSize &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCellWidth === b.deviceCellWidth &&\n a.deviceCellHeight === b.deviceCellHeight &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from './TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from './Types';\nimport { generateConfig, configEquals } from './CharAtlasUtils';\nimport type { ILogService } from 'common/services/Services';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number,\n deviceMaxTextureSize: number,\n customGlyphs: boolean = true\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio, deviceMaxTextureSize, customGlyphs);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const logService = (core as any)._logService as ILogService;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService, logService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RendererConstants } from 'browser/renderer/shared/Constants';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\nconst enum Constants {\n /**\n * The time between cursor blinks.\n */\n BLINK_INTERVAL = 600,\n}\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n this._resetIdleTimer();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._resetIdleTimer();\n }\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = Constants.BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = Constants.BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, Constants.BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n this._isIdlePaused = false;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this._resetIdleTimer();\n this.restartBlinkAnimation();\n }\n\n /**\n * Resets the idle timer. If the terminal is idle for the idle timeout period,\n * the cursor blinking will stop.\n */\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n if (this._idleTimeout) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n }\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n /**\n * Stops cursor blinking due to idle timeout.\n */\n private _stopBlinkingDueToIdle(): void {\n // Make cursor visible and stop blinking\n this.isCursorVisible = true;\n this._isIdlePaused = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n // Clear the idle timeout as we've already acted on it\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n // Trigger a render to show the cursor in its final visible state\n this._renderCallback();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable, IDisposable } from 'common/Lifecycle';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string, logService: ILogService): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource, logService)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource, logService)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n logService.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string, logService: ILogService): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n logService.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { TextureAtlas } from './TextureAtlas';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { ILogService, IOptionsService } from 'common/services/Services';\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n // A v_texpage beyond the sampler budget matches no branch above. Leaving outColor unwritten\n // is undefined behaviour in GLSL ES and paints garbage, so fall through to transparent.\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals} else { outColor = vec4(0.0, 0.0, 0.0, 0.0); }\n}`);\n}\n\nconst enum Constants {\n INDICES_PER_CELL = 11,\n BYTES_PER_CELL = INDICES_PER_CELL * 4/* Float32Array.BYTES_PER_ELEMENT */,\n CELL_POSITION_INDICES = 2\n}\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _lastSeenPageLayoutVersion: number = -1;\n private _pageOverflowWarned: boolean = false;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages), this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, Constants.BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, Constants.BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this._register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n /**\n * Call when a frame is being drawn. Returns whether the full model must be rebuilt before\n * rendering this frame because the atlas page layout changed since this renderer last drew.\n */\n public beginFrame(): boolean {\n if (!this._atlas) {\n return true;\n }\n if (this._atlas.pageLayoutVersion !== this._lastSeenPageLayoutVersion) {\n this._lastSeenPageLayoutVersion = this._atlas.pageLayoutVersion;\n return true;\n }\n return false;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a one-off for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * Constants.INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + Constants.INDICES_PER_CELL - 1 - Constants.CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false, this._terminal.element);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false, this._terminal.element);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * Constants.INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += Constants.INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n gl.uniform2f(this._resolutionLocation, this._dimensions.device.canvas.width, this._dimensions.device.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * Constants.INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * Constants.INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed. AtlasPage.version is globally\n // monotonic, so a page object swap at the same index (which happens after a page merge)\n // is detected by the same comparison.\n // Clamp defensively in case the atlas unexpectedly exceeds texture capacity.\n const pageCount = Math.min(this._atlas.pages.length, this._atlasTextures.length);\n if (this._atlas.pages.length > this._atlasTextures.length && !this._pageOverflowWarned) {\n this._pageOverflowWarned = true;\n this._logService.warn(`Atlas page count (${this._atlas.pages.length}) exceeds the renderer's texture capacity (${this._atlasTextures.length}), some glyphs will not render correctly`);\n }\n for (let i = 0; i < pageCount; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / Constants.INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n this._lastSeenPageLayoutVersion = -1;\n this.invalidateAtlasTextures();\n }\n\n public invalidateAtlasTextures(): void {\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const enum RenderModelConstants {\n INDICIES_PER_CELL = 4,\n BG_OFFSET = 1,\n FG_OFFSET = 2,\n EXT_OFFSET = 3\n}\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RenderModelConstants.INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RenderModelConstants } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport type { ILogService } from 'common/services/Services';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService,\n private readonly _logService: ILogService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource, this._logService));\n this._register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n const vertexArrayObject = this._vertexArrayObject = gl.createVertexArray();\n this._register(toDisposable(() => gl.deleteVertexArray(vertexArrayObject)));\n gl.bindVertexArray(vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this._register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this._register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this._register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RenderModelConstants.BG_OFFSET];\n fg = model.cells[modelIndex + RenderModelConstants.FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + INDICES_PER_RECTANGLE) {\n // +1 for the viewport-clear rectangle at offset 0.\n vertices.attributes = expandFloat32Array(vertices.attributes, (this._terminal.rows * this._terminal.cols + 1) * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from '../CharAtlasCache';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TEXT_BASELINE } from '../Constants';\nimport type { ITextureAtlas } from '../Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this._register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this._register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr, 2048);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from '../CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this._register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this._register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from './CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from './CharAtlasCache';\nimport { CursorBlinkStateManager } from './CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from './DevicePixelObserver';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { CharData, IBufferLine, ICellData } from 'common/buffer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RenderModel, RenderModelConstants } from './RenderModel';\nimport { IWebGL2RenderingContext, type ITextureAtlas } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { Emitter, EventUtils } from 'common/Event';\nimport { addDisposableListener } from 'browser/Dom';\nimport { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\n\nconst enum Constants {\n MERGE_RETRY_LIMIT = 32\n}\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable = this._register(new MutableDisposable());\n private _textBlinkStateManager: TextBlinkStateManager;\n private _charAtlasDisposable = this._register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _deviceMaxTextureSize: number;\n private _observerDisposable = this._register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n private _workCell: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable = this._register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable = this._register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n private readonly _customGlyphs: boolean = true,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n // IMPORTANT: Canvas initialization and fetching of the context must be first in order to\n // prevent possible listeners leaking and continuing to operate after the WebglRenderer has been\n // discarded.\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this._register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this._register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._requestRedrawViewport(),\n this._coreBrowserService,\n this._optionsService\n ));\n this._resetBlinkingRowState();\n\n this._deviceMaxTextureSize = this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE);\n\n this._register(addDisposableListener(this._canvas, 'webglcontextlost', (e) => {\n this._logService.debug('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n this._logService.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this._register(addDisposableListener(this._canvas, 'webglcontextrestored', (e) => {\n this._logService.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this._register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._register(addDisposableListener(this._coreBrowserService.mainDocument, 'mousedown', () => this._cursorBlinkStateManager.value?.restartBlinkAnimation()));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._core.screenElement!.isConnected;\n\n this._register(toDisposable(() => {\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n this._resetBlinkingRowState();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService, this._logService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService, this._logService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr,\n this._deviceMaxTextureSize,\n this._customGlyphs\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = combinedDisposable(\n EventUtils.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n EventUtils.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n );\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._resetBlinkingRowState();\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._core.screenElement?.isConnected && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // A mid-update atlas page merge invalidates vertex data and may not bump the host\n // page's version, so re-run the update and force a full texture rebind.\n let merged = false;\n let mergeRetries = 0;\n // Test the retry budget before beginFrame: beginFrame latches the page layout version it\n // observed, so tripping the limit after consuming it would strand a stale model with no\n // later frame able to notice it needs rebuilding.\n while (this._charAtlas && mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()) {\n merged = true;\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n }\n if (merged) {\n this._glyphRenderer.value.invalidateAtlasTextures();\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._coreService.decPrivateModes.cursorBlink ?? this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let skipJoinedCheckUntilX: number;\n let isValidJoinRange: boolean;\n let lastCharX: number;\n let range: [number, number];\n let isCursorRow: boolean;\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? terminal.options.cursorStyle ?? 'block';\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n const bufferLine = terminal.buffer.lines.get(row);\n if (!bufferLine) {\n this._model.lineLengths[y] = 0;\n for (x = 0; x < terminal.cols; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n modelUpdated = true;\n this._nullModelCell(x, y, j, 0, 0, 0);\n }\n this._setRowBlinkState(y, false);\n continue;\n }\n line = bufferLine;\n let rowHasBlinkingCells = false;\n this._model.lineLengths[y] = 0;\n isCursorRow = cursorY === row;\n skipJoinedCheckUntilX = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n range = joinedRanges.shift()!;\n\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._model.selection.isCellSelected(this._terminal, range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._model.selection.isCellSelected(this._terminal, i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n\n if (!rowHasBlinkingCells && cell.isBlink()) {\n rowHasBlinkingCells = true;\n }\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width, this.dimensions.device.cell.height);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ? cursorStyle : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n cursorStyle === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))\n ) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (this._textBlinkStateManager.isEnabled && !this._textBlinkStateManager.isBlinkOn && cell.isBlink()) {\n this._cellColorResolver.result.fg |= FgFlags.INVISIBLE;\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RenderModelConstants.BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RenderModelConstants.FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RenderModelConstants.BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RenderModelConstants.FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RenderModelConstants.EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x <= lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RenderModelConstants.INDICIES_PER_CELL;\n // Don't re-resolve the cell color since multi-colored ligature backgrounds are not\n // supported\n this._nullModelCell(x, y, j, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext);\n }\n x--; // Go back to the previous update cell for next iteration\n }\n }\n this._setRowBlinkState(y, rowHasBlinkingCells);\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n this._updateTextBlinkState();\n }\n\n private _nullModelCell(x: number, y: number, cellIndex: number, bg: number, fg: number, ext: number): void {\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, bg, fg, ext, NULL_CELL_CHAR, 0, 0);\n this._model.cells[cellIndex] = NULL_CELL_CODE;\n this._model.cells[cellIndex + RenderModelConstants.BG_OFFSET] = bg;\n this._model.cells[cellIndex + RenderModelConstants.FG_OFFSET] = fg;\n this._model.cells[cellIndex + RenderModelConstants.EXT_OFFSET] = ext;\n }\n\n private _resetBlinkingRowState(): void {\n this._rowHasBlinkingCells = new Array(this._terminal.rows).fill(false);\n this._rowHasBlinkingCellsCount = 0;\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may cause blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n // Render synchronously to avoid flicker when the canvas is cleared\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1, sync: true });\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { IWebglAddonOptions, WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { Emitter, EventUtils } from 'common/Event';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon, IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this._register(new Emitter());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this._register(new Emitter());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this._register(new Emitter());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this._register(new Emitter());\n public readonly onContextLoss = this._onContextLoss.event;\n\n private readonly _customGlyphs: boolean;\n private readonly _preserveDrawingBuffer?: boolean;\n\n constructor(options?: IWebglAddonOptions) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('WebGL2 is only supported on Safari 16 and above');\n }\n }\n super();\n this._customGlyphs = options?.customGlyphs ?? true;\n this._preserveDrawingBuffer = options?.preserveDrawingBuffer;\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this._register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n this._renderer = this._register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n logService,\n optionsService,\n themeService,\n this._customGlyphs,\n this._preserveDrawingBuffer\n ));\n this._register(EventUtils.forward(this._renderer.onContextLoss, this._onContextLoss));\n this._register(EventUtils.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this._register(EventUtils.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this._register(EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this._register(toDisposable(() => {\n if ((this._terminal as any)._core._store._isDisposed) {\n return;\n }\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"], ++ "mappings": "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", ++ "names": ["toDisposable", "fn", "dispose", "arg", "d", "combinedDisposable", "disposables", "DisposableStore", "o", "Disposable", "MutableDisposable", "value", "isNode", "userAgent", "platform", "isFirefox", "isChrome", "isLegacyEdge", "isSafari", "getSafariVersion", "isSafari", "majorVersion", "userAgent", "isMac", "platform", "isWindows", "isLinux", "isChromeOS", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isRestrictedPowerlineGlyph", "isNerdFontGlyph", "isBoxOrBlockGlyph", "isEmoji", "allowRescaling", "width", "glyphSizeX", "deviceCellWidth", "treatGlyphAsBackgroundColor", "createRenderDimensions", "createDimension", "computeNextVariantOffset", "cellWidth", "lineWidth", "currentOffset", "GitBranchSymbolsParts", "xp", "yp", "customGlyphDefinitions", "sextant", "segmentedDigit", "_", "i", "blockPatternCodepoints", "pattern", "rects", "rowH", "rowY", "row", "leftBit", "rightBit", "paths", "x1", "x2", "x3", "y1", "y2", "$fg", "$bg", "$hasFg", "$hasBg", "$isSelected", "$colors", "$variantOffset", "CellColorResolver", "_terminal", "_optionService", "_selectionRenderModel", "_decorationService", "_coreBrowserService", "_themeService", "cell", "x", "y", "deviceCellWidth", "deviceCellHeight", "code", "lineWidth", "blockPatternCodepoints", "d", "rgba", "treatGlyphAsBackgroundColor", "DIM_OPACITY", "TEXT_BASELINE", "isFirefox", "isLegacyEdge", "createOffscreenPatternCanvas", "width", "height", "createDomPatternCanvas", "canvas", "createPatternCanvas", "offscreenCanvasFactory", "domCanvasFactory", "tryDrawCustomGlyph", "ctx", "c", "xOffset", "yOffset", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "fontSize", "devicePixelRatio", "logService", "backgroundColor", "variantOffset", "unifiedCharDefinition", "customGlyphDefinitions", "parts", "part", "drawDefinitionPart", "drawWidth", "drawHeight", "drawXOffset", "drawYOffset", "applyClipPath", "drawBlockVectorChar", "drawPatternChar", "drawPathFunctionCharacter", "drawPathDefinitionCharacter", "drawPathNegativeDefinitionCharacter", "drawVectorShape", "drawBrailleCharacter", "charDefinition", "i", "box", "xEighth", "yEighth", "brailleDotPositions", "pattern", "paddingY", "radius", "bit", "x", "y", "cx", "cy", "strokeWidth", "instructions", "currentX", "currentY", "lastControlX", "lastControlY", "lastCommand", "instruction", "type", "args", "rx", "ry", "xAxisRotation", "largeArcFlag", "sweepFlag", "drawSvgArc", "translatedArgs", "e", "val", "cpX", "cpY", "x1", "y1", "phi", "x2", "y2", "cosPhi", "sinPhi", "dx", "dy", "x1p", "y1p", "rxSq", "rySq", "x1pSq", "y1pSq", "lambda", "lambdaSqrt", "sq", "coef", "cxp", "cyp", "ux", "uy", "vx", "vy", "startAngle", "dTheta", "endAngle", "cachedPatterns", "patternSet", "fillStyle", "tmpCanvas", "tmpCtx", "throwIfFalsy", "imageData", "r", "g", "b", "a", "actualInstructions", "yp", "state", "f", "svgToCanvasInstructionMap", "translateArgs", "clipPath", "clipRegion", "cssLineWidth", "clamp", "value", "max", "min", "cellWidth", "cellHeight", "doClamp", "leftPadding", "rightPadding", "clampToCell", "result", "rounded", "TwoKeyMap", "first", "second", "value", "FourKeyMap", "third", "fourth", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "i", "len", "EventUtils", "forward", "from", "to", "e", "map", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "NULL_RASTERIZED_GLYPH", "TMP_CANVAS_GLYPH_PADDING", "$glyph", "TextureAtlas", "_TextureAtlas", "_document", "_config", "_unicodeService", "_logService", "FourKeyMap", "AttributeData", "Emitter", "createCanvas", "TMP_CANVAS_GLYPH_PADDING", "throwIfFalsy", "page", "queue", "IdleTaskQueue", "i", "rasterizedGlyph", "pagesBySize", "e", "a", "b", "sameSizeI", "size", "mergingPages", "p", "newPage", "AtlasPage", "sortedMergingPagesIndexes", "mergedPageIndex", "mergedPage", "mergedSize", "xOffset", "yOffset", "g", "index", "pageIndex", "j", "adjustingPage", "startTime", "pageCount", "chars", "bg", "fg", "ext", "restrictToCellHeight", "domContainer", "code", "cacheMap", "key", "idx", "bgColorMode", "bgColor", "inverse", "dim", "NULL_COLOR", "result", "arr", "channels", "color", "fgColorMode", "fgColor", "bold", "excludeFromContrastRatioDemands", "minimumContrastColor", "DIM_OPACITY", "cache", "adjustedColor", "bgRgba", "fgRgba", "rgba", "fontWeight", "desired", "token", "codeOrChars", "allowedWidth", "allowedHeight", "NULL_RASTERIZED_GLYPH", "italic", "underline", "strikethrough", "overline", "temp", "temp2", "backgroundColor", "fontStyle", "TEXT_BASELINE", "powerlineGlyph", "isPowerlineGlyph", "restrictedPowerlineGlyph", "isRestrictedPowerlineGlyph", "foregroundColor", "treatGlyphAsBackgroundColor", "padding", "customGlyph", "variantOffset", "tryDrawCustomGlyph", "enableClearThresholdCheck", "chWidth", "lineWidth", "xLeft", "yTopDefault", "yBotDefault", "nextOffset", "yTop", "yBot", "wasFilled", "xChLeft", "xChRight", "clipRegion", "cellW", "curlyH", "scaleX", "scaleY", "polygons", "polygon", "x", "y", "offsetWidth", "computeNextVariantOffset", "lineRatio", "gapRatio", "xChWidth", "line", "gap", "end", "metrics", "isBeyondCellBounds", "clearColor", "offset", "imageData", "isEmpty", "checkCompletelyTransparent", "activePage", "activeRow", "row", "wasPageAndRowFound", "candidatePage", "boundingBox", "restrictedGlyph", "height", "width", "found", "alphaOffset", "_AtlasPage", "document", "sourcePages", "glyph", "enableThresholdCheck", "r", "fgR", "fgG", "fgB", "threshold", "canvas", "generateConfig", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "options", "colors", "devicePixelRatio", "deviceMaxTextureSize", "customGlyphs", "clonedColors", "NULL_COLOR", "configEquals", "a", "b", "i", "is256Color", "colorCode", "charAtlasCache", "acquireTextureAtlas", "terminal", "options", "colors", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "devicePixelRatio", "deviceMaxTextureSize", "customGlyphs", "newConfig", "generateConfig", "i", "entry", "ownedByIndex", "configEquals", "core", "logService", "newEntry", "TextureAtlas", "removeTerminalFromCache", "index", "CursorBlinkStateManager", "_renderCallback", "_coreBrowserService", "timeToStart", "time", "observeDevicePixelDimensions", "element", "parentWindow", "callback", "observer", "entries", "entry", "width", "height", "toDisposable", "stringFromCodePoint", "codePoint", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "PROJECTION_MATRIX", "createProgram", "gl", "vertexSource", "fragmentSource", "logService", "program", "throwIfFalsy", "createShader", "type", "source", "shader", "expandFloat32Array", "max", "newLength", "newArray", "i", "GLTexture", "texture", "vertexShaderSource", "createFragmentShaderSource", "maxFragmentShaderTextureUnits", "textureConditionals", "i", "$i", "$glyph", "$leftCellPadding", "$clippedPixels", "GlyphRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_optionsService", "_logService", "gl", "TextureAtlas", "throwIfFalsy", "createProgram", "vertexShaderSource", "createFragmentShaderSource", "toDisposable", "vertexArrayObject", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "textureUnits", "i", "PROJECTION_MATRIX", "glTexture", "GLTexture", "x", "y", "code", "bg", "fg", "ext", "chars", "width", "lastBg", "array", "allowRescaling", "terminal", "newCount", "renderModel", "activeBuffer", "bufferLength", "si", "sub", "pageCount", "atlas", "dimensions", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "COMBINED_CHAR_BIT_MASK", "RenderModel", "createSelectionRenderModel", "cols", "rows", "indexCount", "vertexShaderSource", "fragmentShaderSource", "INDICES_PER_RECTANGLE", "BYTES_PER_RECTANGLE", "INITIAL_BUFFER_RECTANGLE_CAPACITY", "Vertices", "$rgba", "$x1", "$y1", "$r", "$g", "$b", "$a", "RectangleRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_themeService", "_logService", "gl", "throwIfFalsy", "createProgram", "toDisposable", "vertexArrayObject", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "e", "vertices", "PROJECTION_MATRIX", "dimensions", "colors", "model", "terminal", "rectangleCount", "y", "x", "currentStartX", "currentBg", "currentFg", "currentInverse", "modelIndex", "bg", "fg", "inverse", "offset", "cursor", "startX", "endX", "expandFloat32Array", "array", "x1", "y1", "width", "height", "r", "g", "b", "a", "color", "BaseRenderLayer", "Disposable", "terminal", "_container", "id", "zIndex", "_alpha", "_coreBrowserService", "_optionsService", "_themeService", "e", "toDisposable", "throwIfFalsy", "startRow", "endRow", "start", "end", "columnSelectMode", "alpha", "oldCanvas", "colorSet", "acquireTextureAtlas", "dim", "x", "y", "width", "height", "cell", "TEXT_BASELINE", "isBold", "isItalic", "fontWeight", "LinkRenderLayer", "BaseRenderLayer", "container", "zIndex", "terminal", "linkifier2", "coreBrowserService", "optionsService", "themeService", "e", "dim", "middleRowCount", "is256Color", "y", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "WebglRenderer", "Disposable", "_terminal", "_characterJoinerService", "_charSizeService", "_coreBrowserService", "_coreService", "_decorationService", "_logService", "_optionsService", "_themeService", "_customGlyphs", "preserveDrawingBuffer", "MutableDisposable", "RenderModel", "CellData", "Emitter", "contextAttributes", "CellColorResolver", "LinkRenderLayer", "createRenderDimensions", "TextBlinkStateManager", "addDisposableListener", "e", "removeTerminalFromCache", "observeDevicePixelDimensions", "w", "h", "toDisposable", "l", "cols", "rows", "isVisible", "start", "end", "columnSelectMode", "RectangleRenderer", "GlyphRenderer", "atlas", "acquireTextureAtlas", "combinedDisposable", "EventUtils", "clearGlyphRenderer", "merged", "mergeRetries", "CursorBlinkStateManager", "terminal", "cell", "lastBg", "y", "row", "line", "joinedRanges", "isJoined", "skipJoinedCheckUntilX", "isValidJoinRange", "lastCharX", "range", "isCursorRow", "chars", "code", "width", "i", "x", "j", "clamp", "cursorStyle", "cursorY", "viewportRelativeCursorY", "cursorX", "lastCursorX", "isCursorVisible", "modelUpdated", "bufferLine", "rowHasBlinkingCells", "firstSelectionState", "JoinedCellData", "COMBINED_CHAR_BIT_MASK", "cellIndex", "bg", "fg", "ext", "hasBlinkingCells", "height", "AttributeData", "firstCell", "value", "max", "min", "WebglAddon", "Disposable", "options", "isSafari", "getSafariVersion", "contextAttributes", "Emitter", "terminal", "core", "coreService", "optionsService", "unsafeCore", "renderService", "characterJoinerService", "charSizeService", "coreBrowserService", "decorationService", "logService", "themeService", "WebglRenderer", "EventUtils", "toDisposable"] + } +diff --git a/src/GlyphRenderer.ts b/src/GlyphRenderer.ts +index 742f0879ff4f04509e4a07c8efdf0d5743fe8ee5..885a206a394fff783737a412c0b75bf935dd0eca 100644 +--- a/src/GlyphRenderer.ts ++++ b/src/GlyphRenderer.ts +@@ -61,6 +61,8 @@ function createFragmentShaderSource(maxFragmentShaderTextureUnits: number): stri + for (let i = 1; i < maxFragmentShaderTextureUnits; i++) { + textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`; + } ++ // A v_texpage beyond the sampler budget matches no branch above. Leaving outColor unwritten ++ // is undefined behaviour in GLSL ES and paints garbage, so fall through to transparent. + return (`#version 300 es + precision lowp float; + +@@ -74,7 +76,7 @@ out vec4 outColor; + void main() { + if (v_texpage == 0) { + outColor = texture(u_texture[0], v_texcoord); +- } ${textureConditionals} ++ } ${textureConditionals} else { outColor = vec4(0.0, 0.0, 0.0, 0.0); } + }`); + } + +diff --git a/src/TextureAtlas.ts b/src/TextureAtlas.ts +index 4977ad741065e26bbfd35bc50e7558a033b13340..f55805ddc3f266415f7f8e81e5b8c318e7db194c 100644 +--- a/src/TextureAtlas.ts ++++ b/src/TextureAtlas.ts +@@ -3,6 +3,7 @@ + * @license MIT + */ + ++import { FontWeight } from '@xterm/xterm'; + import { IColorContrastCache } from 'browser/Types'; + import { DIM_OPACITY, TEXT_BASELINE } from './Constants'; + import { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer'; +@@ -135,21 +136,23 @@ export class TextureAtlas implements ITextureAtlas { + private _pageLayoutVersion = 0; + public get pageLayoutVersion(): number { return this._pageLayoutVersion; } + ++ // Orca diagnostics: read by terminal-render-desync-weight-probe.ts to tell a real ++ // bold-collapse from a repaint problem. Canvas silently keeps its previous font when an ++ // assignment fails to parse, which rasterizes glyphs at a stale weight. ++ public fontProbeMismatchCount = 0; ++ public fontProbeLastMismatch: { desired: string, actual: string } | undefined; ++ + public clearTexture(): void { +- if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) { ++ // Guard on every page rather than pages[0]: a merged page is never written through ++ // currentRow, so once one lands at index 0 the old check made every later clear a no-op. ++ if (this._pages.every(page => page.glyphs.length === 0 && page.currentRow.x === 0 && page.currentRow.y === 0)) { + return; + } +- for (const page of this._pages) { +- page.clear(); +- } +- this._cacheMap.clear(); +- this._cacheMapCombined.clear(); +- this._didWarmUp = false; +- +- // Invalidate renderer models so all texture pages are refreshed. The atlas may be shared, in +- // which case the clearing renderer has cleared only its own model and every other owner still +- // holds texture coords into the rows just wiped. +- this._pageLayoutVersion++; ++ // Return the atlas to its constructor state instead of clearing in place: page.clear() leaves ++ // page.glyphs populated, which would keep the guard above from ever firing again. Eviction ++ // also bumps _pageLayoutVersion, so every renderer sharing this atlas rebuilds its model. ++ this._evictAllPages(); ++ this._createNewPage(); + } + + private _createNewPage(): AtlasPage { +@@ -465,6 +468,36 @@ export class TextureAtlas implements ITextureAtlas { + return this._config.colors.contrastCache; + } + ++ /** ++ * Orca diagnostic. Canvas ignores a font assignment it cannot parse and silently keeps the ++ * previous value, so a bad family or weight rasterizes every glyph at a stale weight. Record ++ * the mismatch rather than correcting it: the goal is to tell that failure apart from a ++ * repaint bug when a terminal renders bold-collapsed. ++ */ ++ private _probeRasterizationFontWeight(fontWeight: FontWeight): void { ++ const desired = String(fontWeight); ++ // Only numeric weights are comparable; keywords round-trip through Canvas unchanged. ++ if (!/^(?:[1-8]\d{2}|900)$/.test(desired)) { ++ return; ++ } ++ // Canvas normalizes font serialization: Chromium omits 400 and emits the keyword bold for 700. ++ const token = this._tmpCtx.font.match( ++ /(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/ ++ )?.[1] ?? '400'; ++ const actual = token === 'normal' ? '400' : token === 'bold' ? '700' : token; ++ if (actual === desired) { ++ return; ++ } ++ this.fontProbeMismatchCount++; ++ this.fontProbeLastMismatch = { desired, actual: this._tmpCtx.font }; ++ try { ++ (globalThis as { __orcaAtlasFontProbe?: (mismatch: { desired: string, actual: string }) => void }) ++ .__orcaAtlasFontProbe?.(this.fontProbeLastMismatch); ++ } catch { ++ // Diagnostics only; a throwing listener must never break rasterization. ++ } ++ } ++ + private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph { + const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars; + +@@ -536,6 +569,7 @@ export class TextureAtlas implements ITextureAtlas { + const fontStyle = italic ? 'italic' : ''; + this._tmpCtx.font = + `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`; ++ this._probeRasterizationFontWeight(fontWeight); + this._tmpCtx.textBaseline = TEXT_BASELINE; + + const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0)); +diff --git a/src/WebglRenderer.ts b/src/WebglRenderer.ts +index a951efba5c75e82735cd39b6b22c4b5d5fad5928..e7f80c3a8c14dd65a16a97f1d17e3da1d65ed8bf 100644 +--- a/src/WebglRenderer.ts ++++ b/src/WebglRenderer.ts +@@ -386,7 +386,10 @@ export class WebglRenderer extends Disposable implements IRenderer { + // page's version, so re-run the update and force a full texture rebind. + let merged = false; + let mergeRetries = 0; +- while (this._charAtlas && this._glyphRenderer.value.beginFrame() && mergeRetries++ < Constants.MERGE_RETRY_LIMIT) { ++ // Test the retry budget before beginFrame: beginFrame latches the page layout version it ++ // observed, so tripping the limit after consuming it would strand a stale model with no ++ // later frame able to notice it needs rebuilding. ++ while (this._charAtlas && mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()) { + merged = true; + this._clearModel(true); + this._updateModel(0, this._terminal.rows - 1); diff --git a/config/patches/@xterm__xterm@6.1.0-beta.287.patch b/config/patches/@xterm__xterm@6.1.0-beta.303.patch similarity index 50% rename from config/patches/@xterm__xterm@6.1.0-beta.287.patch rename to config/patches/@xterm__xterm@6.1.0-beta.303.patch index cebb2242456..b3e59cc89ed 100644 --- a/config/patches/@xterm__xterm@6.1.0-beta.287.patch +++ b/config/patches/@xterm__xterm@6.1.0-beta.303.patch @@ -1,66 +1,66 @@ diff --git a/lib/xterm.js b/lib/xterm.js -index 9602d2a2abbdd6eb1ed884dd2cdcace32d1bb1a3..3f7c31e557b931dd8016985e59f098483945cb5f 100644 +index 5de883f434d2e60af7181461b1e36cd5e75bdfc0..7305fe19149f5d7c97e514252593d4dcb238bc77 100644 --- a/lib/xterm.js +++ b/lib/xterm.js @@ -1,2 +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={2840(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=r.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new c.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,f.addDisposableListener)(r,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register((0,d.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=l.tooMuchOutput.get())))}_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=[],o=e?.translateToString(!0,void 0,void 0,t)||"",n=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===o.length?(a.textContent=" ",this._rowColumns.set(a,[0,1])):(a.textContent=o,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",n),a.setAttribute("aria-setsize",s),this._alignRowWidth(a))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent===l.tooMuchOutput.get()&&this._clearLiveRegion(),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,o;if(0===t?(r=i,o=this._rowElements.pop(),this._rowContainer.removeChild(o)):(r=this._rowElements.shift(),o=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),o.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=this._coreBrowserService.mainDocument.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 o=t=this._terminal.cols&&(++s,o=0),{row:s,column:o}},o=r(t),n=r(i);if(o&&n){if(o.row>n.row||o.row===n.row&&o.column>=n.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(n.row-o.row)*this._terminal.cols-o.column+n.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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;ethis._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(e=>this.refresh(e?.start??0,e?.end??this.rows-1))),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(I.EventUtils.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(I.EventUtils.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(I.EventUtils.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(I.EventUtils.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(e=>this._afterResize(e.cols,e.rows))),this._register((0,N.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=E.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`]${i};${(0,M.toRgbString)(s)}\\`);break;case 1:if("ansi"===e)this._themeService.modifyColors(e=>e.ansi[t.index]=E.channels.toColor(...t.color));else{const i=e;this._themeService.modifyColors(e=>e[i]=E.channels.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index)}}}_reportColorScheme(){if(!this._themeService)return;const e=E.rgb.relativeLuminance(this._themeService.colors.background.rgba>>8)>8)?1:2;this.coreService.triggerDataEvent(`[?997;${e}n`)}_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(P.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),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(""),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),o=this._renderService.dimensions.css.cell.width*r,n=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=n+"px",this.textarea.style.width=o+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this._register((0,H.addDisposableListener)(this.element,"copy",e=>{this.hasSelection()&&(0,a.copyHandler)(e,this._selectionService)}));const e=e=>(0,a.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this._register((0,H.addDisposableListener)(this.textarea,"paste",e)),this._register((0,H.addDisposableListener)(this.element,"paste",e)),x.isFirefox?this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>{2===e.button&&(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register((0,H.addDisposableListener)(this.element,"contextmenu",e=>{(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),x.isLinux&&this._register((0,H.addDisposableListener)(this.element,"auxclick",e=>{1===e.button&&(0,a.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)}))}_bindKeys(){this._register((0,H.addDisposableListener)(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register((0,H.addDisposableListener)(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register((0,H.addDisposableListener)(this.textarea,"compositionend",()=>this._compositionHelper.compositionend())),this._register((0,H.addDisposableListener)(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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",e=>this.element.classList.toggle("allow-transparency",e))),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.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register((0,H.addDisposableListener)(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);const i=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",h.promptLabel.get()),x.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._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>i.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(g.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??("undefined"!=typeof window?window.document:null))),this._instantiationService.setService(C.ICoreBrowserService,this._coreBrowserService),this._register((0,H.addDisposableListener)(this.textarea,"focus",e=>this._handleTextAreaFocus(e))),this._register((0,H.addDisposableListener)(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(p.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(C.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(k.ThemeService),this._instantiationService.setService(C.IThemeService,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(v.CharacterJoinerService),this._instantiationService.setService(C.ICharacterJoinerService,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(w.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(C.IRenderService,this._renderService),this._register(this._renderService.onRenderedViewportChange(e=>this._onRender.fire(e))),this._register(this._renderService.onDimensionsChange(e=>this._onDimensionsChange.fire({css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}))),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(u.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(S.MouseCoordsService),this._instantiationService.setService(C.IMouseCoordsService,this._mouseCoordsService);const s=this._linkifier.value=this._register(this._instantiationService.createInstance(O.Linkifier,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(e){this._logService.error("onWillOpen handler threw an exception",e)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(c.Viewport,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(e=>{super.scrollLines(e,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(y.SelectionService,this.element,this.screenElement,s)),this._instantiationService.setService(C.ISelectionService,this._selectionService),this._mouseService=this._instantiationService.createInstance(b.MouseService),this._instantiationService.setService(C.IMouseService,this._mouseService),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(I.EventUtils.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(d.BufferDecorationRenderer,this.screenElement)),this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>this._selectionService.handleMouseDown(e))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(P.AccessibilityManager,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",e=>this._handleScreenReaderModeOptionChange(e)));const r=this.options.scrollbar?.showScrollbar??!0,o=this.options.scrollbar?.width;r&&o&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",e=>{const t=(e?.showScrollbar??!0)&&!!e?.width;!this._overviewRulerRenderer&&t&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:e=>this._viewport?.handleTouchScroll(e)},e=>this._register(e),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(f.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,i=!1){this._renderService?.refreshRows(e,t,i)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}paste(e){(0,a.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(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(!0),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),e.preventDefault(),e.stopPropagation(),!1}if(1===i.type&&this.selectAll(),this._isThirdLevelShift(this.browser,e))return!0;if(i.cancel&&(e.preventDefault(),e.stopPropagation()),!i.key)return!0;if(!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;""!==i.key&&"\r"!==i.key||(this.textarea.value="");const s=this._keyboardService.useWin32InputMode&&W(e);if(this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;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){if(this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return;W(e)||this.focus();const t=this._keyboardService.evaluateKeyUp(e);if(t?.key){const i=this._keyboardService.useWin32InputMode&&W(e);this.coreService.triggerDataEvent(t.key,!i)}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(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),!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()}clear(){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;efunction(e){const t=l(e);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(a.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}(e))),r};const s=i(3132);function r(e){const t=e;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;const i=e;return i?.view?i.view:window}class o{constructor(e,t,i,s){this._node=e,this._type=t,this._handler=i,this._options=s,e.addEventListener(t,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function n(e,t,i,s){return new o(e,t,i,s)}t.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class a{constructor(e,t){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}const h=new Map;function l(e){let t=h.get(e);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(e,t)),t}class c extends s.IntervalTimer{constructor(e){super(),this._defaultTarget=e?r(e):void 0}cancelAndSet(e,t,i){super.cancelAndSet(e,t,i??this._defaultTarget??window)}}t.WindowIntervalTimer=c},8906(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const o=i(4812),n=i(6501),a=i(7098),h=i(8636),l=i(4159);let c=class extends o.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseCoordsService=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 h.Emitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this._register(new h.Emitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this._register((0,o.toDisposable)(()=>{(0,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register((0,l.addDisposableListener)(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register((0,l.addDisposableListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element);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=o;e<=n;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);var i,s;t&&this._mouseDownLink&&(i=this._mouseDownLink.link,s=this._currentLink.link,i.text===s.text&&i.range.start.x===s.range.start.x&&i.range.start.y===s.range.start.y&&i.range.end.x===s.range.end.x&&i.range.end.y===s.range.end.y)&&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,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);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);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){const i=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(i)return{x:i[0],y:i[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=c,t.Linkifier=c=s([r(1,a.IMouseCoordsService),r(2,a.IRenderService),r(3,n.IBufferService),r(4,a.ILinkProviderService)],c)},7721(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0;let i="Terminal input";const s={get:()=>i,set:e=>i=e};t.promptLabel=s;let r="Too much output to announce, navigate to rows manually to read";const o={get:()=>r,set:e=>r=e};t.tooMuchOutput=o},3285(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const o=i(3055),n=i(6501);let a=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i,this._workCell=new o.CellData}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=this._workCell,n=i.getTrimmedLength();let a=-1,l=-1,c=!1;for(let t=0;tr?r.activate(e,t,d):h(0,t),hover:(e,t)=>r?.hover?.(e,t,d),leave:(e,t)=>r?.leave?.(e,t,d)})}c=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,a=o.extended.urlId):(l=-1,a=-1)}}t(s)}_getRangeWithLineWrap(e,t,i,s){let r=e,o=t,n=e,a=i;for(;0===o;){const e=this._bufferService.buffer.lines.get(r-1);if(!e?.isWrapped)break;const t=this._bufferService.buffer.lines.get(r-2);if(!t)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,i-1,s))break;let n=i-1;for(;n>0&&this._hasUrlId(t,n-1,s);)n--;r--,o=n}for(;;){const e=this._bufferService.buffer.lines.get(n-1);if(!e)break;if(a!==e.getTrimmedLength())break;const t=this._bufferService.buffer.lines.get(n);if(!t?.isWrapped)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,0,s))break;let r=1;for(;rthis._innerRefresh()),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=e??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,void 0===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=[]}}},4292(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(e,t,i){this._rowCount=i,e=e??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=performance.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)void 0!==this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),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=performance.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)}}},9302(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_ANSI_COLORS=void 0;const s=i(4103);t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const r=t[i/36%6|0],o=t[i/6%6|0],n=t[i%6];e.push({css:s.channels.toCss(r,o,n),rgba:s.channels.toRgba(r,o,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:s.channels.toCss(i,i,i),rgba:s.channels.toRgba(i,i,i)})}return e})())},4017(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const o=i(7098),n=i(4812),a=i(6501),h=i(4159),l=i(8566),c=i(8636),d=i(7880);let _=class extends n.Disposable{constructor(e,t,i,s,r,o,a,_,u){super(),this._bufferService=i,this._coreService=r,this._optionsService=_,this._renderService=u,this._onRequestScrollLines=this._register(new c.Emitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._isSyncing=!1,this._isHandlingScroll=!1,this._suppressOnScrollHandler=!1,this._needsSyncOnRender=!1;const f=this._register(new d.Scrollable({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:e=>(0,h.scheduleAtNextAnimationFrame)(s.window,e)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{f.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new l.SmoothScrollableElement(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},f)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(o.onProtocolChange(e=>{this._scrollableElement.updateOptions({handleMouseWheel:!(16&e)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{e.style.backgroundColor=a.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=a.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register((0,n.toDisposable)(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register((0,n.toDisposable)(()=>this._styleElement.remove())),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${a.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${a.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${a.colors.scrollbarSliderActiveBackground.css};`,"}"].join("\n")})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(e=>this._handleScroll(e)))}scrollLines(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){const e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,i=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:i,verticalHasArrows:t}}queueSync(e){void 0!==e&&(this._latestYDisp=e),void 0===this._queuedAnimationFrame&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){this._renderService&&!this._isSyncing&&(this._coreService.decPrivateModes.synchronizedOutput?this._needsSyncOnRender=!0:(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1))}_handleScroll(e){if(!this._renderService)return;if(this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;const t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),i=t-this._bufferService.buffer.ydisp;0!==i&&(this._latestYDisp=t,this._onRequestScrollLines.fire(i)),this._isHandlingScroll=!1}handleTouchScroll(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};t.Viewport=_,t.Viewport=_=s([r(2,a.IBufferService),r(3,o.ICoreBrowserService),r(4,a.ICoreService),r(5,a.IMouseStateService),r(6,o.IThemeService),r(7,a.IOptionsService),r(8,o.IRenderService)],_)},4196(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const o=i(7098),n=i(4812),a=i(6501);let h=class extends n.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,n.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.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),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,t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,o.ICoreBrowserService),r(3,a.IDecorationService),r(4,o.IRenderService)],h)},957(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)}}},9925(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const o=i(957),n=i(7098),a=i(4812),h=i(6501),l={full:0,left:0,center:0,right:0},c={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=class extends a.Disposable{get _width(){const e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??1?e?.width??0:0}constructor(e,t,i,s,r,n,h,l){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=n,this._themeService=h,this._coreBrowserService=l,this._colorZoneStore=new o.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),this._register((0,a.toDisposable)(()=>this._canvas?.remove()));const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register((0,a.toDisposable)(()=>{void 0!==this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);c.full=this._canvas.width,c.left=e,c.center=t,c.right=e,this._refreshDrawHeightConstants(),d.full=1,d.left=1,d.center=1+c.left,d.right=1+c.left+c.center}_refreshDrawHeightConstants(){l.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);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;const e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;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,this._renderRulerOutline();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}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_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)-l[e.position||"full"]/2),c[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_,t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,n.IRenderService),r(5,h.IOptionsService),r(6,n.IThemeService),r(7,n.ICoreBrowserService)],_)},3618(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const o=i(7098),n=i(6501);let a=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,o){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=o,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent=""}compositionstart(){this._isComposing=!0;const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;this._compositionPosition.start=Math.min(e,t),this._compositionPosition.end=Math.max(e,t),this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=`‎${e.data}‎`,this.updateCompositionElements(),setTimeout(()=>{const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)},0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(20===e.keyCode||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},t=this._compositionSuffix;this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){let i;if(this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,this._isComposing)i=this._textarea.value.substring(e.start,this._compositionPosition.start);else{const s=this._textarea.value,r=t.length>0&&s.endsWith(t)?s.length-t.length:s.length;i=s.substring(e.start,Math.max(e.start,r))}i.length>0&&this._coreService.triggerDataEvent(i,!0)}},0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;const e=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!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=a,t.CompositionHelper=a=s([r(2,n.IBufferService),r(3,n.IOptionsService),r(4,n.ICoreService),r(5,o.IRenderService)],a)},5251(e,t){function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),o=parseInt(r.getPropertyValue("padding-left"),10),n=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-s.left-o,t.clientY-s.top-n]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,o,n,a,h,l){if(!n)return;const c=i(e,t,s);return c[0]=Math.ceil((c[0]+(l?a/2:0))/a),c[1]=Math.ceil(c[1]/h),c[0]=Math.min(Math.max(c[0],1),r+(l?1:0)),c[1]=Math.min(Math.max(c[1],1),o),c}},9686(e,t){function i(e,t,i,o){const h=e-s(e,i),l=t-s(t,i),c=Math.abs(h-l)-function(e,t,i){let o=0;const n=e-s(e,i),a=t-s(t,i);for(let s=0;s=0&&et?"A":"B"}function o(e,t,i,s,r,o){let n=e,a=t,h="";for(;(n!==i||a!==s)&&a>=0&&ao.cols-1?(h+=o.buffer.translateBufferLineToString(a,!1,e,n),n=0,e=0,a++):!r&&n<0&&(h+=o.buffer.translateBufferLineToString(a,!1,0,e+1),n=o.cols-1,e=n,a--);return h+o.buffer.translateBufferLineToString(a,!1,e,n)}function n(e,t){return""+(t?"O":"[")+e}function a(e,t){e=Math.floor(e);let i="";for(let s=0;s0?h-s(h,l):t;const _=h,u=function(e,t,r,o,n,a){let h;return h=i(t,o,n,a).length>0?o-s(o,n):t,e=r&&he?"D":"C",a(Math.abs(l-e),n(d,h));d=c>t?"D":"C";const _=Math.abs(c-t);return a(function(e,t){return t.cols-e}(c>t?e:l,r)+(_-1)*r.cols+1+((c>t?l:e)-1),n(d,h))}},6081(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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(f.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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new _.ParserApi(this._core)}get unicode(){return this._checkProposedApi(),new u.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._register(new d.BufferNamespaceApi(this._core))}get markers(){return this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.mouseStateService.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,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:e.synchronizedOutput,win32InputMode:e.win32InputMode,wraparoundMode:e.wraparound}}get dimensions(){return this._core.dimensions}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._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return 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{get promptLabel(){return a.promptLabel.get()},set promptLabel(e){a.promptLabel.set(e)},get tooMuchOutput(){return a.tooMuchOutput.get()},set tooMuchOutput(e){a.tooMuchOutput.set(e)}}}_verifyIntegers(...e){for(p of e)if(p===1/0||isNaN(p)||p%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(p of e)if(p&&(p===1/0||isNaN(p)||p%1!=0||p<0))throw new Error("This API only accepts positive integers")}}t.Terminal=v},3955(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const o=i(1433),n=i(2744),a=i(9176),h=i(6181),l=i(2274),c=i(654),d=i(7098),_=i(4103),u=i(4812),f=i(6501),p=i(8636),v=i(4159);let g=1,m=class extends u.Disposable{constructor(e,t,i,s,r,a,d,_,f,m,b,w,y,C){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=d,this._charSizeService=f,this._optionsService=m,this._bufferService=b,this._coreService=w,this._coreBrowserService=y,this._themeService=C,this._terminalClass=g++,this._rowElements=[],this._selectionRenderModel=(0,l.createSelectionRenderModel)(),this._lastSelectionColumnMode=!1,this._rowHasBlinkingCells=[],this._rowHasBlinkingCellsCount=0,this._onRequestRedraw=this._register(new p.Emitter),this.onRequestRedraw=this._onRequestRedraw.event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),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=_.createInstance(o.DomRendererRowFactory,document),this._element.classList.add("xterm-dom-renderer-owner-"+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._cursorBlinkStateManager=new S(this._rowContainer,this._coreBrowserService),this._register((0,v.addDisposableListener)(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register((0,u.toDisposable)(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new c.TextBlinkStateManager(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register((0,u.toDisposable)(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new n.WidthCache,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} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${_.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;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} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${i} { color: ${s.css}; }${this._terminalSelector} .xterm-fg-${i}.xterm-dim { color: ${_.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .xterm-bg-${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR} { color: ${_.color.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${_.color.multiplyOpacity(_.color.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${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),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,i){const s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i);let r=0,o=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(r=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow));let n=0,a=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,i),this._selectionRenderModel.hasSelection){const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,o=this._selectionRenderModel.viewportCappedStartRow,h=this._selectionRenderModel.viewportCappedEndRow;n=o,a=h;const l=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];l.appendChild(this._createSelectionElement(o,i?t[0]:e[0],i?e[0]:t[0],h-o+1))}else{const i=s===o?e[0]:0,n=o===r?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(o,i,n));const a=h-o-1;if(l.appendChild(this._createSelectionElement(o+1,0,this._bufferService.cols,a)),o!==h){const e=r===h?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(h,0,e))}}this._selectionContainer.appendChild(l)}let h=Math.min(r,n),l=Math.max(o,a);if(l>=0){h=Math.max(h,0),l=Math.min(l,s-1);const e=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&e>=0&&ethis.dimensions.css.canvas.width&&(n=this.dimensions.css.canvas.width-o),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${o}px`,r.style.width=`${n}px`,r}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),o=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,n=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle,h={hasBlinkingCells:!1};for(let l=e;l<=t;l++){const e=l+i.ydisp,t=this._rowElements[l];if(!t)continue;const c=i.lines.get(e);c?(t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,n,a,r,o,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,h)),this._setRowBlinkState(l,h.hasBlinkingCells)):(t.replaceChildren(),this._setRowBlinkState(l,!1))}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,o){i<0&&(e=0),s<0&&(t=0);const n=this._bufferService.rows-1;i=Math.max(Math.min(i,n),0),s=Math.max(Math.min(s,n),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,l=Math.min(a.x,r-1),c=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle,u={hasBlinkingCells:!1};for(let n=i;n<=s;++n){const f=n+a.ydisp,p=this._rowElements[n];if(!p)continue;const v=a.lines.get(f);v?(p.replaceChildren(...this._rowFactory.createRow(v,f,f===h,d,_,l,c,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,o?n===i?e:0:-1,o?(n===s?t:r)-1:-1,u)),this._setRowBlinkState(n,u.hasBlinkingCells)):(p.replaceChildren(),this._setRowBlinkState(n,!1))}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};t.DomRenderer=m,t.DomRenderer=m=s([r(7,f.IInstantiationService),r(8,d.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,f.ICoreService),r(12,d.ICoreBrowserService),r(13,d.IThemeService)],m);class S{constructor(e,t){this._rowContainer=e,this._coreBrowserService=t,this._isIdlePaused=!1,this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){void 0!==this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}}},1433(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const o=i(9176),n=i(8938),a=i(3055),h=i(6501),l=i(4103),c=i(7098),d=i(945),_=i(6181),u=i(5451);let f=class{constructor(e,t,i,s,r,o,n){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=o,this._themeService=n,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,c,_,f,p,v,g){const m=[];g&&(g.hasBlinkingCells=!1);const S=this._characterJoinerService.getJoinedCharacters(t),b=this._themeService.colors;let w,y=e.getNoBgTrimmedLength();i&&y=A,F=I,W=this._workCell;if(S.length>0&&I===S[0][0]&&N){const s=S.shift(),r=this._isCellInSelection(s[0],t);for(C=s[0]+1;C=s[1],N?(H=!0,W=new d.JoinedCellData(this._workCell,e.translateToString(!0,s[0],s[1]),s[1]-s[0]),F=s[1]-1,y=W.getWidth()):A=s[1]}const z=this._isCellInSelection(I,t),K=i&&I===a,U=O&&I>=p&&I<=v;g&&W.isBlink()&&(g.hasBlinkingCells=!0),!c&&W.isBlink()&&P.push("xterm-blink-hidden");let j=!1;this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{j=!0});let $=W.getChars()||n.WHITESPACE_CELL_CHAR;if(" "===$&&(W.isUnderline()||W.isOverline())&&($=" "),k=y*_-f.get($,W.isBold(),W.isItalic()),w){if(D&&(z&&T||!z&&!T&&W.bg===L)&&(z&&T&&b.selectionForeground||W.fg===x)&&W.extended.ext===R&&U===M&&k===B&&!K&&!H&&!j&&N){W.isInvisible()?E+=n.WHITESPACE_CELL_CHAR:E+=$,D++;continue}D&&(w.textContent=E),w=this._document.createElement("span"),D=0,E=""}else w=this._document.createElement("span");if(L=W.bg,x=W.fg,R=W.extended.ext,M=U,B=k,T=z,H&&a>=I&&a<=F&&(a=I),!this._coreService.isCursorHidden&&K&&this._coreService.isCursorInitialized)if(P.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&P.push("xterm-cursor-blink"),P.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":P.push("xterm-cursor-outline");break;case"block":P.push("xterm-cursor-block");break;case"bar":P.push("xterm-cursor-bar");break;case"underline":P.push("xterm-cursor-underline")}if(W.isBold()&&P.push("xterm-bold"),W.isItalic()&&P.push("xterm-italic"),W.isDim()&&P.push("xterm-dim"),E=W.isInvisible()?n.WHITESPACE_CELL_CHAR:W.getChars()||n.WHITESPACE_CELL_CHAR,W.isUnderline()&&(P.push(`xterm-underline-${W.extended.underlineStyle}`)," "===E&&(E=" "),!W.isUnderlineColorDefault()))if(W.isUnderlineColorRGB())w.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(W.getUnderlineColor()).join(",")})`;else{let e=W.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&W.isBold()&&e<8&&(e+=8),w.style.textDecorationColor=b.ansi[e].css}W.isOverline()&&(P.push("xterm-overline")," "===E&&(E=" ")),W.isStrikethrough()&&P.push("xterm-strikethrough"),U&&(w.style.textDecoration="underline");let q=W.getFgColor(),V=W.getFgColorMode(),X=W.getBgColor(),Y=W.getBgColorMode();const G=!!W.isInverse();if(G){const e=q;q=X,X=e;const t=V;V=Y,Y=t}let J,Z,Q,ee=!1;switch(this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{"top"!==e.options.layer&&ee||(e.backgroundColorRGB&&(Y=50331648,X=e.backgroundColorRGB.rgba>>8&16777215,J=e.backgroundColorRGB),e.foregroundColorRGB&&(V=50331648,q=e.foregroundColorRGB.rgba>>8&16777215,Z=e.foregroundColorRGB),ee="top"===e.options.layer)}),!ee&&z&&(J=this._coreBrowserService.isFocused?b.selectionBackgroundOpaque:b.selectionInactiveBackgroundOpaque,X=J.rgba>>8&16777215,Y=50331648,ee=!0,b.selectionForeground&&(V=50331648,q=b.selectionForeground.rgba>>8&16777215,Z=b.selectionForeground)),ee&&P.push("xterm-decoration-top"),Y){case 16777216:case 33554432:Q=b.ansi[X],P.push(`xterm-bg-${X}`);break;case 50331648:Q=l.channels.toColor(X>>16,X>>8&255,255&X),this._addStyle(w,`background-color:#${(X>>>0).toString(16).padStart(6,"0")}`);break;default:G?(Q=b.foreground,P.push(`xterm-bg-${o.INVERTED_DEFAULT_COLOR}`)):Q=b.background}switch(J||W.isDim()&&(J=l.color.multiplyOpacity(Q,.5)),V){case 16777216:case 33554432:W.isBold()&&q<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(q+=8),this._applyMinimumContrast(w,Q,b.ansi[q],W,J,void 0)||P.push(`xterm-fg-${q}`);break;case 50331648:const e=l.channels.toColor(q>>16&255,q>>8&255,255&q);this._applyMinimumContrast(w,Q,e,W,J,Z)||this._addStyle(w,`color:#${q.toString(16).padStart(6,"0")}`);break;default:this._applyMinimumContrast(w,Q,b.foreground,W,J,Z)||G&&P.push(`xterm-fg-${o.INVERTED_DEFAULT_COLOR}`)}P.length&&(w.className=P.join(" "),P.length=0),K||H||j||!N?w.textContent=E:D++,k!==this.defaultSpacing&&(w.style.letterSpacing=`${k}px`),m.push(w),I=F}return w&&D&&(w.textContent=E),m}_applyMinimumContrast(e,t,i,s,r,o){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const n=this._getContrastCache(s);let a;if(r||o||(a=n.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=l.color.ensureContrastRatio(r??t,o??i,e),n.setColor((r??t).rgba,(o??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])}};t.DomRendererRowFactory=f,t.DomRendererRowFactory=f=s([r(1,c.ICharacterJoinerService),r(2,h.IOptionsService),r(3,c.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,c.IThemeService)],f)},2744(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0;const s=i(6181);t.WidthCache=class{constructor(e=()=>new r){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._canvasElements=[],this._canvasElements=[e(),e(),e(),e()],this.clear()}dispose(){this._canvasElements.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._canvasElements[0].setFont(e,t,i,!1),this._canvasElements[1].setFont(e,t,s,!1),this._canvasElements[2].setFont(e,t,i,!0),this._canvasElements[3].setFont(e,t,s,!0),this.clear())}get(e,t,i){let s;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 o=this._holey.get(r);if(void 0===o){let s=0;t&&(s|=1),i&&(s|=2),o=this._measure(e,s),o>0&&this._holey.set(r,o)}return o}_measure(e,t){return this._canvasElements[t].measure(e)}};class r{constructor(){"undefined"!=typeof OffscreenCanvas?(this._canvas=new OffscreenCanvas(1,1),this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d")))}setFont(e,t,i,s){const r=s?"italic":"";this._ctx.font=`${r} ${i} ${t}px ${e}`.trim()}measure(e){return this._ctx.measureText(e).width}}},9176(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.INVERTED_DEFAULT_COLOR=void 0,t.INVERTED_DEFAULT_COLOR=257},6181(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.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,o){return 1===t&&r>Math.ceil(1.5*o)&&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))}},2274(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=function(){return new i};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,o=t[1]-r,n=i[1]-r,a=Math.max(o,0),h=Math.min(n,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,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)}}},654(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TextBlinkStateManager=void 0;const s=i(4812);class r extends s.Disposable{constructor(e,t,i){super(),this._renderCallback=e,this._coreBrowserService=t,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",e=>{this.setIntervalDuration(e)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const e=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(e||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}t.TextBlinkStateManager=r},8501(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._domNodePointerDown(e)))}_createArrow(e){const t=this._register(new c.ScrollbarArrow(e));return this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode),t}_createSlider(e,t,i,s){this.slider=new h.FastDomNode(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(e),this.slider.setLeft(t),"number"==typeof i&&this.slider.setWidth(i),"number"==typeof s&&this.slider.setHeight(s),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(a.addDisposableListener(this.slider.domNode,a.eventType.POINTER_DOWN,e=>{0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))})),this._onclick(this.slider.domNode,e=>{e.leftButton&&e.stopPropagation()})}_handleElementSize(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(e){e.target===this.domNode.domNode&&this._handlePointerDown(e)}delegatePointerDown(e){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),s=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderPointerPosition(e);i<=r&&r<=s?0===e.button&&(e.preventDefault(),this._sliderPointerDown(e)):this._handlePointerDown(e)}_handlePointerDown(e){let t,i;if(e.target===this.domNode.domNode&&"number"==typeof e.offsetX&&"number"==typeof e.offsetY)t=e.offsetX,i=e.offsetY;else{const s=a.getDomNodePagePosition(this.domNode.domNode);t=e.pageX-s.left,i=e.pageY-s.top}const s=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(s):this._scrollbarState.getDesiredScrollPositionFromOffset(s)),0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))}_sliderPointerDown(e){if(!(e.target&&e.target instanceof Element))return;const t=this._sliderPointerPosition(e),i=this._sliderOrthogonalPointerPosition(e),s=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{const r=this._sliderOrthogonalPointerPosition(e),o=Math.abs(r-i);if(u.isWindows&&o>140)return void this._setDesiredScrollPositionNow(s.getScrollPosition());const n=this._sliderPointerPosition(e)-t;this._setDesiredScrollPositionNow(s.getDesiredScrollPositionFromDelta(n))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(e){const t={};this.writeScrollPosition(t,e),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(e){this._updateScrollbarSize(e),this._scrollbarState.setScrollbarSize(e),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}t.AbstractScrollbar=f},1203(e,t){function i(e){return"number"==typeof e?`${e}px`:e}Object.defineProperty(t,"__esModule",{value:!0}),t.FastDomNode=void 0,t.FastDomNode=class{constructor(e){this.domNode=e,this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._className="",this._position="",this._layerHint=!1,this._contain="none"}setWidth(e){const t=i(e);this._width!==t&&(this._width=t,this.domNode.style.width=this._width)}setHeight(e){const t=i(e);this._height!==t&&(this._height=t,this.domNode.style.height=this._height)}setTop(e){const t=i(e);this._top!==t&&(this._top=t,this.domNode.style.top=this._top)}setLeft(e){const t=i(e);this._left!==t&&(this._left=t,this.domNode.style.left=this._left)}setBottom(e){const t=i(e);this._bottom!==t&&(this._bottom=t,this.domNode.style.bottom=this._bottom)}setRight(e){const t=i(e);this._right!==t&&(this._right=t,this.domNode.style.right=this._right)}setClassName(e){this._className!==e&&(this._className=e,this.domNode.className=this._className)}toggleClassName(e,t){this.domNode.classList.toggle(e,t),this._className=this.domNode.className}setPosition(e){this._position!==e&&(this._position=e,this.domNode.style.position=this._position)}setLayerHinting(e){this._layerHint!==e&&(this._layerHint=e,this.domNode.style.transform=e?"translate3d(0px, 0px, 0px)":"")}setContain(e){this._contain!==e&&(this._contain=e,this.domNode.style.contain=this._contain)}setAttribute(e,t){this.domNode.setAttribute(e,t)}}},928(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{try{e.releasePointerCapture(t)}catch{}}))}catch{o=a.getWindow(e)}this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_MOVE,e=>{e.buttons===i?(e.preventDefault(),this._pointerMoveCallback(e)):this.stopMonitoring(!0)})),this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_UP,e=>this.stopMonitoring(!0)))}}},9699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.HorizontalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(t.horizontalHasArrows?t.horizontalScrollbarSize:0,2===t.horizontal?0:t.horizontalScrollbarSize,2===t.vertical?0:t.verticalScrollbarSize,s.width,s.scrollWidth,o.scrollLeft),visibility:t.horizontal,extraScrollbarClassName:"xterm-horizontal",scrollable:e,scrollByPage:t.scrollByPage}),t.horizontalHasArrows)throw new Error("horizontalHasArrows is not supported in xterm.js");this._createSlider(Math.floor((t.horizontalScrollbarSize-t.horizontalSliderSize)/2),0,void 0,t.horizontalSliderSize)}_updateSlider(e,t){this.slider.setWidth(e),this.slider.setLeft(t)}_renderDomNode(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._handleElementSize(e.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return e}_sliderPointerPosition(e){return e.pageX}_sliderOrthogonalPointerPosition(e){return e.pageY}_updateScrollbarSize(e){this.slider.setHeight(e)}writeScrollPosition(e,t){e.scrollLeft=t}updateOptions(e){this.updateScrollbarSize(2===e.horizontal?0:e.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._visibilityController.setVisibility(e.horizontal),this._scrollByPage=e.scrollByPage}}t.HorizontalScrollbar=o},3988(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;ni&&(s=i-t),s<0&&(s=0),r<0&&(r=0),n+r>o&&(n=o-r),n<0&&(n=0),this.width=t,this.scrollWidth=i,this.scrollLeft=s,this.height=r,this.scrollHeight=o,this.scrollTop=n}equals(e){return this.rawScrollLeft===e.rawScrollLeft&&this.rawScrollTop===e.rawScrollTop&&this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop}withScrollDimensions(e,t){return new o(this._forceIntegerValues,void 0!==e.width?e.width:this.width,void 0!==e.scrollWidth?e.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,void 0!==e.height?e.height:this.height,void 0!==e.scrollHeight?e.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(e){return new o(this._forceIntegerValues,this.width,this.scrollWidth,void 0!==e.scrollLeft?e.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,void 0!==e.scrollTop?e.scrollTop:this.rawScrollTop)}createScrollEvent(e,t){const i=this.width!==e.width,s=this.scrollWidth!==e.scrollWidth,r=this.scrollLeft!==e.scrollLeft,o=this.height!==e.height,n=this.scrollHeight!==e.scrollHeight,a=this.scrollTop!==e.scrollTop;return{inSmoothScrolling:t,oldWidth:e.width,oldScrollWidth:e.scrollWidth,oldScrollLeft:e.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:e.height,oldScrollHeight:e.scrollHeight,oldScrollTop:e.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:s,scrollLeftChanged:r,heightChanged:o,scrollHeightChanged:n,scrollTopChanged:a}}}t.ScrollState=o;class n extends r.Disposable{constructor(e){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new s.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new o(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){const i=this._state.withScrollDimensions(e,t);this._setState(i,Boolean(this._smoothScrolling)),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){const t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(0!==this._smoothScrollDuration){if(this._smoothScrolling){e={scrollLeft:void 0===e.scrollLeft?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:void 0===e.scrollTop?this._smoothScrolling.to.scrollTop:e.scrollTop};const i=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===i.scrollLeft&&this._smoothScrolling.to.scrollTop===i.scrollTop)return;let s;s=t?new l(this._smoothScrolling.from,i,this._smoothScrolling.startTime,this._smoothScrolling.duration):l.start(this._state,i,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{const t=this._state.withScrollPosition(e);this._smoothScrolling=l.start(this._state,t,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}else this.setScrollPositionNow(e)}hasPendingScrollAnimation(){return Boolean(this._smoothScrolling)}_performSmoothScrolling(){if(!this._smoothScrolling)return;const e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);return this._setState(t,!0),this._smoothScrolling?e.isDone?(this._smoothScrolling.dispose(),void(this._smoothScrolling=null)):void(this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})):void 0}_setState(e,t){const i=this._state;i.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(i,t)))}}t.Scrollable=n;class a{constructor(e,t,i){this.scrollLeft=e,this.scrollTop=t,this.isDone=i}}function h(e,t){const i=t-e;return function(t){return e+i*(1-(s=1-t,Math.pow(s,3)));var s}}class l{constructor(e,t,i,s){this.from=e,this.to=t,this.duration=s,this.startTime=i,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this._scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this._scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(e,t,i){if(Math.abs(e-t)>2.5*i){let n,a;return e0&&Math.abs(e.deltaY)>0)return 1;let i=.5;if(this._isAlmostInt(e.deltaX)&&this._isAlmostInt(e.deltaY)||(i+=.25),t){const s=Math.abs(e.deltaX),r=Math.abs(e.deltaY),o=Math.abs(t.deltaX),n=Math.abs(t.deltaY),a=Math.max(Math.min(s,o),1),h=Math.max(Math.min(r,n),1),l=Math.max(s,o),c=Math.max(r,n);l%a===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(e){return Math.abs(Math.round(e)-e)<.01}}S.INSTANCE=new S;class b extends _.Widget{get options(){return this._options}constructor(e,t,i){let s;super(),this._onScroll=this._register(new f.Emitter),this.onScroll=this._onScroll.event,t=t??{};const r=!i;i?s=i:(t.mouseWheelSmoothScroll=!1,s=new g.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:t=>a.scheduleAtNextAnimationFrame(a.getWindow(e),t)})),this._options=function(e){const t={lazyRender:void 0!==e.lazyRender&&e.lazyRender,className:void 0!==e.className?e.className:"",useShadows:void 0===e.useShadows||e.useShadows,handleMouseWheel:void 0===e.handleMouseWheel||e.handleMouseWheel,flipAxes:void 0!==e.flipAxes&&e.flipAxes,consumeMouseWheelIfScrollbarIsNeeded:void 0!==e.consumeMouseWheelIfScrollbarIsNeeded&&e.consumeMouseWheelIfScrollbarIsNeeded,alwaysConsumeMouseWheel:void 0!==e.alwaysConsumeMouseWheel&&e.alwaysConsumeMouseWheel,scrollYToX:void 0!==e.scrollYToX&&e.scrollYToX,mouseWheelScrollSensitivity:void 0!==e.mouseWheelScrollSensitivity?e.mouseWheelScrollSensitivity:1,fastScrollSensitivity:void 0!==e.fastScrollSensitivity?e.fastScrollSensitivity:5,scrollPredominantAxis:void 0===e.scrollPredominantAxis||e.scrollPredominantAxis,mouseWheelSmoothScroll:void 0===e.mouseWheelSmoothScroll||e.mouseWheelSmoothScroll,listenOnDomNode:void 0!==e.listenOnDomNode?e.listenOnDomNode:null,horizontal:void 0!==e.horizontal?e.horizontal:1,horizontalScrollbarSize:void 0!==e.horizontalScrollbarSize?e.horizontalScrollbarSize:10,horizontalSliderSize:void 0!==e.horizontalSliderSize?e.horizontalSliderSize:0,horizontalHasArrows:void 0!==e.horizontalHasArrows&&e.horizontalHasArrows,vertical:void 0!==e.vertical?e.vertical:1,verticalScrollbarSize:void 0!==e.verticalScrollbarSize?e.verticalScrollbarSize:10,verticalHasArrows:void 0!==e.verticalHasArrows&&e.verticalHasArrows,verticalSliderSize:void 0!==e.verticalSliderSize?e.verticalSliderSize:0,scrollByPage:void 0!==e.scrollByPage&&e.scrollByPage};return t.horizontalSliderSize=void 0!==e.horizontalSliderSize?e.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=void 0!==e.verticalSliderSize?e.verticalSliderSize:t.verticalScrollbarSize,v.isMac&&(t.className+=" xterm-mac"),t}(t),this._scrollable=s,this._register(this._scrollable.onScroll(e=>{this._handleScroll(e),this._onScroll.fire(e)})),r&&this._register(this._scrollable);const o={handleMouseWheel:e=>this._handleMouseWheel(e),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new d.VerticalScrollbar(this._scrollable,this._options,o)),this._horizontalScrollbar=this._register(new c.HorizontalScrollbar(this._scrollable,this._options,o)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,e=>this._handleMouseOver(e)),this._onmouseleave(this._listenOnDomNode,e=>this._handleMouseLeave(e)),this._hideTimeout=this._register(new u.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,v.isMac&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){void 0!==e.handleMouseWheel&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),void 0!==e.mouseWheelScrollSensitivity&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),void 0!==e.fastScrollSensitivity&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),void 0!==e.scrollPredominantAxis&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),void 0!==e.horizontal&&(this._options.horizontal=e.horizontal),void 0!==e.vertical&&(this._options.vertical=e.vertical),void 0!==e.horizontalHasArrows&&(this._options.horizontalHasArrows=e.horizontalHasArrows),void 0!==e.verticalHasArrows&&(this._options.verticalHasArrows=e.verticalHasArrows),void 0!==e.horizontalScrollbarSize&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),void 0!==e.verticalScrollbarSize&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),void 0!==e.scrollByPage&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new l.StandardWheelEvent(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),e)){const e=e=>{this._handleMouseWheel(new l.StandardWheelEvent(e))};this._mouseWheelToDispose.push(a.addDisposableListener(this._listenOnDomNode,a.eventType.MOUSE_WHEEL,e,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;const t=S.INSTANCE;t.acceptStandardWheelEvent(e);let i=!1;if(e.deltaY||e.deltaX){let s=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&r+s===0?r=s=0:Math.abs(s)>=Math.abs(r)?r=0:s=0),this._options.flipAxes&&([s,r]=[r,s]);const o=!v.isMac&&e.browserEvent&&e.browserEvent.shiftKey;!this._options.scrollYToX&&!o||r||(r=s,s=0),e.browserEvent&&e.browserEvent.altKey&&(r*=this._options.fastScrollSensitivity,s*=this._options.fastScrollSensitivity);const n=this._scrollable.getFutureScrollPosition();let a={};if(s){const e=50*s,t=n.scrollTop-(e<0?Math.floor(e):Math.ceil(e));this._verticalScrollbar.writeScrollPosition(a,t)}if(r){const e=50*r,t=n.scrollLeft-(e<0?Math.floor(e):Math.ceil(e));this._horizontalScrollbar.writeScrollPosition(a,t)}a=this._scrollable.validateScrollPosition(a),(n.scrollLeft!==a.scrollLeft||n.scrollTop!==a.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(a):this._scrollable.setScrollPositionNow(a),i=!0)}let s=i;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,i=e.scrollLeft>0,s=i?" xterm-shadow-left":"",r=t?" xterm-shadow-top":"",o=i||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${r}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${o}${r}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){this._mouseIsOver||this._isDragging||(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){this._mouseIsOver||this._isDragging||this._hideTimeout.cancelAndSet(()=>this._hide(),500)}}t.SmoothScrollableElement=b},9594(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._arrowPointerDown(e))),this._register(c.addStandardDisposableListener(this.domNode,c.eventType.POINTER_DOWN,e=>this._arrowPointerDown(e))),this._pointerdownRepeatTimer=this._register(new c.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new l.TimeoutTimer)}_arrowPointerDown(e){e.target&&e.target instanceof Element&&(this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,c.getWindow(e))},200),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),e.preventDefault())}}t.ScrollbarArrow=d},1270(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ScrollbarState=void 0;class i{constructor(e,t,i,s,r,o){this._scrollbarSize=Math.round(t),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(e),this._visibleSize=s,this._scrollSize=r,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new i(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(e){const t=Math.round(e);return this._visibleSize!==t&&(this._visibleSize=t,this._refreshComputedValues(),!0)}setScrollSize(e){const t=Math.round(e);return this._scrollSize!==t&&(this._scrollSize=t,this._refreshComputedValues(),!0)}setScrollPosition(e){const t=Math.round(e);return this._scrollPosition!==t&&(this._scrollPosition=t,this._refreshComputedValues(),!0)}setScrollbarSize(e){this._scrollbarSize=Math.round(e)}setArrowSize(e){const t=Math.round(e);this._arrowSize!==t&&(this._arrowSize=t,this._refreshComputedValues())}setOppositeScrollbarSize(e){this._oppositeScrollbarSize=Math.round(e)}static _computeValues(e,t,i,s,r){const o=Math.max(0,i-e),n=Math.max(0,o-2*t),a=s>0&&s>i;if(!a)return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(n),computedSliderRatio:0,computedSliderPosition:0};const h=Math.round(Math.max(20,Math.floor(i*n/s))),l=(n-h)/(s-i),c=r*l;return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(h),computedSliderRatio:l,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){const e=i._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=e.computedAvailableSize,this._computedIsNeeded=e.computedIsNeeded,this._computedSliderSize=e.computedSliderSize,this._computedSliderRatio=e.computedSliderRatio,this._computedSliderPosition=e.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize-this._computedSliderSize/2;return Math.round(t/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize;let i=this._scrollPosition;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(e){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(e?" xterm-fade":"")))}}t.ScrollbarVisibilityController=o},2650(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{s||(s=!0,this._remove(i))}}_remove(e){if(e.prev!==_.Undefined&&e.next!==_.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===_.Undefined&&e.next===_.Undefined?(this._first=_.Undefined,this._last=_.Undefined):e.next===_.Undefined?(this._last=this._last.prev,this._last.next=_.Undefined):e.prev===_.Undefined&&(this._first=this._first.next,this._first.prev=_.Undefined)}*[Symbol.iterator](){let e=this._first;for(;e!==_.Undefined;)yield e.element,e=e.next}}var f;!function(e){e.TAP="-xterm-gesturetap",e.CHANGE="-xterm-gesturechange",e.START="-xterm-gesturestart",e.END="-xterm-gesturesend",e.CONTEXT_MENU="-xterm-gesturecontextmenu"}(f||(t.EventType=f={}));class p extends l.Disposable{constructor(){super(),this._dispatched=!1,this._targets=new u,this._ignoreTargets=new u,this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;const e=c;this._register(h.addDisposableListener(e.document,"touchstart",e=>this._handleTouchStart(e),{passive:!1})),this._register(h.addDisposableListener(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(h.addDisposableListener(e.document,"touchmove",e=>this._handleTouchMove(e),{passive:!1}))}static addTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._targets.push(e);return(0,l.toDisposable)(t)}static ignoreTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._ignoreTargets.push(e);return(0,l.toDisposable)(t)}static isTouchDevice(){return"ontouchstart"in c||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){const t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let i=0,s=e.targetTouches.length;i=p._holdDelay&&Math.abs(n.initialPageX-d(n.rollingPageX))<30&&Math.abs(n.initialPageY-d(n.rollingPageY))<30){const e=this._newGestureEvent(f.CONTEXT_MENU,n.initialTarget);e.pageX=d(n.rollingPageX),e.pageY=d(n.rollingPageY),this._dispatchEvent(e)}else if(1===s){const t=d(n.rollingPageX),s=d(n.rollingPageY),r=d(n.rollingTimestamps)-n.rollingTimestamps[0],o=t-n.rollingPageX[0],a=s-n.rollingPageY[0],h=[...this._targets].filter(e=>n.initialTarget instanceof Node&&e.contains(n.initialTarget));this._inertia(e,h,i,Math.abs(o)/r,o>0?1:-1,t,Math.abs(a)/r,a>0?1:-1,s)}this._dispatchEvent(this._newGestureEvent(f.END,n.initialTarget)),delete this._activeTouches[o.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){const i=document.createEvent("CustomEvent");return i.initEvent(e,!1,!0),i.initialTarget=t,i.tapCount=0,i}_dispatchEvent(e){if(e.type===f.TAP){const t=(new Date).getTime();let i;i=t-this._lastSetTapCountTime>p._clearTapCountTime?1:2,this._lastSetTapCountTime=t,e.tapCount=i}else e.type!==f.CHANGE&&e.type!==f.CONTEXT_MENU||(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(const t of this._ignoreTargets)if(t.contains(e.initialTarget))return;const t=[];for(const i of this._targets)if(i.contains(e.initialTarget)){let s=0,r=e.initialTarget;for(;r&&r!==i;)s++,r=r.parentElement;t.push([s,i])}t.sort((e,t)=>e[0]-t[0]);for(const[,i]of t)i.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,i,s,r,o,n,a,l){this._handle=h.scheduleAtNextAnimationFrame(e,()=>{const h=Date.now(),c=h-i;let d=0,_=0,u=!0;s+=p._scrollFriction*c,n+=p._scrollFriction*c,s>0&&(u=!1,d=r*s*c),n>0&&(u=!1,_=a*n*c);const v=this._newGestureEvent(f.CHANGE);v.translationX=d,v.translationY=_,t.forEach(e=>e.dispatchEvent(v)),u||this._inertia(e,t,h,s,r,o+d,n,a,l+_)})}_handleTouchMove(e){const t=Date.now();for(let i=0,s=e.changedTouches.length;i3&&(r.rollingPageX.shift(),r.rollingPageY.shift(),r.rollingTimestamps.shift()),r.rollingPageX.push(s.pageX),r.rollingPageY.push(s.pageY),r.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}}t.Gesture=p,p._scrollFriction=-.005,p._holdDelay=700,p._clearTapCountTime=400,n([function(e,t,i){let s=null,r=null;if("function"==typeof i.value?(s="value",r=i.value,0!==r.length&&console.warn("Memoize should only be used in functions with zero parameters")):"function"==typeof i.get&&(s="get",r=i.get),!r||!s)throw new Error("not supported");const o=`$memoize$${t}`;i[s]=function(...e){return this.hasOwnProperty(o)||Object.defineProperty(this,o,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,e)}),this[o]}}],p,"isTouchDevice",null)},8997(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VerticalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition(),n=t.verticalHasArrows;super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(n?t.verticalScrollbarSize:0,2===t.vertical?0:t.verticalScrollbarSize,0,s.height,s.scrollHeight,o.scrollTop),visibility:t.vertical,extraScrollbarClassName:"xterm-vertical",scrollable:e,scrollByPage:t.scrollByPage}),this._arrowScrollDelta=0,this._setArrows(n,t.verticalScrollbarSize),this._createSlider(0,Math.floor((t.verticalScrollbarSize-t.verticalSliderSize)/2),t.verticalSliderSize,void 0)}_updateSlider(e,t){this.slider.setHeight(e),this.slider.setTop(t)}_renderDomNode(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._handleElementSize(e.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return t}_sliderPointerPosition(e){return e.pageY}_sliderOrthogonalPointerPosition(e){return e.pageX}_updateScrollbarSize(e){this.slider.setWidth(e)}writeScrollPosition(e,t){e.scrollTop=t}_arrowScroll(e){const t=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollTop:t.scrollTop+e})}_setArrows(e,t){if(this._arrowScrollDelta=t,!this._arrowUp||!this._arrowDown){const e=0;this._arrowUp=this._createArrow({className:"xterm-scra xterm-arrow-up",top:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})}if(this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;const i=e?"":"none";this._arrowUp.bgDomNode.style.display=i,this._arrowUp.domNode.style.display=i,this._arrowDown.bgDomNode.style.display=i,this._arrowDown.domNode.style.display=i}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){const t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}}t.VerticalScrollbar=o},7741(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nt(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseover(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_OVER,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseleave(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_LEAVE,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}}t.Widget=c},5959(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=[0,0],!0)}}},4792(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const o=i(6501),n=i(4812),a=i(8636);let h=class extends n.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 a.Emitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new d(this._optionsService))}catch{this._measureStrategy=this._register(new c(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h,t.CharSizeService=h=s([r(2,o.IOptionsService)],h);class l extends n.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 c extends l{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 l{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}}},945(e,t,i){var s,r=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},o=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(5451),a=i(8938),h=i(3055),l=i(6501);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 d=s=class{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new h.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,h,n,t,o);for(let t=0;t1){const e=this._getJoinedRanges(s,h,n,t,o);for(let t=0;tthis._screenDprMonitor.setWindow(e))),this._register(s.EventUtils.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register((0,r.addDisposableListener)(this._textarea,"focus",()=>this._isFocused=!0)),this._register((0,r.addDisposableListener)(this._textarea,"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=n;class a extends o.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this._register(new o.MutableDisposable),this._onDprChange=this._register(new s.Emitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register((0,o.toDisposable)(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,r.addDisposableListener)(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)}}},2136(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.KeyboardService=void 0;const o=i(706),n=i(7241),a=i(9249),h=i(701),l=i(6501);let c=class{constructor(e,t){this._coreService=e,this._optionsService=t}_getWin32InputMode(){return this._win32InputMode??=new a.Win32InputMode,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new n.KittyKeyboard,this._kittyKeyboard}evaluateKeyDown(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!0);const t=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(e,t,e.repeat?2:1,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):(0,o.evaluateKeyboardEvent)(e,this._coreService.decPrivateModes.applicationCursorKeys,h.isMac,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!1);const t=this._coreService.kittyKeyboard.flags;return this.useKitty&&2&t?this._getKittyKeyboard().evaluate(e,t,3,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):void 0}get useKitty(){const e=this._coreService.kittyKeyboard.flags;return!(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard||!n.KittyKeyboard.shouldUseProtocol(e))}get useWin32InputMode(){return!(!this._optionsService.rawOptions.vtExtensions?.win32InputMode||!this._coreService.decPrivateModes.win32InputMode)}};t.KeyboardService=c,t.KeyboardService=c=s([r(0,l.ICoreService),r(1,l.IOptionsService)],c)},9820(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(4812);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},8294(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseCoordsService=void 0;const o=i(4159),n=i(5251),a=i(7098);let h=class{constructor(e,t){this._charSizeService=e,this._renderService=t}getCoords(e,t,i,s,r){return(0,n.getCoords)((0,o.getWindow)(t),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,n.getCoordsRelativeToElement)((0,o.getWindow)(t),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.MouseCoordsService=h,t.MouseCoordsService=h=s([r(0,a.ICharSizeService),r(1,a.IRenderService)],h)},9784(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AltMouseCursorController=t.MouseService=void 0;const o=i(4159),n=i(6501),a=i(4812),h=i(7098),l=i(2650);let c=class{constructor(e,t,i,s,r,o,n,a,h){this._renderService=e,this._mouseCoordsService=t,this._mouseStateService=i,this._coreService=s,this._bufferService=r,this._optionsService=o,this._selectionService=n,this._logService=a,this._coreBrowserService=h,this._lastEvent=null,this._wheelPartialScroll=0,this._touchScrollAccumulator=0}bindMouse(e,t,i){const{element:s,document:r}=e,n={mouseup:null,wheel:null,mousedrag:null,mousemove:null},h={target:e,focus:i,requestedEvents:n},c={mouseup:e=>this._handleMouseUp(h,e),wheel:e=>this._handleWheel(h,e),mousedrag:e=>this._handleMouseDrag(h,e),mousemove:e=>this._handleMouseMove(h,e)};this._altMouseCursor=new d(s,r,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),t(this._altMouseCursor),t(this._mouseStateService.onProtocolChange(e=>{this._handleProtocolChange(h,c,e)})),t(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(s),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,t((0,a.toDisposable)(()=>{n.mouseup&&r.removeEventListener("mouseup",n.mouseup),n.mousedrag&&r.removeEventListener("mousemove",n.mousedrag)})),t((0,o.addDisposableListener)(s,"mousedown",e=>this._handleMouseDown(h,e))),t((0,o.addDisposableListener)(s,"wheel",e=>this._handlePassiveWheel(h,e),{passive:!1})),t(l.Gesture.addTarget(e.screenElement)),t((0,o.addDisposableListener)(e.screenElement,l.EventType.START,()=>this._handleTouchStart())),t((0,o.addDisposableListener)(e.screenElement,l.EventType.CHANGE,e=>this._handleTouchChange(h,e)))}_sendEvent(e,t){const i=this._mouseCoordsService.getMouseReportCoords(t,e.target.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(!this._mouseStateService.allowCustomWheelEvent(t))return!1;const e=t.deltaY;if(0===e)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return!1;r=e<0?0:1,s=4;break;default:return!1}if(void 0===r||void 0===s||s>4)return!1;if(4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!t.altKey)return!1;const o=4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:!o&&t.altKey,shift:t.shiftKey})}_handleMouseUp(e,t){this._sendEvent(e,t),t.buttons||(e.requestedEvents.mouseup&&e.target.document.removeEventListener("mouseup",e.requestedEvents.mouseup),e.requestedEvents.mousedrag&&e.target.document.removeEventListener("mousemove",e.requestedEvents.mousedrag))}_handleWheel(e,t){return this._sendEvent(e,t),t.preventDefault(),t.stopPropagation(),!1}_handleMouseDrag(e,t){t.buttons&&this._sendEvent(e,t)}_handleMouseMove(e,t){t.buttons||this._sendEvent(e,t)}_handleMouseDown(e,t){t.preventDefault(),e.focus(),this._mouseStateService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(t)&&(this._sendEvent(e,t),e.requestedEvents.mouseup&&e.target.document.addEventListener("mouseup",e.requestedEvents.mouseup),e.requestedEvents.mousedrag&&e.target.document.addEventListener("mousemove",e.requestedEvents.mousedrag))}_handlePassiveWheel(e,t){if(!e.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(t))return!1;if(!this._bufferService.buffer.hasScrollback){if(0===t.deltaY)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return t.preventDefault(),t.stopPropagation(),!1;const e=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(e,!0),t.preventDefault(),t.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(e,t){t.preventDefault(),t.stopPropagation(),e.requestedEvents.wheel?this._handleTouchScrollAsWheel(e,t):this._bufferService.buffer.hasScrollback?e.target.handleTouchScroll?.(t.translationY):this._handleTouchScrollAsKeys(t)}_handleTouchScrollAsKeys(e){const t=this._renderService?.dimensions.css.cell.height;if(!t)return;this._touchScrollAccumulator-=e.translationY;const i=Math.trunc(this._touchScrollAccumulator/t);if(0===i)return;this._touchScrollAccumulator-=i*t;const s=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let e=0;e0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(r*=this._bufferService.rows),r}_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,this._mouseStateService.isPixelEncoding))return!1;if(!this._mouseStateService.restrictMouseEvent(e))return!1;const t=this._mouseStateService.encodeMouseEvent(e);return t&&(this._mouseStateService.isDefaultEncoding?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.MouseService=c,t.MouseService=c=s([r(0,h.IRenderService),r(1,h.IMouseCoordsService),r(2,n.IMouseStateService),r(3,n.ICoreService),r(4,n.IBufferService),r(5,n.IOptionsService),r(6,h.ISelectionService),r(7,n.ILogService),r(8,h.ICoreBrowserService)],c);class d{constructor(e,t,i){this._element=e,this._document=t,this._isActive=i,this._listeners=new a.MutableDisposable}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;const e=new a.DisposableStore,t=e=>this.syncFromModifier(e);e.add((0,o.addDisposableListener)(this._document,"keydown",t)),e.add((0,o.addDisposableListener)(this._document,"keyup",t)),e.add((0,o.addDisposableListener)(this._element,"mousemove",t));const i=this._element.ownerDocument?.defaultView;i&&e.add((0,o.addDisposableListener)(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=e}resetClass(){this._updateClass(!1)}syncFromModifier(e){this._isActive()&&this._updateClass(e.getModifierState("Alt"))}_updateClass(e){e?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}}t.AltMouseCursorController=d},5783(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const o=i(4852),n=i(7098),a=i(4812),h=i(6168),l=i(6501),c=i(8636);let d=class extends a.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,n,l,d,u,f){super(),this._rowCount=e,this._optionsService=i,this._logService=s,this._charSizeService=r,this._coreService=n,this._coreBrowserService=u,this._renderer=this._register(new a.MutableDisposable),this._observerDisposable=this._register(new a.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 c.Emitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this._register(new c.Emitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this._register(new c.Emitter),this.onRender=this._onRender.event,this._onRefreshRequest=this._register(new c.Emitter),this.onRefreshRequest=this._onRefreshRequest.event,this._pausedResizeTask=this._register(new h.DebouncedIdleTask(this._logService)),this._renderDebouncer=new o.RenderDebouncer((e,t)=>this._renderRows(e,t),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new _(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register((0,a.toDisposable)(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(d.onResize(()=>this._fullRefresh())),this._register(d.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(d.cols,d.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(d.buffer.y,d.buffer.y,void 0,!0))),this._register(f.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.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});this._observerDisposable.value=(0,a.toDisposable)(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=i,i.observe(t)}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),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,s=!1){if(this._isPaused)return void(this._needsFullRefresh=!0);if(this._coreService.decPrivateModes.synchronizedOutput)return void this._syncOutputHandler.bufferRows(e,t);const r=this._syncOutputHandler.flush();r&&(e=Math.min(e,r.start),t=Math.max(t,r.end)),s||(this._isNextRenderRedrawOnly=!1),i?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){this._renderer.value&&(this._coreService.decPrivateModes.synchronizedOutput?this._syncOutputHandler.bufferRows(e,t):(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,e.sync,!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,t.RenderService=d=s([r(2,l.IOptionsService),r(3,l.ILogService),r(4,n.ICharSizeService),r(5,l.ICoreService),r(6,l.IDecorationService),r(7,l.IBufferService),r(8,n.ICoreBrowserService),r(9,n.IThemeService)],d);class _{constructor(e,t,i){this._coreBrowserService=e,this._coreService=t,this._onTimeout=i,this._start=0,this._end=0,this._isBuffering=!1}bufferRows(e,t){this._isBuffering?(this._start=Math.min(this._start,e),this._end=Math.max(this._end,t)):(this._start=e,this._end=t,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;const e={start:this._start,end:this._end};return this._isBuffering=!1,e}dispose(){void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}}},2079(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(e=>this._handleTrim(e)),this._register(this._bufferService.buffers.onBufferActivate(e=>this._handleBufferActivate(e))),this.enable(),this._model=new d.SelectionModel(this._bufferService),this._activeSelectionMode=0,this._register((0,u.toDisposable)(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(e=>{e.rowsChanged&&this.clearSelection()}))}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(b," ")).join(f.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())),f.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,p.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._mouseCoordsService.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,l.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 this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:f.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(2===e.button&&this.hasSelection||0!==e.button||this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){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){const t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);const i=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);i&&i.length!==this._model.selectionStart[0]&&0===i.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(!this._optionsService.rawOptions.mouseEventsRequireAlt||!this._mouseStateService.areMouseEventsActive)&&e.altKey&&!(f.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-1,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._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,c.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.value=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,o=r.lines.get(e[1]);if(!o)return;const n=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(o,e[0]),h=a;const l=e[0]-a;let c=0,d=0,_=0,u=0;if(" "===n.charAt(a)){for(;a>0&&" "===n.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(o.loadCell(t-1,this._workCell));){o.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(c++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+l-c+_,p=Math.min(this._bufferService.cols,h-a+c+d-_-u);if(t||""!==n.slice(a,h).trim()){if(i&&0===f&&32!==o.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&o.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,p+=e}}}if(s&&f+p===this._bufferService.cols&&32!==o.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&&(p+=t.length)}}return{start:f,length:p}}}_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,p.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=w,t.SelectionService=w=n([h(3,g.IBufferService),h(4,g.ICoreService),h(5,_.IMouseCoordsService),h(6,g.IOptionsService),h(7,g.IMouseStateService),h(8,_.IRenderService),h(9,_.ICoreBrowserService)],w)},7098(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.IKeyboardService=t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.IMouseCoordsService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(6201);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseCoordsService=(0,s.createDecorator)("MouseCoordsService"),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"),t.IKeyboardService=(0,s.createDecorator)("KeyboardService")},9078(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=void 0;const o=i(7174),n=i(9302),a=i(4103),h=i(4812),l=i(6501),c=i(8636),d=a.css.toColor("#ffffff"),_=a.css.toColor("#000000"),u=a.css.toColor("#ffffff"),f=_,p={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},v=d;let g=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new o.ColorContrastCache,this._halfContrastCache=new o.ColorContrastCache,this._onChangeColors=this._register(new c.Emitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:d,background:_,cursor:u,cursorAccent:f,selectionForeground:void 0,selectionBackgroundTransparent:p,selectionBackgroundOpaque:a.color.blend(_,p),selectionInactiveBackgroundTransparent:p,selectionInactiveBackgroundOpaque:a.color.blend(_,p),scrollbarSliderBackground:a.color.opacity(d,.2),scrollbarSliderHoverBackground:a.color.opacity(d,.4),scrollbarSliderActiveBackground:a.color.opacity(d,.5),overviewRulerBorder:d,ansi:n.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 t=this._colors;if(t.foreground=m(e.foreground,d),t.background=m(e.background,_),t.cursor=a.color.blend(t.background,m(e.cursor,u)),t.cursorAccent=a.color.blend(t.background,m(e.cursorAccent,f)),t.selectionBackgroundTransparent=m(e.selectionBackground,p),t.selectionBackgroundOpaque=a.color.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=m(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=a.color.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?m(e.selectionForeground,a.NULL_COLOR):void 0,t.selectionForeground===a.NULL_COLOR&&(t.selectionForeground=void 0),a.color.isOpaque(t.selectionBackgroundTransparent)){const e=.3;t.selectionBackgroundTransparent=a.color.opacity(t.selectionBackgroundTransparent,e)}if(a.color.isOpaque(t.selectionInactiveBackgroundTransparent)){const e=.3;t.selectionInactiveBackgroundTransparent=a.color.opacity(t.selectionInactiveBackgroundTransparent,e)}if(t.scrollbarSliderBackground=m(e.scrollbarSliderBackground,a.color.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=m(e.scrollbarSliderHoverBackground,a.color.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=m(e.scrollbarSliderActiveBackground,a.color.opacity(t.foreground,.5)),t.overviewRulerBorder=m(e.overviewRulerBorder,v),t.ansi=n.DEFAULT_ANSI_COLORS.slice(),t.ansi[0]=m(e.black,n.DEFAULT_ANSI_COLORS[0]),t.ansi[1]=m(e.red,n.DEFAULT_ANSI_COLORS[1]),t.ansi[2]=m(e.green,n.DEFAULT_ANSI_COLORS[2]),t.ansi[3]=m(e.yellow,n.DEFAULT_ANSI_COLORS[3]),t.ansi[4]=m(e.blue,n.DEFAULT_ANSI_COLORS[4]),t.ansi[5]=m(e.magenta,n.DEFAULT_ANSI_COLORS[5]),t.ansi[6]=m(e.cyan,n.DEFAULT_ANSI_COLORS[6]),t.ansi[7]=m(e.white,n.DEFAULT_ANSI_COLORS[7]),t.ansi[8]=m(e.brightBlack,n.DEFAULT_ANSI_COLORS[8]),t.ansi[9]=m(e.brightRed,n.DEFAULT_ANSI_COLORS[9]),t.ansi[10]=m(e.brightGreen,n.DEFAULT_ANSI_COLORS[10]),t.ansi[11]=m(e.brightYellow,n.DEFAULT_ANSI_COLORS[11]),t.ansi[12]=m(e.brightBlue,n.DEFAULT_ANSI_COLORS[12]),t.ansi[13]=m(e.brightMagenta,n.DEFAULT_ANSI_COLORS[13]),t.ansi[14]=m(e.brightCyan,n.DEFAULT_ANSI_COLORS[14]),t.ansi[15]=m(e.brightWhite,n.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const i=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;ssetTimeout(t,e))},t.disposableTimeout=function(e,t=0,i){const r=setTimeout(()=>{e(),i&&o.dispose()},t),o=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(o),o};const s=i(4812);t.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}},t.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}},t.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(e,t,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{e()},t);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},5639(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(4812),r=i(8636);class o extends s.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this._register(new r.Emitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this._register(new r.Emitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this._register(new r.Emitter),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>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(n||(t.channels=n={})),function(e){function t(e,t){return o=Math.round(255*t),[i,s,r]=c.toChannels(e.rgba),{css:n.toCss(i,s,r,o),rgba:n.toRgba(i,s,r,o)}}e.blend=function(e,t){if(o=(255&t.rgba)/255,1===o)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),{css:n.toCss(i,s,r),rgba:n.toRgba(i,s,r)}},e.isOpaque=function(e){return!(255&~e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=c.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return n.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=c.toChannels(t),{css:n.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return o=255&e.rgba,t(e,o*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),n.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),o=parseInt(e.slice(4,5).repeat(2),16),n.toColor(i,s,r,o);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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),o=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),n.toColor(i,s,r,o);if("transparent"===e)return{css:"transparent",rgba:0};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,o]=t.getImageData(0,0,1,1).data,255!==o)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(i,s,r,o),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(l||(t.rgb=l={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c>>0}e.blend=function(e,t){if(o=(255&t)/255,1===o)return t;const a=t>>24&255,h=t>>16&255,l=t>>8&255,c=e>>24&255,d=e>>16&255,_=e>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),n.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=l.relativeLuminance(e>>8),o=l.relativeLuminance(i>>8);if(_(r,o)>8));if(n_(r,l.relativeLuminance(t>>8))?o:t}return o}const n=a(e,i,s),h=_(r,l.relativeLuminance(n>>8));if(h_(r,l.relativeLuminance(o>>8))?n:o}return n}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(c||(t.rgba=c={}))},5777(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(6501),r=i(6025),o=i(7276),n=i(9640),a=i(56),h=i(4071),l=i(6478),c=i(7428),d=i(6415),_=i(5746),u=i(5882),f=i(2486),p=i(3562),v=i(8811),g=i(8636),m=i(4812);let S=!1;class b extends m.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new g.Emitter),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 m.MutableDisposable),this._onBinary=this._register(new g.Emitter),this.onBinary=this._onBinary.event,this._onData=this._register(new g.Emitter),this.onData=this._onData.event,this._onLineFeed=this._register(new g.Emitter),this.onLineFeed=this._onLineFeed.event,this._onRender=this._register(new g.Emitter),this.onRender=this._onRender.event,this._onResize=this._register(new g.Emitter),this.onResize=this._onResize.event,this._onWriteParsed=this._register(new g.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this._register(new g.Emitter),this._instantiationService=new r.InstantiationService,this.optionsService=this._register(new a.OptionsService(e)),this._instantiationService.setService(s.IOptionsService,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(s.ILogService,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(n.BufferService)),this._instantiationService.setService(s.IBufferService,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(h.CoreService)),this._instantiationService.setService(s.ICoreService,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(l.MouseStateService)),this._instantiationService.setService(s.IMouseStateService,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(d.UnicodeService)),this.unicodeService.register(new c.UnicodeV6),this._instantiationService.setService(s.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(_.CharsetService),this._instantiationService.setService(s.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(v.OscLinkService),this._instantiationService.setService(s.IOscLinkService,this._oscLinkService),this._inputHandler=this._register(new f.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(g.EventUtils.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(g.EventUtils.forward(this._bufferService.onResize,this._onResize)),this._register(g.EventUtils.forward(this.coreService.onData,this._onData)),this._register(g.EventUtils.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),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(g.EventUtils.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=s.LogLevelEnum.WARN&&!S&&(this._logService.warn("writeSync is unreliable and will be removed soon."),S=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.backend&&void 0!==t.buildNumber&&(e=!!("conpty"===t.backend&&t.buildNumber<21376)),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(u.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>((0,u.updateWindowsModeWrappedState)(this._bufferService),!1))),this._windowsWrappingHeuristics.value=(0,m.toDisposable)(()=>{for(const t of e)t.dispose()})}}}t.CoreTerminal=b},8636(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const s=i(4812);var r;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:e,thisArgs:t};this._listeners.push(r);const o=(0,s.toDisposable)(()=>{const e=this._listeners.indexOf(r);-1!==e&&this._listeners.splice(e,1)});return i&&(Array.isArray(i)?i.push(o):i.add(o)),o}),this._event}fire(e){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{const{fn:t,thisArgs:i}=this._listeners[0];return void t.call(i,e)}default:{const t=this._listeners.slice();for(const{fn:i,thisArgs:s}of t)i.call(s,e)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},function(e){e.forward=function(e,t){return e(e=>t.fire(e))},e.map=function(e,t){return(i,s,r)=>e(e=>i.call(s,t(e)),void 0,r)},e.any=function(...e){return(t,i,r)=>{const o=new s.DisposableStore;for(const s of e)o.add(s(e=>t.call(i,e)));return r&&(Array.isArray(r)?r.push(o):r.add(o)),o}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(r||(t.EventUtils=r={}))},2486(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0,t.isValidColorIndex=L;const o=i(6760),n=i(6717),a=i(4812),h=i(726),l=i(6107),c=i(8938),d=i(3055),_=i(5451),u=i(6501),f=i(6415),p=i(1346),v=i(9823),g=i(2607),m=i(8693),S=i(8636),b=i(7804),w={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function y(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 C;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(C||(t.WindowsOptionsReportType=C={}));let k=0;class D extends a.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,a,c,d,_=new n.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=a,this._mouseStateService=c,this._unicodeService=d,this._parser=_,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new h.StringToUtf32,this._utf8Decoder=new h.Utf8ToUtf32,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 S.Emitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this._register(new S.Emitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this._register(new S.Emitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this._register(new S.Emitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this._register(new S.Emitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this._register(new S.Emitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this._register(new S.Emitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this._register(new S.Emitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this._register(new S.Emitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this._register(new S.Emitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this._register(new S.Emitter),this.onScroll=this._onScroll.event,this._onTitleChange=this._register(new S.Emitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this._register(new S.Emitter),this.onColor=this._onColor.event,this._onRequestColorSchemeQuery=this._register(new S.Emitter),this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 E(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.setApcHandlerFallback((e,t,i)=>{this._logService.debug("Unknown APC 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.scrollDown(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({prefix:">",final:"q"},e=>this.sendXtVersion(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.registerCsiHandler({prefix:"=",final:"u"},e=>this.kittyKeyboardSet(e)),this._parser.registerCsiHandler({prefix:"?",final:"u"},e=>this.kittyKeyboardQuery(e)),this._parser.registerCsiHandler({prefix:">",final:"u"},e=>this.kittyKeyboardPush(e)),this._parser.registerCsiHandler({prefix:"<",final:"u"},e=>this.kittyKeyboardPop(e)),this._parser.setExecuteHandler("",()=>this.bell()),this._parser.setExecuteHandler("\n",()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler("\t",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("„",()=>this.index()),this._parser.setExecuteHandler("…",()=>this.nextLine()),this._parser.setExecuteHandler("ˆ",()=>this.tabSet()),this._parser.registerOscHandler(0,new p.OscHandler(e=>(this.setTitle(e),this.setIconName(e),!0))),this._parser.registerOscHandler(1,new p.OscHandler(e=>this.setIconName(e))),this._parser.registerOscHandler(2,new p.OscHandler(e=>this.setTitle(e))),this._parser.registerOscHandler(4,new p.OscHandler(e=>this.setOrReportIndexedColor(e))),this._parser.registerOscHandler(8,new p.OscHandler(e=>this.setHyperlink(e))),this._parser.registerOscHandler(10,new p.OscHandler(e=>this.setOrReportFgColor(e))),this._parser.registerOscHandler(11,new p.OscHandler(e=>this.setOrReportBgColor(e))),this._parser.registerOscHandler(12,new p.OscHandler(e=>this.setOrReportCursorColor(e))),this._parser.registerOscHandler(104,new p.OscHandler(e=>this.restoreIndexedColor(e))),this._parser.registerOscHandler(110,new p.OscHandler(e=>this.restoreFgColor(e))),this._parser.registerOscHandler(111,new p.OscHandler(e=>this.restoreBgColor(e))),this._parser.registerOscHandler(112,new p.OscHandler(e=>this.restoreCursorColor(e))),this._parser.registerEscHandler({final:"7"},()=>this.saveCursor()),this._parser.registerEscHandler({final:"8"},()=>this.restoreCursor()),this._parser.registerEscHandler({final:"D"},()=>this.index()),this._parser.registerEscHandler({final:"E"},()=>this.nextLine()),this._parser.registerEscHandler({final:"H"},()=>this.tabSet()),this._parser.registerEscHandler({final:"M"},()=>this.reverseIndex()),this._parser.registerEscHandler({final:"="},()=>this.keypadApplicationMode()),this._parser.registerEscHandler({final:">"},()=>this.keypadNumericMode()),this._parser.registerEscHandler({final:"c"},()=>this.fullReset()),this._parser.registerEscHandler({final:"n"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"o"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"|"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"}"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"~"},()=>this.setgLevel(1)),this._parser.registerEscHandler({intermediates:"%",final:"@"},()=>this.selectDefaultCharset()),this._parser.registerEscHandler({intermediates:"%",final:"G"},()=>this.selectDefaultCharset());for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},()=>this.selectCharset("("+e)),this._parser.registerEscHandler({intermediates:")",final:e},()=>this.selectCharset(")"+e)),this._parser.registerEscHandler({intermediates:"*",final:e},()=>this.selectCharset("*"+e)),this._parser.registerEscHandler({intermediates:"+",final:e},()=>this.selectCharset("+"+e)),this._parser.registerEscHandler({intermediates:"-",final:e},()=>this.selectCharset("-"+e)),this._parser.registerEscHandler({intermediates:".",final:e},()=>this.selectCharset("."+e)),this._parser.registerEscHandler({intermediates:"/",final:e},()=>this.selectCharset("/"+e));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(e=>(this._logService.error("Parsing error: ",e),e)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new v.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){if(this._logService.logLevel<=u.LogLevelEnum.WARN){let t;const i=new Promise((e,i)=>{t=setTimeout(()=>i("#SLOW_TIMEOUT"),5e3)});Promise.race([e,i]).then(()=>{void 0!==t&&clearTimeout(t)},e=>{if(void 0!==t&&clearTimeout(t),"#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,o=0;const n=this._parseStack.paused;if(n){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>131072&&(o=this._parseStack.position+131072)}if(this._logService.logLevel<=u.LogLevelEnum.DEBUG&&this._logService.debug("parsing data "+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,e=>String.fromCharCode(e)).join("")}"`)),this._logService.logLevel===u.LogLevelEnum.TRACE&&this._logService.trace("parsing data (codes)","string"==typeof e?e.split("").map(e=>e.charCodeAt(0)):e),this._parseBuffer.length131072)for(let t=o;t0&&2===p.getWidth(this._activeBuffer.x-1)&&p.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(d){const e=p;let t=this._activeBuffer.x-m;if(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),p=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!p)return;for(m>0&&p instanceof l.BufferLine&&p.copyCellsFrom(e,t,0,m,!1);t=0;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(_&&(p.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===p.getWidth(a-1)&&p.setCellFromCodepoint(a-1,c.NULL_CELL_CODE,c.NULL_CELL_WIDTH,u)),p.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===p.getWidth(this._activeBuffer.x)&&!p.hasContent(this._activeBuffer.x)&&p.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=>!y(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new v.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new g.ApcHandler(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 o=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);o&&(o.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(o.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){const e=this._activeBuffer.lines.get(i+1);e&&(e.isWrapped=!1)}for(;i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(i=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,i-1);i--;){const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+i);if(e?.getTrimmedLength())break}for(;i>=0;i--)this._bufferService.scroll(this._eraseAttrData())}else{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("[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`P>|xterm.js(${b.XTERM_VERSION})\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(o.triggerDataEvent(`[${t?"":"?"}${e};${i}$y`),!0),_=e=>e?1:2,u=e.params[0];return t?d(u,2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(c.convertEol):0):1===u?d(u,_(i.applicationCursorKeys)):3===u?d(u,c.windowOptions.setWinLines?80===a?2:132===a?1:0:0):6===u?d(u,_(i.origin)):7===u?d(u,_(i.wraparound)):8===u?d(u,3):9===u?d(u,_("X10"===s)):12===u?d(u,_(c.cursorBlink)):25===u?d(u,_(!o.isCursorHidden)):45===u?d(u,_(i.reverseWraparound)):66===u?d(u,_(i.applicationKeypad)):67===u?d(u,4):1e3===u?d(u,_("VT200"===s)):1002===u?d(u,_("DRAG"===s)):1003===u?d(u,_("ANY"===s)):1004===u?d(u,_(i.sendFocus)):1005===u?d(u,4):1006===u?d(u,_("SGR"===r)):1015===u?d(u,4):1016===u?d(u,_("SGR_PIXELS"===r)):1048===u?d(u,1):47===u||1047===u||1049===u?d(u,_(h===l)):2004===u?d(u,_(i.bracketedPasteMode)):2026===u?d(u,_(i.synchronizedOutput)):9001===u&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?d(u,_(i.win32InputMode)):d(u,0)}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=_.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-67108864,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,o=0;do{if(s[o+r]=e.params[t+o],e.hasSubParams(t+o)){const i=e.getSubParams(t+o);let n=0;do{5===s[1]&&(r=1),s[o+n+1+r]=i[n]}while(++n=2||2===s[1]&&o+r>=5)break;s[1]&&(r=1)}while(++o+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&=-67108864,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-67108864,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-67108864,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-67108864,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:221===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.fg&=-134217729:222===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.bg&=-134217729:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("");break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[${e};${t}R`)}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[?${e};${t}R`);break;case 15:case 25:case 26:case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??1)&&this._onRequestColorSchemeQuery.fire()}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=0===e.length?1:e.params[0];if(0===t)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar"}const e=t%2==1;this._coreService.decPrivateModes.cursorBlink=e}return!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(!y(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(C.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(C.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`[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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let e=0;e1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e,10);if(L(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.indexOf(";");if(-1===t)return!0;const i=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(i,s):!i.trim()&&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,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=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 d.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(`${e}\\`),!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)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(i){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;return s.length>=16&&s.shift(),s.push(i.flags),i.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=Math.max(1,e.params[0]||1),i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;for(let e=0;e0;e++)i.flags=s.pop();return 0===s.length&&t>0&&(i.flags=0),!0}}t.InputHandler=D;let E=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&&(k=e,e=t,t=k),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}E=s([r(0,u.IBufferService)],E)},4812(e,t){function i(e){return{dispose:e}}function s(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=s,t.combinedDisposable=function(...e){return i(()=>s(e))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=r;class o{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=o,o.None=Object.freeze({dispose(){}}),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}}},7710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},701(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isMac=t.isSafari=t.isLegacyEdge=t.isChrome=t.isFirefox=t.isNode=void 0,t.getZoomFactor=function(e){return 1},t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1],10)},t.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isChrome=i.includes("Chrome"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},3087(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;const s=i(6168);let r=0;t.SortedList=class{constructor(e,t){this._getKey=e,this._array=[],this._insertedValues=[],this._isFlushingInserted=!1,this._deletedIndices=[],this._isFlushingDeleted=!1,this._flushInsertedTask=new s.IdleTaskQueue(t),this._flushDeletedTask=new s.IdleTaskQueue(t)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(e){this._flushCleanupDeleted(),0===this._insertedValues.length&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(e)}_flushInserted(){const e=this._insertedValues.sort((e,t)=>this._getKey(e)-this._getKey(t));let t=0,i=0;const s=new Array(this._array.length+this._insertedValues.length);for(let r=0;r=this._array.length||this._getKey(e[t])<=this._getKey(this._array[i])?(s[r]=e[t],t++):s[r]=this._array[i++];this._array=s,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(e){if(this._flushCleanupInserted(),0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(r=this._search(t),-1===r)return!1;if(this._getKey(this._array[r])!==t)return!1;do{if(this._array[r]===e)return 0===this._deletedIndices.length&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(r),!0}while(++re-t);let t=0;const i=new Array(this._array.length-e.length);let s=0;for(let r=0;r0&&this._flushDeletedTask.flush()}*getKeyIterator(e){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),0!==this._array.length&&(r=this._search(e),!(r<0||r>=this._array.length)&&this._getKey(this._array[r])===e))do{yield this._array[r]}while(++r=this._array.length)&&this._getKey(this._array[r])===e))do{t(this._array[r])}while(++r=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}}},4220(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LimitedStringBuilder=t.StringBuilder=void 0;class i{constructor(){this._chunks=[],this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(e){this._chunks.push(e),this._length+=e.length}toString(){return this._chunks.join("")}}t.StringBuilder=i,t.LimitedStringBuilder=class{constructor(e){this._limit=e,this._builder=new i}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(e){return this._builder.append(e),this._builder.length>this._limit&&(this._builder.reset(),!0)}toString(){return this._builder.toString()}}},6168(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;class i{constructor(e){this._tasks=[],this._i=0,this._logService=e}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ii)return r-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-t))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}}t.PriorityTaskQueue=s,t.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:s,t.DebouncedIdleTask=class{constructor(e){this._queue=new t.IdleTaskQueue(e)}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},7804(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.XTERM_VERSION=void 0,t.XTERM_VERSION="6.1.0-beta.287"},5882(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),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)};const s=i(8938)},5451(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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(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},1073(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(5639),r=i(4812),o=i(6168),n=i(5451),a=i(6107),h=i(3326),l=i(732),c=i(3055),d=i(8938),_=i(8158),u=i(6760);t.MAX_BUFFER_SIZE=4294967295;class f extends r.Disposable{constructor(e,t,i,n){super(),this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this._logService=n,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=a.DEFAULT_ATTR_DATA.clone(),this.savedCharset=u.DEFAULT_CHARSET,this.savedCharsets=[],this.savedGlevel=0,this.savedOriginMode=!1,this.savedWraparoundMode=!0,this.markers=[],this._nullCell=c.CellData.fromCharData([0,d.NULL_CELL_CHAR,d.NULL_CELL_WIDTH,d.NULL_CELL_CODE]),this._whitespaceCell=c.CellData.fromCharData([0,d.WHITESPACE_CELL_CHAR,d.WHITESPACE_CELL_WIDTH,d.WHITESPACE_CELL_CODE]),this._isClearing=!1,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(),this._memoryCleanupQueue=new o.IdleTaskQueue(this._logService),this._register((0,r.toDisposable)(()=>this._memoryCleanupQueue.clear())),this._register((0,r.toDisposable)(()=>this.clearAllMarkers())),this._stringCache=this._register(new h.BufferLineStringCache)}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 a.BufferLine(this._stringCache,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){e??=a.DEFAULT_ATTR_DATA;let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this._stringCache.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(a.DEFAULT_ATTR_DATA);this._stringCache.clear();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+o+1?(this.ybase--,o++,this.ydisp>0&&this.ydisp--):this.lines.push(new a.BufferLine(this._stringCache,e,i,!1)));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),o&&(this.y+=o),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;t0){const e=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,e)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._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}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=this._optionsService.rawOptions.reflowCursorLine,s=(0,l.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(a.DEFAULT_ATTR_DATA),i);if(s.length>0){const i=(0,l.reflowLargerCreateNewLayout)(this.lines,s);(0,l.reflowLargerApplyNewLayout)(this.lines,i.layout),this._reflowLargerAdjustViewport(e,t,i.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(a.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);if(!i){const e=this.ybase+this.y;if(e>=n&&e0&&(r.push({start:n+c.length+o,newLines:p}),o+=p.length),c.push(...p);let v=_.length-1,g=_[v];0===g&&(v--,g=_[v]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[v])break;if(c[v].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(v--,g=_[v]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,l.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;l--)if(a&&a.start>s+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(l--,a.newLines[e]);l++,e.push({index:s+1,amount:a.newLines.length}),h+=a.newLines.length,a=r[++n]}else this.lines.set(l,t[s--]);let l=0;for(let t=e.length-1;t>=0;t--)e[t].index+=l,this.lines.onInsertEmitter.fire(e[t]),l+=e[t].amount;const c=Math.max(0,i+o-this.lines.maxLength);c>0&&this.lines.onTrimEmitter.fire(c)}}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(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)}}t.Buffer=f},6107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(5451),r=i(3055),o=i(8938),n=i(726),a=i(4220);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let h=0;const l=new r.CellData,c=new a.StringBuilder;class d{constructor(e,t,i,s=!1){this._stringCache=e,this.isWrapped=s,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*t);const n=i??r.CellData.fromCharData([0,o.NULL_CELL_CHAR,o.NULL_CELL_WIDTH,o.NULL_CELL_CODE]);for(let e=0;e>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._invalidateStringCache(),this._data[3*e+1]=t[o.CHAR_DATA_ATTR_INDEX],t[o.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[o.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[o.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[o.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,n.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,i){return h=3*e,i.content=this._data[h+0],i.fg=this._data[h+1],i.bg=this._data[h+2],2097152&i.content?i.combinedData=this._combined[e]:i.combinedData="",268435456&i.bg?i.extended=this._extendedAttrs[e]:i.extended=t.DEFAULT_ATTR_DATA.extended.clone(),i}setCell(e,t){this._invalidateStringCache(),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){this._invalidateStringCache(),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){this._invalidateStringCache();let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,n.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,n.stringFromCodePoint)(2097151&s)+(0,n.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(this._invalidateStringCache(),(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,l));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){this._invalidateStringCache();const o=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]=o[3*(t+r)+e];this._copyCellMapsFrom(e,t+r,i+r)}else for(let r=0;r>22||1}s&&s.push(t);const h=c.toString();if(c.reset(),r){const t=this._getStringCacheEntry(!0);t.value=h,t.isTrimmed=!!e}return h}_getStringCacheEntry(e){const t=this._stringCacheEntryRef?.deref();if(t&&t.generation===this._stringCache.generation)return t;if(!e)return;const i=this._stringCache.allocateEntry();return this._stringCacheEntryRef=new WeakRef(i),i}_invalidateStringCache(){const e=this._getStringCacheEntry(!1);e&&(e.value=void 0,e.isTrimmed=!1)}_copyCellMapsFrom(e,t,i){const s=3*t;2097152&e._data[s+0]&&(this._combined[i]=e._combined[t]),268435456&e._data[s+2]&&(this._extendedAttrs[i]=e._extendedAttrs[t])}_copySparseMapsFrom(e){this._combined={},this._extendedAttrs={};for(let t=0;tthis.entries.clear()))}touch(){this._scheduleClear()}allocateEntry(){const e={value:void 0,isTrimmed:!1,generation:this.generation};return this.entries.add(e),this._scheduleClear(),e}clear(){this._clearTimeout.clear(),this._lastAccessTimestamp=0,this.generation++;for(const e of this.entries)e.value=void 0,e.isTrimmed=!1;this.entries.clear()}_scheduleClear(){this._lastAccessTimestamp=Date.now(),this._clearTimeout.value||this._scheduleClearTimeout(15e3)}_scheduleClearTimeout(e){this._clearTimeout.value=(0,s.disposableTimeout)(()=>{const e=Date.now()-this._lastAccessTimestamp;e>=15e3?this.clear():this._scheduleClearTimeout(15e3-e)},e)}}t.BufferLineStringCache=o},9384(e,t){Object.defineProperty(t,"__esModule",{value:!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)}},732(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.reflowLargerGetLinesToRemove=function(e,t,s,r,o,n){const a=[];for(let h=0;h=h&&r0&&(e>_||0===d[e].getTrimmedLength());e--)v++;v>0&&(a.push(h+d.length-v),a.push(v)),h+=d.length-1}return a},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],o=0;for(let n=0;nl&&(n-=l,a++);const c=2===e[a].getWidth(n-1);c&&n--;const d=c?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},4097(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(4812),r=i(1073),o=i(8636);class n extends s.Disposable{constructor(e,t,i){super(),this._optionsService=e,this._bufferService=t,this._logService=i,this._normalBuffer=this._register(new s.MutableDisposable),this._altBuffer=this._register(new s.MutableDisposable),this._onBufferActivate=this._register(new o.Emitter),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 r.Buffer(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new r.Buffer(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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=n},3055(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(726),r=i(8938),o=i(5451);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=n},8938(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=t.DEFAULT_COLOR<<9|256,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},8158(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(4812),r=i(8636);class o{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=o._nextId++,this._onDispose=this.register(new r.Emitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,s.dispose)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=o,o._nextId=1},6760(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["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},706(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=function(e,t,s,r){const o={type:0,cancel:!1,key:void 0},n=(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?"OA":"":"UIKeyInputLeftArrow"===e.key?o.key=t?"OD":"":"UIKeyInputRightArrow"===e.key?o.key=t?"OC":"":"UIKeyInputDownArrow"===e.key&&(o.key=t?"OB":"");break;case 8:o.key=e.ctrlKey?"\b":"",e.altKey&&(o.key=""+o.key);break;case 9:if(e.shiftKey){o.key="";break}o.key="\t",o.cancel=!0;break;case 13:"c"===e.key&&e.ctrlKey?o.key="":o.key=e.altKey?"\r":"\r",o.cancel=!0;break;case 27:o.key="",e.altKey&&(o.key=""),o.cancel=!0;break;case 37:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"D":t?"OD":"";break;case 39:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"C":t?"OC":"";break;case 38:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"A":t?"OA":"";break;case 40:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"B":t?"OB":"";break;case 45:e.shiftKey||e.ctrlKey||(o.key="[2~");break;case 46:o.key=n?"[3;"+(n+1)+"~":"[3~";break;case 36:o.key=n?"[1;"+(n+1)+"H":t?"OH":"";break;case 35:o.key=n?"[1;"+(n+1)+"F":t?"OF":"";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key="[5;"+(n+1)+"~":o.key="[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key="[6;"+(n+1)+"~":o.key="[6~";break;case 112:o.key=n?"[1;"+(n+1)+"P":"OP";break;case 113:o.key=n?"[1;"+(n+1)+"Q":"OQ";break;case 114:o.key=n?"[1;"+(n+1)+"R":"OR";break;case 115:o.key=n?"[1;"+(n+1)+"S":"OS";break;case 116:o.key=n?"[15;"+(n+1)+"~":"[15~";break;case 117:o.key=n?"[17;"+(n+1)+"~":"[17~";break;case 118:o.key=n?"[18;"+(n+1)+"~":"[18~";break;case 119:o.key=n?"[19;"+(n+1)+"~":"[19~";break;case 120:o.key=n?"[20;"+(n+1)+"~":"[20~";break;case 121:o.key=n?"[21;"+(n+1)+"~":"[21~";break;case 122:o.key=n?"[23;"+(n+1)+"~":"[23~";break;case 123:o.key=n?"[24;"+(n+1)+"~":"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(s&&!r||!e.altKey||e.metaKey)if(!s||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey){if(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length)o.key=e.key;else if(e.key&&e.ctrlKey&&e.shiftKey)switch(e.code){case"Minus":o.key="";break;case"Digit2":o.key="\0";break;case"Digit6":o.key=""}}else 65===e.keyCode&&(o.type=1);else{const t=i[e.keyCode],s=t?.[e.shiftKey?1:0];if(s)o.key=""+s;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=""+i}else if(32===e.keyCode)o.key=""+(e.ctrlKey?"\0":" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=""+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key="\0":e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key="":"/"===e.key?o.key="":219===e.keyCode?o.key="":220===e.keyCode?o.key="":221===e.keyCode&&(o.key="")}return o};const i={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:["'",'"']}},7241(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyKeyboard=void 0,t.KittyKeyboard=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440},this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24},this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"},this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(e){if(e.code.startsWith("Numpad")){const t=e.code.slice(6);if(t>="0"&&t<="9")return 57399+parseInt(t,10);switch(t){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(e){switch(e.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(e){let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4),e.metaKey&&(t|=8),t>0?t+1:0}_getKeyCode(e,t){const i=this._getNumpadKeyCode(e);if(void 0!==i)return i;const s=this._getModifierKeyCode(e);if(void 0!==s)return s;const r=this._functionalKeyCodes[e.key];if(void 0!==r)return r;if((e.shiftKey||t&&e.altKey)&&e.code){if(e.code.startsWith("Digit")&&6===e.code.length){const t=e.code.charAt(5);if(t>="0"&&t<="9")return t.charCodeAt(0)}if(e.code.startsWith("Key")&&4===e.code.length)return e.code.charAt(3).toLowerCase().charCodeAt(0)}if(1===e.key.length){const t=e.key.codePointAt(0);return t>=65&&t<=90?t+32:t}}_isModifierKey(e){return"Shift"===e.key||"Control"===e.key||"Alt"===e.key||"Meta"===e.key}_isLockKey(e){return"CapsLock"===e.key||"NumLock"===e.key||"ScrollLock"===e.key}_buildCsiLetterSequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"["+e}_buildSs3Sequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"O"+e}_buildCsiTildeSequence(e,t,i,s){const r=s&&1!==i;let o="["+e;return(t>0||r)&&(o+=";"+(t>0?t:"1"),r&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(e,t,i,s,r,o,n){const a=!!(2&r);let h,l="["+t;4&r&&e.shiftKey&&1===e.key.length&&!o&&!n&&(h=e.key.codePointAt(0),l+=":"+h);const c=16&r&&3!==s&&1===e.key.length&&!o&&!n&&!e.ctrlKey?e.key.codePointAt(0):void 0,d=a&&1!==s&&(3===s||void 0===c);return(i>0||d||void 0!==c)&&(l+=";",i>0?l+=i:d&&(l+="1"),d&&(l+=":"+s)),void 0!==c&&(l+=";"+c),l+="u",l}evaluate(e,t,i=1,s=!1){const r={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(e),n=this._isModifierKey(e),a=!!(2&t);if(!a&&3===i)return r;if(n&&!(8&t))return r;if(this._isLockKey(e)&&!(8&t))return r;const h=this._csiLetterKeys[e.key];if(h)return r.key=this._buildCsiLetterSequence(h,o,i,a),r.cancel=!0,r;const l=this._ss3FunctionKeys[e.key];if(l)return r.key=this._buildSs3Sequence(l,o,i,a),r.cancel=!0,r;const c=this._csiTildeKeys[e.key];if(void 0!==c)return r.key=this._buildCsiTildeSequence(c,o,i,a),r.cancel=!0,r;const d=this._getKeyCode(e,s);if(void 0===d)return r;const _=13===d||9===d||127===d;if(_&&3===i&&!(8&t))return r;const u=void 0!==this._functionalKeyCodes[e.key]||void 0!==this._getNumpadKeyCode(e);if(8&t||a&&3===i||(1&t||a)&&(u&&!_||o>0&&1!==e.key.length||o-1>1))r.key=this._buildCsiUSequence(e,d,o,i,t,u,n),r.cancel=!0;else{const t=13===d?"\r":9===d?"\t":127===d?"":void 0;t?r.key=t:1!==e.key.length||e.ctrlKey||e.altKey||e.metaKey||(r.key=e.key)}return r}static shouldUseProtocol(e){return e>0}}},726(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 o=r;o=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n);continue}65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=this.interim[++n])&&n<4;)r<<=6,r|=63&o;const a=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=a-n;for(;l=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===a?r<128?l--:t[h++]=r:3===a?r<2048||r>=55296&&r<=57343||65279===r||(t[h++]=r):r<65536||r>1114111||(t[h++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(a=(31&s)<<6|63&r,a<128){d--;continue}t[h++]=a}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(a=(15&s)<<12|(63&r)<<6|63&o,a<2048||a>=55296&&a<=57343||65279===a)continue;t[h++]=a}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,h;if(n=e[d++],128!=(192&n)){d--;continue}if(a=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,a<65536||a>1114111)continue;t[h++]=a}}return h}}},7428(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(6415),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]],o=[[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 n;t.UnicodeV6=class{constructor(){if(this.version="6",!n){n=new Uint8Array(65536),n.fill(1),n[0]=0,n.fill(0,1,32),n.fill(0,127,160),n.fill(2,4352,4448),n[9001]=2,n[9002]=2,n.fill(2,11904,42192),n[12351]=1,n.fill(2,44032,55204),n.fill(2,63744,64256),n.fill(2,65040,65050),n.fill(2,65072,65136),n.fill(2,65280,65377),n.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)}}},9249(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Win32InputMode=void 0,t.Win32InputMode=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226},this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40},this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]),this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(e){const t=this._codeToVk[e.code];return void 0!==t?t:e.keyCode||0}_getScanCode(e){return this._codeToScancode[e.code]||0}_getUnicodeChar(e){if(e.ctrlKey&&!e.altKey&&!e.metaKey){if("Enter"===e.key)return 10;if("Backspace"===e.key)return 127}const t=this._keyToControlChar[e.key];if(void 0!==t)return t;if(1===e.key.length){const t=e.key.codePointAt(0)||0;if(e.ctrlKey&&!e.altKey&&!e.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(e){let t=0;return e.shiftKey&&(t|=16),e.ctrlKey&&("ControlRight"===e.code?t|=4:t|=8),e.altKey&&("AltRight"===e.code?t|=1:t|=2),this._enhancedKeyCodes.has(e.code)&&(t|=256),t}evaluateKeyboardEvent(e,t){return{type:0,cancel:!0,key:`[${this._getVirtualKeyCode(e)};${this._getScanCode(e)};${this._getUnicodeChar(e)};${t?1:0};${this._getControlKeyState(e)};1_`}}}},3562(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(3132),r=i(4812),o=i(8636);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._innerWriteTimer=this._register(new s.TimeoutTimer),this._onWriteParsed=this._register(new o.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._register((0,r.toDisposable)(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed)return;if(this._isSyncWriting)return;let e;this._isSyncWriting=!0;let t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);const i=this._callbacks.shift();i&&i()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;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._store.isDisposed){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();this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;const i=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>{this._store.isDisposed||(performance.now()-i>=12?this._scheduleInnerWrite(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,performance.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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},8693(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(t.startsWith("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(t.startsWith("#")&&(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,o]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(o,t)}`};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}}},2607(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ApcHandler=t.ApcParser=void 0;const s=i(726),r=i(4220),o=[];t.ApcParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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].end(!1);this._stack.paused=!1,this._active=o,this._ident=0}start(e){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].start();else this._handlerFb(this._ident,"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._ident,"PUT",(0,s.utf32ToString)(e,t,i))}end(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].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._ident,"END",e);this._active=o,this._ident=0}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.ApcHandler=n,n._payloadLimit=1e7},9823(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(726),r=i(7262),o=i(4220),n=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=n,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}registerHandler(e,t){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=n,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||n,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=n,this._ident=0}};const a=new r.Params;a.addParam(0);class h{constructor(e){this._handler=e,this._data=new o.LimitedStringBuilder(h._payloadLimit),this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString(),this._params),t instanceof Promise))return t.then(e=>(this._params=a,this._data.reset(),this._hitLimit=!1,e));return this._params=a,this._data.reset(),this._hitLimit=!1,t}}t.DcsHandler=h,h._payloadLimit=1e7},6717(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(4812),r=i(7262),o=i(1346),n=i(9823),a=i(2607);class h{constructor(e){this.table=new Uint16Array(e)}setDefault(e,t){this.table.fill(e<<8|t)}add(e,t,i,s){this.table[t<<8|e]=i<<8|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 o=i(0,17);e.setDefault(1,0),e.addMany(s,0,2,0);for(const t of o)e.addMany([24,26,153,154],t,3,0),e.addMany(i(128,144),t,3,0),e.addMany(i(144,152),t,3,0),e.add(156,t,0,0),e.add(27,t,11,1),e.add(157,t,4,8),e.addMany([152,158],t,0,7),e.add(159,t,11,14),e.add(155,t,11,3),e.add(144,t,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],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(95,1,11,14),e.addMany(r,14,0,14),e.add(127,14,0,14),e.addMany(i(32,48),14,9,15),e.addMany(i(48,127),14,15,16),e.addMany(i(48,127),15,15,16),e.addMany(r,15,0,15),e.addMany(i(32,48),15,9,15),e.add(127,15,0,15),e.addMany(s,16,16,16),e.addMany(r,16,0,16),e.addMany(i(8,14),16,16,16),e.add(127,16,0,16),e.addMany([27,156,24,26],16,17,0),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(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(r,10,0,10),e.add(127,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(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(l,0,2,0),e.add(l,8,5,8),e.add(l,6,0,6),e.add(l,11,0,11),e.add(l,13,13,13),e.add(l,16,16,16),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._executeHandlersArr=new Array(24).fill(void 0),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._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new o.OscParser),this._dcsParser=this._register(new n.DcsParser),this._apcParser=this._register(new a.ApcParser),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>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]);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){const i=e.charCodeAt(0);this._executeHandlers[i]=t,i<24&&(this._executeHandlersArr[i]=t)}clearExecuteHandler(e){const t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),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,o,n=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,n=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 r=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](this._params),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 4:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],o=this._dcsParser.unhook(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],o=this._oscParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],o=this._apcParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0}this._parseStack.state=0,n=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=255&this._parseStack.transition}for(let i=n;i=60&&n<=63&&(this._collect=n,s++);let a=!1;for(;s=48&&n<=57)this._params.addDigit(n-48);else if(59===n)this._params.addParam(0);else{if(58!==n){if(n>=64&&n<=126){const e=this._csiHandlers[this._collect<<8|n];let t=e?e.length-1:-1;for(;t>=0&&(o=e[t](this._params),!0!==o);t--)if(o instanceof Promise)return r=1792,this._preserveStack(3,e,t,r,s),o;t<0&&this._csiHandlerFb(this._collect<<8|n,this._params),this.precedingJoinState=0,i=s,this.currentState=0,a=!0;break}break}this._params.addSubParam(-1)}a||(i=s-1,this.currentState=4);continue}switch(r=this._transitions.table[this.currentState<<8|(s>8){case 2:let n=i;const a=t-4;for(;n=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l););if(n>=a)for(;n=32&&(e[n]<=126||e[n]>=l);)n++;this._printHandler(e,i,n),i=n-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const h=this._csiHandlers[this._collect<<8|s];let c=h?h.length-1:-1;for(;c>=0&&(o=h[c](this._params),!0!==o);c--)if(o instanceof Promise)return this._preserveStack(3,h,c,r,i),o;c<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do{switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}}while(++i47&&s<60);i--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:const d=this._escHandlers[this._collect<<8|s];let _=d?d.length-1:-1;for(;_>=0&&(o=d[_](),!0!==o);_--)if(o instanceof Promise)return this._preserveStack(4,d,_,r,i),o;_<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let r=i+1;;++r)if(r>=t||24===(s=e[r])||26===s||27===s||s>127&&s=t||(s=e[r])<32||s>127&&s=32&&e[s]<127||e[s]>=8&&e[s]<14||e[s]>=l))){this._apcParser.put(e,i,s),i=s-1;break}break;case 17:if(o=this._apcParser.end(24!==s&&26!==s),o)return this._preserveStack(7,[],0,r,i),o;27===s&&(r|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0}this.currentState=255&r}}}t.EscapeSequenceParser=c},1346(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(726),r=i(4220),o=[];t.OscParser=class{constructor(){this._state=0,this._active=o,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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=o,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||o,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,s.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=o,this._id=-1,this._state=0}}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.OscHandler=n,n._payloadLimit=1e7},7262(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;class i{static fromArray(e){const t=new i;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 i(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}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>2147483647?2147483647: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 less than -1 are not allowed");this._subParams[this._subParamsLength++]=e>2147483647?2147483647: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 i=this._digitIsSub?this._subParams:this.params,s=i[t-1];i[t-1]=~s?Math.min(10*s+e,2147483647):e}}t.Params=i},3027(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i=this._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)}}},5101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(3235),r=i(4812),o=i(8636);class n extends r.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this._register(new o.Emitter),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._register(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=n},6097(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)}registerApcHandler(e,t){return this._core.registerApcHandler(e,t)}}},4335(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}}},9640(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=void 0;const o=i(4812),n=i(4097),a=i(6501),h=i(8636);let l=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e,t){super(),this.isUserScrolling=!1,this._onResize=this._register(new h.Emitter),this.onResize=this._onResize.event,this._onScroll=this._register(new h.Emitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new n.BufferSet(e,this,t)),this._register(this.buffers.onBufferActivate(e=>{this._onScroll.fire(e.activeBuffer.ydisp)}))}resize(e,t){const i=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:i,rowsChanged:s})}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,o=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;o===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(o+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=o-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(o,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t){const i=this.buffer;if(e<0){if(0===i.ydisp)return;this.isUserScrolling=!0}else e+i.ydisp>=i.ybase&&(this.isUserScrolling=!1);const s=i.ydisp;i.ydisp=Math.max(Math.min(i.ydisp+e,i.ybase),0),s!==i.ydisp&&(t||this._onScroll.fire(i.ydisp))}};t.BufferService=l,t.BufferService=l=s([r(0,a.IOptionsService),r(1,a.ILogService)],l)},5746(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}get charsets(){return 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)}}},4071(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const o=i(4812),n=i(6501),a=i(8636),h=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0});let c=class extends o.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorHidden=!1,this._onData=this._register(new a.Emitter),this.onData=this._onData.event,this._onUserInput=this._register(new a.Emitter),this.onUserInput=this._onUserInput.event,this._onBinary=this._register(new a.Emitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this._register(new a.Emitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.isCursorInitialized=i.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}reset(){this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}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}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onBinary.fire(e))}};t.CoreService=c,t.CoreService=c=s([r(0,n.IBufferService),r(1,n.ILogService),r(2,n.IOptionsService)],c)},4720(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationLineCache=t.DecorationService=void 0;const o=i(3132),n=i(4103),a=i(4812),h=i(6501),l=i(3087),c=i(8636);let d=0,_=0,u=class extends a.Disposable{get decorations(){return this._decorations.values()}constructor(e,t){super(),this._logService=e,this._bufferService=t,this._lineCache=this._register(new f),this._onDecorationRegistered=this._register(new c.Emitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this._register(new c.Emitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this._decorations=new l.SortedList(e=>e?.marker.line,this._logService),this._register((0,a.toDisposable)(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}registerDecoration(e){if(e.marker.isDisposed)return;const t=new p(e);if(t){const e=t.marker.onDispose(()=>t.dispose()),i=t.onDispose(()=>{i.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),e.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,i){const s=this._lineCache.getDecorationsOnLine(t);if(s)for(const t of s)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&(yield t)}forEachDecorationAtCell(e,t,i,s){const r=this._lineCache.getDecorationsOnLine(t);if(r)for(const t of r)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&s(t)}};t.DecorationService=u,t.DecorationService=u=s([r(0,h.ILogService),r(1,h.IBufferService)],u);class f extends a.Disposable{constructor(){super(...arguments),this._decorationsByLine=new Map,this._decorations=new Set,this._bufferLineListeners=this._register(new a.MutableDisposable),this._lineIndexSyncTimer=this._register(new o.MicrotaskTimer),this._lineIndexSyncCallbacks=[]}clear(){this._lineIndexSyncCallbacks.length=0,this._lineIndexSyncTimer.cancel(),this._decorationsByLine.clear(),this._decorations.clear()}add(e){this._decorations.add(e),this._addToLineBuckets(e)}remove(e){this._decorations.delete(e),this._removeFromLineBuckets(e)}getDecorationsOnLine(e){return this._decorationsByLine.get(e)}attachToBufferLines(e){const t=new a.DisposableStore;this._bufferLineListeners.value=t,t.add(e.onTrim(e=>this._handleBufferLinesTrim(e))),t.add(e.onInsert(e=>this._handleBufferLinesInsert(e))),t.add(e.onDelete(e=>this._handleBufferLinesDelete(e)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){const t=e.marker.line;if(t<0)return;e._indexedStartLine=t;const i=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{const e=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(const t of e)t()})}_handleBufferLinesTrim(e){if(e<=0)return;const t=new Map;for(const[i,s]of this._decorationsByLine){const r=i-e;r<0||this._mergeLineBucket(t,r,s)}this._decorationsByLine.clear();for(const[e,i]of t)this._decorationsByLine.set(e,i);for(const t of this._decorations)t.marker.isDisposed||(t._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,i){const s=e.get(t);if(s)for(let e=0,t=i.length;et&&(s.push(e),this._removeFromLineBuckets(e))}const r=new Map;for(const[e,s]of this._decorationsByLine){const o=e>=t?e+i:e;this._mergeLineBucket(r,o,s)}this._decorationsByLine.clear();for(const[e,t]of r)this._decorationsByLine.set(e,t);for(const e of this._decorations)e.marker.isDisposed||e._indexedStartLine>=t&&(e._indexedStartLine=e.marker.line);for(const e of s)this._addToLineBuckets(e)}_applyBufferLinesDelete(e){const t=e.index+e.amount,i=new Map;for(const[s,r]of this._decorationsByLine){if(s>=e.index&&s=t?s-e.amount:s;this._mergeLineBucket(i,o,r)}this._decorationsByLine.clear();for(const[e,t]of i)this._decorationsByLine.set(e,t);const s=[];for(const i of this._decorations){if(i.marker.isDisposed)continue;const r=i._indexedStartLine,o=this._getDecorationHeight(i);r>=t?i._indexedStartLine=i.marker.line:rt&&s.push(i)}for(const e of s)this._reindexDecoration(e)}}t.DecorationLineCache=f;class p extends a.DisposableStore{get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=n.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=n.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.add(new c.Emitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.add(new c.Emitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},6025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(6501),r=i(6201);class o{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=o,t.InstantiationService=class{constructor(){this._services=new o,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._id}.`);s.push(i)}const o=i.length>0?i[0].index:t.length;if(t.length!==o)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${o+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7276(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.LogService=void 0;const o=i(4812),n=i(6501),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t!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 n(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 a=String.fromCharCode,h={DEFAULT:e=>{const t=[n(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${a(t[0])}${a(t[1])}${a(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.x};${e.y}${t}`}};class l extends s.Disposable{constructor(){super(),this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._onProtocolChange=this._register(new r.Emitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(o))this.addProtocol(e,o[e]);for(const e of Object.keys(h))this.addEncoding(e,h[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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return!this._customWheelEventHandler||!1!==this._customWheelEventHandler(e)}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return"DEFAULT"===this._activeEncoding}get isPixelEncoding(){return"SGR_PIXELS"===this._activeEncoding}}t.MouseStateService=l},56(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(4812),r=i(701),o=i(8636);t.DEFAULT_OPTIONS={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:r.isMac,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}};const n=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends s.Disposable{constructor(e){super(),this._onOptionChange=this._register(new o.Emitter),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,s.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=n.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"blinkIntervalDuration":if((i=Math.floor(i))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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},8811(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const o=i(6501);let n=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 o=t.addMarker(t.ybase+t.y),n={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(n,o)),this._entriesWithId.set(n.key,n),this._dataByLinkId.set(n.id,n),n.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=n,t.OscLinkService=n=s([r(0,o.IBufferService)],n)},6201(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.serviceRegistry=void 0,t.getServiceDependencies=function(e){return e.di$dependencies||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const i=function(e,t,s){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,i){t.di$target===t?t.di$dependencies.push({id:e,index:i}):(t.di$dependencies=[{id:e,index:i}],t.di$target=t)}(i,e,s)};return i._id=e,t.serviceRegistry.set(e,i),i},t.serviceRegistry=new Map},6501(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.IMouseStateService=t.IBufferService=void 0;const s=i(6201);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.IMouseStateService=(0,s.createDecorator)("MouseStateService"),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")},6415(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8636);class r{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.Emitter,this.onChange=this._onChange.event}static extractShouldJoin(e){return!!(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)}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,this._active||(this.activeVersion=e.version)}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let o=0;o=s)return t+this.wcwidth(n);const i=e.charCodeAt(o);56320<=i&&i<=57343?n=1024*(n-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(n,i);let h=r.extractWidth(a);r.extractShouldJoin(a)&&(h-=r.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=r}},t={};return function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}(6081)})()); -+!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={2840(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=r.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new c.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,f.addDisposableListener)(r,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register((0,d.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=l.tooMuchOutput.get())))}_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=[],o=e?.translateToString(!0,void 0,void 0,t)||"",n=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===o.length?(a.textContent=" ",this._rowColumns.set(a,[0,1])):(a.textContent=o,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",n),a.setAttribute("aria-setsize",s),this._alignRowWidth(a))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent===l.tooMuchOutput.get()&&this._clearLiveRegion(),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,o;if(0===t?(r=i,o=this._rowElements.pop(),this._rowContainer.removeChild(o)):(r=this._rowElements.shift(),o=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),o.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=this._coreBrowserService.mainDocument.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 o=t=this._terminal.cols&&(++s,o=0),{row:s,column:o}},o=r(t),n=r(i);if(o&&n){if(o.row>n.row||o.row===n.row&&o.column>=n.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(n.row-o.row)*this._terminal.cols-o.column+n.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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;ethis._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(e=>this.refresh(e?.start??0,e?.end??this.rows-1))),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(I.EventUtils.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(I.EventUtils.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(I.EventUtils.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(I.EventUtils.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(e=>this._afterResize(e.cols,e.rows))),this._register((0,N.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=E.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`]${i};${(0,R.toRgbString)(s)}\\`);break;case 1:if("ansi"===e)this._themeService.modifyColors(e=>e.ansi[t.index]=E.channels.toColor(...t.color));else{const i=e;this._themeService.modifyColors(e=>e[i]=E.channels.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index)}}}_reportColorScheme(){if(!this._themeService)return;const e=E.rgb.relativeLuminance(this._themeService.colors.background.rgba>>8)>8)?1:2;this.coreService.triggerDataEvent(`[?997;${e}n`)}_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(A.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.blur()}_handleTextAreaBlur(){this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.blur(),this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),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),o=this._renderService.dimensions.css.cell.width*r,n=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=n+"px",this.textarea.style.width=o+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this._register((0,H.addDisposableListener)(this.element,"copy",e=>{this.hasSelection()&&(0,a.copyHandler)(e,this._selectionService)}));const e=e=>(0,a.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this._register((0,H.addDisposableListener)(this.textarea,"paste",e)),this._register((0,H.addDisposableListener)(this.element,"paste",e)),L.isFirefox?this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>{2===e.button&&(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register((0,H.addDisposableListener)(this.element,"contextmenu",e=>{(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),L.isLinux&&this._register((0,H.addDisposableListener)(this.element,"auxclick",e=>{1===e.button&&(0,a.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)}))}_bindKeys(){this._register((0,H.addDisposableListener)(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register((0,H.addDisposableListener)(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register((0,H.addDisposableListener)(this.textarea,"compositionend",e=>{this._compositionHelper instanceof u.CompositionHelper?this._compositionHelper.compositionend(e)&&this.textarea.dispatchEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0})):this._compositionHelper.compositionend()})),this._register((0,H.addDisposableListener)(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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",e=>this.element.classList.toggle("allow-transparency",e))),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.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register((0,H.addDisposableListener)(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);const i=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",h.promptLabel.get()),L.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._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>i.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(g.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??("undefined"!=typeof window?window.document:null))),this._instantiationService.setService(C.ICoreBrowserService,this._coreBrowserService),this._register((0,H.addDisposableListener)(this.textarea,"focus",e=>this._handleTextAreaFocus(e))),this._register((0,H.addDisposableListener)(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(p.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(C.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(k.ThemeService),this._instantiationService.setService(C.IThemeService,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(v.CharacterJoinerService),this._instantiationService.setService(C.ICharacterJoinerService,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(w.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(C.IRenderService,this._renderService),this._register(this._renderService.onRenderedViewportChange(e=>this._onRender.fire(e))),this._register(this._renderService.onDimensionsChange(e=>this._onDimensionsChange.fire({css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}))),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(u.CompositionHelper,this.textarea,this._compositionView),this._register((0,N.toDisposable)(()=>{this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.dispose()})),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(S.MouseCoordsService),this._instantiationService.setService(C.IMouseCoordsService,this._mouseCoordsService);const s=this._linkifier.value=this._register(this._instantiationService.createInstance(O.Linkifier,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(e){this._logService.error("onWillOpen handler threw an exception",e)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(c.Viewport,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(e=>{super.scrollLines(e,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(y.SelectionService,this.element,this.screenElement,s)),this._instantiationService.setService(C.ISelectionService,this._selectionService),this._mouseService=this._instantiationService.createInstance(b.MouseService),this._instantiationService.setService(C.IMouseService,this._mouseService),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(I.EventUtils.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(d.BufferDecorationRenderer,this.screenElement)),this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>this._selectionService.handleMouseDown(e))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(A.AccessibilityManager,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",e=>this._handleScreenReaderModeOptionChange(e)));const r=this.options.scrollbar?.showScrollbar??!0,o=this.options.scrollbar?.width;r&&o&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",e=>{const t=(e?.showScrollbar??!0)&&!!e?.width;!this._overviewRulerRenderer&&t&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:e=>this._viewport?.handleTouchScroll(e)},e=>this._register(e),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(f.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,i=!1){this._renderService?.refreshRows(e,t,i)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}paste(e){(0,a.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(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(!0),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),e.preventDefault(),e.stopPropagation(),!1}if(1===i.type&&this.selectAll(),this._isThirdLevelShift(this.browser,e))return!0;if(i.cancel&&(e.preventDefault(),e.stopPropagation()),!i.key)return!0;if(!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;""!==i.key&&"\r"!==i.key||(this.textarea.value="");const s=this._keyboardService.useWin32InputMode&&W(e);if(this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;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){if(this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return;W(e)||this.focus();const t=this._keyboardService.evaluateKeyUp(e);if(t?.key){const i=this._keyboardService.useWin32InputMode&&W(e);this.coreService.triggerDataEvent(t.key,!i)}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(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._compositionHelper.keypress?.(t)||this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&!this.optionsService.rawOptions.screenReaderMode&&this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.input(e.data))return!0;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),!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()}clear(){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;efunction(e){const t=l(e);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(a.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}(e))),r};const s=i(3132);function r(e){const t=e;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;const i=e;return i?.view?i.view:window}class o{constructor(e,t,i,s){this._node=e,this._type=t,this._handler=i,this._options=s,e.addEventListener(t,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function n(e,t,i,s){return new o(e,t,i,s)}t.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class a{constructor(e,t){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}const h=new Map;function l(e){let t=h.get(e);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(e,t)),t}class c extends s.IntervalTimer{constructor(e){super(),this._defaultTarget=e?r(e):void 0}cancelAndSet(e,t,i){super.cancelAndSet(e,t,i??this._defaultTarget??window)}}t.WindowIntervalTimer=c},8906(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const o=i(4812),n=i(6501),a=i(7098),h=i(8636),l=i(4159);let c=class extends o.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseCoordsService=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 h.Emitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this._register(new h.Emitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this._register((0,o.toDisposable)(()=>{(0,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register((0,l.addDisposableListener)(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register((0,l.addDisposableListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element);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=o;e<=n;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);var i,s;t&&this._mouseDownLink&&(i=this._mouseDownLink.link,s=this._currentLink.link,i.text===s.text&&i.range.start.x===s.range.start.x&&i.range.start.y===s.range.start.y&&i.range.end.x===s.range.end.x&&i.range.end.y===s.range.end.y)&&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,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);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);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){const i=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(i)return{x:i[0],y:i[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=c,t.Linkifier=c=s([r(1,a.IMouseCoordsService),r(2,a.IRenderService),r(3,n.IBufferService),r(4,a.ILinkProviderService)],c)},7721(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0;let i="Terminal input";const s={get:()=>i,set:e=>i=e};t.promptLabel=s;let r="Too much output to announce, navigate to rows manually to read";const o={get:()=>r,set:e=>r=e};t.tooMuchOutput=o},3285(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const o=i(3055),n=i(6501);let a=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i,this._workCell=new o.CellData}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=this._workCell,n=i.getTrimmedLength();let a=-1,l=-1,c=!1;for(let t=0;tr?r.activate(e,t,d):h(0,t),hover:(e,t)=>r?.hover?.(e,t,d),leave:(e,t)=>r?.leave?.(e,t,d)})}c=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,a=o.extended.urlId):(l=-1,a=-1)}}t(s)}_getRangeWithLineWrap(e,t,i,s){let r=e,o=t,n=e,a=i;for(;0===o;){const e=this._bufferService.buffer.lines.get(r-1);if(!e?.isWrapped)break;const t=this._bufferService.buffer.lines.get(r-2);if(!t)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,i-1,s))break;let n=i-1;for(;n>0&&this._hasUrlId(t,n-1,s);)n--;r--,o=n}for(;;){const e=this._bufferService.buffer.lines.get(n-1);if(!e)break;if(a!==e.getTrimmedLength())break;const t=this._bufferService.buffer.lines.get(n);if(!t?.isWrapped)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,0,s))break;let r=1;for(;rthis._innerRefresh()),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=e??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,void 0===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=[]}}},4292(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(e,t,i){this._rowCount=i,e=e??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=performance.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)void 0!==this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),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=performance.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)}}},9302(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_ANSI_COLORS=void 0;const s=i(4103);t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const r=t[i/36%6|0],o=t[i/6%6|0],n=t[i%6];e.push({css:s.channels.toCss(r,o,n),rgba:s.channels.toRgba(r,o,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:s.channels.toCss(i,i,i),rgba:s.channels.toRgba(i,i,i)})}return e})())},4017(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const o=i(7098),n=i(4812),a=i(6501),h=i(4159),l=i(8566),c=i(8636),d=i(7880);let _=class extends n.Disposable{constructor(e,t,i,s,r,o,a,_,u){super(),this._bufferService=i,this._coreService=r,this._optionsService=_,this._renderService=u,this._onRequestScrollLines=this._register(new c.Emitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._isSyncing=!1,this._isHandlingScroll=!1,this._suppressOnScrollHandler=!1,this._needsSyncOnRender=!1;const f=this._register(new d.Scrollable({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:e=>(0,h.scheduleAtNextAnimationFrame)(s.window,e)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{f.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new l.SmoothScrollableElement(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},f)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(o.onProtocolChange(e=>{this._scrollableElement.updateOptions({handleMouseWheel:!(16&e)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{e.style.backgroundColor=a.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=a.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register((0,n.toDisposable)(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register((0,n.toDisposable)(()=>this._styleElement.remove())),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${a.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${a.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${a.colors.scrollbarSliderActiveBackground.css};`,"}"].join("\n")})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(e=>this._handleScroll(e)))}scrollLines(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){const e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,i=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:i,verticalHasArrows:t}}queueSync(e){void 0!==e&&(this._latestYDisp=e),void 0===this._queuedAnimationFrame&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){this._renderService&&!this._isSyncing&&(this._coreService.decPrivateModes.synchronizedOutput?this._needsSyncOnRender=!0:(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1))}_handleScroll(e){if(!this._renderService)return;if(this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;const t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),i=t-this._bufferService.buffer.ydisp;0!==i&&(this._latestYDisp=t,this._onRequestScrollLines.fire(i)),this._isHandlingScroll=!1}handleTouchScroll(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};t.Viewport=_,t.Viewport=_=s([r(2,a.IBufferService),r(3,o.ICoreBrowserService),r(4,a.ICoreService),r(5,a.IMouseStateService),r(6,o.IThemeService),r(7,a.IOptionsService),r(8,o.IRenderService)],_)},4196(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const o=i(7098),n=i(4812),a=i(6501);let h=class extends n.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,n.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.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),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,t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,o.ICoreBrowserService),r(3,a.IDecorationService),r(4,o.IRenderService)],h)},957(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)}}},9925(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const o=i(957),n=i(7098),a=i(4812),h=i(6501),l={full:0,left:0,center:0,right:0},c={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=class extends a.Disposable{get _width(){const e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??1?e?.width??0:0}constructor(e,t,i,s,r,n,h,l){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=n,this._themeService=h,this._coreBrowserService=l,this._colorZoneStore=new o.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),this._register((0,a.toDisposable)(()=>this._canvas?.remove()));const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register((0,a.toDisposable)(()=>{void 0!==this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);c.full=this._canvas.width,c.left=e,c.center=t,c.right=e,this._refreshDrawHeightConstants(),d.full=1,d.left=1,d.center=1+c.left,d.right=1+c.left+c.center}_refreshDrawHeightConstants(){l.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);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;const e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;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,this._renderRulerOutline();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}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_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)-l[e.position||"full"]/2),c[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_,t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,n.IRenderService),r(5,h.IOptionsService),r(6,n.IThemeService),r(7,n.ICoreBrowserService)],_)},3618(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const o=i(7098),n=i(6501),a=i(4103),h="xterm-composition-session-end";let l=class{get isComposing(){return this._isComposing}get hasPendingCompositionFinalization(){return void 0!==this._pendingComposition}get _isSendingComposition(){return this.hasPendingCompositionFinalization}get _pendingKeypressData(){return this._pendingComposition?.keypressData??""}constructor(e,t,i,s,r,o,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=o,this._themeService=n,this._isComposing=!1,this._isAwaitingCompositionEnd=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent="",this._compositionInputData="",this._lastCompositionData="",this._compositionStartValue="",this._compositionStartSelection={start:0,end:0},this._compositionHasObservedProgress=!1,this._compositionTransactionId=0,this._compositionTimers=new Set,this._imeKeydownAwaitingCommit=!1}compositionstart(){this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=void 0,this._cancelDeferredTimer(this._compositionViewTimer),this._compositionViewTimer=void 0,this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;this._compositionPosition.start=Math.min(e,t),this._compositionPosition.end=Math.max(e,t),this._compositionStartValue=this._textarea.value,this._compositionStartSelection={start:e,end:t},this._compositionHasObservedProgress=!1,this._imeKeydownAwaitingCommit=!1,this._pendingComposition&&(this._pendingComposition.nextCompositionStart=this._compositionPosition.start),this._compositionTransactionId++,this._isComposing=!0,this._isAwaitingCompositionEnd=!0,this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._resetCompositionView(),this._dataAlreadySent="",this._compositionInputData="",this._lastCompositionData="",this._compositionView.classList.add("active"),this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-session-start",{bubbles:!0,detail:{id:this._compositionTransactionId}}))}compositionupdate(e){e.data&&!this._isComposing&&this.compositionstart(),this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._compositionHasObservedProgress||=this._hasCompositionProgress(),e.data?.length>0&&(this._lastCompositionData=e.data),this._renderCompositionView(e.data??""),this._compositionView.classList.toggle("active",Boolean(e.data)),this.updateCompositionElements();const t=this._compositionTransactionId;this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=this._defer(()=>{if(this._isComposing&&this._compositionTransactionId===t){this._compositionHasObservedProgress||=this._hasCompositionProgress();const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)}})}compositionend(e){if(!this._isAwaitingCompositionEnd)return!1;if(!this._isComposing){const t=this._pendingComposition;return t?.transactionId===this._compositionTransactionId&&(t.endData=e?.data??"",this._updatePostCompositionInputExpectation(t)),!1}const t=e?.data??"";if(this._compositionHasObservedProgress||=this._hasCompositionProgress(),!this._compositionEndBelongsToCurrentTransaction(t)){const e=this._pendingComposition;return e&&e.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(e),this._deferCompositionEnd(t),!1}return this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._finalizeComposition(!0,t),!0}blur(){if(this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._isComposing){const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)}(this._isComposing||this.hasPendingCompositionFinalization)&&this._finalizeComposition(!1)}dispose(){void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);for(const e of this._compositionTimers)clearTimeout(e);this._compositionTimers.clear(),this._compositionPositionTimer=void 0,this._compositionViewTimer=void 0,this._compositionEndTimer=void 0,this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionTransactionId++,this._compositionView.classList.remove("active"),this._resetCompositionView()}keydown(e){if(this._canceledKey?.code===e.code&&this._canceledKey.timeStamp===e.timeStamp)return this._canceledKey=void 0,!1;if("Escape"===e.key&&(this._isComposing||this.hasPendingCompositionFinalization))return this._canceledKey={code:e.code,timeStamp:e.timeStamp},this._cancelComposition(),!1;if(this._isComposing||this.hasPendingCompositionFinalization){if(this._deferPreeditResync(this._composedRegionLength()>0),20===e.keyCode||229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return this._imeKeydownAwaitingCommit=229===e.keyCode,229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}keypress(e){const t=this._pendingComposition;return!(!t||(t.keypressMayOverlapComposition?(t.keypressData+=e,0):t.expectsPostCompositionInput&&0===t.keypressData.length?(t.keypressData=e,0):(this._sendPendingComposition(t),1)))}input(e){if(this._isComposing)return this._compositionHasObservedProgress||=this._hasCompositionProgress(),this._compositionInputData+=e,!0;const t=this._pendingComposition;if(!t)return this._claimImeKeydownCommit(e);if(t.expectsPostCompositionInput)return t.inputData+=e,t.expectsPostCompositionInput=!1,this._sendPendingComposition(t),!0;const i=e.length>0&&this._getPendingTextareaInput(t)===e&&this._getPendingTextareaInput(t,!0)===e;return this._sendPendingComposition(t),i||this._coreService.triggerDataEvent(e,!0),!0}_claimImeKeydownCommit(e){return!!this._imeKeydownAwaitingCommit&&(this._imeKeydownAwaitingCommit=!1,void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0),this._coreService.triggerDataEvent(e,!0),!0)}_finalizeComposition(e,t=""){const i=this._isComposing;if(this._compositionView.classList.remove("active"),this._resetCompositionView(),this._isComposing=!1,!e||i)if(e){this._pendingComposition&&this._sendPendingComposition(this._pendingComposition);const e={transactionId:this._compositionTransactionId,lifecycleSettled:!1,sessionEnded:!1,position:{start:this._compositionPosition.start,end:this._compositionPosition.end},suffix:this._compositionSuffix,dataAlreadySent:this._dataAlreadySent,compositionData:this._lastCompositionData,endData:t,inputData:this._compositionInputData,keypressData:"",keypressMayOverlapComposition:0===this._lastCompositionData.length&&0===t.length,expectsPostCompositionInput:!1};this._updatePostCompositionInputExpectation(e),this._pendingComposition=e,e.finalizerTimer=this._defer(()=>{e.finalizerTimer=void 0,this._compositionTransactionId===e.transactionId&&(this._isAwaitingCompositionEnd=!1),this._pendingComposition===e&&this._sendPendingComposition(e,!0)})}else if(this._pendingComposition&&this._sendPendingComposition(this._pendingComposition,!0),i){const e=this._getCompositionInput(this._compositionPosition.start+this._dataAlreadySent.length,this._compositionSuffix);this._sendCompositionInput(this._compositionTransactionId,e)}}_sendPendingComposition(e,t=!1){this._cancelPendingFinalizer(e),this._pendingComposition===e&&(this._pendingComposition=void 0);const i=this._getPendingTextareaInput(e,t),s=this._removeAlreadySentData(e.inputData||e.keypressData,e.dataAlreadySent),r=this._mergeTextObservations(i||e.endData||(s?e.compositionData:""),s,e.keypressMayOverlapComposition);this._sendCompositionInput(e.transactionId,r,!e.sessionEnded),this._settlePendingComposition(e)}_cancelPendingFinalizer(e){void 0!==e.finalizerTimer&&(clearTimeout(e.finalizerTimer),this._compositionTimers.delete(e.finalizerTimer),e.finalizerTimer=void 0)}_settlePendingComposition(e){e.lifecycleSettled||(e.lifecycleSettled=!0,this._dispatchCompositionTransactionSettled())}_mergeTextObservations(e,t,i){if(!t||e.includes(t))return e;if(!e||t.includes(e))return t;if(i){let i=Math.min(e.length,t.length);for(;i>0&&!e.endsWith(t.substring(0,i));)i--;let s=Math.min(e.length,t.length);for(;s>0&&!t.endsWith(e.substring(0,s));)s--;return i>s?e+t.substring(i):t+e.substring(s)}let s=Math.min(e.length,t.length);for(;s>0&&!e.endsWith(t.substring(0,s));)s--;return e+t.substring(s)}_updatePostCompositionInputExpectation(e){e.expectsPostCompositionInput=(e.endData.length>0||e.compositionData.length>0)&&0===e.inputData.length&&0===this._getPendingTextareaInput(e).length}_getPendingTextareaInput(e,t=!1){const i=this._textarea.value,s=e.position.start+e.dataAlreadySent.length;if(void 0!==e.nextCompositionStart)return i.substring(s,Math.max(s,e.nextCompositionStart));const r=e.suffix.length>0&&i.endsWith(e.suffix)?i.length-e.suffix.length:i.length,o=(e.endData||e.compositionData).length,n=t?r:Math.max(e.position.end,s+o);return i.substring(s,Math.max(s,Math.min(r,n)))}_getCompositionInput(e,t){const i=this._textarea.value,s=t.length>0&&i.endsWith(t)?i.length-t.length:i.length;return i.substring(e,Math.max(e,s))}_removeAlreadySentData(e,t){return 0===t.length?e:e.startsWith(t)?e.substring(t.length):t.includes(e)?"":e}_cancelComposition(){const e=this._pendingComposition;e&&this._isComposing&&e.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(e);const t=this._isComposing?this._compositionTransactionId:this._pendingComposition?.transactionId??0,i=void 0!==e&&this._pendingComposition===e;this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionView.classList.remove("active"),this._resetCompositionView(),this._textarea.value=this._textarea.value.substring(0,this._compositionPosition.start)+this._compositionSuffix,this._sendCompositionInput(t,""),i&&e&&this._settlePendingComposition(e)}_sendCompositionInput(e,t,i=!0){let s=!1;if(i){const i=new CustomEvent(h,{bubbles:!0,cancelable:!0,detail:{id:e,data:t}});this._dispatchCompositionSessionEvent(i),s=i.defaultPrevented}t.length>0&&!s&&this._coreService.triggerDataEvent(t,!0)}_endPendingCompositionSession(e){if(e.sessionEnded)return;e.sessionEnded=!0;const t=this._getPendingTextareaInput(e)||e.endData||e.compositionData;this._dispatchCompositionSessionEvent(new CustomEvent(h,{bubbles:!0,cancelable:!0,detail:{id:e.transactionId,data:t,dataPendingReconciliation:!0}}))}_dispatchCompositionSessionEvent(e){"function"==typeof this._textarea.dispatchEvent&&this._textarea.dispatchEvent(e)}_dispatchCompositionTransactionSettled(){this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-settled",{bubbles:!0}))}_deferCompositionEnd(e){this._cancelDeferredTimer(this._compositionEndTimer);const t=this._compositionTransactionId,i=this._defer(()=>{if(this._compositionEndTimer!==i||!this._isComposing||this._compositionTransactionId!==t||!this._compositionEndBelongsToCurrentTransaction(e))return;this._compositionEndTimer=void 0,this._finalizeComposition(!0,e),this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0}));const s=this._pendingComposition;s?.transactionId===t&&this._sendPendingComposition(s,!0)});this._compositionEndTimer=i}_composedRegionLength(){const e=this._textarea.value.length-this._compositionSuffix.length;return Math.max(0,e-this._compositionPosition.start)}_deferPreeditResync(e){if(!e||!this._isComposing)return;const t=this._compositionTransactionId;this._defer(()=>{this._isComposing&&this._compositionTransactionId===t&&0===this._composedRegionLength()&&this._cancelComposition()})}_hasCompositionProgress(){const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;return this._compositionHasObservedProgress||this._textarea.value!==this._compositionStartValue||e!==this._compositionStartSelection.start||t!==this._compositionStartSelection.end}_compositionEndBelongsToCurrentTransaction(e){return this._hasCompositionProgress()||e.length>0&&e===this._lastCompositionData}_defer(e){const t=setTimeout(()=>{this._compositionTimers.delete(t),e()},0);return this._compositionTimers.add(t),t}_cancelDeferredTimer(e){void 0!==e&&(clearTimeout(e),this._compositionTimers.delete(e))}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;const e=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");t!==e&&(this._imeKeydownAwaitingCommit=!1),this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.lengththis.updateCompositionElements(!0)))}};t.CompositionHelper=l,t.CompositionHelper=l=s([r(2,n.IBufferService),r(3,n.IOptionsService),r(4,n.ICoreService),r(5,o.IRenderService),r(6,o.IThemeService)],l)},5251(e,t){function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),o=parseInt(r.getPropertyValue("padding-left"),10),n=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-s.left-o,t.clientY-s.top-n]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,o,n,a,h,l){if(!n)return;const c=i(e,t,s);return c[0]=Math.ceil((c[0]+(l?a/2:0))/a),c[1]=Math.ceil(c[1]/h),c[0]=Math.min(Math.max(c[0],1),r+(l?1:0)),c[1]=Math.min(Math.max(c[1],1),o),c}},9686(e,t){function i(e,t,i,o){const h=e-s(e,i),l=t-s(t,i),c=Math.abs(h-l)-function(e,t,i){let o=0;const n=e-s(e,i),a=t-s(t,i);for(let s=0;s=0&&et?"A":"B"}function o(e,t,i,s,r,o){let n=e,a=t,h="";for(;(n!==i||a!==s)&&a>=0&&ao.cols-1?(h+=o.buffer.translateBufferLineToString(a,!1,e,n),n=0,e=0,a++):!r&&n<0&&(h+=o.buffer.translateBufferLineToString(a,!1,0,e+1),n=o.cols-1,e=n,a--);return h+o.buffer.translateBufferLineToString(a,!1,e,n)}function n(e,t){return""+(t?"O":"[")+e}function a(e,t){e=Math.floor(e);let i="";for(let s=0;s0?h-s(h,l):t;const _=h,u=function(e,t,r,o,n,a){let h;return h=i(t,o,n,a).length>0?o-s(o,n):t,e=r&&he?"D":"C",a(Math.abs(l-e),n(d,h));d=c>t?"D":"C";const _=Math.abs(c-t);return a(function(e,t){return t.cols-e}(c>t?e:l,r)+(_-1)*r.cols+1+((c>t?l:e)-1),n(d,h))}},6081(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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(f.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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new _.ParserApi(this._core)}get unicode(){return this._checkProposedApi(),new u.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._register(new d.BufferNamespaceApi(this._core))}get markers(){return this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.mouseStateService.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,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:e.synchronizedOutput,win32InputMode:e.win32InputMode,wraparoundMode:e.wraparound}}get dimensions(){return this._core.dimensions}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._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return 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{get promptLabel(){return a.promptLabel.get()},set promptLabel(e){a.promptLabel.set(e)},get tooMuchOutput(){return a.tooMuchOutput.get()},set tooMuchOutput(e){a.tooMuchOutput.set(e)}}}_verifyIntegers(...e){for(p of e)if(p===1/0||isNaN(p)||p%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(p of e)if(p&&(p===1/0||isNaN(p)||p%1!=0||p<0))throw new Error("This API only accepts positive integers")}}t.Terminal=v},3955(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const o=i(1433),n=i(2744),a=i(9176),h=i(6181),l=i(2274),c=i(654),d=i(7098),_=i(4103),u=i(4812),f=i(6501),p=i(8636),v=i(4159);let g=1,m=class extends u.Disposable{constructor(e,t,i,s,r,a,d,_,f,m,b,w,y,C){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=d,this._charSizeService=f,this._optionsService=m,this._bufferService=b,this._coreService=w,this._coreBrowserService=y,this._themeService=C,this._terminalClass=g++,this._rowElements=[],this._selectionRenderModel=(0,l.createSelectionRenderModel)(),this._lastSelectionColumnMode=!1,this._rowHasBlinkingCells=[],this._rowHasBlinkingCellsCount=0,this._onRequestRedraw=this._register(new p.Emitter),this.onRequestRedraw=this._onRequestRedraw.event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),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=_.createInstance(o.DomRendererRowFactory,document),this._element.classList.add("xterm-dom-renderer-owner-"+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._cursorBlinkStateManager=new S(this._rowContainer,this._coreBrowserService),this._register((0,v.addDisposableListener)(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register((0,u.toDisposable)(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new c.TextBlinkStateManager(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register((0,u.toDisposable)(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new n.WidthCache,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} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${_.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;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} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${i} { color: ${s.css}; }${this._terminalSelector} .xterm-fg-${i}.xterm-dim { color: ${_.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .xterm-bg-${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR} { color: ${_.color.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${_.color.multiplyOpacity(_.color.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${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),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,i){const s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i);let r=0,o=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(r=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow));let n=0,a=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,i),this._selectionRenderModel.hasSelection){const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,o=this._selectionRenderModel.viewportCappedStartRow,h=this._selectionRenderModel.viewportCappedEndRow;n=o,a=h;const l=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];l.appendChild(this._createSelectionElement(o,i?t[0]:e[0],i?e[0]:t[0],h-o+1))}else{const i=s===o?e[0]:0,n=o===r?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(o,i,n));const a=h-o-1;if(l.appendChild(this._createSelectionElement(o+1,0,this._bufferService.cols,a)),o!==h){const e=r===h?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(h,0,e))}}this._selectionContainer.appendChild(l)}let h=Math.min(r,n),l=Math.max(o,a);if(l>=0){h=Math.max(h,0),l=Math.min(l,s-1);const e=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&e>=0&&ethis.dimensions.css.canvas.width&&(n=this.dimensions.css.canvas.width-o),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${o}px`,r.style.width=`${n}px`,r}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),o=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,n=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle,h={hasBlinkingCells:!1};for(let l=e;l<=t;l++){const e=l+i.ydisp,t=this._rowElements[l];if(!t)continue;const c=i.lines.get(e);c?(t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,n,a,r,o,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,h)),this._setRowBlinkState(l,h.hasBlinkingCells)):(t.replaceChildren(),this._setRowBlinkState(l,!1))}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,o){i<0&&(e=0),s<0&&(t=0);const n=this._bufferService.rows-1;i=Math.max(Math.min(i,n),0),s=Math.max(Math.min(s,n),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,l=Math.min(a.x,r-1),c=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle,u={hasBlinkingCells:!1};for(let n=i;n<=s;++n){const f=n+a.ydisp,p=this._rowElements[n];if(!p)continue;const v=a.lines.get(f);v?(p.replaceChildren(...this._rowFactory.createRow(v,f,f===h,d,_,l,c,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,o?n===i?e:0:-1,o?(n===s?t:r)-1:-1,u)),this._setRowBlinkState(n,u.hasBlinkingCells)):(p.replaceChildren(),this._setRowBlinkState(n,!1))}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};t.DomRenderer=m,t.DomRenderer=m=s([r(7,f.IInstantiationService),r(8,d.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,f.ICoreService),r(12,d.ICoreBrowserService),r(13,d.IThemeService)],m);class S{constructor(e,t){this._rowContainer=e,this._coreBrowserService=t,this._isIdlePaused=!1,this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){void 0!==this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}}},1433(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const o=i(9176),n=i(8938),a=i(3055),h=i(6501),l=i(4103),c=i(7098),d=i(945),_=i(6181),u=i(5451);let f=class{constructor(e,t,i,s,r,o,n){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=o,this._themeService=n,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,c,_,f,p,v,g){const m=[];g&&(g.hasBlinkingCells=!1);const S=this._characterJoinerService.getJoinedCharacters(t),b=this._themeService.colors;let w,y=e.getNoBgTrimmedLength();i&&y=B,F=I,W=this._workCell;if(S.length>0&&I===S[0][0]&&N){const s=S.shift(),r=this._isCellInSelection(s[0],t);for(C=s[0]+1;C=s[1],N?(H=!0,W=new d.JoinedCellData(this._workCell,e.translateToString(!0,s[0],s[1]),s[1]-s[0]),F=s[1]-1,y=W.getWidth()):B=s[1]}const z=this._isCellInSelection(I,t),K=i&&I===a,U=O&&I>=p&&I<=v;g&&W.isBlink()&&(g.hasBlinkingCells=!0),!c&&W.isBlink()&&A.push("xterm-blink-hidden");let j=!1;this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{j=!0});let V=W.getChars()||n.WHITESPACE_CELL_CHAR;if(" "===V&&(W.isUnderline()||W.isOverline())&&(V=" "),k=y*_-f.get(V,W.isBold(),W.isItalic()),w){if(D&&(z&&P||!z&&!P&&W.bg===x)&&(z&&P&&b.selectionForeground||W.fg===L)&&W.extended.ext===T&&U===R&&k===M&&!K&&!H&&!j&&N){W.isInvisible()?E+=n.WHITESPACE_CELL_CHAR:E+=V,D++;continue}D&&(w.textContent=E),w=this._document.createElement("span"),D=0,E=""}else w=this._document.createElement("span");if(x=W.bg,L=W.fg,T=W.extended.ext,R=U,M=k,P=z,H&&a>=I&&a<=F&&(a=I),!this._coreService.isCursorHidden&&K&&this._coreService.isCursorInitialized)if(A.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&A.push("xterm-cursor-blink"),A.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":A.push("xterm-cursor-outline");break;case"block":A.push("xterm-cursor-block");break;case"bar":A.push("xterm-cursor-bar");break;case"underline":A.push("xterm-cursor-underline")}if(W.isBold()&&A.push("xterm-bold"),W.isItalic()&&A.push("xterm-italic"),W.isDim()&&A.push("xterm-dim"),E=W.isInvisible()?n.WHITESPACE_CELL_CHAR:W.getChars()||n.WHITESPACE_CELL_CHAR,W.isUnderline()&&(A.push(`xterm-underline-${W.extended.underlineStyle}`)," "===E&&(E=" "),!W.isUnderlineColorDefault()))if(W.isUnderlineColorRGB())w.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(W.getUnderlineColor()).join(",")})`;else{let e=W.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&W.isBold()&&e<8&&(e+=8),w.style.textDecorationColor=b.ansi[e].css}W.isOverline()&&(A.push("xterm-overline")," "===E&&(E=" ")),W.isStrikethrough()&&A.push("xterm-strikethrough"),U&&(w.style.textDecoration="underline");let $=W.getFgColor(),q=W.getFgColorMode(),X=W.getBgColor(),Y=W.getBgColorMode();const G=!!W.isInverse();if(G){const e=$;$=X,X=e;const t=q;q=Y,Y=t}let J,Z,Q,ee=!1;switch(this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{"top"!==e.options.layer&&ee||(e.backgroundColorRGB&&(Y=50331648,X=e.backgroundColorRGB.rgba>>8&16777215,J=e.backgroundColorRGB),e.foregroundColorRGB&&(q=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,Z=e.foregroundColorRGB),ee="top"===e.options.layer)}),!ee&&z&&(J=this._coreBrowserService.isFocused?b.selectionBackgroundOpaque:b.selectionInactiveBackgroundOpaque,X=J.rgba>>8&16777215,Y=50331648,ee=!0,b.selectionForeground&&(q=50331648,$=b.selectionForeground.rgba>>8&16777215,Z=b.selectionForeground)),ee&&A.push("xterm-decoration-top"),Y){case 16777216:case 33554432:Q=b.ansi[X],A.push(`xterm-bg-${X}`);break;case 50331648:Q=l.channels.toColor(X>>16,X>>8&255,255&X),this._addStyle(w,`background-color:#${(X>>>0).toString(16).padStart(6,"0")}`);break;default:G?(Q=b.foreground,A.push(`xterm-bg-${o.INVERTED_DEFAULT_COLOR}`)):Q=b.background}switch(J||W.isDim()&&(J=l.color.multiplyOpacity(Q,.5)),q){case 16777216:case 33554432:W.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(w,Q,b.ansi[$],W,J,void 0)||A.push(`xterm-fg-${$}`);break;case 50331648:const e=l.channels.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(w,Q,e,W,J,Z)||this._addStyle(w,`color:#${$.toString(16).padStart(6,"0")}`);break;default:this._applyMinimumContrast(w,Q,b.foreground,W,J,Z)||G&&A.push(`xterm-fg-${o.INVERTED_DEFAULT_COLOR}`)}A.length&&(w.className=A.join(" "),A.length=0),K||H||j||!N?w.textContent=E:D++,k!==this.defaultSpacing&&(w.style.letterSpacing=`${k}px`),m.push(w),I=F}return w&&D&&(w.textContent=E),m}_applyMinimumContrast(e,t,i,s,r,o){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const n=this._getContrastCache(s);let a;if(r||o||(a=n.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=l.color.ensureContrastRatio(r??t,o??i,e),n.setColor((r??t).rgba,(o??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])}};t.DomRendererRowFactory=f,t.DomRendererRowFactory=f=s([r(1,c.ICharacterJoinerService),r(2,h.IOptionsService),r(3,c.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,c.IThemeService)],f)},2744(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0;const s=i(6181);t.WidthCache=class{constructor(e=()=>new r){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._canvasElements=[],this._canvasElements=[e(),e(),e(),e()],this.clear()}dispose(){this._canvasElements.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._canvasElements[0].setFont(e,t,i,!1),this._canvasElements[1].setFont(e,t,s,!1),this._canvasElements[2].setFont(e,t,i,!0),this._canvasElements[3].setFont(e,t,s,!0),this.clear())}get(e,t,i){let s;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 o=this._holey.get(r);if(void 0===o){let s=0;t&&(s|=1),i&&(s|=2),o=this._measure(e,s),o>0&&this._holey.set(r,o)}return o}_measure(e,t){return this._canvasElements[t].measure(e)}};class r{constructor(){"undefined"!=typeof OffscreenCanvas?(this._canvas=new OffscreenCanvas(1,1),this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d")))}setFont(e,t,i,s){const r=s?"italic":"";this._ctx.font=`${r} ${i} ${t}px ${e}`.trim()}measure(e){return this._ctx.measureText(e).width}}},9176(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.INVERTED_DEFAULT_COLOR=void 0,t.INVERTED_DEFAULT_COLOR=257},6181(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.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,o){return 1===t&&r>Math.ceil(1.5*o)&&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))}},2274(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=function(){return new i};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,o=t[1]-r,n=i[1]-r,a=Math.max(o,0),h=Math.min(n,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,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)}}},654(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TextBlinkStateManager=void 0;const s=i(4812);class r extends s.Disposable{constructor(e,t,i){super(),this._renderCallback=e,this._coreBrowserService=t,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",e=>{this.setIntervalDuration(e)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const e=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(e||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}t.TextBlinkStateManager=r},8501(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._domNodePointerDown(e)))}_createArrow(e){const t=this._register(new c.ScrollbarArrow(e));return this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode),t}_createSlider(e,t,i,s){this.slider=new h.FastDomNode(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(e),this.slider.setLeft(t),"number"==typeof i&&this.slider.setWidth(i),"number"==typeof s&&this.slider.setHeight(s),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(a.addDisposableListener(this.slider.domNode,a.eventType.POINTER_DOWN,e=>{0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))})),this._onclick(this.slider.domNode,e=>{e.leftButton&&e.stopPropagation()})}_handleElementSize(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(e){e.target===this.domNode.domNode&&this._handlePointerDown(e)}delegatePointerDown(e){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),s=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderPointerPosition(e);i<=r&&r<=s?0===e.button&&(e.preventDefault(),this._sliderPointerDown(e)):this._handlePointerDown(e)}_handlePointerDown(e){let t,i;if(e.target===this.domNode.domNode&&"number"==typeof e.offsetX&&"number"==typeof e.offsetY)t=e.offsetX,i=e.offsetY;else{const s=a.getDomNodePagePosition(this.domNode.domNode);t=e.pageX-s.left,i=e.pageY-s.top}const s=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(s):this._scrollbarState.getDesiredScrollPositionFromOffset(s)),0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))}_sliderPointerDown(e){if(!(e.target&&e.target instanceof Element))return;const t=this._sliderPointerPosition(e),i=this._sliderOrthogonalPointerPosition(e),s=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{const r=this._sliderOrthogonalPointerPosition(e),o=Math.abs(r-i);if(u.isWindows&&o>140)return void this._setDesiredScrollPositionNow(s.getScrollPosition());const n=this._sliderPointerPosition(e)-t;this._setDesiredScrollPositionNow(s.getDesiredScrollPositionFromDelta(n))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(e){const t={};this.writeScrollPosition(t,e),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(e){this._updateScrollbarSize(e),this._scrollbarState.setScrollbarSize(e),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}t.AbstractScrollbar=f},1203(e,t){function i(e){return"number"==typeof e?`${e}px`:e}Object.defineProperty(t,"__esModule",{value:!0}),t.FastDomNode=void 0,t.FastDomNode=class{constructor(e){this.domNode=e,this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._className="",this._position="",this._layerHint=!1,this._contain="none"}setWidth(e){const t=i(e);this._width!==t&&(this._width=t,this.domNode.style.width=this._width)}setHeight(e){const t=i(e);this._height!==t&&(this._height=t,this.domNode.style.height=this._height)}setTop(e){const t=i(e);this._top!==t&&(this._top=t,this.domNode.style.top=this._top)}setLeft(e){const t=i(e);this._left!==t&&(this._left=t,this.domNode.style.left=this._left)}setBottom(e){const t=i(e);this._bottom!==t&&(this._bottom=t,this.domNode.style.bottom=this._bottom)}setRight(e){const t=i(e);this._right!==t&&(this._right=t,this.domNode.style.right=this._right)}setClassName(e){this._className!==e&&(this._className=e,this.domNode.className=this._className)}toggleClassName(e,t){this.domNode.classList.toggle(e,t),this._className=this.domNode.className}setPosition(e){this._position!==e&&(this._position=e,this.domNode.style.position=this._position)}setLayerHinting(e){this._layerHint!==e&&(this._layerHint=e,this.domNode.style.transform=e?"translate3d(0px, 0px, 0px)":"")}setContain(e){this._contain!==e&&(this._contain=e,this.domNode.style.contain=this._contain)}setAttribute(e,t){this.domNode.setAttribute(e,t)}}},928(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{try{e.releasePointerCapture(t)}catch{}}))}catch{o=a.getWindow(e)}this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_MOVE,e=>{e.buttons===i?(e.preventDefault(),this._pointerMoveCallback(e)):this.stopMonitoring(!0)})),this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_UP,e=>this.stopMonitoring(!0)))}}},9699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.HorizontalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(t.horizontalHasArrows?t.horizontalScrollbarSize:0,2===t.horizontal?0:t.horizontalScrollbarSize,2===t.vertical?0:t.verticalScrollbarSize,s.width,s.scrollWidth,o.scrollLeft),visibility:t.horizontal,extraScrollbarClassName:"xterm-horizontal",scrollable:e,scrollByPage:t.scrollByPage}),t.horizontalHasArrows)throw new Error("horizontalHasArrows is not supported in xterm.js");this._createSlider(Math.floor((t.horizontalScrollbarSize-t.horizontalSliderSize)/2),0,void 0,t.horizontalSliderSize)}_updateSlider(e,t){this.slider.setWidth(e),this.slider.setLeft(t)}_renderDomNode(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._handleElementSize(e.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return e}_sliderPointerPosition(e){return e.pageX}_sliderOrthogonalPointerPosition(e){return e.pageY}_updateScrollbarSize(e){this.slider.setHeight(e)}writeScrollPosition(e,t){e.scrollLeft=t}updateOptions(e){this.updateScrollbarSize(2===e.horizontal?0:e.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._visibilityController.setVisibility(e.horizontal),this._scrollByPage=e.scrollByPage}}t.HorizontalScrollbar=o},3988(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;ni&&(s=i-t),s<0&&(s=0),r<0&&(r=0),n+r>o&&(n=o-r),n<0&&(n=0),this.width=t,this.scrollWidth=i,this.scrollLeft=s,this.height=r,this.scrollHeight=o,this.scrollTop=n}equals(e){return this.rawScrollLeft===e.rawScrollLeft&&this.rawScrollTop===e.rawScrollTop&&this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop}withScrollDimensions(e,t){return new o(this._forceIntegerValues,void 0!==e.width?e.width:this.width,void 0!==e.scrollWidth?e.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,void 0!==e.height?e.height:this.height,void 0!==e.scrollHeight?e.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(e){return new o(this._forceIntegerValues,this.width,this.scrollWidth,void 0!==e.scrollLeft?e.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,void 0!==e.scrollTop?e.scrollTop:this.rawScrollTop)}createScrollEvent(e,t){const i=this.width!==e.width,s=this.scrollWidth!==e.scrollWidth,r=this.scrollLeft!==e.scrollLeft,o=this.height!==e.height,n=this.scrollHeight!==e.scrollHeight,a=this.scrollTop!==e.scrollTop;return{inSmoothScrolling:t,oldWidth:e.width,oldScrollWidth:e.scrollWidth,oldScrollLeft:e.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:e.height,oldScrollHeight:e.scrollHeight,oldScrollTop:e.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:s,scrollLeftChanged:r,heightChanged:o,scrollHeightChanged:n,scrollTopChanged:a}}}t.ScrollState=o;class n extends r.Disposable{constructor(e){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new s.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new o(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){const i=this._state.withScrollDimensions(e,t);this._setState(i,Boolean(this._smoothScrolling)),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){const t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(0!==this._smoothScrollDuration){if(this._smoothScrolling){e={scrollLeft:void 0===e.scrollLeft?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:void 0===e.scrollTop?this._smoothScrolling.to.scrollTop:e.scrollTop};const i=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===i.scrollLeft&&this._smoothScrolling.to.scrollTop===i.scrollTop)return;let s;s=t?new l(this._smoothScrolling.from,i,this._smoothScrolling.startTime,this._smoothScrolling.duration):l.start(this._state,i,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{const t=this._state.withScrollPosition(e);this._smoothScrolling=l.start(this._state,t,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}else this.setScrollPositionNow(e)}hasPendingScrollAnimation(){return Boolean(this._smoothScrolling)}_performSmoothScrolling(){if(!this._smoothScrolling)return;const e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);return this._setState(t,!0),this._smoothScrolling?e.isDone?(this._smoothScrolling.dispose(),void(this._smoothScrolling=null)):void(this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})):void 0}_setState(e,t){const i=this._state;i.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(i,t)))}}t.Scrollable=n;class a{constructor(e,t,i){this.scrollLeft=e,this.scrollTop=t,this.isDone=i}}function h(e,t){const i=t-e;return function(t){return e+i*(1-(s=1-t,Math.pow(s,3)));var s}}class l{constructor(e,t,i,s){this.from=e,this.to=t,this.duration=s,this.startTime=i,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this._scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this._scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(e,t,i){if(Math.abs(e-t)>2.5*i){let n,a;return e0&&Math.abs(e.deltaY)>0)return 1;let i=.5;if(this._isAlmostInt(e.deltaX)&&this._isAlmostInt(e.deltaY)||(i+=.25),t){const s=Math.abs(e.deltaX),r=Math.abs(e.deltaY),o=Math.abs(t.deltaX),n=Math.abs(t.deltaY),a=Math.max(Math.min(s,o),1),h=Math.max(Math.min(r,n),1),l=Math.max(s,o),c=Math.max(r,n);l%a===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(e){return Math.abs(Math.round(e)-e)<.01}}S.INSTANCE=new S;class b extends _.Widget{get options(){return this._options}constructor(e,t,i){let s;super(),this._onScroll=this._register(new f.Emitter),this.onScroll=this._onScroll.event,t=t??{};const r=!i;i?s=i:(t.mouseWheelSmoothScroll=!1,s=new g.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:t=>a.scheduleAtNextAnimationFrame(a.getWindow(e),t)})),this._options=function(e){const t={lazyRender:void 0!==e.lazyRender&&e.lazyRender,className:void 0!==e.className?e.className:"",useShadows:void 0===e.useShadows||e.useShadows,handleMouseWheel:void 0===e.handleMouseWheel||e.handleMouseWheel,flipAxes:void 0!==e.flipAxes&&e.flipAxes,consumeMouseWheelIfScrollbarIsNeeded:void 0!==e.consumeMouseWheelIfScrollbarIsNeeded&&e.consumeMouseWheelIfScrollbarIsNeeded,alwaysConsumeMouseWheel:void 0!==e.alwaysConsumeMouseWheel&&e.alwaysConsumeMouseWheel,scrollYToX:void 0!==e.scrollYToX&&e.scrollYToX,mouseWheelScrollSensitivity:void 0!==e.mouseWheelScrollSensitivity?e.mouseWheelScrollSensitivity:1,fastScrollSensitivity:void 0!==e.fastScrollSensitivity?e.fastScrollSensitivity:5,scrollPredominantAxis:void 0===e.scrollPredominantAxis||e.scrollPredominantAxis,mouseWheelSmoothScroll:void 0===e.mouseWheelSmoothScroll||e.mouseWheelSmoothScroll,listenOnDomNode:void 0!==e.listenOnDomNode?e.listenOnDomNode:null,horizontal:void 0!==e.horizontal?e.horizontal:1,horizontalScrollbarSize:void 0!==e.horizontalScrollbarSize?e.horizontalScrollbarSize:10,horizontalSliderSize:void 0!==e.horizontalSliderSize?e.horizontalSliderSize:0,horizontalHasArrows:void 0!==e.horizontalHasArrows&&e.horizontalHasArrows,vertical:void 0!==e.vertical?e.vertical:1,verticalScrollbarSize:void 0!==e.verticalScrollbarSize?e.verticalScrollbarSize:10,verticalHasArrows:void 0!==e.verticalHasArrows&&e.verticalHasArrows,verticalSliderSize:void 0!==e.verticalSliderSize?e.verticalSliderSize:0,scrollByPage:void 0!==e.scrollByPage&&e.scrollByPage};return t.horizontalSliderSize=void 0!==e.horizontalSliderSize?e.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=void 0!==e.verticalSliderSize?e.verticalSliderSize:t.verticalScrollbarSize,v.isMac&&(t.className+=" xterm-mac"),t}(t),this._scrollable=s,this._register(this._scrollable.onScroll(e=>{this._handleScroll(e),this._onScroll.fire(e)})),r&&this._register(this._scrollable);const o={handleMouseWheel:e=>this._handleMouseWheel(e),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new d.VerticalScrollbar(this._scrollable,this._options,o)),this._horizontalScrollbar=this._register(new c.HorizontalScrollbar(this._scrollable,this._options,o)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,e=>this._handleMouseOver(e)),this._onmouseleave(this._listenOnDomNode,e=>this._handleMouseLeave(e)),this._hideTimeout=this._register(new u.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,v.isMac&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){void 0!==e.handleMouseWheel&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),void 0!==e.mouseWheelScrollSensitivity&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),void 0!==e.fastScrollSensitivity&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),void 0!==e.scrollPredominantAxis&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),void 0!==e.horizontal&&(this._options.horizontal=e.horizontal),void 0!==e.vertical&&(this._options.vertical=e.vertical),void 0!==e.horizontalHasArrows&&(this._options.horizontalHasArrows=e.horizontalHasArrows),void 0!==e.verticalHasArrows&&(this._options.verticalHasArrows=e.verticalHasArrows),void 0!==e.horizontalScrollbarSize&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),void 0!==e.verticalScrollbarSize&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),void 0!==e.scrollByPage&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new l.StandardWheelEvent(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),e)){const e=e=>{this._handleMouseWheel(new l.StandardWheelEvent(e))};this._mouseWheelToDispose.push(a.addDisposableListener(this._listenOnDomNode,a.eventType.MOUSE_WHEEL,e,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;const t=S.INSTANCE;t.acceptStandardWheelEvent(e);let i=!1;if(e.deltaY||e.deltaX){let s=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&r+s===0?r=s=0:Math.abs(s)>=Math.abs(r)?r=0:s=0),this._options.flipAxes&&([s,r]=[r,s]);const o=!v.isMac&&e.browserEvent&&e.browserEvent.shiftKey;!this._options.scrollYToX&&!o||r||(r=s,s=0),e.browserEvent&&e.browserEvent.altKey&&(r*=this._options.fastScrollSensitivity,s*=this._options.fastScrollSensitivity);const n=this._scrollable.getFutureScrollPosition();let a={};if(s){const e=50*s,t=n.scrollTop-(e<0?Math.floor(e):Math.ceil(e));this._verticalScrollbar.writeScrollPosition(a,t)}if(r){const e=50*r,t=n.scrollLeft-(e<0?Math.floor(e):Math.ceil(e));this._horizontalScrollbar.writeScrollPosition(a,t)}a=this._scrollable.validateScrollPosition(a),(n.scrollLeft!==a.scrollLeft||n.scrollTop!==a.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(a):this._scrollable.setScrollPositionNow(a),i=!0)}let s=i;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,i=e.scrollLeft>0,s=i?" xterm-shadow-left":"",r=t?" xterm-shadow-top":"",o=i||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${r}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${o}${r}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){this._mouseIsOver||this._isDragging||(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){this._mouseIsOver||this._isDragging||this._hideTimeout.cancelAndSet(()=>this._hide(),500)}}t.SmoothScrollableElement=b},9594(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._arrowPointerDown(e))),this._register(c.addStandardDisposableListener(this.domNode,c.eventType.POINTER_DOWN,e=>this._arrowPointerDown(e))),this._pointerdownRepeatTimer=this._register(new c.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new l.TimeoutTimer)}_arrowPointerDown(e){e.target&&e.target instanceof Element&&(this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,c.getWindow(e))},200),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),e.preventDefault())}}t.ScrollbarArrow=d},1270(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ScrollbarState=void 0;class i{constructor(e,t,i,s,r,o){this._scrollbarSize=Math.round(t),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(e),this._visibleSize=s,this._scrollSize=r,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new i(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(e){const t=Math.round(e);return this._visibleSize!==t&&(this._visibleSize=t,this._refreshComputedValues(),!0)}setScrollSize(e){const t=Math.round(e);return this._scrollSize!==t&&(this._scrollSize=t,this._refreshComputedValues(),!0)}setScrollPosition(e){const t=Math.round(e);return this._scrollPosition!==t&&(this._scrollPosition=t,this._refreshComputedValues(),!0)}setScrollbarSize(e){this._scrollbarSize=Math.round(e)}setArrowSize(e){const t=Math.round(e);this._arrowSize!==t&&(this._arrowSize=t,this._refreshComputedValues())}setOppositeScrollbarSize(e){this._oppositeScrollbarSize=Math.round(e)}static _computeValues(e,t,i,s,r){const o=Math.max(0,i-e),n=Math.max(0,o-2*t),a=s>0&&s>i;if(!a)return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(n),computedSliderRatio:0,computedSliderPosition:0};const h=Math.round(Math.max(20,Math.floor(i*n/s))),l=(n-h)/(s-i),c=r*l;return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(h),computedSliderRatio:l,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){const e=i._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=e.computedAvailableSize,this._computedIsNeeded=e.computedIsNeeded,this._computedSliderSize=e.computedSliderSize,this._computedSliderRatio=e.computedSliderRatio,this._computedSliderPosition=e.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize-this._computedSliderSize/2;return Math.round(t/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize;let i=this._scrollPosition;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(e){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(e?" xterm-fade":"")))}}t.ScrollbarVisibilityController=o},2650(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{s||(s=!0,this._remove(i))}}_remove(e){if(e.prev!==_.Undefined&&e.next!==_.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===_.Undefined&&e.next===_.Undefined?(this._first=_.Undefined,this._last=_.Undefined):e.next===_.Undefined?(this._last=this._last.prev,this._last.next=_.Undefined):e.prev===_.Undefined&&(this._first=this._first.next,this._first.prev=_.Undefined)}*[Symbol.iterator](){let e=this._first;for(;e!==_.Undefined;)yield e.element,e=e.next}}var f;!function(e){e.TAP="-xterm-gesturetap",e.CHANGE="-xterm-gesturechange",e.START="-xterm-gesturestart",e.END="-xterm-gesturesend",e.CONTEXT_MENU="-xterm-gesturecontextmenu"}(f||(t.EventType=f={}));class p extends l.Disposable{constructor(){super(),this._dispatched=!1,this._targets=new u,this._ignoreTargets=new u,this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;const e=c;this._register(h.addDisposableListener(e.document,"touchstart",e=>this._handleTouchStart(e),{passive:!1})),this._register(h.addDisposableListener(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(h.addDisposableListener(e.document,"touchmove",e=>this._handleTouchMove(e),{passive:!1}))}static addTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._targets.push(e);return(0,l.toDisposable)(t)}static ignoreTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._ignoreTargets.push(e);return(0,l.toDisposable)(t)}static isTouchDevice(){return"ontouchstart"in c||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){const t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let i=0,s=e.targetTouches.length;i=p._holdDelay&&Math.abs(n.initialPageX-d(n.rollingPageX))<30&&Math.abs(n.initialPageY-d(n.rollingPageY))<30){const e=this._newGestureEvent(f.CONTEXT_MENU,n.initialTarget);e.pageX=d(n.rollingPageX),e.pageY=d(n.rollingPageY),this._dispatchEvent(e)}else if(1===s){const t=d(n.rollingPageX),s=d(n.rollingPageY),r=d(n.rollingTimestamps)-n.rollingTimestamps[0],o=t-n.rollingPageX[0],a=s-n.rollingPageY[0],h=[...this._targets].filter(e=>n.initialTarget instanceof Node&&e.contains(n.initialTarget));this._inertia(e,h,i,Math.abs(o)/r,o>0?1:-1,t,Math.abs(a)/r,a>0?1:-1,s)}this._dispatchEvent(this._newGestureEvent(f.END,n.initialTarget)),delete this._activeTouches[o.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){const i=document.createEvent("CustomEvent");return i.initEvent(e,!1,!0),i.initialTarget=t,i.tapCount=0,i}_dispatchEvent(e){if(e.type===f.TAP){const t=(new Date).getTime();let i;i=t-this._lastSetTapCountTime>p._clearTapCountTime?1:2,this._lastSetTapCountTime=t,e.tapCount=i}else e.type!==f.CHANGE&&e.type!==f.CONTEXT_MENU||(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(const t of this._ignoreTargets)if(t.contains(e.initialTarget))return;const t=[];for(const i of this._targets)if(i.contains(e.initialTarget)){let s=0,r=e.initialTarget;for(;r&&r!==i;)s++,r=r.parentElement;t.push([s,i])}t.sort((e,t)=>e[0]-t[0]);for(const[,i]of t)i.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,i,s,r,o,n,a,l){this._handle=h.scheduleAtNextAnimationFrame(e,()=>{const h=Date.now(),c=h-i;let d=0,_=0,u=!0;s+=p._scrollFriction*c,n+=p._scrollFriction*c,s>0&&(u=!1,d=r*s*c),n>0&&(u=!1,_=a*n*c);const v=this._newGestureEvent(f.CHANGE);v.translationX=d,v.translationY=_,t.forEach(e=>e.dispatchEvent(v)),u||this._inertia(e,t,h,s,r,o+d,n,a,l+_)})}_handleTouchMove(e){const t=Date.now();for(let i=0,s=e.changedTouches.length;i3&&(r.rollingPageX.shift(),r.rollingPageY.shift(),r.rollingTimestamps.shift()),r.rollingPageX.push(s.pageX),r.rollingPageY.push(s.pageY),r.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}}t.Gesture=p,p._scrollFriction=-.005,p._holdDelay=700,p._clearTapCountTime=400,n([function(e,t,i){let s=null,r=null;if("function"==typeof i.value?(s="value",r=i.value,0!==r.length&&console.warn("Memoize should only be used in functions with zero parameters")):"function"==typeof i.get&&(s="get",r=i.get),!r||!s)throw new Error("not supported");const o=`$memoize$${t}`;i[s]=function(...e){return this.hasOwnProperty(o)||Object.defineProperty(this,o,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,e)}),this[o]}}],p,"isTouchDevice",null)},8997(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VerticalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition(),n=t.verticalHasArrows;super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(n?t.verticalScrollbarSize:0,2===t.vertical?0:t.verticalScrollbarSize,0,s.height,s.scrollHeight,o.scrollTop),visibility:t.vertical,extraScrollbarClassName:"xterm-vertical",scrollable:e,scrollByPage:t.scrollByPage}),this._arrowScrollDelta=0,this._setArrows(n,t.verticalScrollbarSize),this._createSlider(0,Math.floor((t.verticalScrollbarSize-t.verticalSliderSize)/2),t.verticalSliderSize,void 0)}_updateSlider(e,t){this.slider.setHeight(e),this.slider.setTop(t)}_renderDomNode(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._handleElementSize(e.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return t}_sliderPointerPosition(e){return e.pageY}_sliderOrthogonalPointerPosition(e){return e.pageX}_updateScrollbarSize(e){this.slider.setWidth(e)}writeScrollPosition(e,t){e.scrollTop=t}_arrowScroll(e){const t=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollTop:t.scrollTop+e})}_setArrows(e,t){if(this._arrowScrollDelta=t,!this._arrowUp||!this._arrowDown){const e=0;this._arrowUp=this._createArrow({className:"xterm-scra xterm-arrow-up",top:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})}if(this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;const i=e?"":"none";this._arrowUp.bgDomNode.style.display=i,this._arrowUp.domNode.style.display=i,this._arrowDown.bgDomNode.style.display=i,this._arrowDown.domNode.style.display=i}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){const t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}}t.VerticalScrollbar=o},7741(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nt(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseover(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_OVER,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseleave(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_LEAVE,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}}t.Widget=c},5959(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=[0,0],!0)}}},4792(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const o=i(6501),n=i(4812),a=i(8636);let h=class extends n.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 a.Emitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new d(this._optionsService))}catch{this._measureStrategy=this._register(new c(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h,t.CharSizeService=h=s([r(2,o.IOptionsService)],h);class l extends n.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 c extends l{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 l{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}}},945(e,t,i){var s,r=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},o=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(5451),a=i(8938),h=i(3055),l=i(6501);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 d=s=class{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new h.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,h,n,t,o);for(let t=0;t1){const e=this._getJoinedRanges(s,h,n,t,o);for(let t=0;tthis._screenDprMonitor.setWindow(e))),this._register(s.EventUtils.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register((0,r.addDisposableListener)(this._textarea,"focus",()=>this._isFocused=!0)),this._register((0,r.addDisposableListener)(this._textarea,"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=n;class a extends o.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this._register(new o.MutableDisposable),this._onDprChange=this._register(new s.Emitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register((0,o.toDisposable)(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,r.addDisposableListener)(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)}}},2136(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.KeyboardService=void 0;const o=i(706),n=i(7241),a=i(9249),h=i(701),l=i(6501);let c=class{constructor(e,t){this._coreService=e,this._optionsService=t}_getWin32InputMode(){return this._win32InputMode??=new a.Win32InputMode,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new n.KittyKeyboard,this._kittyKeyboard}evaluateKeyDown(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!0);const t=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(e,t,e.repeat?2:1,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):(0,o.evaluateKeyboardEvent)(e,this._coreService.decPrivateModes.applicationCursorKeys,h.isMac,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!1);const t=this._coreService.kittyKeyboard.flags;return this.useKitty&&2&t?this._getKittyKeyboard().evaluate(e,t,3,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):void 0}get useKitty(){const e=this._coreService.kittyKeyboard.flags;return!(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard||!n.KittyKeyboard.shouldUseProtocol(e))}get useWin32InputMode(){return!(!this._optionsService.rawOptions.vtExtensions?.win32InputMode||!this._coreService.decPrivateModes.win32InputMode)}};t.KeyboardService=c,t.KeyboardService=c=s([r(0,l.ICoreService),r(1,l.IOptionsService)],c)},9820(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(4812);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},8294(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseCoordsService=void 0;const o=i(4159),n=i(5251),a=i(7098);let h=class{constructor(e,t){this._charSizeService=e,this._renderService=t}getCoords(e,t,i,s,r){return(0,n.getCoords)((0,o.getWindow)(t),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,n.getCoordsRelativeToElement)((0,o.getWindow)(t),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.MouseCoordsService=h,t.MouseCoordsService=h=s([r(0,a.ICharSizeService),r(1,a.IRenderService)],h)},9784(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AltMouseCursorController=t.MouseService=void 0;const o=i(4159),n=i(6501),a=i(4812),h=i(7098),l=i(2650);let c=class{constructor(e,t,i,s,r,o,n,a,h){this._renderService=e,this._mouseCoordsService=t,this._mouseStateService=i,this._coreService=s,this._bufferService=r,this._optionsService=o,this._selectionService=n,this._logService=a,this._coreBrowserService=h,this._lastEvent=null,this._wheelPartialScroll=0,this._touchScrollAccumulator=0}bindMouse(e,t,i){const{element:s,document:r}=e,n={mouseup:null,wheel:null,mousedrag:null,mousemove:null},h={target:e,focus:i,requestedEvents:n},c={mouseup:e=>this._handleMouseUp(h,e),wheel:e=>this._handleWheel(h,e),mousedrag:e=>this._handleMouseDrag(h,e),mousemove:e=>this._handleMouseMove(h,e)};this._altMouseCursor=new d(s,r,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),t(this._altMouseCursor),t(this._mouseStateService.onProtocolChange(e=>{this._handleProtocolChange(h,c,e)})),t(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(s),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,t((0,a.toDisposable)(()=>{n.mouseup&&r.removeEventListener("mouseup",n.mouseup),n.mousedrag&&r.removeEventListener("mousemove",n.mousedrag)})),t((0,o.addDisposableListener)(s,"mousedown",e=>this._handleMouseDown(h,e))),t((0,o.addDisposableListener)(s,"wheel",e=>this._handlePassiveWheel(h,e),{passive:!1})),t(l.Gesture.addTarget(e.screenElement)),t((0,o.addDisposableListener)(e.screenElement,l.EventType.START,()=>this._handleTouchStart())),t((0,o.addDisposableListener)(e.screenElement,l.EventType.CHANGE,e=>this._handleTouchChange(h,e)))}_sendEvent(e,t){const i=this._mouseCoordsService.getMouseReportCoords(t,e.target.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(!this._mouseStateService.allowCustomWheelEvent(t))return!1;const e=t.deltaY;if(0===e)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return!1;r=e<0?0:1,s=4;break;default:return!1}if(void 0===r||void 0===s||s>4)return!1;if(4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!t.altKey)return!1;const o=4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:!o&&t.altKey,shift:t.shiftKey})}_handleMouseUp(e,t){this._sendEvent(e,t),t.buttons||(e.requestedEvents.mouseup&&e.target.document.removeEventListener("mouseup",e.requestedEvents.mouseup),e.requestedEvents.mousedrag&&e.target.document.removeEventListener("mousemove",e.requestedEvents.mousedrag))}_handleWheel(e,t){return this._sendEvent(e,t),t.preventDefault(),t.stopPropagation(),!1}_handleMouseDrag(e,t){t.buttons&&this._sendEvent(e,t)}_handleMouseMove(e,t){t.buttons||this._sendEvent(e,t)}_handleMouseDown(e,t){t.preventDefault(),e.focus(),this._mouseStateService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(t)&&(this._sendEvent(e,t),e.requestedEvents.mouseup&&e.target.document.addEventListener("mouseup",e.requestedEvents.mouseup),e.requestedEvents.mousedrag&&e.target.document.addEventListener("mousemove",e.requestedEvents.mousedrag))}_handlePassiveWheel(e,t){if(!e.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(t))return!1;if(!this._bufferService.buffer.hasScrollback){if(0===t.deltaY)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return t.preventDefault(),t.stopPropagation(),!1;const e=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(e,!0),t.preventDefault(),t.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(e,t){t.preventDefault(),t.stopPropagation(),e.requestedEvents.wheel?this._handleTouchScrollAsWheel(e,t):this._bufferService.buffer.hasScrollback?e.target.handleTouchScroll?.(t.translationY):this._handleTouchScrollAsKeys(t)}_handleTouchScrollAsKeys(e){const t=this._renderService?.dimensions.css.cell.height;if(!t)return;this._touchScrollAccumulator-=e.translationY;const i=Math.trunc(this._touchScrollAccumulator/t);if(0===i)return;this._touchScrollAccumulator-=i*t;const s=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let e=0;e0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(r*=this._bufferService.rows),r}_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,this._mouseStateService.isPixelEncoding))return!1;if(!this._mouseStateService.restrictMouseEvent(e))return!1;const t=this._mouseStateService.encodeMouseEvent(e);return t&&(this._mouseStateService.isDefaultEncoding?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.MouseService=c,t.MouseService=c=s([r(0,h.IRenderService),r(1,h.IMouseCoordsService),r(2,n.IMouseStateService),r(3,n.ICoreService),r(4,n.IBufferService),r(5,n.IOptionsService),r(6,h.ISelectionService),r(7,n.ILogService),r(8,h.ICoreBrowserService)],c);class d{constructor(e,t,i){this._element=e,this._document=t,this._isActive=i,this._listeners=new a.MutableDisposable}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;const e=new a.DisposableStore,t=e=>this.syncFromModifier(e);e.add((0,o.addDisposableListener)(this._document,"keydown",t)),e.add((0,o.addDisposableListener)(this._document,"keyup",t)),e.add((0,o.addDisposableListener)(this._element,"mousemove",t));const i=this._element.ownerDocument?.defaultView;i&&e.add((0,o.addDisposableListener)(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=e}resetClass(){this._updateClass(!1)}syncFromModifier(e){this._isActive()&&this._updateClass(e.getModifierState("Alt"))}_updateClass(e){e?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}}t.AltMouseCursorController=d},5783(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const o=i(4852),n=i(7098),a=i(4812),h=i(6168),l=i(6501),c=i(8636);let d=class extends a.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,n,l,d,u,f){super(),this._rowCount=e,this._optionsService=i,this._logService=s,this._charSizeService=r,this._coreService=n,this._coreBrowserService=u,this._renderer=this._register(new a.MutableDisposable),this._observerDisposable=this._register(new a.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 c.Emitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this._register(new c.Emitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this._register(new c.Emitter),this.onRender=this._onRender.event,this._onRefreshRequest=this._register(new c.Emitter),this.onRefreshRequest=this._onRefreshRequest.event,this._pausedResizeTask=this._register(new h.DebouncedIdleTask(this._logService)),this._renderDebouncer=new o.RenderDebouncer((e,t)=>this._renderRows(e,t),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new _(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register((0,a.toDisposable)(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(d.onResize(()=>this._fullRefresh())),this._register(d.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(d.cols,d.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(d.buffer.y,d.buffer.y,void 0,!0))),this._register(f.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.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});this._observerDisposable.value=(0,a.toDisposable)(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=i,i.observe(t)}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),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,s=!1){if(this._isPaused)return void(this._needsFullRefresh=!0);if(this._coreService.decPrivateModes.synchronizedOutput)return void this._syncOutputHandler.bufferRows(e,t);const r=this._syncOutputHandler.flush();r&&(e=Math.min(e,r.start),t=Math.max(t,r.end)),s||(this._isNextRenderRedrawOnly=!1),i?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){this._renderer.value&&(this._coreService.decPrivateModes.synchronizedOutput?this._syncOutputHandler.bufferRows(e,t):(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,e.sync,!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,t.RenderService=d=s([r(2,l.IOptionsService),r(3,l.ILogService),r(4,n.ICharSizeService),r(5,l.ICoreService),r(6,l.IDecorationService),r(7,l.IBufferService),r(8,n.ICoreBrowserService),r(9,n.IThemeService)],d);class _{constructor(e,t,i){this._coreBrowserService=e,this._coreService=t,this._onTimeout=i,this._start=0,this._end=0,this._isBuffering=!1}bufferRows(e,t){this._isBuffering?(this._start=Math.min(this._start,e),this._end=Math.max(this._end,t)):(this._start=e,this._end=t,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;const e={start:this._start,end:this._end};return this._isBuffering=!1,e}dispose(){void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}}},2079(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(e=>this._handleTrim(e)),this._register(this._bufferService.buffers.onBufferActivate(e=>this._handleBufferActivate(e))),this.enable(),this._model=new d.SelectionModel(this._bufferService),this._activeSelectionMode=0,this._register((0,u.toDisposable)(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(e=>{e.rowsChanged&&this.clearSelection()}))}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(b," ")).join(f.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())),f.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,p.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._mouseCoordsService.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,l.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 this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:f.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(2===e.button&&this.hasSelection||0!==e.button||this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){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){const t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);const i=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);i&&i.length!==this._model.selectionStart[0]&&0===i.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(!this._optionsService.rawOptions.mouseEventsRequireAlt||!this._mouseStateService.areMouseEventsActive)&&e.altKey&&!(f.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-1,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._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,c.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.value=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,o=r.lines.get(e[1]);if(!o)return;const n=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(o,e[0]),h=a;const l=e[0]-a;let c=0,d=0,_=0,u=0;if(" "===n.charAt(a)){for(;a>0&&" "===n.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(o.loadCell(t-1,this._workCell));){o.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(c++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+l-c+_,p=Math.min(this._bufferService.cols,h-a+c+d-_-u);if(t||""!==n.slice(a,h).trim()){if(i&&0===f&&32!==o.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&o.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,p+=e}}}if(s&&f+p===this._bufferService.cols&&32!==o.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&&(p+=t.length)}}return{start:f,length:p}}}_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,p.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=w,t.SelectionService=w=n([h(3,g.IBufferService),h(4,g.ICoreService),h(5,_.IMouseCoordsService),h(6,g.IOptionsService),h(7,g.IMouseStateService),h(8,_.IRenderService),h(9,_.ICoreBrowserService)],w)},7098(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.IKeyboardService=t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.IMouseCoordsService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(6201);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseCoordsService=(0,s.createDecorator)("MouseCoordsService"),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"),t.IKeyboardService=(0,s.createDecorator)("KeyboardService")},9078(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=void 0;const o=i(7174),n=i(9302),a=i(4103),h=i(4812),l=i(6501),c=i(8636),d=a.css.toColor("#ffffff"),_=a.css.toColor("#000000"),u=a.css.toColor("#ffffff"),f=_,p={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},v=d;let g=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new o.ColorContrastCache,this._halfContrastCache=new o.ColorContrastCache,this._onChangeColors=this._register(new c.Emitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:d,background:_,cursor:u,cursorAccent:f,selectionForeground:void 0,selectionBackgroundTransparent:p,selectionBackgroundOpaque:a.color.blend(_,p),selectionInactiveBackgroundTransparent:p,selectionInactiveBackgroundOpaque:a.color.blend(_,p),scrollbarSliderBackground:a.color.opacity(d,.2),scrollbarSliderHoverBackground:a.color.opacity(d,.4),scrollbarSliderActiveBackground:a.color.opacity(d,.5),overviewRulerBorder:d,ansi:n.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 t=this._colors;if(t.foreground=m(e.foreground,d),t.background=m(e.background,_),t.cursor=a.color.blend(t.background,m(e.cursor,u)),t.cursorAccent=a.color.blend(t.background,m(e.cursorAccent,f)),t.selectionBackgroundTransparent=m(e.selectionBackground,p),t.selectionBackgroundOpaque=a.color.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=m(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=a.color.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?m(e.selectionForeground,a.NULL_COLOR):void 0,t.selectionForeground===a.NULL_COLOR&&(t.selectionForeground=void 0),a.color.isOpaque(t.selectionBackgroundTransparent)){const e=.3;t.selectionBackgroundTransparent=a.color.opacity(t.selectionBackgroundTransparent,e)}if(a.color.isOpaque(t.selectionInactiveBackgroundTransparent)){const e=.3;t.selectionInactiveBackgroundTransparent=a.color.opacity(t.selectionInactiveBackgroundTransparent,e)}if(t.scrollbarSliderBackground=m(e.scrollbarSliderBackground,a.color.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=m(e.scrollbarSliderHoverBackground,a.color.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=m(e.scrollbarSliderActiveBackground,a.color.opacity(t.foreground,.5)),t.overviewRulerBorder=m(e.overviewRulerBorder,v),t.ansi=n.DEFAULT_ANSI_COLORS.slice(),t.ansi[0]=m(e.black,n.DEFAULT_ANSI_COLORS[0]),t.ansi[1]=m(e.red,n.DEFAULT_ANSI_COLORS[1]),t.ansi[2]=m(e.green,n.DEFAULT_ANSI_COLORS[2]),t.ansi[3]=m(e.yellow,n.DEFAULT_ANSI_COLORS[3]),t.ansi[4]=m(e.blue,n.DEFAULT_ANSI_COLORS[4]),t.ansi[5]=m(e.magenta,n.DEFAULT_ANSI_COLORS[5]),t.ansi[6]=m(e.cyan,n.DEFAULT_ANSI_COLORS[6]),t.ansi[7]=m(e.white,n.DEFAULT_ANSI_COLORS[7]),t.ansi[8]=m(e.brightBlack,n.DEFAULT_ANSI_COLORS[8]),t.ansi[9]=m(e.brightRed,n.DEFAULT_ANSI_COLORS[9]),t.ansi[10]=m(e.brightGreen,n.DEFAULT_ANSI_COLORS[10]),t.ansi[11]=m(e.brightYellow,n.DEFAULT_ANSI_COLORS[11]),t.ansi[12]=m(e.brightBlue,n.DEFAULT_ANSI_COLORS[12]),t.ansi[13]=m(e.brightMagenta,n.DEFAULT_ANSI_COLORS[13]),t.ansi[14]=m(e.brightCyan,n.DEFAULT_ANSI_COLORS[14]),t.ansi[15]=m(e.brightWhite,n.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const i=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;ssetTimeout(t,e))},t.disposableTimeout=function(e,t=0,i){const r=setTimeout(()=>{e(),i&&o.dispose()},t),o=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(o),o};const s=i(4812);t.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}},t.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}},t.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(e,t,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{e()},t);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},5639(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(4812),r=i(8636);class o extends s.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this._register(new r.Emitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this._register(new r.Emitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this._register(new r.Emitter),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>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(n||(t.channels=n={})),function(e){function t(e,t){return o=Math.round(255*t),[i,s,r]=c.toChannels(e.rgba),{css:n.toCss(i,s,r,o),rgba:n.toRgba(i,s,r,o)}}e.blend=function(e,t){if(o=(255&t.rgba)/255,1===o)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),{css:n.toCss(i,s,r),rgba:n.toRgba(i,s,r)}},e.isOpaque=function(e){return!(255&~e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=c.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return n.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=c.toChannels(t),{css:n.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return o=255&e.rgba,t(e,o*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),n.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),o=parseInt(e.slice(4,5).repeat(2),16),n.toColor(i,s,r,o);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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),o=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),n.toColor(i,s,r,o);if("transparent"===e)return{css:"transparent",rgba:0};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,o]=t.getImageData(0,0,1,1).data,255!==o)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(i,s,r,o),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(l||(t.rgb=l={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c>>0}e.blend=function(e,t){if(o=(255&t)/255,1===o)return t;const a=t>>24&255,h=t>>16&255,l=t>>8&255,c=e>>24&255,d=e>>16&255,_=e>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),n.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=l.relativeLuminance(e>>8),o=l.relativeLuminance(i>>8);if(_(r,o)>8));if(n_(r,l.relativeLuminance(t>>8))?o:t}return o}const n=a(e,i,s),h=_(r,l.relativeLuminance(n>>8));if(h_(r,l.relativeLuminance(o>>8))?n:o}return n}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(c||(t.rgba=c={}))},5777(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(6501),r=i(6025),o=i(7276),n=i(9640),a=i(56),h=i(4071),l=i(6478),c=i(7428),d=i(6415),_=i(5746),u=i(5882),f=i(2486),p=i(3562),v=i(8811),g=i(8636),m=i(4812);let S=!1;class b extends m.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new g.Emitter),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 m.MutableDisposable),this._onBinary=this._register(new g.Emitter),this.onBinary=this._onBinary.event,this._onData=this._register(new g.Emitter),this.onData=this._onData.event,this._onLineFeed=this._register(new g.Emitter),this.onLineFeed=this._onLineFeed.event,this._onRender=this._register(new g.Emitter),this.onRender=this._onRender.event,this._onResize=this._register(new g.Emitter),this.onResize=this._onResize.event,this._onWriteParsed=this._register(new g.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this._register(new g.Emitter),this._instantiationService=new r.InstantiationService,this.optionsService=this._register(new a.OptionsService(e)),this._instantiationService.setService(s.IOptionsService,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(s.ILogService,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(n.BufferService)),this._instantiationService.setService(s.IBufferService,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(h.CoreService)),this._instantiationService.setService(s.ICoreService,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(l.MouseStateService)),this._instantiationService.setService(s.IMouseStateService,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(d.UnicodeService)),this.unicodeService.register(new c.UnicodeV6),this._instantiationService.setService(s.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(_.CharsetService),this._instantiationService.setService(s.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(v.OscLinkService),this._instantiationService.setService(s.IOscLinkService,this._oscLinkService),this._inputHandler=this._register(new f.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(g.EventUtils.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(g.EventUtils.forward(this._bufferService.onResize,this._onResize)),this._register(g.EventUtils.forward(this.coreService.onData,this._onData)),this._register(g.EventUtils.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),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(g.EventUtils.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=s.LogLevelEnum.WARN&&!S&&(this._logService.warn("writeSync is unreliable and will be removed soon."),S=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.backend&&void 0!==t.buildNumber&&(e=!!("conpty"===t.backend&&t.buildNumber<21376)),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(u.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>((0,u.updateWindowsModeWrappedState)(this._bufferService),!1))),this._windowsWrappingHeuristics.value=(0,m.toDisposable)(()=>{for(const t of e)t.dispose()})}}}t.CoreTerminal=b},8636(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const s=i(4812);var r;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:e,thisArgs:t};this._listeners.push(r);const o=(0,s.toDisposable)(()=>{const e=this._listeners.indexOf(r);-1!==e&&this._listeners.splice(e,1)});return i&&(Array.isArray(i)?i.push(o):i.add(o)),o}),this._event}fire(e){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{const{fn:t,thisArgs:i}=this._listeners[0];return void t.call(i,e)}default:{const t=this._listeners.slice();for(const{fn:i,thisArgs:s}of t)i.call(s,e)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},function(e){e.forward=function(e,t){return e(e=>t.fire(e))},e.map=function(e,t){return(i,s,r)=>e(e=>i.call(s,t(e)),void 0,r)},e.any=function(...e){return(t,i,r)=>{const o=new s.DisposableStore;for(const s of e)o.add(s(e=>t.call(i,e)));return r&&(Array.isArray(r)?r.push(o):r.add(o)),o}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(r||(t.EventUtils=r={}))},2486(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0,t.isValidColorIndex=x;const o=i(6760),n=i(6717),a=i(4812),h=i(726),l=i(6107),c=i(8938),d=i(3055),_=i(5451),u=i(6501),f=i(6415),p=i(1346),v=i(9823),g=i(2607),m=i(8693),S=i(8636),b=i(7804),w={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function y(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 C;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(C||(t.WindowsOptionsReportType=C={}));let k=0;class D extends a.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,a,c,d,_=new n.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=a,this._mouseStateService=c,this._unicodeService=d,this._parser=_,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new h.StringToUtf32,this._utf8Decoder=new h.Utf8ToUtf32,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 S.Emitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this._register(new S.Emitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this._register(new S.Emitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this._register(new S.Emitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this._register(new S.Emitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this._register(new S.Emitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this._register(new S.Emitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this._register(new S.Emitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this._register(new S.Emitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this._register(new S.Emitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this._register(new S.Emitter),this.onScroll=this._onScroll.event,this._onTitleChange=this._register(new S.Emitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this._register(new S.Emitter),this.onColor=this._onColor.event,this._onRequestColorSchemeQuery=this._register(new S.Emitter),this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 E(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.setApcHandlerFallback((e,t,i)=>{this._logService.debug("Unknown APC 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.scrollDown(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({prefix:">",final:"q"},e=>this.sendXtVersion(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.registerCsiHandler({prefix:"=",final:"u"},e=>this.kittyKeyboardSet(e)),this._parser.registerCsiHandler({prefix:"?",final:"u"},e=>this.kittyKeyboardQuery(e)),this._parser.registerCsiHandler({prefix:">",final:"u"},e=>this.kittyKeyboardPush(e)),this._parser.registerCsiHandler({prefix:"<",final:"u"},e=>this.kittyKeyboardPop(e)),this._parser.setExecuteHandler("",()=>this.bell()),this._parser.setExecuteHandler("\n",()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler("\t",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("„",()=>this.index()),this._parser.setExecuteHandler("…",()=>this.nextLine()),this._parser.setExecuteHandler("ˆ",()=>this.tabSet()),this._parser.registerOscHandler(0,new p.OscHandler(e=>(this.setTitle(e),this.setIconName(e),!0))),this._parser.registerOscHandler(1,new p.OscHandler(e=>this.setIconName(e))),this._parser.registerOscHandler(2,new p.OscHandler(e=>this.setTitle(e))),this._parser.registerOscHandler(4,new p.OscHandler(e=>this.setOrReportIndexedColor(e))),this._parser.registerOscHandler(8,new p.OscHandler(e=>this.setHyperlink(e))),this._parser.registerOscHandler(10,new p.OscHandler(e=>this.setOrReportFgColor(e))),this._parser.registerOscHandler(11,new p.OscHandler(e=>this.setOrReportBgColor(e))),this._parser.registerOscHandler(12,new p.OscHandler(e=>this.setOrReportCursorColor(e))),this._parser.registerOscHandler(104,new p.OscHandler(e=>this.restoreIndexedColor(e))),this._parser.registerOscHandler(110,new p.OscHandler(e=>this.restoreFgColor(e))),this._parser.registerOscHandler(111,new p.OscHandler(e=>this.restoreBgColor(e))),this._parser.registerOscHandler(112,new p.OscHandler(e=>this.restoreCursorColor(e))),this._parser.registerEscHandler({final:"7"},()=>this.saveCursor()),this._parser.registerEscHandler({final:"8"},()=>this.restoreCursor()),this._parser.registerEscHandler({final:"D"},()=>this.index()),this._parser.registerEscHandler({final:"E"},()=>this.nextLine()),this._parser.registerEscHandler({final:"H"},()=>this.tabSet()),this._parser.registerEscHandler({final:"M"},()=>this.reverseIndex()),this._parser.registerEscHandler({final:"="},()=>this.keypadApplicationMode()),this._parser.registerEscHandler({final:">"},()=>this.keypadNumericMode()),this._parser.registerEscHandler({final:"c"},()=>this.fullReset()),this._parser.registerEscHandler({final:"n"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"o"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"|"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"}"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"~"},()=>this.setgLevel(1)),this._parser.registerEscHandler({intermediates:"%",final:"@"},()=>this.selectDefaultCharset()),this._parser.registerEscHandler({intermediates:"%",final:"G"},()=>this.selectDefaultCharset());for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},()=>this.selectCharset("("+e)),this._parser.registerEscHandler({intermediates:")",final:e},()=>this.selectCharset(")"+e)),this._parser.registerEscHandler({intermediates:"*",final:e},()=>this.selectCharset("*"+e)),this._parser.registerEscHandler({intermediates:"+",final:e},()=>this.selectCharset("+"+e)),this._parser.registerEscHandler({intermediates:"-",final:e},()=>this.selectCharset("-"+e)),this._parser.registerEscHandler({intermediates:".",final:e},()=>this.selectCharset("."+e)),this._parser.registerEscHandler({intermediates:"/",final:e},()=>this.selectCharset("/"+e));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(e=>(this._logService.error("Parsing error: ",e),e)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new v.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){if(this._logService.logLevel<=u.LogLevelEnum.WARN){let t;const i=new Promise((e,i)=>{t=setTimeout(()=>i("#SLOW_TIMEOUT"),5e3)});Promise.race([e,i]).then(()=>{void 0!==t&&clearTimeout(t)},e=>{if(void 0!==t&&clearTimeout(t),"#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,o=0;const n=this._parseStack.paused;if(n){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>131072&&(o=this._parseStack.position+131072)}if(this._logService.logLevel<=u.LogLevelEnum.DEBUG&&this._logService.debug("parsing data "+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,e=>String.fromCharCode(e)).join("")}"`)),this._logService.logLevel===u.LogLevelEnum.TRACE&&this._logService.trace("parsing data (codes)","string"==typeof e?e.split("").map(e=>e.charCodeAt(0)):e),this._parseBuffer.length131072)for(let t=o;t0&&2===p.getWidth(this._activeBuffer.x-1)&&p.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(d){const e=p;let t=this._activeBuffer.x-m;if(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),p=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!p)return;for(m>0&&p instanceof l.BufferLine&&p.copyCellsFrom(e,t,0,m,!1);t=0;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(_&&(p.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===p.getWidth(a-1)&&p.setCellFromCodepoint(a-1,c.NULL_CELL_CODE,c.NULL_CELL_WIDTH,u)),p.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===p.getWidth(this._activeBuffer.x)&&!p.hasContent(this._activeBuffer.x)&&p.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=>!y(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new v.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new g.ApcHandler(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 o=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);o&&(o.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(o.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){const e=this._activeBuffer.lines.get(i+1);e&&(e.isWrapped=!1)}for(;i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(i=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,i-1);i--;){const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+i);if(e?.getTrimmedLength())break}for(;i>=0;i--)this._bufferService.scroll(this._eraseAttrData())}else{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("[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`P>|xterm.js(${b.XTERM_VERSION})\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(o.triggerDataEvent(`[${t?"":"?"}${e};${i}$y`),!0),_=e=>e?1:2,u=e.params[0];return t?d(u,2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(c.convertEol):0):1===u?d(u,_(i.applicationCursorKeys)):3===u?d(u,c.windowOptions.setWinLines?80===a?2:132===a?1:0:0):6===u?d(u,_(i.origin)):7===u?d(u,_(i.wraparound)):8===u?d(u,3):9===u?d(u,_("X10"===s)):12===u?d(u,_(c.cursorBlink)):25===u?d(u,_(!o.isCursorHidden)):45===u?d(u,_(i.reverseWraparound)):66===u?d(u,_(i.applicationKeypad)):67===u?d(u,4):1e3===u?d(u,_("VT200"===s)):1002===u?d(u,_("DRAG"===s)):1003===u?d(u,_("ANY"===s)):1004===u?d(u,_(i.sendFocus)):1005===u?d(u,4):1006===u?d(u,_("SGR"===r)):1015===u?d(u,4):1016===u?d(u,_("SGR_PIXELS"===r)):1048===u?d(u,1):47===u||1047===u||1049===u?d(u,_(h===l)):2004===u?d(u,_(i.bracketedPasteMode)):2026===u?d(u,_(i.synchronizedOutput)):9001===u&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?d(u,_(i.win32InputMode)):d(u,0)}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=_.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-67108864,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,o=0;do{if(s[o+r]=e.params[t+o],e.hasSubParams(t+o)){const i=e.getSubParams(t+o);let n=0;do{5===s[1]&&(r=1),s[o+n+1+r]=i[n]}while(++n=2||2===s[1]&&o+r>=5)break;s[1]&&(r=1)}while(++o+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&=-67108864,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-67108864,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-67108864,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-67108864,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:221===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.fg&=-134217729:222===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.bg&=-134217729:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("");break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[${e};${t}R`)}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[?${e};${t}R`);break;case 15:case 25:case 26:case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??1)&&this._onRequestColorSchemeQuery.fire()}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=0===e.length?1:e.params[0];if(0===t)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar"}const e=t%2==1;this._coreService.decPrivateModes.cursorBlink=e}return!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(!y(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(C.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(C.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`[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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let e=0;e1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e,10);if(x(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.indexOf(";");if(-1===t)return!0;const i=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(i,s):!i.trim()&&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,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=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 d.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(`${e}\\`),!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)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(i){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;return s.length>=16&&s.shift(),s.push(i.flags),i.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=Math.max(1,e.params[0]||1),i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;for(let e=0;e0;e++)i.flags=s.pop();return 0===s.length&&t>0&&(i.flags=0),!0}}t.InputHandler=D;let E=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&&(k=e,e=t,t=k),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function x(e){return 0<=e&&e<256}E=s([r(0,u.IBufferService)],E)},4812(e,t){function i(e){return{dispose:e}}function s(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=s,t.combinedDisposable=function(...e){return i(()=>s(e))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=r;class o{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=o,o.None=Object.freeze({dispose(){}}),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}}},7710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},701(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isMac=t.isSafari=t.isLegacyEdge=t.isChrome=t.isFirefox=t.isNode=void 0,t.getZoomFactor=function(e){return 1},t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1],10)},t.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isChrome=i.includes("Chrome"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},3087(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;const s=i(6168);let r=0;t.SortedList=class{constructor(e,t){this._getKey=e,this._array=[],this._insertedValues=[],this._isFlushingInserted=!1,this._deletedIndices=[],this._isFlushingDeleted=!1,this._flushInsertedTask=new s.IdleTaskQueue(t),this._flushDeletedTask=new s.IdleTaskQueue(t)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(e){this._flushCleanupDeleted(),0===this._insertedValues.length&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(e)}_flushInserted(){const e=this._insertedValues.sort((e,t)=>this._getKey(e)-this._getKey(t));let t=0,i=0;const s=new Array(this._array.length+this._insertedValues.length);for(let r=0;r=this._array.length||this._getKey(e[t])<=this._getKey(this._array[i])?(s[r]=e[t],t++):s[r]=this._array[i++];this._array=s,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(e){if(this._flushCleanupInserted(),0===this._array.length)return!1;const t=this._getKey(e);return void 0!==t&&(!!this._deleteAtKey(e,t)||0!==this._deletedIndices.length&&(this._flushCleanupDeleted(),this._deleteAtKey(e,t)))}_deleteAtKey(e,t){if(r=this._search(t),-1===r)return!1;if(this._getKey(this._array[r])!==t)return!1;do{if(this._array[r]===e)return 0===this._deletedIndices.length&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(r),!0}while(++re-t);let t=0;const i=new Array(this._array.length-e.length);let s=0;for(let r=0;r0&&this._flushDeletedTask.flush()}*getKeyIterator(e){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),0!==this._array.length&&(r=this._search(e),!(r<0||r>=this._array.length)&&this._getKey(this._array[r])===e))do{yield this._array[r]}while(++r=this._array.length)&&this._getKey(this._array[r])===e))do{t(this._array[r])}while(++r=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}}},4220(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LimitedStringBuilder=t.StringBuilder=void 0;class i{constructor(){this._chunks=[],this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(e){this._chunks.push(e),this._length+=e.length}toString(){return this._chunks.join("")}}t.StringBuilder=i,t.LimitedStringBuilder=class{constructor(e){this._limit=e,this._builder=new i}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(e){return this._builder.append(e),this._builder.length>this._limit&&(this._builder.reset(),!0)}toString(){return this._builder.toString()}}},6168(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;class i{constructor(e){this._tasks=[],this._i=0,this._logService=e}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ii)return r-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-t))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}}t.PriorityTaskQueue=s,t.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:s,t.DebouncedIdleTask=class{constructor(e){this._queue=new t.IdleTaskQueue(e)}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},7804(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.XTERM_VERSION=void 0,t.XTERM_VERSION="6.1.0-beta.287"},5882(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),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)};const s=i(8938)},5451(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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(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},1073(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(5639),r=i(4812),o=i(6168),n=i(5451),a=i(6107),h=i(3326),l=i(732),c=i(3055),d=i(8938),_=i(8158),u=i(6760);t.MAX_BUFFER_SIZE=4294967295;class f extends r.Disposable{constructor(e,t,i,n){super(),this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this._logService=n,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=a.DEFAULT_ATTR_DATA.clone(),this.savedCharset=u.DEFAULT_CHARSET,this.savedCharsets=[],this.savedGlevel=0,this.savedOriginMode=!1,this.savedWraparoundMode=!0,this.markers=[],this._nullCell=c.CellData.fromCharData([0,d.NULL_CELL_CHAR,d.NULL_CELL_WIDTH,d.NULL_CELL_CODE]),this._whitespaceCell=c.CellData.fromCharData([0,d.WHITESPACE_CELL_CHAR,d.WHITESPACE_CELL_WIDTH,d.WHITESPACE_CELL_CODE]),this._isClearing=!1,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(),this._memoryCleanupQueue=new o.IdleTaskQueue(this._logService),this._register((0,r.toDisposable)(()=>this._memoryCleanupQueue.clear())),this._register((0,r.toDisposable)(()=>this.clearAllMarkers())),this._stringCache=this._register(new h.BufferLineStringCache)}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 a.BufferLine(this._stringCache,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){e??=a.DEFAULT_ATTR_DATA;let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this._stringCache.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(a.DEFAULT_ATTR_DATA);this._stringCache.clear();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+o+1?(this.ybase--,o++,this.ydisp>0&&this.ydisp--):this.lines.push(new a.BufferLine(this._stringCache,e,i,!1)));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),o&&(this.y+=o),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;t0){const e=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,e)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._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}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=this._optionsService.rawOptions.reflowCursorLine,s=(0,l.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(a.DEFAULT_ATTR_DATA),i);if(s.length>0){const i=(0,l.reflowLargerCreateNewLayout)(this.lines,s);(0,l.reflowLargerApplyNewLayout)(this.lines,i.layout),this._reflowLargerAdjustViewport(e,t,i.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(a.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);if(!i){const e=this.ybase+this.y;if(e>=n&&e0&&(r.push({start:n+c.length+o,newLines:p}),o+=p.length),c.push(...p);let v=_.length-1,g=_[v];0===g&&(v--,g=_[v]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[v])break;if(c[v].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(v--,g=_[v]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,l.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;l--)if(a&&a.start>s+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(l--,a.newLines[e]);l++,e.push({index:s+1,amount:a.newLines.length}),h+=a.newLines.length,a=r[++n]}else this.lines.set(l,t[s--]);let l=0;for(let t=e.length-1;t>=0;t--)e[t].index+=l,this.lines.onInsertEmitter.fire(e[t]),l+=e[t].amount;const c=Math.max(0,i+o-this.lines.maxLength);c>0&&this.lines.onTrimEmitter.fire(c)}}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(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)}}t.Buffer=f},6107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(5451),r=i(3055),o=i(8938),n=i(726),a=i(4220);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let h=0;const l=new r.CellData,c=new a.StringBuilder;class d{constructor(e,t,i,s=!1){this._stringCache=e,this.isWrapped=s,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*t);const n=i??r.CellData.fromCharData([0,o.NULL_CELL_CHAR,o.NULL_CELL_WIDTH,o.NULL_CELL_CODE]);for(let e=0;e>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._invalidateStringCache(),this._data[3*e+1]=t[o.CHAR_DATA_ATTR_INDEX],t[o.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[o.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[o.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[o.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,n.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,i){return h=3*e,i.content=this._data[h+0],i.fg=this._data[h+1],i.bg=this._data[h+2],2097152&i.content?i.combinedData=this._combined[e]:i.combinedData="",268435456&i.bg?i.extended=this._extendedAttrs[e]:i.extended=t.DEFAULT_ATTR_DATA.extended.clone(),i}setCell(e,t){this._invalidateStringCache(),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){this._invalidateStringCache(),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){this._invalidateStringCache();let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,n.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,n.stringFromCodePoint)(2097151&s)+(0,n.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(this._invalidateStringCache(),(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,l));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){this._invalidateStringCache();const o=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]=o[3*(t+r)+e];this._copyCellMapsFrom(e,t+r,i+r)}else for(let r=0;r>22||1}s&&s.push(t);const h=c.toString();if(c.reset(),r){const t=this._getStringCacheEntry(!0);t.value=h,t.isTrimmed=!!e}return h}_getStringCacheEntry(e){const t=this._stringCacheEntryRef?.deref();if(t&&t.generation===this._stringCache.generation)return t;if(!e)return;const i=this._stringCache.allocateEntry();return this._stringCacheEntryRef=new WeakRef(i),i}_invalidateStringCache(){const e=this._getStringCacheEntry(!1);e&&(e.value=void 0,e.isTrimmed=!1)}_copyCellMapsFrom(e,t,i){const s=3*t;2097152&e._data[s+0]&&(this._combined[i]=e._combined[t]),268435456&e._data[s+2]&&(this._extendedAttrs[i]=e._extendedAttrs[t])}_copySparseMapsFrom(e){this._combined={},this._extendedAttrs={};for(let t=0;tthis.entries.clear()))}touch(){this._scheduleClear()}allocateEntry(){const e={value:void 0,isTrimmed:!1,generation:this.generation};return this.entries.add(e),this._scheduleClear(),e}clear(){this._clearTimeout.clear(),this._lastAccessTimestamp=0,this.generation++;for(const e of this.entries)e.value=void 0,e.isTrimmed=!1;this.entries.clear()}_scheduleClear(){this._lastAccessTimestamp=Date.now(),this._clearTimeout.value||this._scheduleClearTimeout(15e3)}_scheduleClearTimeout(e){this._clearTimeout.value=(0,s.disposableTimeout)(()=>{const e=Date.now()-this._lastAccessTimestamp;e>=15e3?this.clear():this._scheduleClearTimeout(15e3-e)},e)}}t.BufferLineStringCache=o},9384(e,t){Object.defineProperty(t,"__esModule",{value:!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)}},732(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.reflowLargerGetLinesToRemove=function(e,t,s,r,o,n){const a=[];for(let h=0;h=h&&r0&&(e>_||0===d[e].getTrimmedLength());e--)v++;v>0&&(a.push(h+d.length-v),a.push(v)),h+=d.length-1}return a},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],o=0;for(let n=0;nl&&(n-=l,a++);const c=2===e[a].getWidth(n-1);c&&n--;const d=c?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},4097(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(4812),r=i(1073),o=i(8636);class n extends s.Disposable{constructor(e,t,i){super(),this._optionsService=e,this._bufferService=t,this._logService=i,this._normalBuffer=this._register(new s.MutableDisposable),this._altBuffer=this._register(new s.MutableDisposable),this._onBufferActivate=this._register(new o.Emitter),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 r.Buffer(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new r.Buffer(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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=n},3055(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(726),r=i(8938),o=i(5451);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=n},8938(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=t.DEFAULT_COLOR<<9|256,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},8158(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(4812),r=i(8636);class o{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=o._nextId++,this._onDispose=this.register(new r.Emitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,s.dispose)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=o,o._nextId=1},6760(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["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},706(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=function(e,t,s,r){const o={type:0,cancel:!1,key:void 0},n=(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?"OA":"":"UIKeyInputLeftArrow"===e.key?o.key=t?"OD":"":"UIKeyInputRightArrow"===e.key?o.key=t?"OC":"":"UIKeyInputDownArrow"===e.key&&(o.key=t?"OB":"");break;case 8:o.key=e.ctrlKey?"\b":"",e.altKey&&(o.key=""+o.key);break;case 9:if(e.shiftKey){o.key="";break}o.key="\t",o.cancel=!0;break;case 13:"c"===e.key&&e.ctrlKey?o.key="":o.key=e.altKey?"\r":"\r",o.cancel=!0;break;case 27:o.key="",e.altKey&&(o.key=""),o.cancel=!0;break;case 37:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"D":t?"OD":"";break;case 39:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"C":t?"OC":"";break;case 38:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"A":t?"OA":"";break;case 40:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"B":t?"OB":"";break;case 45:e.shiftKey||e.ctrlKey||(o.key="[2~");break;case 46:o.key=n?"[3;"+(n+1)+"~":"[3~";break;case 36:o.key=n?"[1;"+(n+1)+"H":t?"OH":"";break;case 35:o.key=n?"[1;"+(n+1)+"F":t?"OF":"";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key="[5;"+(n+1)+"~":o.key="[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key="[6;"+(n+1)+"~":o.key="[6~";break;case 112:o.key=n?"[1;"+(n+1)+"P":"OP";break;case 113:o.key=n?"[1;"+(n+1)+"Q":"OQ";break;case 114:o.key=n?"[1;"+(n+1)+"R":"OR";break;case 115:o.key=n?"[1;"+(n+1)+"S":"OS";break;case 116:o.key=n?"[15;"+(n+1)+"~":"[15~";break;case 117:o.key=n?"[17;"+(n+1)+"~":"[17~";break;case 118:o.key=n?"[18;"+(n+1)+"~":"[18~";break;case 119:o.key=n?"[19;"+(n+1)+"~":"[19~";break;case 120:o.key=n?"[20;"+(n+1)+"~":"[20~";break;case 121:o.key=n?"[21;"+(n+1)+"~":"[21~";break;case 122:o.key=n?"[23;"+(n+1)+"~":"[23~";break;case 123:o.key=n?"[24;"+(n+1)+"~":"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(s&&!r||!e.altKey||e.metaKey)if(!s||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey){if(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length)o.key=e.key;else if(e.key&&e.ctrlKey&&e.shiftKey)switch(e.code){case"Minus":o.key="";break;case"Digit2":o.key="\0";break;case"Digit6":o.key=""}}else 65===e.keyCode&&(o.type=1);else{const t=i[e.keyCode],s=t?.[e.shiftKey?1:0];if(s)o.key=""+s;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=""+i}else if(32===e.keyCode)o.key=""+(e.ctrlKey?"\0":" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=""+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key="\0":e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key="":"/"===e.key?o.key="":219===e.keyCode?o.key="":220===e.keyCode?o.key="":221===e.keyCode&&(o.key="")}return o};const i={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:["'",'"']}},7241(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyKeyboard=void 0,t.KittyKeyboard=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440},this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24},this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"},this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(e){if(e.code.startsWith("Numpad")){const t=e.code.slice(6);if(t>="0"&&t<="9")return 57399+parseInt(t,10);switch(t){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(e){switch(e.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(e){let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4),e.metaKey&&(t|=8),t>0?t+1:0}_getKeyCode(e,t){const i=this._getNumpadKeyCode(e);if(void 0!==i)return i;const s=this._getModifierKeyCode(e);if(void 0!==s)return s;const r=this._functionalKeyCodes[e.key];if(void 0!==r)return r;if((e.shiftKey||t&&e.altKey)&&e.code){if(e.code.startsWith("Digit")&&6===e.code.length){const t=e.code.charAt(5);if(t>="0"&&t<="9")return t.charCodeAt(0)}if(e.code.startsWith("Key")&&4===e.code.length)return e.code.charAt(3).toLowerCase().charCodeAt(0)}if(1===e.key.length){const t=e.key.codePointAt(0);return t>=65&&t<=90?t+32:t}}_isModifierKey(e){return"Shift"===e.key||"Control"===e.key||"Alt"===e.key||"Meta"===e.key}_isLockKey(e){return"CapsLock"===e.key||"NumLock"===e.key||"ScrollLock"===e.key}_buildCsiLetterSequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"["+e}_buildSs3Sequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"O"+e}_buildCsiTildeSequence(e,t,i,s){const r=s&&1!==i;let o="["+e;return(t>0||r)&&(o+=";"+(t>0?t:"1"),r&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(e,t,i,s,r,o,n){const a=!!(2&r);let h,l="["+t;4&r&&e.shiftKey&&1===e.key.length&&!o&&!n&&(h=e.key.codePointAt(0),l+=":"+h);const c=16&r&&3!==s&&1===e.key.length&&!o&&!n&&!e.ctrlKey?e.key.codePointAt(0):void 0,d=a&&1!==s&&(3===s||void 0===c);return(i>0||d||void 0!==c)&&(l+=";",i>0?l+=i:d&&(l+="1"),d&&(l+=":"+s)),void 0!==c&&(l+=";"+c),l+="u",l}evaluate(e,t,i=1,s=!1){const r={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(e),n=this._isModifierKey(e),a=!!(2&t);if(!a&&3===i)return r;if(n&&!(8&t))return r;if(this._isLockKey(e)&&!(8&t))return r;const h=this._csiLetterKeys[e.key];if(h)return r.key=this._buildCsiLetterSequence(h,o,i,a),r.cancel=!0,r;const l=this._ss3FunctionKeys[e.key];if(l)return r.key=this._buildSs3Sequence(l,o,i,a),r.cancel=!0,r;const c=this._csiTildeKeys[e.key];if(void 0!==c)return r.key=this._buildCsiTildeSequence(c,o,i,a),r.cancel=!0,r;const d=this._getKeyCode(e,s);if(void 0===d)return r;const _=13===d||9===d||127===d;if(_&&3===i&&!(8&t))return r;const u=void 0!==this._functionalKeyCodes[e.key]||void 0!==this._getNumpadKeyCode(e);if(8&t||a&&3===i||(1&t||a)&&(u&&!_||o>0&&1!==e.key.length||o-1>1))r.key=this._buildCsiUSequence(e,d,o,i,t,u,n),r.cancel=!0;else{const t=13===d?"\r":9===d?"\t":127===d?"":void 0;t?r.key=t:1!==e.key.length||e.ctrlKey||e.altKey||e.metaKey||(r.key=e.key)}return r}static shouldUseProtocol(e){return e>0}}},726(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 o=r;o=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n);continue}65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=this.interim[++n])&&n<4;)r<<=6,r|=63&o;const a=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=a-n;for(;l=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===a?r<128?l--:t[h++]=r:3===a?r<2048||r>=55296&&r<=57343||65279===r||(t[h++]=r):r<65536||r>1114111||(t[h++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(a=(31&s)<<6|63&r,a<128){d--;continue}t[h++]=a}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(a=(15&s)<<12|(63&r)<<6|63&o,a<2048||a>=55296&&a<=57343||65279===a)continue;t[h++]=a}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,h;if(n=e[d++],128!=(192&n)){d--;continue}if(a=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,a<65536||a>1114111)continue;t[h++]=a}}return h}}},7428(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(6415),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]],o=[[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 n;t.UnicodeV6=class{constructor(){if(this.version="6",!n){n=new Uint8Array(65536),n.fill(1),n[0]=0,n.fill(0,1,32),n.fill(0,127,160),n.fill(2,4352,4448),n[9001]=2,n[9002]=2,n.fill(2,11904,42192),n[12351]=1,n.fill(2,44032,55204),n.fill(2,63744,64256),n.fill(2,65040,65050),n.fill(2,65072,65136),n.fill(2,65280,65377),n.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)}}},9249(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Win32InputMode=void 0,t.Win32InputMode=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226},this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40},this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]),this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(e){const t=this._codeToVk[e.code];return void 0!==t?t:e.keyCode||0}_getScanCode(e){return this._codeToScancode[e.code]||0}_getUnicodeChar(e){if(e.ctrlKey&&!e.altKey&&!e.metaKey){if("Enter"===e.key)return 10;if("Backspace"===e.key)return 127}const t=this._keyToControlChar[e.key];if(void 0!==t)return t;if(1===e.key.length){const t=e.key.codePointAt(0)||0;if(e.ctrlKey&&!e.altKey&&!e.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(e){let t=0;return e.shiftKey&&(t|=16),e.ctrlKey&&("ControlRight"===e.code?t|=4:t|=8),e.altKey&&("AltRight"===e.code?t|=1:t|=2),this._enhancedKeyCodes.has(e.code)&&(t|=256),t}evaluateKeyboardEvent(e,t){return{type:0,cancel:!0,key:`[${this._getVirtualKeyCode(e)};${this._getScanCode(e)};${this._getUnicodeChar(e)};${t?1:0};${this._getControlKeyState(e)};1_`}}}},3562(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(3132),r=i(4812),o=i(8636);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._innerWriteTimer=this._register(new s.TimeoutTimer),this._onWriteParsed=this._register(new o.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._register((0,r.toDisposable)(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed)return;if(this._isSyncWriting)return;let e;this._isSyncWriting=!0;let t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);const i=this._callbacks.shift();i&&i()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;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._store.isDisposed){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();this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;const i=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>{this._store.isDisposed||(performance.now()-i>=12?this._scheduleInnerWrite(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,performance.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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},8693(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(t.startsWith("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(t.startsWith("#")&&(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,o]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(o,t)}`};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}}},2607(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ApcHandler=t.ApcParser=void 0;const s=i(726),r=i(4220),o=[];t.ApcParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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].end(!1);this._stack.paused=!1,this._active=o,this._ident=0}start(e){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].start();else this._handlerFb(this._ident,"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._ident,"PUT",(0,s.utf32ToString)(e,t,i))}end(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].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._ident,"END",e);this._active=o,this._ident=0}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.ApcHandler=n,n._payloadLimit=1e7},9823(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(726),r=i(7262),o=i(4220),n=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=n,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}registerHandler(e,t){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=n,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||n,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=n,this._ident=0}};const a=new r.Params;a.addParam(0);class h{constructor(e){this._handler=e,this._data=new o.LimitedStringBuilder(h._payloadLimit),this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString(),this._params),t instanceof Promise))return t.then(e=>(this._params=a,this._data.reset(),this._hitLimit=!1,e));return this._params=a,this._data.reset(),this._hitLimit=!1,t}}t.DcsHandler=h,h._payloadLimit=1e7},6717(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(4812),r=i(7262),o=i(1346),n=i(9823),a=i(2607);class h{constructor(e){this.table=new Uint16Array(e)}setDefault(e,t){this.table.fill(e<<8|t)}add(e,t,i,s){this.table[t<<8|e]=i<<8|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 o=i(0,17);e.setDefault(1,0),e.addMany(s,0,2,0);for(const t of o)e.addMany([24,26,153,154],t,3,0),e.addMany(i(128,144),t,3,0),e.addMany(i(144,152),t,3,0),e.add(156,t,0,0),e.add(27,t,11,1),e.add(157,t,4,8),e.addMany([152,158],t,0,7),e.add(159,t,11,14),e.add(155,t,11,3),e.add(144,t,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],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(95,1,11,14),e.addMany(r,14,0,14),e.add(127,14,0,14),e.addMany(i(32,48),14,9,15),e.addMany(i(48,127),14,15,16),e.addMany(i(48,127),15,15,16),e.addMany(r,15,0,15),e.addMany(i(32,48),15,9,15),e.add(127,15,0,15),e.addMany(s,16,16,16),e.addMany(r,16,0,16),e.addMany(i(8,14),16,16,16),e.add(127,16,0,16),e.addMany([27,156,24,26],16,17,0),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(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(r,10,0,10),e.add(127,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(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(l,0,2,0),e.add(l,8,5,8),e.add(l,6,0,6),e.add(l,11,0,11),e.add(l,13,13,13),e.add(l,16,16,16),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._executeHandlersArr=new Array(24).fill(void 0),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._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new o.OscParser),this._dcsParser=this._register(new n.DcsParser),this._apcParser=this._register(new a.ApcParser),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>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]);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){const i=e.charCodeAt(0);this._executeHandlers[i]=t,i<24&&(this._executeHandlersArr[i]=t)}clearExecuteHandler(e){const t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),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,o,n=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,n=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 r=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](this._params),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 4:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],o=this._dcsParser.unhook(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],o=this._oscParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],o=this._apcParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0}this._parseStack.state=0,n=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=255&this._parseStack.transition}for(let i=n;i=60&&n<=63&&(this._collect=n,s++);let a=!1;for(;s=48&&n<=57)this._params.addDigit(n-48);else if(59===n)this._params.addParam(0);else{if(58!==n){if(n>=64&&n<=126){const e=this._csiHandlers[this._collect<<8|n];let t=e?e.length-1:-1;for(;t>=0&&(o=e[t](this._params),!0!==o);t--)if(o instanceof Promise)return r=1792,this._preserveStack(3,e,t,r,s),o;t<0&&this._csiHandlerFb(this._collect<<8|n,this._params),this.precedingJoinState=0,i=s,this.currentState=0,a=!0;break}break}this._params.addSubParam(-1)}a||(i=s-1,this.currentState=4);continue}switch(r=this._transitions.table[this.currentState<<8|(s>8){case 2:let n=i;const a=t-4;for(;n=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l););if(n>=a)for(;n=32&&(e[n]<=126||e[n]>=l);)n++;this._printHandler(e,i,n),i=n-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const h=this._csiHandlers[this._collect<<8|s];let c=h?h.length-1:-1;for(;c>=0&&(o=h[c](this._params),!0!==o);c--)if(o instanceof Promise)return this._preserveStack(3,h,c,r,i),o;c<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do{switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}}while(++i47&&s<60);i--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:const d=this._escHandlers[this._collect<<8|s];let _=d?d.length-1:-1;for(;_>=0&&(o=d[_](),!0!==o);_--)if(o instanceof Promise)return this._preserveStack(4,d,_,r,i),o;_<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let r=i+1;;++r)if(r>=t||24===(s=e[r])||26===s||27===s||s>127&&s=t||(s=e[r])<32||s>127&&s=32&&e[s]<127||e[s]>=8&&e[s]<14||e[s]>=l))){this._apcParser.put(e,i,s),i=s-1;break}break;case 17:if(o=this._apcParser.end(24!==s&&26!==s),o)return this._preserveStack(7,[],0,r,i),o;27===s&&(r|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0}this.currentState=255&r}}}t.EscapeSequenceParser=c},1346(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(726),r=i(4220),o=[];t.OscParser=class{constructor(){this._state=0,this._active=o,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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=o,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||o,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,s.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=o,this._id=-1,this._state=0}}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.OscHandler=n,n._payloadLimit=1e7},7262(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;class i{static fromArray(e){const t=new i;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 i(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}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>2147483647?2147483647: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 less than -1 are not allowed");this._subParams[this._subParamsLength++]=e>2147483647?2147483647: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 i=this._digitIsSub?this._subParams:this.params,s=i[t-1];i[t-1]=~s?Math.min(10*s+e,2147483647):e}}t.Params=i},3027(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i=this._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)}}},5101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(3235),r=i(4812),o=i(8636);class n extends r.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this._register(new o.Emitter),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._register(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=n},6097(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)}registerApcHandler(e,t){return this._core.registerApcHandler(e,t)}}},4335(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}}},9640(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=void 0;const o=i(4812),n=i(4097),a=i(6501),h=i(8636);let l=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e,t){super(),this.isUserScrolling=!1,this._onResize=this._register(new h.Emitter),this.onResize=this._onResize.event,this._onScroll=this._register(new h.Emitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new n.BufferSet(e,this,t)),this._register(this.buffers.onBufferActivate(e=>{this._onScroll.fire(e.activeBuffer.ydisp)}))}resize(e,t){const i=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:i,rowsChanged:s})}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,o=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;o===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(o+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=o-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(o,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t){const i=this.buffer;if(e<0){if(0===i.ydisp)return;this.isUserScrolling=!0}else e+i.ydisp>=i.ybase&&(this.isUserScrolling=!1);const s=i.ydisp;i.ydisp=Math.max(Math.min(i.ydisp+e,i.ybase),0),s!==i.ydisp&&(t||this._onScroll.fire(i.ydisp))}};t.BufferService=l,t.BufferService=l=s([r(0,a.IOptionsService),r(1,a.ILogService)],l)},5746(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}get charsets(){return 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)}}},4071(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const o=i(4812),n=i(6501),a=i(8636),h=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0});let c=class extends o.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorHidden=!1,this._onData=this._register(new a.Emitter),this.onData=this._onData.event,this._onUserInput=this._register(new a.Emitter),this.onUserInput=this._onUserInput.event,this._onBinary=this._register(new a.Emitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this._register(new a.Emitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.isCursorInitialized=i.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}reset(){this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}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}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onBinary.fire(e))}};t.CoreService=c,t.CoreService=c=s([r(0,n.IBufferService),r(1,n.ILogService),r(2,n.IOptionsService)],c)},4720(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationLineCache=t.DecorationService=void 0;const o=i(3132),n=i(4103),a=i(4812),h=i(6501),l=i(3087),c=i(8636);let d=0,_=0,u=class extends a.Disposable{get decorations(){return this._decorations.values()}constructor(e,t){super(),this._logService=e,this._bufferService=t,this._lineCache=this._register(new f),this._onDecorationRegistered=this._register(new c.Emitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this._register(new c.Emitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this._decorations=new l.SortedList(e=>e?.marker.line,this._logService),this._register((0,a.toDisposable)(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}registerDecoration(e){if(e.marker.isDisposed)return;const t=new p(e);if(t){const e=t.marker.onDispose(()=>t.dispose()),i=t.onDispose(()=>{i.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),e.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,i){const s=this._lineCache.getDecorationsOnLine(t);if(s)for(const t of s)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&(yield t)}forEachDecorationAtCell(e,t,i,s){const r=this._lineCache.getDecorationsOnLine(t);if(r)for(const t of r)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&s(t)}};t.DecorationService=u,t.DecorationService=u=s([r(0,h.ILogService),r(1,h.IBufferService)],u);class f extends a.Disposable{constructor(){super(...arguments),this._decorationsByLine=new Map,this._decorations=new Set,this._bufferLineListeners=this._register(new a.MutableDisposable),this._lineIndexSyncTimer=this._register(new o.MicrotaskTimer),this._lineIndexSyncCallbacks=[]}clear(){this._lineIndexSyncCallbacks.length=0,this._lineIndexSyncTimer.cancel(),this._decorationsByLine.clear(),this._decorations.clear()}add(e){this._decorations.add(e),this._addToLineBuckets(e)}remove(e){this._decorations.delete(e),this._removeFromLineBuckets(e)}getDecorationsOnLine(e){return this._decorationsByLine.get(e)}attachToBufferLines(e){const t=new a.DisposableStore;this._bufferLineListeners.value=t,t.add(e.onTrim(e=>this._handleBufferLinesTrim(e))),t.add(e.onInsert(e=>this._handleBufferLinesInsert(e))),t.add(e.onDelete(e=>this._handleBufferLinesDelete(e)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){const t=e.marker.line;if(t<0)return;e._indexedStartLine=t;const i=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{const e=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(const t of e)t()})}_handleBufferLinesTrim(e){if(e<=0)return;const t=new Map;for(const[i,s]of this._decorationsByLine){const r=i-e;r<0||this._mergeLineBucket(t,r,s)}this._decorationsByLine.clear();for(const[e,i]of t)this._decorationsByLine.set(e,i);for(const t of this._decorations)t.marker.isDisposed||(t._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,i){const s=e.get(t);if(s)for(let e=0,t=i.length;et&&(s.push(e),this._removeFromLineBuckets(e))}const r=new Map;for(const[e,s]of this._decorationsByLine){const o=e>=t?e+i:e;this._mergeLineBucket(r,o,s)}this._decorationsByLine.clear();for(const[e,t]of r)this._decorationsByLine.set(e,t);for(const e of this._decorations)e.marker.isDisposed||e._indexedStartLine>=t&&(e._indexedStartLine=e.marker.line);for(const e of s)this._addToLineBuckets(e)}_applyBufferLinesDelete(e){const t=e.index+e.amount,i=new Map;for(const[s,r]of this._decorationsByLine){if(s>=e.index&&s=t?s-e.amount:s;this._mergeLineBucket(i,o,r)}this._decorationsByLine.clear();for(const[e,t]of i)this._decorationsByLine.set(e,t);const s=[];for(const i of this._decorations){if(i.marker.isDisposed)continue;const r=i._indexedStartLine,o=this._getDecorationHeight(i);r>=t?i._indexedStartLine=i.marker.line:rt&&s.push(i)}for(const e of s)this._reindexDecoration(e)}}t.DecorationLineCache=f;class p extends a.DisposableStore{get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=n.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=n.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.add(new c.Emitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.add(new c.Emitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},6025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(6501),r=i(6201);class o{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=o,t.InstantiationService=class{constructor(){this._services=new o,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._id}.`);s.push(i)}const o=i.length>0?i[0].index:t.length;if(t.length!==o)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${o+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7276(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.LogService=void 0;const o=i(4812),n=i(6501),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t!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 n(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 a=String.fromCharCode,h={DEFAULT:e=>{const t=[n(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${a(t[0])}${a(t[1])}${a(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.x};${e.y}${t}`}};class l extends s.Disposable{constructor(){super(),this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._onProtocolChange=this._register(new r.Emitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(o))this.addProtocol(e,o[e]);for(const e of Object.keys(h))this.addEncoding(e,h[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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return!this._customWheelEventHandler||!1!==this._customWheelEventHandler(e)}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return"DEFAULT"===this._activeEncoding}get isPixelEncoding(){return"SGR_PIXELS"===this._activeEncoding}}t.MouseStateService=l},56(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(4812),r=i(701),o=i(8636);t.DEFAULT_OPTIONS={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:r.isMac,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}};const n=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends s.Disposable{constructor(e){super(),this._onOptionChange=this._register(new o.Emitter),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,s.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=n.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"blinkIntervalDuration":if((i=Math.floor(i))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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},8811(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const o=i(6501);let n=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 o=t.addMarker(t.ybase+t.y),n={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(n,o)),this._entriesWithId.set(n.key,n),this._dataByLinkId.set(n.id,n),n.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=n,t.OscLinkService=n=s([r(0,o.IBufferService)],n)},6201(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.serviceRegistry=void 0,t.getServiceDependencies=function(e){return e.di$dependencies||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const i=function(e,t,s){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,i){t.di$target===t?t.di$dependencies.push({id:e,index:i}):(t.di$dependencies=[{id:e,index:i}],t.di$target=t)}(i,e,s)};return i._id=e,t.serviceRegistry.set(e,i),i},t.serviceRegistry=new Map},6501(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.IMouseStateService=t.IBufferService=void 0;const s=i(6201);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.IMouseStateService=(0,s.createDecorator)("MouseStateService"),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")},6415(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8636);class r{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.Emitter,this.onChange=this._onChange.event}static extractShouldJoin(e){return!!(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)}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,this._active||(this.activeVersion=e.version)}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let o=0;o=s)return t+this.wcwidth(n);const i=e.charCodeAt(o);56320<=i&&i<=57343?n=1024*(n-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(n,i);let h=r.extractWidth(a);r.extractShouldJoin(a)&&(h-=r.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=r}},t={};return function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}(6081)})()); +-!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={2840(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=r.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new c.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,f.addDisposableListener)(r,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register((0,d.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=l.tooMuchOutput.get())))}_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=[],o=e?.translateToString(!0,void 0,void 0,t)||"",n=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===o.length?(a.textContent=" ",this._rowColumns.set(a,[0,1])):(a.textContent=o,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",n),a.setAttribute("aria-setsize",s),this._alignRowWidth(a))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent===l.tooMuchOutput.get()&&this._clearLiveRegion(),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,o;if(0===t?(r=i,o=this._rowElements.pop(),this._rowContainer.removeChild(o)):(r=this._rowElements.shift(),o=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),o.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=this._coreBrowserService.mainDocument.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 o=t=this._terminal.cols&&(++s,o=0),{row:s,column:o}},o=r(t),n=r(i);if(o&&n){if(o.row>n.row||o.row===n.row&&o.column>=n.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(n.row-o.row)*this._terminal.cols-o.column+n.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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;ethis._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(e=>this.refresh(e?.start??0,e?.end??this.rows-1))),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(I.EventUtils.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(I.EventUtils.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(I.EventUtils.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(I.EventUtils.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(e=>this._afterResize(e.cols,e.rows))),this._register((0,N.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=E.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`]${i};${(0,M.toRgbString)(s)}\\`);break;case 1:if("ansi"===e)this._themeService.modifyColors(e=>e.ansi[t.index]=E.channels.toColor(...t.color));else{const i=e;this._themeService.modifyColors(e=>e[i]=E.channels.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index)}}}_reportColorScheme(){if(!this._themeService)return;const e=E.rgb.relativeLuminance(this._themeService.colors.background.rgba>>8)>8)?1:2;this.coreService.triggerDataEvent(`[?997;${e}n`)}_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(T.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),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(""),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),o=this._renderService.dimensions.css.cell.width*r,n=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=n+"px",this.textarea.style.width=o+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this._register((0,H.addDisposableListener)(this.element,"copy",e=>{this.hasSelection()&&(0,a.copyHandler)(e,this._selectionService)}));const e=e=>(0,a.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this._register((0,H.addDisposableListener)(this.textarea,"paste",e)),this._register((0,H.addDisposableListener)(this.element,"paste",e)),x.isFirefox?this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>{2===e.button&&(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register((0,H.addDisposableListener)(this.element,"contextmenu",e=>{(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),x.isLinux&&this._register((0,H.addDisposableListener)(this.element,"auxclick",e=>{1===e.button&&(0,a.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)}))}_bindKeys(){this._register((0,H.addDisposableListener)(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register((0,H.addDisposableListener)(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register((0,H.addDisposableListener)(this.textarea,"compositionend",()=>this._compositionHelper.compositionend())),this._register((0,H.addDisposableListener)(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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",e=>this.element.classList.toggle("allow-transparency",e))),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.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register((0,H.addDisposableListener)(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);const i=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",h.promptLabel.get()),x.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>i.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(g.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??("undefined"!=typeof window?window.document:null))),this._instantiationService.setService(C.ICoreBrowserService,this._coreBrowserService),this._register((0,H.addDisposableListener)(this.textarea,"focus",e=>this._handleTextAreaFocus(e))),this._register((0,H.addDisposableListener)(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(p.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(C.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(k.ThemeService),this._instantiationService.setService(C.IThemeService,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(v.CharacterJoinerService),this._instantiationService.setService(C.ICharacterJoinerService,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(w.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(C.IRenderService,this._renderService),this._register(this._renderService.onRenderedViewportChange(e=>this._onRender.fire(e))),this._register(this._renderService.onDimensionsChange(e=>this._onDimensionsChange.fire({css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}))),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(u.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(S.MouseCoordsService),this._instantiationService.setService(C.IMouseCoordsService,this._mouseCoordsService);const s=this._linkifier.value=this._register(this._instantiationService.createInstance(O.Linkifier,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(e){this._logService.error("onWillOpen handler threw an exception",e)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(c.Viewport,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(e=>{super.scrollLines(e,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(y.SelectionService,this.element,this.screenElement,s)),this._instantiationService.setService(C.ISelectionService,this._selectionService),this._mouseService=this._instantiationService.createInstance(b.MouseService),this._instantiationService.setService(C.IMouseService,this._mouseService),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(I.EventUtils.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(d.BufferDecorationRenderer,this.screenElement)),this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>this._selectionService.handleMouseDown(e))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(T.AccessibilityManager,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",e=>this._handleScreenReaderModeOptionChange(e)));const r=this.options.scrollbar?.showScrollbar??!0,o=this.options.scrollbar?.width;r&&o&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",e=>{const t=(e?.showScrollbar??!0)&&!!e?.width;!this._overviewRulerRenderer&&t&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:e=>this._viewport?.handleTouchScroll(e)},e=>this._register(e),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(f.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,i=!1){this._renderService?.refreshRows(e,t,i)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}paste(e){(0,a.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(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(!0),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),e.preventDefault(),e.stopPropagation(),!1}if(1===i.type&&this.selectAll(),this._isThirdLevelShift(this.browser,e))return!0;if(i.cancel&&(e.preventDefault(),e.stopPropagation()),!i.key)return!0;if(!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;""!==i.key&&"\r"!==i.key||(this.textarea.value="");const s=this._keyboardService.useWin32InputMode&&W(e);if(this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;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){if(this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return;W(e)||this.focus();const t=this._keyboardService.evaluateKeyUp(e);if(t?.key){const i=this._keyboardService.useWin32InputMode&&W(e);this.coreService.triggerDataEvent(t.key,!i)}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(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),!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()}clear(){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;efunction(e){const t=l(e);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(a.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}(e))),r};const s=i(3132);function r(e){const t=e;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;const i=e;return i?.view?i.view:window}class o{constructor(e,t,i,s){this._node=e,this._type=t,this._handler=i,this._options=s,e.addEventListener(t,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function n(e,t,i,s){return new o(e,t,i,s)}t.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class a{constructor(e,t){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}const h=new Map;function l(e){let t=h.get(e);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(e,t)),t}class c extends s.IntervalTimer{constructor(e){super(),this._defaultTarget=e?r(e):void 0}cancelAndSet(e,t,i){super.cancelAndSet(e,t,i??this._defaultTarget??window)}}t.WindowIntervalTimer=c},8906(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const o=i(4812),n=i(6501),a=i(7098),h=i(8636),l=i(4159);let c=class extends o.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseCoordsService=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 h.Emitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this._register(new h.Emitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this._register((0,o.toDisposable)(()=>{(0,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register((0,l.addDisposableListener)(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register((0,l.addDisposableListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element);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=o;e<=n;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);var i,s;t&&this._mouseDownLink&&(i=this._mouseDownLink.link,s=this._currentLink.link,i.text===s.text&&i.range.start.x===s.range.start.x&&i.range.start.y===s.range.start.y&&i.range.end.x===s.range.end.x&&i.range.end.y===s.range.end.y)&&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,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);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);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){const i=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(i)return{x:i[0],y:i[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=c,t.Linkifier=c=s([r(1,a.IMouseCoordsService),r(2,a.IRenderService),r(3,n.IBufferService),r(4,a.ILinkProviderService)],c)},7721(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0;let i="Terminal input";const s={get:()=>i,set:e=>i=e};t.promptLabel=s;let r="Too much output to announce, navigate to rows manually to read";const o={get:()=>r,set:e=>r=e};t.tooMuchOutput=o},3285(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const o=i(3055),n=i(6501);let a=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i,this._workCell=new o.CellData}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=this._workCell,n=i.getTrimmedLength();let a=-1,l=-1,c=!1;for(let t=0;tr?r.activate(e,t,d):h(0,t),hover:(e,t)=>r?.hover?.(e,t,d),leave:(e,t)=>r?.leave?.(e,t,d)})}c=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,a=o.extended.urlId):(l=-1,a=-1)}}t(s)}_getRangeWithLineWrap(e,t,i,s){let r=e,o=t,n=e,a=i;for(;0===o;){const e=this._bufferService.buffer.lines.get(r-1);if(!e?.isWrapped)break;const t=this._bufferService.buffer.lines.get(r-2);if(!t)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,i-1,s))break;let n=i-1;for(;n>0&&this._hasUrlId(t,n-1,s);)n--;r--,o=n}for(;;){const e=this._bufferService.buffer.lines.get(n-1);if(!e)break;if(a!==e.getTrimmedLength())break;const t=this._bufferService.buffer.lines.get(n);if(!t?.isWrapped)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,0,s))break;let r=1;for(;rthis._innerRefresh()),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=e??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,void 0===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=[]}}},4292(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(e,t,i){this._rowCount=i,e=e??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=performance.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)void 0!==this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),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=performance.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)}}},9302(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_ANSI_COLORS=void 0;const s=i(4103);t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const r=t[i/36%6|0],o=t[i/6%6|0],n=t[i%6];e.push({css:s.channels.toCss(r,o,n),rgba:s.channels.toRgba(r,o,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:s.channels.toCss(i,i,i),rgba:s.channels.toRgba(i,i,i)})}return e})())},4017(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const o=i(7098),n=i(4812),a=i(6501),h=i(4159),l=i(8566),c=i(8636),d=i(7880);let _=class extends n.Disposable{constructor(e,t,i,s,r,o,a,_,u){super(),this._bufferService=i,this._coreService=r,this._optionsService=_,this._renderService=u,this._onRequestScrollLines=this._register(new c.Emitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._isSyncing=!1,this._isHandlingScroll=!1,this._suppressOnScrollHandler=!1,this._needsSyncOnRender=!1;const f=this._register(new d.Scrollable({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:e=>(0,h.scheduleAtNextAnimationFrame)(s.window,e)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{f.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new l.SmoothScrollableElement(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},f)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(o.onProtocolChange(e=>{this._scrollableElement.updateOptions({handleMouseWheel:!(16&e)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{e.style.backgroundColor=a.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=a.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register((0,n.toDisposable)(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register((0,n.toDisposable)(()=>this._styleElement.remove())),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${a.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${a.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${a.colors.scrollbarSliderActiveBackground.css};`,"}"].join("\n")})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(e=>this._handleScroll(e)))}scrollLines(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){const e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,i=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:i,verticalHasArrows:t}}queueSync(e){void 0!==e&&(this._latestYDisp=e),void 0===this._queuedAnimationFrame&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){this._renderService&&!this._isSyncing&&(this._coreService.decPrivateModes.synchronizedOutput?this._needsSyncOnRender=!0:(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1))}_handleScroll(e){if(!this._renderService)return;if(this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;const t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),i=t-this._bufferService.buffer.ydisp;0!==i&&(this._latestYDisp=t,this._onRequestScrollLines.fire(i)),this._isHandlingScroll=!1}handleTouchScroll(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};t.Viewport=_,t.Viewport=_=s([r(2,a.IBufferService),r(3,o.ICoreBrowserService),r(4,a.ICoreService),r(5,a.IMouseStateService),r(6,o.IThemeService),r(7,a.IOptionsService),r(8,o.IRenderService)],_)},4196(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const o=i(7098),n=i(4812),a=i(6501);let h=class extends n.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,n.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.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),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,t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,o.ICoreBrowserService),r(3,a.IDecorationService),r(4,o.IRenderService)],h)},957(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)}}},9925(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const o=i(957),n=i(7098),a=i(4812),h=i(6501),l={full:0,left:0,center:0,right:0},c={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=class extends a.Disposable{get _width(){const e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??1?e?.width??0:0}constructor(e,t,i,s,r,n,h,l){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=n,this._themeService=h,this._coreBrowserService=l,this._colorZoneStore=new o.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),this._register((0,a.toDisposable)(()=>this._canvas?.remove()));const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register((0,a.toDisposable)(()=>{void 0!==this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);c.full=this._canvas.width,c.left=e,c.center=t,c.right=e,this._refreshDrawHeightConstants(),d.full=1,d.left=1,d.center=1+c.left,d.right=1+c.left+c.center}_refreshDrawHeightConstants(){l.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);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;const e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;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,this._renderRulerOutline();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}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_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)-l[e.position||"full"]/2),c[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_,t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,n.IRenderService),r(5,h.IOptionsService),r(6,n.IThemeService),r(7,n.ICoreBrowserService)],_)},3618(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const o=i(7098),n=i(6501);let a=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,o){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=o,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent=""}compositionstart(){this._isComposing=!0;const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;this._compositionPosition.start=Math.min(e,t),this._compositionPosition.end=Math.max(e,t),this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=`‎${e.data}‎`,this.updateCompositionElements(),setTimeout(()=>{const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)},0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(20===e.keyCode||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},t=this._compositionSuffix;this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){let i;if(this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,this._isComposing)i=this._textarea.value.substring(e.start,this._compositionPosition.start);else{const s=this._textarea.value,r=t.length>0&&s.endsWith(t)?s.length-t.length:s.length;i=s.substring(e.start,Math.max(e.start,r))}i.length>0&&this._coreService.triggerDataEvent(i,!0)}},0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;const e=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!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=a,t.CompositionHelper=a=s([r(2,n.IBufferService),r(3,n.IOptionsService),r(4,n.ICoreService),r(5,o.IRenderService)],a)},5251(e,t){function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),o=parseInt(r.getPropertyValue("padding-left"),10),n=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-s.left-o,t.clientY-s.top-n]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,o,n,a,h,l){if(!n)return;const c=i(e,t,s);return c[0]=Math.ceil((c[0]+(l?a/2:0))/a),c[1]=Math.ceil(c[1]/h),c[0]=Math.min(Math.max(c[0],1),r+(l?1:0)),c[1]=Math.min(Math.max(c[1],1),o),c}},9686(e,t){function i(e,t,i,o){const h=e-s(e,i),l=t-s(t,i),c=Math.abs(h-l)-function(e,t,i){let o=0;const n=e-s(e,i),a=t-s(t,i);for(let s=0;s=0&&et?"A":"B"}function o(e,t,i,s,r,o){let n=e,a=t,h="";for(;(n!==i||a!==s)&&a>=0&&ao.cols-1?(h+=o.buffer.translateBufferLineToString(a,!1,e,n),n=0,e=0,a++):!r&&n<0&&(h+=o.buffer.translateBufferLineToString(a,!1,0,e+1),n=o.cols-1,e=n,a--);return h+o.buffer.translateBufferLineToString(a,!1,e,n)}function n(e,t){return""+(t?"O":"[")+e}function a(e,t){e=Math.floor(e);let i="";for(let s=0;s0?h-s(h,l):t;const _=h,u=function(e,t,r,o,n,a){let h;return h=i(t,o,n,a).length>0?o-s(o,n):t,e=r&&he?"D":"C",a(Math.abs(l-e),n(d,h));d=c>t?"D":"C";const _=Math.abs(c-t);return a(function(e,t){return t.cols-e}(c>t?e:l,r)+(_-1)*r.cols+1+((c>t?l:e)-1),n(d,h))}},6081(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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(f.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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new _.ParserApi(this._core)}get unicode(){return this._checkProposedApi(),new u.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._register(new d.BufferNamespaceApi(this._core))}get markers(){return this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.mouseStateService.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,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:e.synchronizedOutput,win32InputMode:e.win32InputMode,wraparoundMode:e.wraparound}}get dimensions(){return this._core.dimensions}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._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return 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{get promptLabel(){return a.promptLabel.get()},set promptLabel(e){a.promptLabel.set(e)},get tooMuchOutput(){return a.tooMuchOutput.get()},set tooMuchOutput(e){a.tooMuchOutput.set(e)}}}_verifyIntegers(...e){for(p of e)if(p===1/0||isNaN(p)||p%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(p of e)if(p&&(p===1/0||isNaN(p)||p%1!=0||p<0))throw new Error("This API only accepts positive integers")}}t.Terminal=v},3955(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const o=i(1433),n=i(2744),a=i(9176),h=i(6181),l=i(2274),c=i(654),d=i(7098),_=i(4103),u=i(4812),f=i(6501),p=i(8636),v=i(4159);let g=1,m=class extends u.Disposable{constructor(e,t,i,s,r,a,d,_,f,m,b,w,y,C){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=d,this._charSizeService=f,this._optionsService=m,this._bufferService=b,this._coreService=w,this._coreBrowserService=y,this._themeService=C,this._terminalClass=g++,this._rowElements=[],this._selectionRenderModel=(0,l.createSelectionRenderModel)(),this._lastSelectionColumnMode=!1,this._rowHasBlinkingCells=[],this._rowHasBlinkingCellsCount=0,this._onRequestRedraw=this._register(new p.Emitter),this.onRequestRedraw=this._onRequestRedraw.event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),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=_.createInstance(o.DomRendererRowFactory,document),this._element.classList.add("xterm-dom-renderer-owner-"+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._cursorBlinkStateManager=new S(this._rowContainer,this._coreBrowserService),this._register((0,v.addDisposableListener)(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register((0,u.toDisposable)(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new c.TextBlinkStateManager(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register((0,u.toDisposable)(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new n.WidthCache,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} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${_.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;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} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${i} { color: ${s.css}; }${this._terminalSelector} .xterm-fg-${i}.xterm-dim { color: ${_.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .xterm-bg-${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR} { color: ${_.color.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${_.color.multiplyOpacity(_.color.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${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),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,i){const s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i);let r=0,o=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(r=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow));let n=0,a=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,i),this._selectionRenderModel.hasSelection){const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,o=this._selectionRenderModel.viewportCappedStartRow,h=this._selectionRenderModel.viewportCappedEndRow;n=o,a=h;const l=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];l.appendChild(this._createSelectionElement(o,i?t[0]:e[0],i?e[0]:t[0],h-o+1))}else{const i=s===o?e[0]:0,n=o===r?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(o,i,n));const a=h-o-1;if(l.appendChild(this._createSelectionElement(o+1,0,this._bufferService.cols,a)),o!==h){const e=r===h?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(h,0,e))}}this._selectionContainer.appendChild(l)}let h=Math.min(r,n),l=Math.max(o,a);if(l>=0){h=Math.max(h,0),l=Math.min(l,s-1);const e=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&e>=0&&ethis.dimensions.css.canvas.width&&(n=this.dimensions.css.canvas.width-o),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${o}px`,r.style.width=`${n}px`,r}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),o=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,n=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle,h={hasBlinkingCells:!1};for(let l=e;l<=t;l++){const e=l+i.ydisp,t=this._rowElements[l];if(!t)continue;const c=i.lines.get(e);c?(t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,n,a,r,o,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,h)),this._setRowBlinkState(l,h.hasBlinkingCells)):(t.replaceChildren(),this._setRowBlinkState(l,!1))}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,o){i<0&&(e=0),s<0&&(t=0);const n=this._bufferService.rows-1;i=Math.max(Math.min(i,n),0),s=Math.max(Math.min(s,n),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,l=Math.min(a.x,r-1),c=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle,u={hasBlinkingCells:!1};for(let n=i;n<=s;++n){const f=n+a.ydisp,p=this._rowElements[n];if(!p)continue;const v=a.lines.get(f);v?(p.replaceChildren(...this._rowFactory.createRow(v,f,f===h,d,_,l,c,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,o?n===i?e:0:-1,o?(n===s?t:r)-1:-1,u)),this._setRowBlinkState(n,u.hasBlinkingCells)):(p.replaceChildren(),this._setRowBlinkState(n,!1))}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};t.DomRenderer=m,t.DomRenderer=m=s([r(7,f.IInstantiationService),r(8,d.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,f.ICoreService),r(12,d.ICoreBrowserService),r(13,d.IThemeService)],m);class S{constructor(e,t){this._rowContainer=e,this._coreBrowserService=t,this._isIdlePaused=!1,this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){void 0!==this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}}},1433(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const o=i(9176),n=i(8938),a=i(3055),h=i(6501),l=i(4103),c=i(7098),d=i(945),_=i(6181),u=i(5451);let f=class{constructor(e,t,i,s,r,o,n){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=o,this._themeService=n,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,c,_,f,p,v,g){const m=[];g&&(g.hasBlinkingCells=!1);const S=this._characterJoinerService.getJoinedCharacters(t),b=this._themeService.colors;let w,y=e.getNoBgTrimmedLength();i&&y=P,F=I,W=this._workCell;if(S.length>0&&I===S[0][0]&&N){const s=S.shift(),r=this._isCellInSelection(s[0],t);for(C=s[0]+1;C=s[1],N?(H=!0,W=new d.JoinedCellData(this._workCell,e.translateToString(!0,s[0],s[1]),s[1]-s[0]),F=s[1]-1,y=W.getWidth()):P=s[1]}const z=this._isCellInSelection(I,t),K=i&&I===a,U=O&&I>=p&&I<=v;g&&W.isBlink()&&(g.hasBlinkingCells=!0),!c&&W.isBlink()&&T.push("xterm-blink-hidden");let j=!1;this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{j=!0});let $=W.getChars()||n.WHITESPACE_CELL_CHAR;if(" "===$&&(W.isUnderline()||W.isOverline())&&($=" "),k=y*_-f.get($,W.isBold(),W.isItalic()),w){if(D&&(z&&A||!z&&!A&&W.bg===L)&&(z&&A&&b.selectionForeground||W.fg===x)&&W.extended.ext===R&&U===M&&k===B&&!K&&!H&&!j&&N){W.isInvisible()?E+=n.WHITESPACE_CELL_CHAR:E+=$,D++;continue}D&&(w.textContent=E),w=this._document.createElement("span"),D=0,E=""}else w=this._document.createElement("span");if(L=W.bg,x=W.fg,R=W.extended.ext,M=U,B=k,A=z,H&&a>=I&&a<=F&&(a=I),!this._coreService.isCursorHidden&&K&&this._coreService.isCursorInitialized)if(T.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&T.push("xterm-cursor-blink"),T.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":T.push("xterm-cursor-outline");break;case"block":T.push("xterm-cursor-block");break;case"bar":T.push("xterm-cursor-bar");break;case"underline":T.push("xterm-cursor-underline")}if(W.isBold()&&T.push("xterm-bold"),W.isItalic()&&T.push("xterm-italic"),W.isDim()&&T.push("xterm-dim"),E=W.isInvisible()?n.WHITESPACE_CELL_CHAR:W.getChars()||n.WHITESPACE_CELL_CHAR,W.isUnderline()&&(T.push(`xterm-underline-${W.extended.underlineStyle}`)," "===E&&(E=" "),!W.isUnderlineColorDefault()))if(W.isUnderlineColorRGB())w.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(W.getUnderlineColor()).join(",")})`;else{let e=W.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&W.isBold()&&e<8&&(e+=8),w.style.textDecorationColor=b.ansi[e].css}W.isOverline()&&(T.push("xterm-overline")," "===E&&(E=" ")),W.isStrikethrough()&&T.push("xterm-strikethrough"),U&&(w.style.textDecoration="underline");let V=W.getFgColor(),q=W.getFgColorMode(),X=W.getBgColor(),Y=W.getBgColorMode();const G=!!W.isInverse();if(G){const e=V;V=X,X=e;const t=q;q=Y,Y=t}let J,Z,Q,ee=!1;switch(this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{"top"!==e.options.layer&&ee||(e.backgroundColorRGB&&(Y=50331648,X=e.backgroundColorRGB.rgba>>8&16777215,J=e.backgroundColorRGB),e.foregroundColorRGB&&(q=50331648,V=e.foregroundColorRGB.rgba>>8&16777215,Z=e.foregroundColorRGB),ee="top"===e.options.layer)}),!ee&&z&&(J=this._coreBrowserService.isFocused?b.selectionBackgroundOpaque:b.selectionInactiveBackgroundOpaque,X=J.rgba>>8&16777215,Y=50331648,ee=!0,b.selectionForeground&&(q=50331648,V=b.selectionForeground.rgba>>8&16777215,Z=b.selectionForeground)),ee&&T.push("xterm-decoration-top"),Y){case 16777216:case 33554432:Q=b.ansi[X],T.push(`xterm-bg-${X}`);break;case 50331648:Q=l.channels.toColor(X>>16,X>>8&255,255&X),this._addStyle(w,`background-color:#${(X>>>0).toString(16).padStart(6,"0")}`);break;default:G?(Q=b.foreground,T.push(`xterm-bg-${o.INVERTED_DEFAULT_COLOR}`)):Q=b.background}switch(J||W.isDim()&&(J=l.color.multiplyOpacity(Q,.5)),q){case 16777216:case 33554432:W.isBold()&&V<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(V+=8),this._applyMinimumContrast(w,Q,b.ansi[V],W,J,void 0)||T.push(`xterm-fg-${V}`);break;case 50331648:const e=l.channels.toColor(V>>16&255,V>>8&255,255&V);this._applyMinimumContrast(w,Q,e,W,J,Z)||this._addStyle(w,`color:#${V.toString(16).padStart(6,"0")}`);break;default:this._applyMinimumContrast(w,Q,b.foreground,W,J,Z)||G&&T.push(`xterm-fg-${o.INVERTED_DEFAULT_COLOR}`)}T.length&&(w.className=T.join(" "),T.length=0),K||H||j||!N?w.textContent=E:D++,k!==this.defaultSpacing&&(w.style.letterSpacing=`${k}px`),m.push(w),I=F}return w&&D&&(w.textContent=E),m}_applyMinimumContrast(e,t,i,s,r,o){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const n=this._getContrastCache(s);let a;if(r||o||(a=n.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=l.color.ensureContrastRatio(r??t,o??i,e),n.setColor((r??t).rgba,(o??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])}};t.DomRendererRowFactory=f,t.DomRendererRowFactory=f=s([r(1,c.ICharacterJoinerService),r(2,h.IOptionsService),r(3,c.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,c.IThemeService)],f)},2744(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0;const s=i(6181);t.WidthCache=class{constructor(e=()=>new r){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._canvasElements=[],this._canvasElements=[e(),e(),e(),e()],this.clear()}dispose(){this._canvasElements.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._canvasElements[0].setFont(e,t,i,!1),this._canvasElements[1].setFont(e,t,s,!1),this._canvasElements[2].setFont(e,t,i,!0),this._canvasElements[3].setFont(e,t,s,!0),this.clear())}get(e,t,i){let s;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 o=this._holey.get(r);if(void 0===o){let s=0;t&&(s|=1),i&&(s|=2),o=this._measure(e,s),o>0&&this._holey.set(r,o)}return o}_measure(e,t){return this._canvasElements[t].measure(e)}};class r{constructor(){"undefined"!=typeof OffscreenCanvas?(this._canvas=new OffscreenCanvas(1,1),this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d")))}setFont(e,t,i,s){const r=s?"italic":"";this._ctx.font=`${r} ${i} ${t}px ${e}`.trim()}measure(e){return this._ctx.measureText(e).width}}},9176(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.INVERTED_DEFAULT_COLOR=void 0,t.INVERTED_DEFAULT_COLOR=257},6181(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.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,o){return 1===t&&r>Math.ceil(1.5*o)&&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))}},2274(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=function(){return new i};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,o=t[1]-r,n=i[1]-r,a=Math.max(o,0),h=Math.min(n,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,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)}}},654(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TextBlinkStateManager=void 0;const s=i(4812);class r extends s.Disposable{constructor(e,t,i){super(),this._renderCallback=e,this._coreBrowserService=t,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",e=>{this.setIntervalDuration(e)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const e=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(e||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}t.TextBlinkStateManager=r},8501(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._domNodePointerDown(e)))}_createArrow(e){const t=this._register(new c.ScrollbarArrow(e));return this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode),t}_createSlider(e,t,i,s){this.slider=new h.FastDomNode(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(e),this.slider.setLeft(t),"number"==typeof i&&this.slider.setWidth(i),"number"==typeof s&&this.slider.setHeight(s),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(a.addDisposableListener(this.slider.domNode,a.eventType.POINTER_DOWN,e=>{0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))})),this._onclick(this.slider.domNode,e=>{e.leftButton&&e.stopPropagation()})}_handleElementSize(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(e){e.target===this.domNode.domNode&&this._handlePointerDown(e)}delegatePointerDown(e){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),s=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderPointerPosition(e);i<=r&&r<=s?0===e.button&&(e.preventDefault(),this._sliderPointerDown(e)):this._handlePointerDown(e)}_handlePointerDown(e){let t,i;if(e.target===this.domNode.domNode&&"number"==typeof e.offsetX&&"number"==typeof e.offsetY)t=e.offsetX,i=e.offsetY;else{const s=a.getDomNodePagePosition(this.domNode.domNode);t=e.pageX-s.left,i=e.pageY-s.top}const s=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(s):this._scrollbarState.getDesiredScrollPositionFromOffset(s)),0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))}_sliderPointerDown(e){if(!(e.target&&e.target instanceof Element))return;const t=this._sliderPointerPosition(e),i=this._sliderOrthogonalPointerPosition(e),s=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{const r=this._sliderOrthogonalPointerPosition(e),o=Math.abs(r-i);if(u.isWindows&&o>140)return void this._setDesiredScrollPositionNow(s.getScrollPosition());const n=this._sliderPointerPosition(e)-t;this._setDesiredScrollPositionNow(s.getDesiredScrollPositionFromDelta(n))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(e){const t={};this.writeScrollPosition(t,e),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(e){this._updateScrollbarSize(e),this._scrollbarState.setScrollbarSize(e),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}t.AbstractScrollbar=f},1203(e,t){function i(e){return"number"==typeof e?`${e}px`:e}Object.defineProperty(t,"__esModule",{value:!0}),t.FastDomNode=void 0,t.FastDomNode=class{constructor(e){this.domNode=e,this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._className="",this._position="",this._layerHint=!1,this._contain="none"}setWidth(e){const t=i(e);this._width!==t&&(this._width=t,this.domNode.style.width=this._width)}setHeight(e){const t=i(e);this._height!==t&&(this._height=t,this.domNode.style.height=this._height)}setTop(e){const t=i(e);this._top!==t&&(this._top=t,this.domNode.style.top=this._top)}setLeft(e){const t=i(e);this._left!==t&&(this._left=t,this.domNode.style.left=this._left)}setBottom(e){const t=i(e);this._bottom!==t&&(this._bottom=t,this.domNode.style.bottom=this._bottom)}setRight(e){const t=i(e);this._right!==t&&(this._right=t,this.domNode.style.right=this._right)}setClassName(e){this._className!==e&&(this._className=e,this.domNode.className=this._className)}toggleClassName(e,t){this.domNode.classList.toggle(e,t),this._className=this.domNode.className}setPosition(e){this._position!==e&&(this._position=e,this.domNode.style.position=this._position)}setLayerHinting(e){this._layerHint!==e&&(this._layerHint=e,this.domNode.style.transform=e?"translate3d(0px, 0px, 0px)":"")}setContain(e){this._contain!==e&&(this._contain=e,this.domNode.style.contain=this._contain)}setAttribute(e,t){this.domNode.setAttribute(e,t)}}},928(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{try{e.releasePointerCapture(t)}catch{}}))}catch{o=a.getWindow(e)}this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_MOVE,e=>{e.buttons===i?(e.preventDefault(),this._pointerMoveCallback(e)):this.stopMonitoring(!0)})),this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_UP,e=>this.stopMonitoring(!0)))}}},9699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.HorizontalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(t.horizontalHasArrows?t.horizontalScrollbarSize:0,2===t.horizontal?0:t.horizontalScrollbarSize,2===t.vertical?0:t.verticalScrollbarSize,s.width,s.scrollWidth,o.scrollLeft),visibility:t.horizontal,extraScrollbarClassName:"xterm-horizontal",scrollable:e,scrollByPage:t.scrollByPage}),t.horizontalHasArrows)throw new Error("horizontalHasArrows is not supported in xterm.js");this._createSlider(Math.floor((t.horizontalScrollbarSize-t.horizontalSliderSize)/2),0,void 0,t.horizontalSliderSize)}_updateSlider(e,t){this.slider.setWidth(e),this.slider.setLeft(t)}_renderDomNode(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._handleElementSize(e.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return e}_sliderPointerPosition(e){return e.pageX}_sliderOrthogonalPointerPosition(e){return e.pageY}_updateScrollbarSize(e){this.slider.setHeight(e)}writeScrollPosition(e,t){e.scrollLeft=t}updateOptions(e){this.updateScrollbarSize(2===e.horizontal?0:e.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._visibilityController.setVisibility(e.horizontal),this._scrollByPage=e.scrollByPage}}t.HorizontalScrollbar=o},3988(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;ni&&(s=i-t),s<0&&(s=0),r<0&&(r=0),n+r>o&&(n=o-r),n<0&&(n=0),this.width=t,this.scrollWidth=i,this.scrollLeft=s,this.height=r,this.scrollHeight=o,this.scrollTop=n}equals(e){return this.rawScrollLeft===e.rawScrollLeft&&this.rawScrollTop===e.rawScrollTop&&this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop}withScrollDimensions(e,t){return new o(this._forceIntegerValues,void 0!==e.width?e.width:this.width,void 0!==e.scrollWidth?e.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,void 0!==e.height?e.height:this.height,void 0!==e.scrollHeight?e.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(e){return new o(this._forceIntegerValues,this.width,this.scrollWidth,void 0!==e.scrollLeft?e.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,void 0!==e.scrollTop?e.scrollTop:this.rawScrollTop)}createScrollEvent(e,t){const i=this.width!==e.width,s=this.scrollWidth!==e.scrollWidth,r=this.scrollLeft!==e.scrollLeft,o=this.height!==e.height,n=this.scrollHeight!==e.scrollHeight,a=this.scrollTop!==e.scrollTop;return{inSmoothScrolling:t,oldWidth:e.width,oldScrollWidth:e.scrollWidth,oldScrollLeft:e.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:e.height,oldScrollHeight:e.scrollHeight,oldScrollTop:e.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:s,scrollLeftChanged:r,heightChanged:o,scrollHeightChanged:n,scrollTopChanged:a}}}t.ScrollState=o;class n extends r.Disposable{constructor(e){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new s.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new o(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){const i=this._state.withScrollDimensions(e,t);this._setState(i,Boolean(this._smoothScrolling)),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){const t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(0!==this._smoothScrollDuration){if(this._smoothScrolling){e={scrollLeft:void 0===e.scrollLeft?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:void 0===e.scrollTop?this._smoothScrolling.to.scrollTop:e.scrollTop};const i=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===i.scrollLeft&&this._smoothScrolling.to.scrollTop===i.scrollTop)return;let s;s=t?new l(this._smoothScrolling.from,i,this._smoothScrolling.startTime,this._smoothScrolling.duration):l.start(this._state,i,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{const t=this._state.withScrollPosition(e);this._smoothScrolling=l.start(this._state,t,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}else this.setScrollPositionNow(e)}hasPendingScrollAnimation(){return Boolean(this._smoothScrolling)}_performSmoothScrolling(){if(!this._smoothScrolling)return;const e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);return this._setState(t,!0),this._smoothScrolling?e.isDone?(this._smoothScrolling.dispose(),void(this._smoothScrolling=null)):void(this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})):void 0}_setState(e,t){const i=this._state;i.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(i,t)))}}t.Scrollable=n;class a{constructor(e,t,i){this.scrollLeft=e,this.scrollTop=t,this.isDone=i}}function h(e,t){const i=t-e;return function(t){return e+i*(1-(s=1-t,Math.pow(s,3)));var s}}class l{constructor(e,t,i,s){this.from=e,this.to=t,this.duration=s,this.startTime=i,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this._scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this._scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(e,t,i){if(Math.abs(e-t)>2.5*i){let n,a;return e0&&Math.abs(e.deltaY)>0)return 1;let i=.5;if(this._isAlmostInt(e.deltaX)&&this._isAlmostInt(e.deltaY)||(i+=.25),t){const s=Math.abs(e.deltaX),r=Math.abs(e.deltaY),o=Math.abs(t.deltaX),n=Math.abs(t.deltaY),a=Math.max(Math.min(s,o),1),h=Math.max(Math.min(r,n),1),l=Math.max(s,o),c=Math.max(r,n);l%a===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(e){return Math.abs(Math.round(e)-e)<.01}}S.INSTANCE=new S;class b extends _.Widget{get options(){return this._options}constructor(e,t,i){let s;super(),this._onScroll=this._register(new f.Emitter),this.onScroll=this._onScroll.event,t=t??{};const r=!i;i?s=i:(t.mouseWheelSmoothScroll=!1,s=new g.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:t=>a.scheduleAtNextAnimationFrame(a.getWindow(e),t)})),this._options=function(e){const t={lazyRender:void 0!==e.lazyRender&&e.lazyRender,className:void 0!==e.className?e.className:"",useShadows:void 0===e.useShadows||e.useShadows,handleMouseWheel:void 0===e.handleMouseWheel||e.handleMouseWheel,flipAxes:void 0!==e.flipAxes&&e.flipAxes,consumeMouseWheelIfScrollbarIsNeeded:void 0!==e.consumeMouseWheelIfScrollbarIsNeeded&&e.consumeMouseWheelIfScrollbarIsNeeded,alwaysConsumeMouseWheel:void 0!==e.alwaysConsumeMouseWheel&&e.alwaysConsumeMouseWheel,scrollYToX:void 0!==e.scrollYToX&&e.scrollYToX,mouseWheelScrollSensitivity:void 0!==e.mouseWheelScrollSensitivity?e.mouseWheelScrollSensitivity:1,fastScrollSensitivity:void 0!==e.fastScrollSensitivity?e.fastScrollSensitivity:5,scrollPredominantAxis:void 0===e.scrollPredominantAxis||e.scrollPredominantAxis,mouseWheelSmoothScroll:void 0===e.mouseWheelSmoothScroll||e.mouseWheelSmoothScroll,listenOnDomNode:void 0!==e.listenOnDomNode?e.listenOnDomNode:null,horizontal:void 0!==e.horizontal?e.horizontal:1,horizontalScrollbarSize:void 0!==e.horizontalScrollbarSize?e.horizontalScrollbarSize:10,horizontalSliderSize:void 0!==e.horizontalSliderSize?e.horizontalSliderSize:0,horizontalHasArrows:void 0!==e.horizontalHasArrows&&e.horizontalHasArrows,vertical:void 0!==e.vertical?e.vertical:1,verticalScrollbarSize:void 0!==e.verticalScrollbarSize?e.verticalScrollbarSize:10,verticalHasArrows:void 0!==e.verticalHasArrows&&e.verticalHasArrows,verticalSliderSize:void 0!==e.verticalSliderSize?e.verticalSliderSize:0,scrollByPage:void 0!==e.scrollByPage&&e.scrollByPage};return t.horizontalSliderSize=void 0!==e.horizontalSliderSize?e.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=void 0!==e.verticalSliderSize?e.verticalSliderSize:t.verticalScrollbarSize,v.isMac&&(t.className+=" xterm-mac"),t}(t),this._scrollable=s,this._register(this._scrollable.onScroll(e=>{this._handleScroll(e),this._onScroll.fire(e)})),r&&this._register(this._scrollable);const o={handleMouseWheel:e=>this._handleMouseWheel(e),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new d.VerticalScrollbar(this._scrollable,this._options,o)),this._horizontalScrollbar=this._register(new c.HorizontalScrollbar(this._scrollable,this._options,o)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,e=>this._handleMouseOver(e)),this._onmouseleave(this._listenOnDomNode,e=>this._handleMouseLeave(e)),this._hideTimeout=this._register(new u.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,v.isMac&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){void 0!==e.handleMouseWheel&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),void 0!==e.mouseWheelScrollSensitivity&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),void 0!==e.fastScrollSensitivity&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),void 0!==e.scrollPredominantAxis&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),void 0!==e.horizontal&&(this._options.horizontal=e.horizontal),void 0!==e.vertical&&(this._options.vertical=e.vertical),void 0!==e.horizontalHasArrows&&(this._options.horizontalHasArrows=e.horizontalHasArrows),void 0!==e.verticalHasArrows&&(this._options.verticalHasArrows=e.verticalHasArrows),void 0!==e.horizontalScrollbarSize&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),void 0!==e.verticalScrollbarSize&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),void 0!==e.scrollByPage&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new l.StandardWheelEvent(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),e)){const e=e=>{this._handleMouseWheel(new l.StandardWheelEvent(e))};this._mouseWheelToDispose.push(a.addDisposableListener(this._listenOnDomNode,a.eventType.MOUSE_WHEEL,e,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;const t=S.INSTANCE;t.acceptStandardWheelEvent(e);let i=!1;if(e.deltaY||e.deltaX){let s=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&r+s===0?r=s=0:Math.abs(s)>=Math.abs(r)?r=0:s=0),this._options.flipAxes&&([s,r]=[r,s]);const o=!v.isMac&&e.browserEvent&&e.browserEvent.shiftKey;!this._options.scrollYToX&&!o||r||(r=s,s=0),e.browserEvent&&e.browserEvent.altKey&&(r*=this._options.fastScrollSensitivity,s*=this._options.fastScrollSensitivity);const n=this._scrollable.getFutureScrollPosition();let a={};if(s){const e=50*s,t=n.scrollTop-(e<0?Math.floor(e):Math.ceil(e));this._verticalScrollbar.writeScrollPosition(a,t)}if(r){const e=50*r,t=n.scrollLeft-(e<0?Math.floor(e):Math.ceil(e));this._horizontalScrollbar.writeScrollPosition(a,t)}a=this._scrollable.validateScrollPosition(a),(n.scrollLeft!==a.scrollLeft||n.scrollTop!==a.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(a):this._scrollable.setScrollPositionNow(a),i=!0)}let s=i;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,i=e.scrollLeft>0,s=i?" xterm-shadow-left":"",r=t?" xterm-shadow-top":"",o=i||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${r}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${o}${r}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){this._mouseIsOver||this._isDragging||(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){this._mouseIsOver||this._isDragging||this._hideTimeout.cancelAndSet(()=>this._hide(),500)}}t.SmoothScrollableElement=b},9594(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._arrowPointerDown(e))),this._register(c.addStandardDisposableListener(this.domNode,c.eventType.POINTER_DOWN,e=>this._arrowPointerDown(e))),this._pointerdownRepeatTimer=this._register(new c.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new l.TimeoutTimer)}_arrowPointerDown(e){e.target&&e.target instanceof Element&&(this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,c.getWindow(e))},200),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),e.preventDefault())}}t.ScrollbarArrow=d},1270(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ScrollbarState=void 0;class i{constructor(e,t,i,s,r,o){this._scrollbarSize=Math.round(t),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(e),this._visibleSize=s,this._scrollSize=r,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new i(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(e){const t=Math.round(e);return this._visibleSize!==t&&(this._visibleSize=t,this._refreshComputedValues(),!0)}setScrollSize(e){const t=Math.round(e);return this._scrollSize!==t&&(this._scrollSize=t,this._refreshComputedValues(),!0)}setScrollPosition(e){const t=Math.round(e);return this._scrollPosition!==t&&(this._scrollPosition=t,this._refreshComputedValues(),!0)}setScrollbarSize(e){this._scrollbarSize=Math.round(e)}setArrowSize(e){const t=Math.round(e);this._arrowSize!==t&&(this._arrowSize=t,this._refreshComputedValues())}setOppositeScrollbarSize(e){this._oppositeScrollbarSize=Math.round(e)}static _computeValues(e,t,i,s,r){const o=Math.max(0,i-e),n=Math.max(0,o-2*t),a=s>0&&s>i;if(!a)return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(n),computedSliderRatio:0,computedSliderPosition:0};const h=Math.round(Math.max(20,Math.floor(i*n/s))),l=(n-h)/(s-i),c=r*l;return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(h),computedSliderRatio:l,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){const e=i._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=e.computedAvailableSize,this._computedIsNeeded=e.computedIsNeeded,this._computedSliderSize=e.computedSliderSize,this._computedSliderRatio=e.computedSliderRatio,this._computedSliderPosition=e.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize-this._computedSliderSize/2;return Math.round(t/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize;let i=this._scrollPosition;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(e){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(e?" xterm-fade":"")))}}t.ScrollbarVisibilityController=o},2650(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{s||(s=!0,this._remove(i))}}_remove(e){if(e.prev!==_.Undefined&&e.next!==_.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===_.Undefined&&e.next===_.Undefined?(this._first=_.Undefined,this._last=_.Undefined):e.next===_.Undefined?(this._last=this._last.prev,this._last.next=_.Undefined):e.prev===_.Undefined&&(this._first=this._first.next,this._first.prev=_.Undefined)}*[Symbol.iterator](){let e=this._first;for(;e!==_.Undefined;)yield e.element,e=e.next}}var f;!function(e){e.TAP="-xterm-gesturetap",e.CHANGE="-xterm-gesturechange",e.START="-xterm-gesturestart",e.END="-xterm-gesturesend",e.CONTEXT_MENU="-xterm-gesturecontextmenu"}(f||(t.EventType=f={}));class p extends l.Disposable{constructor(){super(),this._dispatched=!1,this._targets=new u,this._ignoreTargets=new u,this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;const e=c;this._register(h.addDisposableListener(e.document,"touchstart",e=>this._handleTouchStart(e),{passive:!1})),this._register(h.addDisposableListener(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(h.addDisposableListener(e.document,"touchmove",e=>this._handleTouchMove(e),{passive:!1}))}static addTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._targets.push(e);return(0,l.toDisposable)(t)}static ignoreTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._ignoreTargets.push(e);return(0,l.toDisposable)(t)}static isTouchDevice(){return"ontouchstart"in c||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){const t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let i=0,s=e.targetTouches.length;i=p._holdDelay&&Math.abs(n.initialPageX-d(n.rollingPageX))<30&&Math.abs(n.initialPageY-d(n.rollingPageY))<30){const e=this._newGestureEvent(f.CONTEXT_MENU,n.initialTarget);e.pageX=d(n.rollingPageX),e.pageY=d(n.rollingPageY),this._dispatchEvent(e)}else if(1===s){const t=d(n.rollingPageX),s=d(n.rollingPageY),r=d(n.rollingTimestamps)-n.rollingTimestamps[0],o=t-n.rollingPageX[0],a=s-n.rollingPageY[0],h=[...this._targets].filter(e=>n.initialTarget instanceof Node&&e.contains(n.initialTarget));this._inertia(e,h,i,Math.abs(o)/r,o>0?1:-1,t,Math.abs(a)/r,a>0?1:-1,s)}this._dispatchEvent(this._newGestureEvent(f.END,n.initialTarget)),delete this._activeTouches[o.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){const i=document.createEvent("CustomEvent");return i.initEvent(e,!1,!0),i.initialTarget=t,i.tapCount=0,i}_dispatchEvent(e){if(e.type===f.TAP){const t=(new Date).getTime();let i;i=t-this._lastSetTapCountTime>p._clearTapCountTime?1:2,this._lastSetTapCountTime=t,e.tapCount=i}else e.type!==f.CHANGE&&e.type!==f.CONTEXT_MENU||(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(const t of this._ignoreTargets)if(t.contains(e.initialTarget))return;const t=[];for(const i of this._targets)if(i.contains(e.initialTarget)){let s=0,r=e.initialTarget;for(;r&&r!==i;)s++,r=r.parentElement;t.push([s,i])}t.sort((e,t)=>e[0]-t[0]);for(const[,i]of t)i.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,i,s,r,o,n,a,l){this._handle=h.scheduleAtNextAnimationFrame(e,()=>{const h=Date.now(),c=h-i;let d=0,_=0,u=!0;s+=p._scrollFriction*c,n+=p._scrollFriction*c,s>0&&(u=!1,d=r*s*c),n>0&&(u=!1,_=a*n*c);const v=this._newGestureEvent(f.CHANGE);v.translationX=d,v.translationY=_,t.forEach(e=>e.dispatchEvent(v)),u||this._inertia(e,t,h,s,r,o+d,n,a,l+_)})}_handleTouchMove(e){const t=Date.now();for(let i=0,s=e.changedTouches.length;i3&&(r.rollingPageX.shift(),r.rollingPageY.shift(),r.rollingTimestamps.shift()),r.rollingPageX.push(s.pageX),r.rollingPageY.push(s.pageY),r.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}}t.Gesture=p,p._scrollFriction=-.005,p._holdDelay=700,p._clearTapCountTime=400,n([function(e,t,i){let s=null,r=null;if("function"==typeof i.value?(s="value",r=i.value,0!==r.length&&console.warn("Memoize should only be used in functions with zero parameters")):"function"==typeof i.get&&(s="get",r=i.get),!r||!s)throw new Error("not supported");const o=`$memoize$${t}`;i[s]=function(...e){return this.hasOwnProperty(o)||Object.defineProperty(this,o,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,e)}),this[o]}}],p,"isTouchDevice",null)},8997(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VerticalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition(),n=t.verticalHasArrows;super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(n?t.verticalScrollbarSize:0,2===t.vertical?0:t.verticalScrollbarSize,0,s.height,s.scrollHeight,o.scrollTop),visibility:t.vertical,extraScrollbarClassName:"xterm-vertical",scrollable:e,scrollByPage:t.scrollByPage}),this._arrowScrollDelta=0,this._setArrows(n,t.verticalScrollbarSize),this._createSlider(0,Math.floor((t.verticalScrollbarSize-t.verticalSliderSize)/2),t.verticalSliderSize,void 0)}_updateSlider(e,t){this.slider.setHeight(e),this.slider.setTop(t)}_renderDomNode(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._handleElementSize(e.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return t}_sliderPointerPosition(e){return e.pageY}_sliderOrthogonalPointerPosition(e){return e.pageX}_updateScrollbarSize(e){this.slider.setWidth(e)}writeScrollPosition(e,t){e.scrollTop=t}_arrowScroll(e){const t=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollTop:t.scrollTop+e})}_setArrows(e,t){if(this._arrowScrollDelta=t,!this._arrowUp||!this._arrowDown){const e=0;this._arrowUp=this._createArrow({className:"xterm-scra xterm-arrow-up",top:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})}if(this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;const i=e?"":"none";this._arrowUp.bgDomNode.style.display=i,this._arrowUp.domNode.style.display=i,this._arrowDown.bgDomNode.style.display=i,this._arrowDown.domNode.style.display=i}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){const t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}}t.VerticalScrollbar=o},7741(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nt(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseover(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_OVER,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseleave(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_LEAVE,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}}t.Widget=c},5959(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=[0,0],!0)}}},4792(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const o=i(6501),n=i(4812),a=i(8636);let h=class extends n.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 a.Emitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new d(this._optionsService))}catch{this._measureStrategy=this._register(new c(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h,t.CharSizeService=h=s([r(2,o.IOptionsService)],h);class l extends n.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 c extends l{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 l{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}}},945(e,t,i){var s,r=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},o=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(5451),a=i(8938),h=i(3055),l=i(6501);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 d=s=class{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new h.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,h,n,t,o);for(let t=0;t1){const e=this._getJoinedRanges(s,h,n,t,o);for(let t=0;tthis._screenDprMonitor.setWindow(e))),this._register(s.EventUtils.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register((0,r.addDisposableListener)(this._textarea,"focus",()=>this._isFocused=!0)),this._register((0,r.addDisposableListener)(this._textarea,"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=n;class a extends o.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this._register(new o.MutableDisposable),this._onDprChange=this._register(new s.Emitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register((0,o.toDisposable)(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,r.addDisposableListener)(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)}}},2136(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.KeyboardService=void 0;const o=i(706),n=i(7241),a=i(9249),h=i(701),l=i(6501);let c=class{constructor(e,t){this._coreService=e,this._optionsService=t}_getWin32InputMode(){return this._win32InputMode??=new a.Win32InputMode,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new n.KittyKeyboard,this._kittyKeyboard}evaluateKeyDown(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!0);const t=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(e,t,e.repeat?2:1,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):(0,o.evaluateKeyboardEvent)(e,this._coreService.decPrivateModes.applicationCursorKeys,h.isMac,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!1);const t=this._coreService.kittyKeyboard.flags;return this.useKitty&&2&t?this._getKittyKeyboard().evaluate(e,t,3,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):void 0}get useKitty(){const e=this._coreService.kittyKeyboard.flags;return!(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard||!n.KittyKeyboard.shouldUseProtocol(e))}get useWin32InputMode(){return!(!this._optionsService.rawOptions.vtExtensions?.win32InputMode||!this._coreService.decPrivateModes.win32InputMode)}};t.KeyboardService=c,t.KeyboardService=c=s([r(0,l.ICoreService),r(1,l.IOptionsService)],c)},9820(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(4812);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},8294(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseCoordsService=void 0;const o=i(4159),n=i(5251),a=i(7098);let h=class{constructor(e,t){this._charSizeService=e,this._renderService=t}getCoords(e,t,i,s,r){return(0,n.getCoords)((0,o.getWindow)(t),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,n.getCoordsRelativeToElement)((0,o.getWindow)(t),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.MouseCoordsService=h,t.MouseCoordsService=h=s([r(0,a.ICharSizeService),r(1,a.IRenderService)],h)},9784(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AltMouseCursorController=t.MouseService=void 0;const o=i(4159),n=i(6501),a=i(4812),h=i(7098),l=i(2650);let c=class{constructor(e,t,i,s,r,o,n,a,h){this._renderService=e,this._mouseCoordsService=t,this._mouseStateService=i,this._coreService=s,this._bufferService=r,this._optionsService=o,this._selectionService=n,this._logService=a,this._coreBrowserService=h,this._lastEvent=null,this._wheelPartialScroll=0,this._touchScrollAccumulator=0}bindMouse(e,t,i){const{element:s,document:r}=e,n=new a.MutableDisposable,h=new a.MutableDisposable;t(n),t(h);const c={target:e,focus:i,requestedEvents:{mouseup:null,wheel:null,mousedrag:null,mousemove:null},mouseupListener:n,mousedragListener:h},_={mouseup:e=>this._handleMouseUp(c,e),wheel:e=>this._handleWheel(c,e),mousedrag:e=>this._handleMouseDrag(c,e),mousemove:e=>this._handleMouseMove(c,e)};this._altMouseCursor=new d(s,r,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),t(this._altMouseCursor),t(this._mouseStateService.onProtocolChange(e=>{this._handleProtocolChange(c,_,e)})),t(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(s),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,t((0,o.addDisposableListener)(s,"mousedown",e=>this._handleMouseDown(c,e))),t((0,o.addDisposableListener)(s,"wheel",e=>this._handlePassiveWheel(c,e),{passive:!1})),t(l.Gesture.addTarget(e.screenElement)),t((0,o.addDisposableListener)(e.screenElement,l.EventType.START,()=>this._handleTouchStart())),t((0,o.addDisposableListener)(e.screenElement,l.EventType.CHANGE,e=>this._handleTouchChange(c,e)))}_sendEvent(e,t){const i=this._mouseCoordsService.getMouseReportCoords(t,e.target.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(!this._mouseStateService.allowCustomWheelEvent(t))return!1;const e=t.deltaY;if(0===e)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return!1;r=e<0?0:1,s=4;break;default:return!1}if(void 0===r||void 0===s||s>4)return!1;if(4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!t.altKey)return!1;const o=4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:!o&&t.altKey,shift:t.shiftKey})}_handleMouseUp(e,t){this._sendEvent(e,t),t.buttons||(e.mouseupListener.clear(),e.mousedragListener.clear())}_handleWheel(e,t){return this._sendEvent(e,t),t.preventDefault(),t.stopPropagation(),!1}_handleMouseDrag(e,t){t.buttons&&this._sendEvent(e,t)}_handleMouseMove(e,t){t.buttons||this._sendEvent(e,t)}_handleMouseDown(e,t){if(t.preventDefault(),e.focus(),!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(t))return;this._sendEvent(e,t);const{element:i,document:s}=e.target,r=i.ownerDocument??s;e.requestedEvents.mouseup&&(e.mouseupListener.value=(0,o.addDisposableListener)(r,"mouseup",e.requestedEvents.mouseup)),e.requestedEvents.mousedrag&&(e.mousedragListener.value=(0,o.addDisposableListener)(r,"mousemove",e.requestedEvents.mousedrag))}_handlePassiveWheel(e,t){if(!e.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(t))return!1;if(!this._bufferService.buffer.hasScrollback){if(0===t.deltaY)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return t.preventDefault(),t.stopPropagation(),!1;const e=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(e,!0),t.preventDefault(),t.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(e,t){t.preventDefault(),t.stopPropagation(),e.requestedEvents.wheel?this._handleTouchScrollAsWheel(e,t):this._bufferService.buffer.hasScrollback?e.target.handleTouchScroll?.(t.translationY):this._handleTouchScrollAsKeys(t)}_handleTouchScrollAsKeys(e){const t=this._renderService?.dimensions.css.cell.height;if(!t)return;this._touchScrollAccumulator-=e.translationY;const i=Math.trunc(this._touchScrollAccumulator/t);if(0===i)return;this._touchScrollAccumulator-=i*t;const s=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let e=0;e0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(r*=this._bufferService.rows),r}_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,this._mouseStateService.isPixelEncoding))return!1;if(!this._mouseStateService.restrictMouseEvent(e))return!1;const t=this._mouseStateService.encodeMouseEvent(e);return t&&(this._mouseStateService.isDefaultEncoding?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.MouseService=c,t.MouseService=c=s([r(0,h.IRenderService),r(1,h.IMouseCoordsService),r(2,n.IMouseStateService),r(3,n.ICoreService),r(4,n.IBufferService),r(5,n.IOptionsService),r(6,h.ISelectionService),r(7,n.ILogService),r(8,h.ICoreBrowserService)],c);class d{constructor(e,t,i){this._element=e,this._document=t,this._isActive=i,this._listeners=new a.MutableDisposable}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;const e=new a.DisposableStore,t=e=>this.syncFromModifier(e);e.add((0,o.addDisposableListener)(this._document,"keydown",t)),e.add((0,o.addDisposableListener)(this._document,"keyup",t)),e.add((0,o.addDisposableListener)(this._element,"mousemove",t));const i=this._element.ownerDocument?.defaultView;i&&e.add((0,o.addDisposableListener)(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=e}resetClass(){this._updateClass(!1)}syncFromModifier(e){this._isActive()&&this._updateClass(e.getModifierState("Alt"))}_updateClass(e){e?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}}t.AltMouseCursorController=d},5783(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const o=i(4852),n=i(7098),a=i(4812),h=i(6168),l=i(6501),c=i(8636);let d=class extends a.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,n,l,d,u,f){super(),this._rowCount=e,this._optionsService=i,this._logService=s,this._charSizeService=r,this._coreService=n,this._coreBrowserService=u,this._renderer=this._register(new a.MutableDisposable),this._observerDisposable=this._register(new a.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 c.Emitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this._register(new c.Emitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this._register(new c.Emitter),this.onRender=this._onRender.event,this._onRefreshRequest=this._register(new c.Emitter),this.onRefreshRequest=this._onRefreshRequest.event,this._pausedResizeTask=this._register(new h.DebouncedIdleTask(this._logService)),this._renderDebouncer=new o.RenderDebouncer((e,t)=>this._renderRows(e,t),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new _(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register((0,a.toDisposable)(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(d.onResize(()=>this._fullRefresh())),this._register(d.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(d.cols,d.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(d.buffer.y,d.buffer.y,void 0,!0))),this._register(f.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.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});this._observerDisposable.value=(0,a.toDisposable)(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=i,i.observe(t)}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),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,s=!1){if(this._isPaused)return void(this._needsFullRefresh=!0);if(this._coreService.decPrivateModes.synchronizedOutput)return void this._syncOutputHandler.bufferRows(e,t);const r=this._syncOutputHandler.flush();r&&(e=Math.min(e,r.start),t=Math.max(t,r.end)),s||(this._isNextRenderRedrawOnly=!1),i?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){this._renderer.value&&(this._coreService.decPrivateModes.synchronizedOutput?this._syncOutputHandler.bufferRows(e,t):(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,e.sync,!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,t.RenderService=d=s([r(2,l.IOptionsService),r(3,l.ILogService),r(4,n.ICharSizeService),r(5,l.ICoreService),r(6,l.IDecorationService),r(7,l.IBufferService),r(8,n.ICoreBrowserService),r(9,n.IThemeService)],d);class _{constructor(e,t,i){this._coreBrowserService=e,this._coreService=t,this._onTimeout=i,this._start=0,this._end=0,this._isBuffering=!1}bufferRows(e,t){this._isBuffering?(this._start=Math.min(this._start,e),this._end=Math.max(this._end,t)):(this._start=e,this._end=t,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;const e={start:this._start,end:this._end};return this._isBuffering=!1,e}dispose(){void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}}},2079(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(e=>this._handleTrim(e)),this._register(this._bufferService.buffers.onBufferActivate(e=>this._handleBufferActivate(e))),this.enable(),this._model=new d.SelectionModel(this._bufferService),this._activeSelectionMode=0,this._register((0,u.toDisposable)(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(e=>{e.rowsChanged&&this.clearSelection()}))}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(b," ")).join(f.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())),f.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,p.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._mouseCoordsService.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,l.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 this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:f.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(2===e.button&&this.hasSelection||0!==e.button||this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){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){const t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);const i=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);i&&i.length!==this._model.selectionStart[0]&&0===i.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(!this._optionsService.rawOptions.mouseEventsRequireAlt||!this._mouseStateService.areMouseEventsActive)&&e.altKey&&!(f.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-1,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._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,c.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.value=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,o=r.lines.get(e[1]);if(!o)return;const n=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(o,e[0]),h=a;const l=e[0]-a;let c=0,d=0,_=0,u=0;if(" "===n.charAt(a)){for(;a>0&&" "===n.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(o.loadCell(t-1,this._workCell));){o.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(c++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+l-c+_,p=Math.min(this._bufferService.cols,h-a+c+d-_-u);if(t||""!==n.slice(a,h).trim()){if(i&&0===f&&32!==o.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&o.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,p+=e}}}if(s&&f+p===this._bufferService.cols&&32!==o.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&&(p+=t.length)}}return{start:f,length:p}}}_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,p.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=w,t.SelectionService=w=n([h(3,g.IBufferService),h(4,g.ICoreService),h(5,_.IMouseCoordsService),h(6,g.IOptionsService),h(7,g.IMouseStateService),h(8,_.IRenderService),h(9,_.ICoreBrowserService)],w)},7098(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.IKeyboardService=t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.IMouseCoordsService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(6201);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseCoordsService=(0,s.createDecorator)("MouseCoordsService"),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"),t.IKeyboardService=(0,s.createDecorator)("KeyboardService")},9078(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=void 0;const o=i(7174),n=i(9302),a=i(4103),h=i(4812),l=i(6501),c=i(8636),d=a.css.toColor("#ffffff"),_=a.css.toColor("#000000"),u=a.css.toColor("#ffffff"),f=_,p={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},v=d;let g=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new o.ColorContrastCache,this._halfContrastCache=new o.ColorContrastCache,this._onChangeColors=this._register(new c.Emitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:d,background:_,cursor:u,cursorAccent:f,selectionForeground:void 0,selectionBackgroundTransparent:p,selectionBackgroundOpaque:a.color.blend(_,p),selectionInactiveBackgroundTransparent:p,selectionInactiveBackgroundOpaque:a.color.blend(_,p),scrollbarSliderBackground:a.color.opacity(d,.2),scrollbarSliderHoverBackground:a.color.opacity(d,.4),scrollbarSliderActiveBackground:a.color.opacity(d,.5),overviewRulerBorder:d,ansi:n.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 t=this._colors;if(t.foreground=m(e.foreground,d),t.background=m(e.background,_),t.cursor=a.color.blend(t.background,m(e.cursor,u)),t.cursorAccent=a.color.blend(t.background,m(e.cursorAccent,f)),t.selectionBackgroundTransparent=m(e.selectionBackground,p),t.selectionBackgroundOpaque=a.color.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=m(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=a.color.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?m(e.selectionForeground,a.NULL_COLOR):void 0,t.selectionForeground===a.NULL_COLOR&&(t.selectionForeground=void 0),a.color.isOpaque(t.selectionBackgroundTransparent)){const e=.3;t.selectionBackgroundTransparent=a.color.opacity(t.selectionBackgroundTransparent,e)}if(a.color.isOpaque(t.selectionInactiveBackgroundTransparent)){const e=.3;t.selectionInactiveBackgroundTransparent=a.color.opacity(t.selectionInactiveBackgroundTransparent,e)}if(t.scrollbarSliderBackground=m(e.scrollbarSliderBackground,a.color.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=m(e.scrollbarSliderHoverBackground,a.color.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=m(e.scrollbarSliderActiveBackground,a.color.opacity(t.foreground,.5)),t.overviewRulerBorder=m(e.overviewRulerBorder,v),t.ansi=n.DEFAULT_ANSI_COLORS.slice(),t.ansi[0]=m(e.black,n.DEFAULT_ANSI_COLORS[0]),t.ansi[1]=m(e.red,n.DEFAULT_ANSI_COLORS[1]),t.ansi[2]=m(e.green,n.DEFAULT_ANSI_COLORS[2]),t.ansi[3]=m(e.yellow,n.DEFAULT_ANSI_COLORS[3]),t.ansi[4]=m(e.blue,n.DEFAULT_ANSI_COLORS[4]),t.ansi[5]=m(e.magenta,n.DEFAULT_ANSI_COLORS[5]),t.ansi[6]=m(e.cyan,n.DEFAULT_ANSI_COLORS[6]),t.ansi[7]=m(e.white,n.DEFAULT_ANSI_COLORS[7]),t.ansi[8]=m(e.brightBlack,n.DEFAULT_ANSI_COLORS[8]),t.ansi[9]=m(e.brightRed,n.DEFAULT_ANSI_COLORS[9]),t.ansi[10]=m(e.brightGreen,n.DEFAULT_ANSI_COLORS[10]),t.ansi[11]=m(e.brightYellow,n.DEFAULT_ANSI_COLORS[11]),t.ansi[12]=m(e.brightBlue,n.DEFAULT_ANSI_COLORS[12]),t.ansi[13]=m(e.brightMagenta,n.DEFAULT_ANSI_COLORS[13]),t.ansi[14]=m(e.brightCyan,n.DEFAULT_ANSI_COLORS[14]),t.ansi[15]=m(e.brightWhite,n.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const i=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;ssetTimeout(t,e))},t.disposableTimeout=function(e,t=0,i){const r=setTimeout(()=>{e(),i&&o.dispose()},t),o=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(o),o};const s=i(4812);t.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}},t.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}},t.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(e,t,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{e()},t);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},5639(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(4812),r=i(8636);class o extends s.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this._register(new r.Emitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this._register(new r.Emitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this._register(new r.Emitter),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>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(n||(t.channels=n={})),function(e){function t(e,t){return o=Math.round(255*t),[i,s,r]=c.toChannels(e.rgba),{css:n.toCss(i,s,r,o),rgba:n.toRgba(i,s,r,o)}}e.blend=function(e,t){if(o=(255&t.rgba)/255,1===o)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),{css:n.toCss(i,s,r),rgba:n.toRgba(i,s,r)}},e.isOpaque=function(e){return!(255&~e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=c.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return n.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=c.toChannels(t),{css:n.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return o=255&e.rgba,t(e,o*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),n.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),o=parseInt(e.slice(4,5).repeat(2),16),n.toColor(i,s,r,o);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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),o=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),n.toColor(i,s,r,o);if("transparent"===e)return{css:"transparent",rgba:0};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,o]=t.getImageData(0,0,1,1).data,255!==o)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(i,s,r,o),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(l||(t.rgb=l={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c>>0}e.blend=function(e,t){if(o=(255&t)/255,1===o)return t;const a=t>>24&255,h=t>>16&255,l=t>>8&255,c=e>>24&255,d=e>>16&255,_=e>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),n.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=l.relativeLuminance(e>>8),o=l.relativeLuminance(i>>8);if(_(r,o)>8));if(n_(r,l.relativeLuminance(t>>8))?o:t}return o}const n=a(e,i,s),h=_(r,l.relativeLuminance(n>>8));if(h_(r,l.relativeLuminance(o>>8))?n:o}return n}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(c||(t.rgba=c={}))},5777(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(6501),r=i(6025),o=i(7276),n=i(9640),a=i(56),h=i(4071),l=i(6478),c=i(7428),d=i(6415),_=i(5746),u=i(5882),f=i(2486),p=i(3562),v=i(8811),g=i(8636),m=i(4812);let S=!1;class b extends m.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new g.Emitter),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 m.MutableDisposable),this._onBinary=this._register(new g.Emitter),this.onBinary=this._onBinary.event,this._onData=this._register(new g.Emitter),this.onData=this._onData.event,this._onLineFeed=this._register(new g.Emitter),this.onLineFeed=this._onLineFeed.event,this._onRender=this._register(new g.Emitter),this.onRender=this._onRender.event,this._onResize=this._register(new g.Emitter),this.onResize=this._onResize.event,this._onWriteParsed=this._register(new g.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this._register(new g.Emitter),this._instantiationService=new r.InstantiationService,this.optionsService=this._register(new a.OptionsService(e)),this._instantiationService.setService(s.IOptionsService,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(s.ILogService,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(n.BufferService)),this._instantiationService.setService(s.IBufferService,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(h.CoreService)),this._instantiationService.setService(s.ICoreService,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(l.MouseStateService)),this._instantiationService.setService(s.IMouseStateService,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(d.UnicodeService)),this.unicodeService.register(new c.UnicodeV6),this._instantiationService.setService(s.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(_.CharsetService),this._instantiationService.setService(s.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(v.OscLinkService),this._instantiationService.setService(s.IOscLinkService,this._oscLinkService),this._inputHandler=this._register(new f.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(g.EventUtils.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(g.EventUtils.forward(this._bufferService.onResize,this._onResize)),this._register(g.EventUtils.forward(this.coreService.onData,this._onData)),this._register(g.EventUtils.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),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(g.EventUtils.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=s.LogLevelEnum.WARN&&!S&&(this._logService.warn("writeSync is unreliable and will be removed soon."),S=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.backend&&void 0!==t.buildNumber&&(e=!!("conpty"===t.backend&&t.buildNumber<21376)),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(u.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>((0,u.updateWindowsModeWrappedState)(this._bufferService),!1))),this._windowsWrappingHeuristics.value=(0,m.toDisposable)(()=>{for(const t of e)t.dispose()})}}}t.CoreTerminal=b},8636(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const s=i(4812);var r;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(r);const o=(0,s.toDisposable)(()=>{const e=this._listeners.indexOf(r);-1!==e&&(this._listeners=this._listeners.slice(),this._listeners.splice(e,1))});return i&&(Array.isArray(i)?i.push(o):i.add(o)),o}),this._event}fire(e){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,e);const t=this._listeners;for(let i=0,s=t.length;it.fire(e))},e.map=function(e,t){return(i,s,r)=>e(e=>i.call(s,t(e)),void 0,r)},e.any=function(...e){return(t,i,r)=>{const o=new s.DisposableStore;for(const s of e)o.add(s(e=>t.call(i,e)));return r&&(Array.isArray(r)?r.push(o):r.add(o)),o}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(r||(t.EventUtils=r={}))},2486(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0,t.isValidColorIndex=L;const o=i(6760),n=i(6717),a=i(4812),h=i(726),l=i(6107),c=i(8938),d=i(3055),_=i(5451),u=i(6501),f=i(6415),p=i(1346),v=i(9823),g=i(2607),m=i(8693),S=i(8636),b=i(7804),w={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function y(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 C;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(C||(t.WindowsOptionsReportType=C={}));let k=0;class D extends a.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,a,c,d,_=new n.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=a,this._mouseStateService=c,this._unicodeService=d,this._parser=_,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new h.StringToUtf32,this._utf8Decoder=new h.Utf8ToUtf32,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 S.Emitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this._register(new S.Emitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this._register(new S.Emitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this._register(new S.Emitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this._register(new S.Emitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this._register(new S.Emitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this._register(new S.Emitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this._register(new S.Emitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this._register(new S.Emitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this._register(new S.Emitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this._register(new S.Emitter),this.onScroll=this._onScroll.event,this._onTitleChange=this._register(new S.Emitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this._register(new S.Emitter),this.onColor=this._onColor.event,this._onRequestColorSchemeQuery=this._register(new S.Emitter),this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 E(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.setApcHandlerFallback((e,t,i)=>{this._logService.debug("Unknown APC 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.scrollDown(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({prefix:">",final:"q"},e=>this.sendXtVersion(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.registerCsiHandler({prefix:"=",final:"u"},e=>this.kittyKeyboardSet(e)),this._parser.registerCsiHandler({prefix:"?",final:"u"},e=>this.kittyKeyboardQuery(e)),this._parser.registerCsiHandler({prefix:">",final:"u"},e=>this.kittyKeyboardPush(e)),this._parser.registerCsiHandler({prefix:"<",final:"u"},e=>this.kittyKeyboardPop(e)),this._parser.setExecuteHandler("",()=>this.bell()),this._parser.setExecuteHandler("\n",()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler("\t",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("„",()=>this.index()),this._parser.setExecuteHandler("…",()=>this.nextLine()),this._parser.setExecuteHandler("ˆ",()=>this.tabSet()),this._parser.registerOscHandler(0,new p.OscHandler(e=>(this.setTitle(e),this.setIconName(e),!0))),this._parser.registerOscHandler(1,new p.OscHandler(e=>this.setIconName(e))),this._parser.registerOscHandler(2,new p.OscHandler(e=>this.setTitle(e))),this._parser.registerOscHandler(4,new p.OscHandler(e=>this.setOrReportIndexedColor(e))),this._parser.registerOscHandler(8,new p.OscHandler(e=>this.setHyperlink(e))),this._parser.registerOscHandler(10,new p.OscHandler(e=>this.setOrReportFgColor(e))),this._parser.registerOscHandler(11,new p.OscHandler(e=>this.setOrReportBgColor(e))),this._parser.registerOscHandler(12,new p.OscHandler(e=>this.setOrReportCursorColor(e))),this._parser.registerOscHandler(104,new p.OscHandler(e=>this.restoreIndexedColor(e))),this._parser.registerOscHandler(110,new p.OscHandler(e=>this.restoreFgColor(e))),this._parser.registerOscHandler(111,new p.OscHandler(e=>this.restoreBgColor(e))),this._parser.registerOscHandler(112,new p.OscHandler(e=>this.restoreCursorColor(e))),this._parser.registerEscHandler({final:"7"},()=>this.saveCursor()),this._parser.registerEscHandler({final:"8"},()=>this.restoreCursor()),this._parser.registerEscHandler({final:"D"},()=>this.index()),this._parser.registerEscHandler({final:"E"},()=>this.nextLine()),this._parser.registerEscHandler({final:"H"},()=>this.tabSet()),this._parser.registerEscHandler({final:"M"},()=>this.reverseIndex()),this._parser.registerEscHandler({final:"="},()=>this.keypadApplicationMode()),this._parser.registerEscHandler({final:">"},()=>this.keypadNumericMode()),this._parser.registerEscHandler({final:"c"},()=>this.fullReset()),this._parser.registerEscHandler({final:"n"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"o"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"|"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"}"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"~"},()=>this.setgLevel(1)),this._parser.registerEscHandler({intermediates:"%",final:"@"},()=>this.selectDefaultCharset()),this._parser.registerEscHandler({intermediates:"%",final:"G"},()=>this.selectDefaultCharset());for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},()=>this.selectCharset("("+e)),this._parser.registerEscHandler({intermediates:")",final:e},()=>this.selectCharset(")"+e)),this._parser.registerEscHandler({intermediates:"*",final:e},()=>this.selectCharset("*"+e)),this._parser.registerEscHandler({intermediates:"+",final:e},()=>this.selectCharset("+"+e)),this._parser.registerEscHandler({intermediates:"-",final:e},()=>this.selectCharset("-"+e)),this._parser.registerEscHandler({intermediates:".",final:e},()=>this.selectCharset("."+e)),this._parser.registerEscHandler({intermediates:"/",final:e},()=>this.selectCharset("/"+e));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(e=>(this._logService.error("Parsing error: ",e),e)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new v.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){if(this._logService.logLevel<=u.LogLevelEnum.WARN){let t;const i=new Promise((e,i)=>{t=setTimeout(()=>i("#SLOW_TIMEOUT"),5e3)});Promise.race([e,i]).then(()=>{void 0!==t&&clearTimeout(t)},e=>{if(void 0!==t&&clearTimeout(t),"#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,o=0;const n=this._parseStack.paused;if(n){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>131072&&(o=this._parseStack.position+131072)}if(this._logService.logLevel<=u.LogLevelEnum.DEBUG&&this._logService.debug("parsing data "+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,e=>String.fromCharCode(e)).join("")}"`)),this._logService.logLevel===u.LogLevelEnum.TRACE&&this._logService.trace("parsing data (codes)","string"==typeof e?e.split("").map(e=>e.charCodeAt(0)):e),this._parseBuffer.length131072)for(let t=o;t0&&2===p.getWidth(this._activeBuffer.x-1)&&p.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(d){const e=p;let t=this._activeBuffer.x-m;if(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),p=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!p)return;for(m>0&&p instanceof l.BufferLine&&p.copyCellsFrom(e,t,0,m,!1);t=0;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(_&&(p.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===p.getWidth(a-1)&&p.setCellFromCodepoint(a-1,c.NULL_CELL_CODE,c.NULL_CELL_WIDTH,u)),p.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===p.getWidth(this._activeBuffer.x)&&!p.hasContent(this._activeBuffer.x)&&p.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=>!y(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new v.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new g.ApcHandler(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 o=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);o&&(o.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(o.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){const e=this._activeBuffer.lines.get(i+1);e&&(e.isWrapped=!1)}for(;i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(i=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,i-1);i--;){const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+i);if(e?.getTrimmedLength())break}for(;i>=0;i--)this._bufferService.scroll(this._eraseAttrData())}else{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._activeBuffer===this._bufferService.buffers.normal&&(this._bufferService.isUserScrolling=!1),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("[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`P>|xterm.js(${b.XTERM_VERSION})\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(o.triggerDataEvent(`[${t?"":"?"}${e};${i}$y`),!0),_=e=>e?1:2,u=e.params[0];return t?d(u,2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(c.convertEol):0):1===u?d(u,_(i.applicationCursorKeys)):3===u?d(u,c.windowOptions.setWinLines?80===a?2:132===a?1:0:0):6===u?d(u,_(i.origin)):7===u?d(u,_(i.wraparound)):8===u?d(u,3):9===u?d(u,_("X10"===s)):12===u?d(u,_(c.cursorBlink)):25===u?d(u,_(!o.isCursorHidden)):45===u?d(u,_(i.reverseWraparound)):66===u?d(u,_(i.applicationKeypad)):67===u?d(u,4):1e3===u?d(u,_("VT200"===s)):1002===u?d(u,_("DRAG"===s)):1003===u?d(u,_("ANY"===s)):1004===u?d(u,_(i.sendFocus)):1005===u?d(u,4):1006===u?d(u,_("SGR"===r)):1015===u?d(u,4):1016===u?d(u,_("SGR_PIXELS"===r)):1048===u?d(u,1):47===u||1047===u||1049===u?d(u,_(h===l)):2004===u?d(u,_(i.bracketedPasteMode)):2026===u?d(u,_(i.synchronizedOutput)):9001===u&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?d(u,_(i.win32InputMode)):d(u,0)}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=_.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-67108864,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,o=0;do{if(s[o+r]=e.params[t+o],e.hasSubParams(t+o)){const i=e.getSubParams(t+o);let n=0;do{5===s[1]&&(r=1),s[o+n+1+r]=i[n]}while(++n=2||2===s[1]&&o+r>=5)break;s[1]&&(r=1)}while(++o+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&=-67108864,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-67108864,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-67108864,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-67108864,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:221===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.fg&=-134217729:222===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.bg&=-134217729:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("");break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[${e};${t}R`)}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[?${e};${t}R`);break;case 15:case 25:case 26:case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??1)&&this._onRequestColorSchemeQuery.fire()}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=0===e.length?1:e.params[0];if(0===t)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar"}const e=t%2==1;this._coreService.decPrivateModes.cursorBlink=e}return!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(!y(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(C.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(C.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`[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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let e=0;e1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e,10);if(L(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.indexOf(";");if(-1===t)return!0;const i=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(i,s):!i.trim()&&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,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=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 d.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(`${e}\\`),!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)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(i){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;return s.length>=16&&s.shift(),s.push(i.flags),i.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=Math.max(1,e.params[0]||1),i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;for(let e=0;e0;e++)i.flags=s.pop();return 0===s.length&&t>0&&(i.flags=0),!0}}t.InputHandler=D;let E=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&&(k=e,e=t,t=k),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}E=s([r(0,u.IBufferService)],E)},4812(e,t){function i(e){return{dispose:e}}function s(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=s,t.combinedDisposable=function(...e){return i(()=>s(e))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=r;class o{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=o,o.None=Object.freeze({dispose(){}}),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}}},7710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},701(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isMac=t.isSafari=t.isLegacyEdge=t.isChrome=t.isFirefox=t.isNode=void 0,t.getZoomFactor=function(e){return 1},t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1],10)},t.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isChrome=i.includes("Chrome"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},3087(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;const s=i(6168);let r=0;t.SortedList=class{constructor(e,t){this._getKey=e,this._array=[],this._insertedValues=[],this._isFlushingInserted=!1,this._deletedIndices=[],this._isFlushingDeleted=!1,this._flushInsertedTask=new s.IdleTaskQueue(t),this._flushDeletedTask=new s.IdleTaskQueue(t)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(e){this._flushCleanupDeleted(),0===this._insertedValues.length&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(e)}_flushInserted(){const e=this._insertedValues.sort((e,t)=>this._getKey(e)-this._getKey(t));let t=0,i=0;const s=new Array(this._array.length+this._insertedValues.length);for(let r=0;r=this._array.length||this._getKey(e[t])<=this._getKey(this._array[i])?(s[r]=e[t],t++):s[r]=this._array[i++];this._array=s,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(e){if(this._flushCleanupInserted(),0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(r=this._search(t),-1===r)return!1;if(this._getKey(this._array[r])!==t)return!1;do{if(this._array[r]===e)return 0===this._deletedIndices.length&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(r),!0}while(++re-t);let t=0;const i=new Array(this._array.length-e.length);let s=0;for(let r=0;r0&&this._flushDeletedTask.flush()}*getKeyIterator(e){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),0!==this._array.length&&(r=this._search(e),!(r<0||r>=this._array.length)&&this._getKey(this._array[r])===e))do{yield this._array[r]}while(++r=this._array.length)&&this._getKey(this._array[r])===e))do{t(this._array[r])}while(++r=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}}},4220(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LimitedStringBuilder=t.StringBuilder=void 0;class i{constructor(){this._chunks=[],this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(e){this._chunks.push(e),this._length+=e.length}toString(){return this._chunks.join("")}}t.StringBuilder=i,t.LimitedStringBuilder=class{constructor(e){this._limit=e,this._builder=new i}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(e){return this._builder.append(e),this._builder.length>this._limit&&(this._builder.reset(),!0)}toString(){return this._builder.toString()}}},6168(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;class i{constructor(e){this._tasks=[],this._i=0,this._logService=e}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ii)return r-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-t))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}}t.PriorityTaskQueue=s,t.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:s,t.DebouncedIdleTask=class{constructor(e){this._queue=new t.IdleTaskQueue(e)}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},7804(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.XTERM_VERSION=void 0,t.XTERM_VERSION="6.1.0-beta.303"},5882(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),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)};const s=i(8938)},5451(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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(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},1073(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(5639),r=i(4812),o=i(6168),n=i(5451),a=i(6107),h=i(732),l=i(3055),c=i(8938),d=i(8158),_=i(6760);t.MAX_BUFFER_SIZE=4294967295;class u extends r.Disposable{constructor(e,t,i,n){super(),this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this._logService=n,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=a.DEFAULT_ATTR_DATA.clone(),this.savedCharset=_.DEFAULT_CHARSET,this.savedCharsets=[],this.savedGlevel=0,this.savedOriginMode=!1,this.savedWraparoundMode=!0,this.markers=[],this._nullCell=l.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=l.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,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(),this._memoryCleanupQueue=new o.IdleTaskQueue(this._logService),this._register((0,r.toDisposable)(()=>this._memoryCleanupQueue.clear())),this._register((0,r.toDisposable)(()=>this.clearAllMarkers()))}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 a.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){e??=a.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(a.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+o+1?(this.ybase--,o++,this.ydisp>0&&this.ydisp--):this.lines.push(new a.BufferLine(e,i,!1)));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),o&&(this.y+=o),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;t0){const e=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,e)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._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}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=this._optionsService.rawOptions.reflowCursorLine,s=(0,h.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(a.DEFAULT_ATTR_DATA),i);if(s.length>0){const i=(0,h.reflowLargerCreateNewLayout)(this.lines,s);(0,h.reflowLargerApplyNewLayout)(this.lines,i.layout),this._reflowLargerAdjustViewport(e,t,i.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(a.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length=0;n--){let l=this.lines.get(n);if(!l||!l.isWrapped&&l.getTrimmedLength()<=e)continue;const c=[l];for(;l.isWrapped&&n>0;)l=this.lines.get(--n),c.unshift(l);if(!i){const e=this.ybase+this.y;if(e>=n&&e0&&(r.push({start:n+c.length+o,newLines:p}),o+=p.length),c.push(...p);let v=_.length-1,g=_[v];0===g&&(v--,g=_[v]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[v])break;if(c[v].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(v--,g=_[v]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,h.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;l--)if(a&&a.start>s+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(l--,a.newLines[e]);l++,e.push({index:s+1,amount:a.newLines.length}),h+=a.newLines.length,a=r[++n]}else this.lines.set(l,t[s--]);let l=0;for(let t=e.length-1;t>=0;t--)e[t].index+=l,this.lines.onInsertEmitter.fire(e[t]),l+=e[t].amount;const c=Math.max(0,i+o-this.lines.maxLength);c>0&&this.lines.onTrimEmitter.fire(c)}}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(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)}}t.Buffer=u},6107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(5451),r=i(3055),o=i(8938),n=i(726);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;const h=new r.CellData,l=t.DEFAULT_ATTR_DATA.extended.clone();class c{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._cacheValid=!1,this._cache="",this._cacheTrimmed=!1,this._data=new Uint32Array(3*e);const s=t??r.CellData.fromCharData([0,o.NULL_CELL_CHAR,o.NULL_CELL_WIDTH,o.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._cacheValid=!1,this._data[3*e+1]=t[o.CHAR_DATA_ATTR_INDEX],t[o.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[o.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[o.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[o.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,n.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]:t.combinedData="",268435456&t.bg?t.extended=this._extendedAttrs[e]:(l._ext=0,l._urlId=0,t.extended=l),t}setCell(e,t){this._cacheValid=!1,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){this._cacheValid=!1,268435456&s.bg&&(this._extendedAttrs[e]=s.extended);const r=3*e;this._data[r+0]=t|i<<22,this._data[r+1]=s.fg,this._data[r+2]=s.bg}addCodepointToCell(e,t,i){this._cacheValid=!1;let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,n.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,n.stringFromCodePoint)(2097151&s)+(0,n.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(this._cacheValid=!1,(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,h));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){this._cacheValid=!1;const o=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]=o[3*(t+r)+e];this._copyCellMapsFrom(e,t+r,i+r)}else for(let r=0;r>22||1}s&&s.push(t);const h=a.join("");return r&&(this._cache=h,this._cacheValid=!0,this._cacheTrimmed=!!e),h}_copyCellMapsFrom(e,t,i){const s=3*t;2097152&e._data[s+0]&&(this._combined[i]=e._combined[t]),268435456&e._data[s+2]&&(this._extendedAttrs[i]=e._extendedAttrs[t])}_copySparseMapsFrom(e){this._combined={},this._extendedAttrs={};for(let t=0;te.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)}},732(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.reflowLargerGetLinesToRemove=function(e,t,s,r,o,n){const a=[];for(let h=0;h=h&&r0&&(e>_||0===d[e].getTrimmedLength());e--)v++;v>0&&(a.push(h+d.length-v),a.push(v)),h+=d.length-1}return a},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],o=0;for(let n=0;nl&&(n-=l,a++);const c=2===e[a].getWidth(n-1);c&&n--;const d=c?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},4097(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(4812),r=i(1073),o=i(8636);class n extends s.Disposable{constructor(e,t,i){super(),this._optionsService=e,this._bufferService=t,this._logService=i,this._normalBuffer=this._register(new s.MutableDisposable),this._altBuffer=this._register(new s.MutableDisposable),this._onBufferActivate=this._register(new o.Emitter),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 r.Buffer(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new r.Buffer(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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=n},3055(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(726),r=i(8938),o=i(5451);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=n},8938(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=t.DEFAULT_COLOR<<9|256,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},8158(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(4812),r=i(8636);class o{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=o._nextId++,this._onDispose=this.register(new r.Emitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,s.dispose)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=o,o._nextId=1},6760(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["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},706(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=function(e,t,s,r){const o={type:0,cancel:!1,key:void 0},n=(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?"OA":"":"UIKeyInputLeftArrow"===e.key?o.key=t?"OD":"":"UIKeyInputRightArrow"===e.key?o.key=t?"OC":"":"UIKeyInputDownArrow"===e.key&&(o.key=t?"OB":"");break;case 8:o.key=e.ctrlKey?"\b":"",e.altKey&&(o.key=""+o.key);break;case 9:if(e.shiftKey){o.key="";break}o.key="\t",o.cancel=!0;break;case 13:"c"===e.key&&e.ctrlKey?o.key="":o.key=e.altKey?"\r":"\r",o.cancel=!0;break;case 27:o.key="",e.altKey&&(o.key=""),o.cancel=!0;break;case 37:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"D":t?"OD":"";break;case 39:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"C":t?"OC":"";break;case 38:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"A":t?"OA":"";break;case 40:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"B":t?"OB":"";break;case 45:e.shiftKey||e.ctrlKey||(o.key="[2~");break;case 46:o.key=n?"[3;"+(n+1)+"~":"[3~";break;case 36:o.key=n?"[1;"+(n+1)+"H":t?"OH":"";break;case 35:o.key=n?"[1;"+(n+1)+"F":t?"OF":"";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key="[5;"+(n+1)+"~":o.key="[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key="[6;"+(n+1)+"~":o.key="[6~";break;case 112:o.key=n?"[1;"+(n+1)+"P":"OP";break;case 113:o.key=n?"[1;"+(n+1)+"Q":"OQ";break;case 114:o.key=n?"[1;"+(n+1)+"R":"OR";break;case 115:o.key=n?"[1;"+(n+1)+"S":"OS";break;case 116:o.key=n?"[15;"+(n+1)+"~":"[15~";break;case 117:o.key=n?"[17;"+(n+1)+"~":"[17~";break;case 118:o.key=n?"[18;"+(n+1)+"~":"[18~";break;case 119:o.key=n?"[19;"+(n+1)+"~":"[19~";break;case 120:o.key=n?"[20;"+(n+1)+"~":"[20~";break;case 121:o.key=n?"[21;"+(n+1)+"~":"[21~";break;case 122:o.key=n?"[23;"+(n+1)+"~":"[23~";break;case 123:o.key=n?"[24;"+(n+1)+"~":"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(s&&!r||!e.altKey||e.metaKey)if(!s||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey){if(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length)o.key=e.key;else if(e.key&&e.ctrlKey&&e.shiftKey)switch(e.code){case"Minus":o.key="";break;case"Digit2":o.key="\0";break;case"Digit6":o.key=""}}else 65===e.keyCode&&(o.type=1);else{const t=i[e.keyCode],s=t?.[e.shiftKey?1:0];if(s)o.key=""+s;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=""+i}else if(32===e.keyCode)o.key=""+(e.ctrlKey?"\0":" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=""+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key="\0":e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key="":"/"===e.key?o.key="":219===e.keyCode?o.key="":220===e.keyCode?o.key="":221===e.keyCode&&(o.key="")}return o};const i={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:["'",'"']}},7241(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyKeyboard=void 0,t.KittyKeyboard=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440},this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24},this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"},this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(e){if(e.code.startsWith("Numpad")){const t=e.code.slice(6);if(t>="0"&&t<="9")return 57399+parseInt(t,10);switch(t){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(e){switch(e.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(e){let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4),e.metaKey&&(t|=8),t>0?t+1:0}_getKeyCode(e,t){const i=this._getNumpadKeyCode(e);if(void 0!==i)return i;const s=this._getModifierKeyCode(e);if(void 0!==s)return s;const r=this._functionalKeyCodes[e.key];if(void 0!==r)return r;if((e.shiftKey||t&&e.altKey)&&e.code){if(e.code.startsWith("Digit")&&6===e.code.length){const t=e.code.charAt(5);if(t>="0"&&t<="9")return t.charCodeAt(0)}if(e.code.startsWith("Key")&&4===e.code.length)return e.code.charAt(3).toLowerCase().charCodeAt(0)}if(1===e.key.length){const t=e.key.codePointAt(0);return t>=65&&t<=90?t+32:t}}_isModifierKey(e){return"Shift"===e.key||"Control"===e.key||"Alt"===e.key||"Meta"===e.key}_isLockKey(e){return"CapsLock"===e.key||"NumLock"===e.key||"ScrollLock"===e.key}_buildCsiLetterSequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"["+e}_buildSs3Sequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"O"+e}_buildCsiTildeSequence(e,t,i,s){const r=s&&1!==i;let o="["+e;return(t>0||r)&&(o+=";"+(t>0?t:"1"),r&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(e,t,i,s,r,o,n){const a=!!(2&r);let h,l="["+t;4&r&&e.shiftKey&&1===e.key.length&&!o&&!n&&(h=e.key.codePointAt(0),l+=":"+h);const c=16&r&&3!==s&&1===e.key.length&&!o&&!n&&!e.ctrlKey?e.key.codePointAt(0):void 0,d=a&&1!==s&&(3===s||void 0===c);return(i>0||d||void 0!==c)&&(l+=";",i>0?l+=i:d&&(l+="1"),d&&(l+=":"+s)),void 0!==c&&(l+=";"+c),l+="u",l}evaluate(e,t,i=1,s=!1){const r={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(e),n=this._isModifierKey(e),a=!!(2&t);if(!a&&3===i)return r;if(n&&!(8&t))return r;if(this._isLockKey(e)&&!(8&t))return r;const h=this._csiLetterKeys[e.key];if(h)return r.key=this._buildCsiLetterSequence(h,o,i,a),r.cancel=!0,r;const l=this._ss3FunctionKeys[e.key];if(l)return r.key=this._buildSs3Sequence(l,o,i,a),r.cancel=!0,r;const c=this._csiTildeKeys[e.key];if(void 0!==c)return r.key=this._buildCsiTildeSequence(c,o,i,a),r.cancel=!0,r;const d=this._getKeyCode(e,s);if(void 0===d)return r;const _=13===d||9===d||127===d;if(_&&3===i&&!(8&t))return r;const u=void 0!==this._functionalKeyCodes[e.key]||void 0!==this._getNumpadKeyCode(e);if(8&t||a&&3===i||(1&t||a)&&(u&&!_||o>0&&1!==e.key.length||o-1>1))r.key=this._buildCsiUSequence(e,d,o,i,t,u,n),r.cancel=!0;else{const t=13===d?"\r":9===d?"\t":127===d?"":void 0;t?r.key=t:1!==e.key.length||e.ctrlKey||e.altKey||e.metaKey||(r.key=e.key)}return r}static shouldUseProtocol(e){return e>0}}},726(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 o=r;o=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n);continue}65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=this.interim[++n])&&n<4;)r<<=6,r|=63&o;const a=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=a-n;for(;l=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===a?r<128?l--:t[h++]=r:3===a?r<2048||r>=55296&&r<=57343||65279===r||(t[h++]=r):r<65536||r>1114111||(t[h++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(a=(31&s)<<6|63&r,a<128){d--;continue}t[h++]=a}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(a=(15&s)<<12|(63&r)<<6|63&o,a<2048||a>=55296&&a<=57343||65279===a)continue;t[h++]=a}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,h;if(n=e[d++],128!=(192&n)){d--;continue}if(a=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,a<65536||a>1114111)continue;t[h++]=a}}return h}}},7428(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(6415),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]],o=[[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 n;t.UnicodeV6=class{constructor(){if(this.version="6",!n){n=new Uint8Array(65536),n.fill(1),n[0]=0,n.fill(0,1,32),n.fill(0,127,160),n.fill(2,4352,4448),n[9001]=2,n[9002]=2,n.fill(2,11904,42192),n[12351]=1,n.fill(2,44032,55204),n.fill(2,63744,64256),n.fill(2,65040,65050),n.fill(2,65072,65136),n.fill(2,65280,65377),n.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)}}},9249(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Win32InputMode=void 0,t.Win32InputMode=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226},this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40},this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]),this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(e){const t=this._codeToVk[e.code];return void 0!==t?t:e.keyCode||0}_getScanCode(e){return this._codeToScancode[e.code]||0}_getUnicodeChar(e){if(e.ctrlKey&&!e.altKey&&!e.metaKey){if("Enter"===e.key)return 10;if("Backspace"===e.key)return 127}const t=this._keyToControlChar[e.key];if(void 0!==t)return t;if(1===e.key.length){const t=e.key.codePointAt(0)||0;if(e.ctrlKey&&!e.altKey&&!e.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(e){let t=0;return e.shiftKey&&(t|=16),e.ctrlKey&&("ControlRight"===e.code?t|=4:t|=8),e.altKey&&("AltRight"===e.code?t|=1:t|=2),this._enhancedKeyCodes.has(e.code)&&(t|=256),t}evaluateKeyboardEvent(e,t){return{type:0,cancel:!0,key:`[${this._getVirtualKeyCode(e)};${this._getScanCode(e)};${this._getUnicodeChar(e)};${t?1:0};${this._getControlKeyState(e)};1_`}}}},3562(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(3132),r=i(4812),o=i(8636);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._innerWriteTimer=this._register(new s.TimeoutTimer),this._onWriteParsed=this._register(new o.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._register((0,r.toDisposable)(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed)return;if(this._isSyncWriting)return;let e;this._isSyncWriting=!0;let t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);const i=this._callbacks.shift();i&&i()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;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._store.isDisposed){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();this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;const i=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>{this._store.isDisposed||(performance.now()-i>=12?this._scheduleInnerWrite(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,performance.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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},8693(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(t.startsWith("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(t.startsWith("#")&&(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,o]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(o,t)}`};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}}},2607(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ApcHandler=t.ApcParser=void 0;const s=i(726),r=i(4220),o=[];t.ApcParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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].end(!1);this._stack.paused=!1,this._active=o,this._ident=0}start(e){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].start();else this._handlerFb(this._ident,"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._ident,"PUT",(0,s.utf32ToString)(e,t,i))}end(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].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._ident,"END",e);this._active=o,this._ident=0}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.ApcHandler=n,n._payloadLimit=1e7},9823(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(726),r=i(7262),o=i(4220),n=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=n,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}registerHandler(e,t){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=n,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||n,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=n,this._ident=0}};const a=new r.Params;a.addParam(0);class h{constructor(e){this._handler=e,this._data=new o.LimitedStringBuilder(h._payloadLimit),this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString(),this._params),t instanceof Promise))return t.then(e=>(this._params=a,this._data.reset(),this._hitLimit=!1,e));return this._params=a,this._data.reset(),this._hitLimit=!1,t}}t.DcsHandler=h,h._payloadLimit=1e7},6717(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(4812),r=i(7262),o=i(1346),n=i(9823),a=i(2607);class h{constructor(e){this.table=new Uint16Array(e)}setDefault(e,t){this.table.fill(e<<8|t)}add(e,t,i,s){this.table[t<<8|e]=i<<8|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 o=i(0,17);e.setDefault(1,0),e.addMany(s,0,2,0);for(const t of o)e.addMany([24,26,153,154],t,3,0),e.addMany(i(128,144),t,3,0),e.addMany(i(144,152),t,3,0),e.add(156,t,0,0),e.add(27,t,11,1),e.add(157,t,4,8),e.addMany([152,158],t,0,7),e.add(159,t,11,14),e.add(155,t,11,3),e.add(144,t,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],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(95,1,11,14),e.addMany(r,14,0,14),e.add(127,14,0,14),e.addMany(i(32,48),14,9,15),e.addMany(i(48,127),14,15,16),e.addMany(i(48,127),15,15,16),e.addMany(r,15,0,15),e.addMany(i(32,48),15,9,15),e.add(127,15,0,15),e.addMany(s,16,16,16),e.addMany(r,16,0,16),e.addMany(i(8,14),16,16,16),e.add(127,16,0,16),e.addMany([27,156,24,26],16,17,0),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(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(r,10,0,10),e.add(127,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(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(l,0,2,0),e.add(l,8,5,8),e.add(l,6,0,6),e.add(l,11,0,11),e.add(l,13,13,13),e.add(l,16,16,16),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._executeHandlersArr=new Array(24).fill(void 0),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._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new o.OscParser),this._dcsParser=this._register(new n.DcsParser),this._apcParser=this._register(new a.ApcParser),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>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]);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){const i=e.charCodeAt(0);this._executeHandlers[i]=t,i<24&&(this._executeHandlersArr[i]=t)}clearExecuteHandler(e){const t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),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,o,n=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,n=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 r=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](this._params),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 4:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],o=this._dcsParser.unhook(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],o=this._oscParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],o=this._apcParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0}this._parseStack.state=0,n=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=255&this._parseStack.transition}for(let i=n;i=60&&n<=63&&(this._collect=n,s++);let a=!1;for(;s=48&&n<=57)this._params.addDigit(n-48);else if(59===n)this._params.addParam(0);else{if(58!==n){if(n>=64&&n<=126){const e=this._csiHandlers[this._collect<<8|n];let t=e?e.length-1:-1;for(;t>=0&&(o=e[t](this._params),!0!==o);t--)if(o instanceof Promise)return r=1792,this._preserveStack(3,e,t,r,s),o;t<0&&this._csiHandlerFb(this._collect<<8|n,this._params),this.precedingJoinState=0,i=s,this.currentState=0,a=!0;break}break}this._params.addSubParam(-1)}a||(i=s-1,this.currentState=4);continue}switch(r=this._transitions.table[this.currentState<<8|(s>8){case 2:let n=i;const a=t-4;for(;n=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l););if(n>=a)for(;n=32&&(e[n]<=126||e[n]>=l);)n++;this._printHandler(e,i,n),i=n-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const h=this._csiHandlers[this._collect<<8|s];let c=h?h.length-1:-1;for(;c>=0&&(o=h[c](this._params),!0!==o);c--)if(o instanceof Promise)return this._preserveStack(3,h,c,r,i),o;c<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do{switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}}while(++i47&&s<60);i--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:const d=this._escHandlers[this._collect<<8|s];let _=d?d.length-1:-1;for(;_>=0&&(o=d[_](),!0!==o);_--)if(o instanceof Promise)return this._preserveStack(4,d,_,r,i),o;_<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let r=i+1;;++r)if(r>=t||24===(s=e[r])||26===s||27===s||s>127&&s=t||(s=e[r])<32||s>127&&s=32&&e[s]<127||e[s]>=8&&e[s]<14||e[s]>=l))){this._apcParser.put(e,i,s),i=s-1;break}break;case 17:if(o=this._apcParser.end(24!==s&&26!==s),o)return this._preserveStack(7,[],0,r,i),o;27===s&&(r|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0}this.currentState=255&r}}}t.EscapeSequenceParser=c},1346(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(726),r=i(4220),o=[];t.OscParser=class{constructor(){this._state=0,this._active=o,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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=o,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||o,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,s.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=o,this._id=-1,this._state=0}}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.OscHandler=n,n._payloadLimit=1e7},7262(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;class i{static fromArray(e){const t=new i;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 i(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}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>2147483647?2147483647: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 less than -1 are not allowed");this._subParams[this._subParamsLength++]=e>2147483647?2147483647: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 i=this._digitIsSub?this._subParams:this.params,s=i[t-1];i[t-1]=~s?Math.min(10*s+e,2147483647):e}}t.Params=i},3027(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i=this._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)}}},5101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(3235),r=i(4812),o=i(8636);class n extends r.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this._register(new o.Emitter),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._register(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=n},6097(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)}registerApcHandler(e,t){return this._core.registerApcHandler(e,t)}}},4335(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}}},9640(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=void 0;const o=i(4812),n=i(4097),a=i(6501),h=i(8636);let l=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e,t){super(),this.isUserScrolling=!1,this._onResize=this._register(new h.Emitter),this.onResize=this._onResize.event,this._onScroll=this._register(new h.Emitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new n.BufferSet(e,this,t)),this._register(this.buffers.onBufferActivate(e=>{this._onScroll.fire(e.activeBuffer.ydisp)}))}resize(e,t){const i=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:i,rowsChanged:s})}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,o=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;o===i.lines.length-1?e?i.lines.recycle().copyFrom(s,!0):i.lines.push(s.clone(!0)):i.lines.splice(o+1,0,s.clone(!0)),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=o-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(o,s.clone(!0))}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t){const i=this.buffer;if(e<0){if(0===i.ydisp)return;this.isUserScrolling=!0}else e+i.ydisp>=i.ybase&&(this.isUserScrolling=!1);const s=i.ydisp;i.ydisp=Math.max(Math.min(i.ydisp+e,i.ybase),0),s!==i.ydisp&&(t||this._onScroll.fire(i.ydisp))}};t.BufferService=l,t.BufferService=l=s([r(0,a.IOptionsService),r(1,a.ILogService)],l)},5746(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}get charsets(){return 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)}}},4071(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const o=i(4812),n=i(6501),a=i(8636),h=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0});let c=class extends o.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorHidden=!1,this._onData=this._register(new a.Emitter),this.onData=this._onData.event,this._onUserInput=this._register(new a.Emitter),this.onUserInput=this._onUserInput.event,this._onBinary=this._register(new a.Emitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this._register(new a.Emitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.isCursorInitialized=i.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}reset(){this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}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}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onBinary.fire(e))}};t.CoreService=c,t.CoreService=c=s([r(0,n.IBufferService),r(1,n.ILogService),r(2,n.IOptionsService)],c)},4720(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationLineCache=t.DecorationService=void 0;const o=i(3132),n=i(4103),a=i(4812),h=i(6501),l=i(3087),c=i(8636);let d=0,_=0,u=class extends a.Disposable{get decorations(){return this._decorations.values()}constructor(e,t){super(),this._logService=e,this._bufferService=t,this._lineCache=this._register(new f),this._onDecorationRegistered=this._register(new c.Emitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this._register(new c.Emitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this._decorations=new l.SortedList(e=>e?.marker.line,this._logService),this._register((0,a.toDisposable)(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}registerDecoration(e){if(e.marker.isDisposed)return;const t=new p(e);if(t){const e=t.marker.onDispose(()=>t.dispose()),i=t.onDispose(()=>{i.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),e.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,i){const s=this._lineCache.getDecorationsOnLine(t);if(s)for(const t of s)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&(yield t)}forEachDecorationAtCell(e,t,i,s){const r=this._lineCache.getDecorationsOnLine(t);if(r)for(const t of r)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&s(t)}};t.DecorationService=u,t.DecorationService=u=s([r(0,h.ILogService),r(1,h.IBufferService)],u);class f extends a.Disposable{constructor(){super(...arguments),this._decorationsByLine=new Map,this._decorations=new Set,this._bufferLineListeners=this._register(new a.MutableDisposable),this._lineIndexSyncTimer=this._register(new o.MicrotaskTimer),this._lineIndexSyncCallbacks=[]}clear(){this._lineIndexSyncCallbacks.length=0,this._lineIndexSyncTimer.cancel(),this._decorationsByLine.clear(),this._decorations.clear()}add(e){this._decorations.add(e),this._addToLineBuckets(e)}remove(e){this._decorations.delete(e),this._removeFromLineBuckets(e)}getDecorationsOnLine(e){return this._decorationsByLine.get(e)}attachToBufferLines(e){const t=new a.DisposableStore;this._bufferLineListeners.value=t,t.add(e.onTrim(e=>this._handleBufferLinesTrim(e))),t.add(e.onInsert(e=>this._handleBufferLinesInsert(e))),t.add(e.onDelete(e=>this._handleBufferLinesDelete(e)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){const t=e.marker.line;if(t<0)return;e._indexedStartLine=t;const i=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{const e=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(const t of e)t()})}_handleBufferLinesTrim(e){if(e<=0||!this._decorationsByLine.size)return;const t=new Map;for(const[i,s]of this._decorationsByLine){const r=i-e;r<0||this._mergeLineBucket(t,r,s)}this._decorationsByLine.clear();for(const[e,i]of t)this._decorationsByLine.set(e,i);for(const t of this._decorations)t.marker.isDisposed||(t._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,i){const s=e.get(t);if(s)for(let e=0,t=i.length;et&&(s.push(e),this._removeFromLineBuckets(e))}const r=new Map;for(const[e,s]of this._decorationsByLine){const o=e>=t?e+i:e;this._mergeLineBucket(r,o,s)}this._decorationsByLine.clear();for(const[e,t]of r)this._decorationsByLine.set(e,t);for(const e of this._decorations)e.marker.isDisposed||e._indexedStartLine>=t&&(e._indexedStartLine=e.marker.line);for(const e of s)this._addToLineBuckets(e)}_applyBufferLinesDelete(e){const t=e.index+e.amount,i=new Map;for(const[s,r]of this._decorationsByLine){if(s>=e.index&&s=t?s-e.amount:s;this._mergeLineBucket(i,o,r)}this._decorationsByLine.clear();for(const[e,t]of i)this._decorationsByLine.set(e,t);const s=[];for(const i of this._decorations){if(i.marker.isDisposed)continue;const r=i._indexedStartLine,o=this._getDecorationHeight(i);r>=t?i._indexedStartLine=i.marker.line:rt&&s.push(i)}for(const e of s)this._reindexDecoration(e)}}t.DecorationLineCache=f;class p extends a.DisposableStore{get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=n.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=n.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.add(new c.Emitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.add(new c.Emitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},6025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(6501),r=i(6201);class o{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=o,t.InstantiationService=class{constructor(){this._services=new o,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._id}.`);s.push(i)}const o=i.length>0?i[0].index:t.length;if(t.length!==o)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${o+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7276(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.LogService=void 0;const o=i(4812),n=i(6501),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t!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 n(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 a=String.fromCharCode,h={DEFAULT:e=>{const t=[n(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${a(t[0])}${a(t[1])}${a(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.x};${e.y}${t}`}};class l extends s.Disposable{constructor(){super(),this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._onProtocolChange=this._register(new r.Emitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(o))this.addProtocol(e,o[e]);for(const e of Object.keys(h))this.addEncoding(e,h[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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return!this._customWheelEventHandler||!1!==this._customWheelEventHandler(e)}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return"DEFAULT"===this._activeEncoding}get isPixelEncoding(){return"SGR_PIXELS"===this._activeEncoding}}t.MouseStateService=l},56(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(4812),r=i(701),o=i(8636);t.DEFAULT_OPTIONS={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:r.isMac,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}};const n=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends s.Disposable{constructor(e){super(),this._onOptionChange=this._register(new o.Emitter),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,s.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=n.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"blinkIntervalDuration":if((i=Math.floor(i))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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},8811(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const o=i(6501);let n=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 o=t.addMarker(t.ybase+t.y),n={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(n,o)),this._entriesWithId.set(n.key,n),this._dataByLinkId.set(n.id,n),n.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=n,t.OscLinkService=n=s([r(0,o.IBufferService)],n)},6201(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.serviceRegistry=void 0,t.getServiceDependencies=function(e){return e.di$dependencies||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const i=function(e,t,s){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,i){t.di$target===t?t.di$dependencies.push({id:e,index:i}):(t.di$dependencies=[{id:e,index:i}],t.di$target=t)}(i,e,s)};return i._id=e,t.serviceRegistry.set(e,i),i},t.serviceRegistry=new Map},6501(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.IMouseStateService=t.IBufferService=void 0;const s=i(6201);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.IMouseStateService=(0,s.createDecorator)("MouseStateService"),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")},6415(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8636);class r{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.Emitter,this.onChange=this._onChange.event}static extractShouldJoin(e){return!!(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)}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,this._active||(this.activeVersion=e.version)}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let o=0;o=s)return t+this.wcwidth(n);const i=e.charCodeAt(o);56320<=i&&i<=57343?n=1024*(n-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(n,i);let h=r.extractWidth(a);r.extractShouldJoin(a)&&(h-=r.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=r}},t={};return function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}(6081)})()); ++!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={2840(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=r.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new c.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,f.addDisposableListener)(r,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register((0,d.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=l.tooMuchOutput.get())))}_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=[],o=e?.translateToString(!0,void 0,void 0,t)||"",n=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===o.length?(a.textContent=" ",this._rowColumns.set(a,[0,1])):(a.textContent=o,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",n),a.setAttribute("aria-setsize",s),this._alignRowWidth(a))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent===l.tooMuchOutput.get()&&this._clearLiveRegion(),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,o;if(0===t?(r=i,o=this._rowElements.pop(),this._rowContainer.removeChild(o)):(r=this._rowElements.shift(),o=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),o.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=this._coreBrowserService.mainDocument.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 o=t=this._terminal.cols&&(++s,o=0),{row:s,column:o}},o=r(t),n=r(i);if(o&&n){if(o.row>n.row||o.row===n.row&&o.column>=n.column)throw new Error("invalid range");this._terminal.select(o.column,o.row,(n.row-o.row)*this._terminal.cols-o.column+n.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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;ethis._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(e=>this.refresh(e?.start??0,e?.end??this.rows-1))),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(I.EventUtils.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(I.EventUtils.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(I.EventUtils.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(I.EventUtils.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(e=>this._afterResize(e.cols,e.rows))),this._register((0,N.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=E.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`]${i};${(0,R.toRgbString)(s)}\\`);break;case 1:if("ansi"===e)this._themeService.modifyColors(e=>e.ansi[t.index]=E.channels.toColor(...t.color));else{const i=e;this._themeService.modifyColors(e=>e[i]=E.channels.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index)}}}_reportColorScheme(){if(!this._themeService)return;const e=E.rgb.relativeLuminance(this._themeService.colors.background.rgba>>8)>8)?1:2;this.coreService.triggerDataEvent(`[?997;${e}n`)}_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(A.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.blur()}_handleTextAreaBlur(){this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.blur(),this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(""),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),o=this._renderService.dimensions.css.cell.width*r,n=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=n+"px",this.textarea.style.width=o+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this._register((0,H.addDisposableListener)(this.element,"copy",e=>{this.hasSelection()&&(0,a.copyHandler)(e,this._selectionService)}));const e=e=>(0,a.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this._register((0,H.addDisposableListener)(this.textarea,"paste",e)),this._register((0,H.addDisposableListener)(this.element,"paste",e)),L.isFirefox?this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>{2===e.button&&(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register((0,H.addDisposableListener)(this.element,"contextmenu",e=>{(0,a.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),L.isLinux&&this._register((0,H.addDisposableListener)(this.element,"auxclick",e=>{1===e.button&&(0,a.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)}))}_bindKeys(){this._register((0,H.addDisposableListener)(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register((0,H.addDisposableListener)(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register((0,H.addDisposableListener)(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register((0,H.addDisposableListener)(this.textarea,"compositionend",e=>{this._compositionHelper instanceof u.CompositionHelper?this._compositionHelper.compositionend(e)&&this.textarea.dispatchEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0})):this._compositionHelper.compositionend()})),this._register((0,H.addDisposableListener)(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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",e=>this.element.classList.toggle("allow-transparency",e))),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.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register((0,H.addDisposableListener)(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);const i=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",h.promptLabel.get()),L.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>i.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(g.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??("undefined"!=typeof window?window.document:null))),this._instantiationService.setService(C.ICoreBrowserService,this._coreBrowserService),this._register((0,H.addDisposableListener)(this.textarea,"focus",e=>this._handleTextAreaFocus(e))),this._register((0,H.addDisposableListener)(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(p.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(C.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(k.ThemeService),this._instantiationService.setService(C.IThemeService,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(v.CharacterJoinerService),this._instantiationService.setService(C.ICharacterJoinerService,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(w.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(C.IRenderService,this._renderService),this._register(this._renderService.onRenderedViewportChange(e=>this._onRender.fire(e))),this._register(this._renderService.onDimensionsChange(e=>this._onDimensionsChange.fire({css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}))),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(u.CompositionHelper,this.textarea,this._compositionView),this._register((0,N.toDisposable)(()=>{this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.dispose()})),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(S.MouseCoordsService),this._instantiationService.setService(C.IMouseCoordsService,this._mouseCoordsService);const s=this._linkifier.value=this._register(this._instantiationService.createInstance(O.Linkifier,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(e){this._logService.error("onWillOpen handler threw an exception",e)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(c.Viewport,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(e=>{super.scrollLines(e,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(y.SelectionService,this.element,this.screenElement,s)),this._instantiationService.setService(C.ISelectionService,this._selectionService),this._mouseService=this._instantiationService.createInstance(b.MouseService),this._instantiationService.setService(C.IMouseService,this._mouseService),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(I.EventUtils.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(d.BufferDecorationRenderer,this.screenElement)),this._register((0,H.addDisposableListener)(this.element,"mousedown",e=>this._selectionService.handleMouseDown(e))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(A.AccessibilityManager,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",e=>this._handleScreenReaderModeOptionChange(e)));const r=this.options.scrollbar?.showScrollbar??!0,o=this.options.scrollbar?.width;r&&o&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",e=>{const t=(e?.showScrollbar??!0)&&!!e?.width;!this._overviewRulerRenderer&&t&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(_.OverviewRulerRenderer,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:e=>this._viewport?.handleTouchScroll(e)},e=>this._register(e),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(f.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,i=!1){this._renderService?.refreshRows(e,t,i)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}paste(e){(0,a.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(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(!0),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),e.preventDefault(),e.stopPropagation(),!1}if(1===i.type&&this.selectAll(),this._isThirdLevelShift(this.browser,e))return!0;if(i.cancel&&(e.preventDefault(),e.stopPropagation()),!i.key)return!0;if(!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;""!==i.key&&"\r"!==i.key||(this.textarea.value="");const s=this._keyboardService.useWin32InputMode&&W(e);if(this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;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){if(this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return;W(e)||this.focus();const t=this._keyboardService.evaluateKeyUp(e);if(t?.key){const i=this._keyboardService.useWin32InputMode&&W(e);this.coreService.triggerDataEvent(t.key,!i)}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(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._compositionHelper.keypress?.(t)||this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&!this.optionsService.rawOptions.screenReaderMode&&this._compositionHelper instanceof u.CompositionHelper&&this._compositionHelper.input(e.data))return!0;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),!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()}clear(){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;efunction(e){const t=l(e);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(a.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}(e))),r};const s=i(3132);function r(e){const t=e;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;const i=e;return i?.view?i.view:window}class o{constructor(e,t,i,s){this._node=e,this._type=t,this._handler=i,this._options=s,e.addEventListener(t,i,s)}dispose(){this._node&&this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function n(e,t,i,s){return new o(e,t,i,s)}t.eventType={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};class a{constructor(e,t){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){console.error(e)}}static sort(e,t){return t.priority-e.priority}}const h=new Map;function l(e){let t=h.get(e);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},h.set(e,t)),t}class c extends s.IntervalTimer{constructor(e){super(),this._defaultTarget=e?r(e):void 0}cancelAndSet(e,t,i){super.cancelAndSet(e,t,i??this._defaultTarget??window)}}t.WindowIntervalTimer=c},8906(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const o=i(4812),n=i(6501),a=i(7098),h=i(8636),l=i(4159);let c=class extends o.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseCoordsService=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 h.Emitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this._register(new h.Emitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this._register((0,o.toDisposable)(()=>{(0,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register((0,l.addDisposableListener)(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register((0,l.addDisposableListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register((0,l.addDisposableListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element);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=o;e<=n;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);var i,s;t&&this._mouseDownLink&&(i=this._mouseDownLink.link,s=this._currentLink.link,i.text===s.text&&i.range.start.x===s.range.start.x&&i.range.start.y===s.range.start.y&&i.range.end.x===s.range.end.x&&i.range.end.y===s.range.end.y)&&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,o.dispose)(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);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);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){const i=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(i)return{x:i[0],y:i[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=c,t.Linkifier=c=s([r(1,a.IMouseCoordsService),r(2,a.IRenderService),r(3,n.IBufferService),r(4,a.ILinkProviderService)],c)},7721(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0;let i="Terminal input";const s={get:()=>i,set:e=>i=e};t.promptLabel=s;let r="Too much output to announce, navigate to rows manually to read";const o={get:()=>r,set:e=>r=e};t.tooMuchOutput=o},3285(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const o=i(3055),n=i(6501);let a=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i,this._workCell=new o.CellData}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=this._workCell,n=i.getTrimmedLength();let a=-1,l=-1,c=!1;for(let t=0;tr?r.activate(e,t,d):h(0,t),hover:(e,t)=>r?.hover?.(e,t,d),leave:(e,t)=>r?.leave?.(e,t,d)})}c=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,a=o.extended.urlId):(l=-1,a=-1)}}t(s)}_getRangeWithLineWrap(e,t,i,s){let r=e,o=t,n=e,a=i;for(;0===o;){const e=this._bufferService.buffer.lines.get(r-1);if(!e?.isWrapped)break;const t=this._bufferService.buffer.lines.get(r-2);if(!t)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,i-1,s))break;let n=i-1;for(;n>0&&this._hasUrlId(t,n-1,s);)n--;r--,o=n}for(;;){const e=this._bufferService.buffer.lines.get(n-1);if(!e)break;if(a!==e.getTrimmedLength())break;const t=this._bufferService.buffer.lines.get(n);if(!t?.isWrapped)break;const i=t.getTrimmedLength();if(0===i||!this._hasUrlId(t,0,s))break;let r=1;for(;rthis._innerRefresh()),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=e??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,void 0===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=[]}}},4292(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(e,t,i){this._rowCount=i,e=e??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=performance.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)void 0!==this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),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=performance.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)}}},9302(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_ANSI_COLORS=void 0;const s=i(4103);t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[s.css.toColor("#2e3436"),s.css.toColor("#cc0000"),s.css.toColor("#4e9a06"),s.css.toColor("#c4a000"),s.css.toColor("#3465a4"),s.css.toColor("#75507b"),s.css.toColor("#06989a"),s.css.toColor("#d3d7cf"),s.css.toColor("#555753"),s.css.toColor("#ef2929"),s.css.toColor("#8ae234"),s.css.toColor("#fce94f"),s.css.toColor("#729fcf"),s.css.toColor("#ad7fa8"),s.css.toColor("#34e2e2"),s.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const r=t[i/36%6|0],o=t[i/6%6|0],n=t[i%6];e.push({css:s.channels.toCss(r,o,n),rgba:s.channels.toRgba(r,o,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:s.channels.toCss(i,i,i),rgba:s.channels.toRgba(i,i,i)})}return e})())},4017(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const o=i(7098),n=i(4812),a=i(6501),h=i(4159),l=i(8566),c=i(8636),d=i(7880);let _=class extends n.Disposable{constructor(e,t,i,s,r,o,a,_,u){super(),this._bufferService=i,this._coreService=r,this._optionsService=_,this._renderService=u,this._onRequestScrollLines=this._register(new c.Emitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._isSyncing=!1,this._isHandlingScroll=!1,this._suppressOnScrollHandler=!1,this._needsSyncOnRender=!1;const f=this._register(new d.Scrollable({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:e=>(0,h.scheduleAtNextAnimationFrame)(s.window,e)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{f.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new l.SmoothScrollableElement(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},f)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(o.onProtocolChange(e=>{this._scrollableElement.updateOptions({handleMouseWheel:!(16&e)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{e.style.backgroundColor=a.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=a.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register((0,n.toDisposable)(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register((0,n.toDisposable)(()=>this._styleElement.remove())),this._register(c.EventUtils.runAndSubscribe(a.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${a.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${a.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${a.colors.scrollbarSliderActiveBackground.css};`,"}"].join("\n")})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(e=>this._handleScroll(e)))}scrollLines(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){const e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,i=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:i,verticalHasArrows:t}}queueSync(e){void 0!==e&&(this._latestYDisp=e),void 0===this._queuedAnimationFrame&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){this._renderService&&!this._isSyncing&&(this._coreService.decPrivateModes.synchronizedOutput?this._needsSyncOnRender=!0:(this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1))}_handleScroll(e){if(!this._renderService)return;if(this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;const t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),i=t-this._bufferService.buffer.ydisp;0!==i&&(this._latestYDisp=t,this._onRequestScrollLines.fire(i)),this._isHandlingScroll=!1}handleTouchScroll(e){const t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};t.Viewport=_,t.Viewport=_=s([r(2,a.IBufferService),r(3,o.ICoreBrowserService),r(4,a.ICoreService),r(5,a.IMouseStateService),r(6,o.IThemeService),r(7,a.IOptionsService),r(8,o.IRenderService)],_)},4196(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const o=i(7098),n=i(4812),a=i(6501);let h=class extends n.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,n.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.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),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,t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,o.ICoreBrowserService),r(3,a.IDecorationService),r(4,o.IRenderService)],h)},957(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)}}},9925(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const o=i(957),n=i(7098),a=i(4812),h=i(6501),l={full:0,left:0,center:0,right:0},c={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=class extends a.Disposable{get _width(){const e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??1?e?.width??0:0}constructor(e,t,i,s,r,n,h,l){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=n,this._themeService=h,this._coreBrowserService=l,this._colorZoneStore=new o.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),this._register((0,a.toDisposable)(()=>this._canvas?.remove()));const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register((0,a.toDisposable)(()=>{void 0!==this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);c.full=this._canvas.width,c.left=e,c.center=t,c.right=e,this._refreshDrawHeightConstants(),d.full=1,d.left=1,d.center=1+c.left,d.right=1+c.left+c.center}_refreshDrawHeightConstants(){l.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);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;const e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;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,this._renderRulerOutline();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}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_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)-l[e.position||"full"]/2),c[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_,t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,n.IRenderService),r(5,h.IOptionsService),r(6,n.IThemeService),r(7,n.ICoreBrowserService)],_)},3618(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const o=i(7098),n=i(6501),a=i(4103),h="xterm-composition-session-end";let l=class{get isComposing(){return this._isComposing}get hasPendingCompositionFinalization(){return void 0!==this._pendingComposition}get _isSendingComposition(){return this.hasPendingCompositionFinalization}get _pendingKeypressData(){return this._pendingComposition?.keypressData??""}constructor(e,t,i,s,r,o,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=o,this._themeService=n,this._isComposing=!1,this._isAwaitingCompositionEnd=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent="",this._compositionInputData="",this._lastCompositionData="",this._compositionStartValue="",this._compositionStartSelection={start:0,end:0},this._compositionHasObservedProgress=!1,this._compositionTransactionId=0,this._compositionTimers=new Set,this._imeKeydownAwaitingCommit=!1}compositionstart(){this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=void 0,this._cancelDeferredTimer(this._compositionViewTimer),this._compositionViewTimer=void 0,this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;this._compositionPosition.start=Math.min(e,t),this._compositionPosition.end=Math.max(e,t),this._compositionStartValue=this._textarea.value,this._compositionStartSelection={start:e,end:t},this._compositionHasObservedProgress=!1,this._imeKeydownAwaitingCommit=!1,this._pendingComposition&&(this._pendingComposition.nextCompositionStart=this._compositionPosition.start),this._compositionTransactionId++,this._isComposing=!0,this._isAwaitingCompositionEnd=!0,this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._resetCompositionView(),this._dataAlreadySent="",this._compositionInputData="",this._lastCompositionData="",this._compositionView.classList.add("active"),this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-session-start",{bubbles:!0,detail:{id:this._compositionTransactionId}}))}compositionupdate(e){e.data&&!this._isComposing&&this.compositionstart(),this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._compositionHasObservedProgress||=this._hasCompositionProgress(),e.data?.length>0&&(this._lastCompositionData=e.data),this._renderCompositionView(e.data??""),this._compositionView.classList.toggle("active",Boolean(e.data)),this.updateCompositionElements();const t=this._compositionTransactionId;this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=this._defer(()=>{if(this._isComposing&&this._compositionTransactionId===t){this._compositionHasObservedProgress||=this._hasCompositionProgress();const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)}})}compositionend(e){if(!this._isAwaitingCompositionEnd)return!1;if(!this._isComposing){const t=this._pendingComposition;return t?.transactionId===this._compositionTransactionId&&(t.endData=e?.data??"",this._updatePostCompositionInputExpectation(t)),!1}const t=e?.data??"";if(this._compositionHasObservedProgress||=this._hasCompositionProgress(),!this._compositionEndBelongsToCurrentTransaction(t)){const e=this._pendingComposition;return e&&e.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(e),this._deferCompositionEnd(t),!1}return this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._finalizeComposition(!0,t),!0}blur(){if(this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._isComposing){const e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)}(this._isComposing||this.hasPendingCompositionFinalization)&&this._finalizeComposition(!1)}dispose(){void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);for(const e of this._compositionTimers)clearTimeout(e);this._compositionTimers.clear(),this._compositionPositionTimer=void 0,this._compositionViewTimer=void 0,this._compositionEndTimer=void 0,this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionTransactionId++,this._compositionView.classList.remove("active"),this._resetCompositionView()}keydown(e){if(this._canceledKey?.code===e.code&&this._canceledKey.timeStamp===e.timeStamp)return this._canceledKey=void 0,!1;if("Escape"===e.key&&(this._isComposing||this.hasPendingCompositionFinalization))return this._canceledKey={code:e.code,timeStamp:e.timeStamp},this._cancelComposition(),!1;if(this._isComposing||this.hasPendingCompositionFinalization){if(this._deferPreeditResync(this._composedRegionLength()>0),20===e.keyCode||229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return this._imeKeydownAwaitingCommit=229===e.keyCode,229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}keypress(e){const t=this._pendingComposition;return!(!t||(t.keypressMayOverlapComposition?(t.keypressData+=e,0):t.expectsPostCompositionInput&&0===t.keypressData.length?(t.keypressData=e,0):(this._sendPendingComposition(t),1)))}input(e){if(this._isComposing)return this._compositionHasObservedProgress||=this._hasCompositionProgress(),this._compositionInputData+=e,!0;const t=this._pendingComposition;if(!t)return this._claimImeKeydownCommit(e);if(t.expectsPostCompositionInput)return t.inputData+=e,t.expectsPostCompositionInput=!1,this._sendPendingComposition(t),!0;const i=e.length>0&&this._getPendingTextareaInput(t)===e&&this._getPendingTextareaInput(t,!0)===e;return this._sendPendingComposition(t),i||this._coreService.triggerDataEvent(e,!0),!0}_claimImeKeydownCommit(e){return!!this._imeKeydownAwaitingCommit&&(this._imeKeydownAwaitingCommit=!1,void 0!==this._textareaChangeTimer&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0),this._coreService.triggerDataEvent(e,!0),!0)}_finalizeComposition(e,t=""){const i=this._isComposing;if(this._compositionView.classList.remove("active"),this._resetCompositionView(),this._isComposing=!1,!e||i)if(e){this._pendingComposition&&this._sendPendingComposition(this._pendingComposition);const e={transactionId:this._compositionTransactionId,lifecycleSettled:!1,sessionEnded:!1,position:{start:this._compositionPosition.start,end:this._compositionPosition.end},suffix:this._compositionSuffix,dataAlreadySent:this._dataAlreadySent,compositionData:this._lastCompositionData,endData:t,inputData:this._compositionInputData,keypressData:"",keypressMayOverlapComposition:0===this._lastCompositionData.length&&0===t.length,expectsPostCompositionInput:!1};this._updatePostCompositionInputExpectation(e),this._pendingComposition=e,e.finalizerTimer=this._defer(()=>{e.finalizerTimer=void 0,this._compositionTransactionId===e.transactionId&&(this._isAwaitingCompositionEnd=!1),this._pendingComposition===e&&this._sendPendingComposition(e,!0)})}else if(this._pendingComposition&&this._sendPendingComposition(this._pendingComposition,!0),i){const e=this._getCompositionInput(this._compositionPosition.start+this._dataAlreadySent.length,this._compositionSuffix);this._sendCompositionInput(this._compositionTransactionId,e)}}_sendPendingComposition(e,t=!1){this._cancelPendingFinalizer(e),this._pendingComposition===e&&(this._pendingComposition=void 0);const i=this._getPendingTextareaInput(e,t),s=this._removeAlreadySentData(e.inputData||e.keypressData,e.dataAlreadySent),r=this._mergeTextObservations(i||e.endData||(s?e.compositionData:""),s,e.keypressMayOverlapComposition);this._sendCompositionInput(e.transactionId,r,!e.sessionEnded),this._settlePendingComposition(e)}_cancelPendingFinalizer(e){void 0!==e.finalizerTimer&&(clearTimeout(e.finalizerTimer),this._compositionTimers.delete(e.finalizerTimer),e.finalizerTimer=void 0)}_settlePendingComposition(e){e.lifecycleSettled||(e.lifecycleSettled=!0,this._dispatchCompositionTransactionSettled())}_mergeTextObservations(e,t,i){if(!t||e.includes(t))return e;if(!e||t.includes(e))return t;if(i){let i=Math.min(e.length,t.length);for(;i>0&&!e.endsWith(t.substring(0,i));)i--;let s=Math.min(e.length,t.length);for(;s>0&&!t.endsWith(e.substring(0,s));)s--;return i>s?e+t.substring(i):t+e.substring(s)}let s=Math.min(e.length,t.length);for(;s>0&&!e.endsWith(t.substring(0,s));)s--;return e+t.substring(s)}_updatePostCompositionInputExpectation(e){e.expectsPostCompositionInput=(e.endData.length>0||e.compositionData.length>0)&&0===e.inputData.length&&0===this._getPendingTextareaInput(e).length}_getPendingTextareaInput(e,t=!1){const i=this._textarea.value,s=e.position.start+e.dataAlreadySent.length;if(void 0!==e.nextCompositionStart)return i.substring(s,Math.max(s,e.nextCompositionStart));const r=e.suffix.length>0&&i.endsWith(e.suffix)?i.length-e.suffix.length:i.length,o=(e.endData||e.compositionData).length,n=t?r:Math.max(e.position.end,s+o);return i.substring(s,Math.max(s,Math.min(r,n)))}_getCompositionInput(e,t){const i=this._textarea.value,s=t.length>0&&i.endsWith(t)?i.length-t.length:i.length;return i.substring(e,Math.max(e,s))}_removeAlreadySentData(e,t){return 0===t.length?e:e.startsWith(t)?e.substring(t.length):t.includes(e)?"":e}_cancelComposition(){const e=this._pendingComposition;e&&this._isComposing&&e.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(e);const t=this._isComposing?this._compositionTransactionId:this._pendingComposition?.transactionId??0,i=void 0!==e&&this._pendingComposition===e;this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionView.classList.remove("active"),this._resetCompositionView(),this._textarea.value=this._textarea.value.substring(0,this._compositionPosition.start)+this._compositionSuffix,this._sendCompositionInput(t,""),i&&e&&this._settlePendingComposition(e)}_sendCompositionInput(e,t,i=!0){let s=!1;if(i){const i=new CustomEvent(h,{bubbles:!0,cancelable:!0,detail:{id:e,data:t}});this._dispatchCompositionSessionEvent(i),s=i.defaultPrevented}t.length>0&&!s&&this._coreService.triggerDataEvent(t,!0)}_endPendingCompositionSession(e){if(e.sessionEnded)return;e.sessionEnded=!0;const t=this._getPendingTextareaInput(e)||e.endData||e.compositionData;this._dispatchCompositionSessionEvent(new CustomEvent(h,{bubbles:!0,cancelable:!0,detail:{id:e.transactionId,data:t,dataPendingReconciliation:!0}}))}_dispatchCompositionSessionEvent(e){"function"==typeof this._textarea.dispatchEvent&&this._textarea.dispatchEvent(e)}_dispatchCompositionTransactionSettled(){this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-settled",{bubbles:!0}))}_deferCompositionEnd(e){this._cancelDeferredTimer(this._compositionEndTimer);const t=this._compositionTransactionId,i=this._defer(()=>{if(this._compositionEndTimer!==i||!this._isComposing||this._compositionTransactionId!==t)return;if(this._compositionEndTimer=void 0,!this._compositionEndBelongsToCurrentTransaction(e))return void(0!==e.length||this._hasCompositionProgress()||this._cancelComposition());this._finalizeComposition(!0,e),this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0}));const s=this._pendingComposition;s?.transactionId===t&&this._sendPendingComposition(s,!0)});this._compositionEndTimer=i}_composedRegionLength(){const e=this._textarea.value.length-this._compositionSuffix.length;return Math.max(0,e-this._compositionPosition.start)}_deferPreeditResync(e){if(!e||!this._isComposing)return;const t=this._compositionTransactionId;this._defer(()=>{this._isComposing&&this._compositionTransactionId===t&&0===this._composedRegionLength()&&this._cancelComposition()})}_hasCompositionProgress(){const e=this._textarea.selectionStart??this._textarea.value.length,t=this._textarea.selectionEnd??e;return this._compositionHasObservedProgress||this._textarea.value!==this._compositionStartValue||e!==this._compositionStartSelection.start||t!==this._compositionStartSelection.end}_compositionEndBelongsToCurrentTransaction(e){return this._hasCompositionProgress()||e.length>0&&e===this._lastCompositionData}_defer(e){const t=setTimeout(()=>{this._compositionTimers.delete(t),e()},0);return this._compositionTimers.add(t),t}_cancelDeferredTimer(e){void 0!==e&&(clearTimeout(e),this._compositionTimers.delete(e))}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;const e=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");t!==e&&(this._imeKeydownAwaitingCommit=!1),this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.lengththis.updateCompositionElements(!0)))}};t.CompositionHelper=l,t.CompositionHelper=l=s([r(2,n.IBufferService),r(3,n.IOptionsService),r(4,n.ICoreService),r(5,o.IRenderService),r(6,o.IThemeService)],l)},5251(e,t){function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),o=parseInt(r.getPropertyValue("padding-left"),10),n=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-s.left-o,t.clientY-s.top-n]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,o,n,a,h,l){if(!n)return;const c=i(e,t,s);return c[0]=Math.ceil((c[0]+(l?a/2:0))/a),c[1]=Math.ceil(c[1]/h),c[0]=Math.min(Math.max(c[0],1),r+(l?1:0)),c[1]=Math.min(Math.max(c[1],1),o),c}},9686(e,t){function i(e,t,i,o){const h=e-s(e,i),l=t-s(t,i),c=Math.abs(h-l)-function(e,t,i){let o=0;const n=e-s(e,i),a=t-s(t,i);for(let s=0;s=0&&et?"A":"B"}function o(e,t,i,s,r,o){let n=e,a=t,h="";for(;(n!==i||a!==s)&&a>=0&&ao.cols-1?(h+=o.buffer.translateBufferLineToString(a,!1,e,n),n=0,e=0,a++):!r&&n<0&&(h+=o.buffer.translateBufferLineToString(a,!1,0,e+1),n=o.cols-1,e=n,a--);return h+o.buffer.translateBufferLineToString(a,!1,e,n)}function n(e,t){return""+(t?"O":"[")+e}function a(e,t){e=Math.floor(e);let i="";for(let s=0;s0?h-s(h,l):t;const _=h,u=function(e,t,r,o,n,a){let h;return h=i(t,o,n,a).length>0?o-s(o,n):t,e=r&&he?"D":"C",a(Math.abs(l-e),n(d,h));d=c>t?"D":"C";const _=Math.abs(c-t);return a(function(e,t){return t.cols-e}(c>t?e:l,r)+(_-1)*r.cols+1+((c>t?l:e)-1),n(d,h))}},6081(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._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(f.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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new _.ParserApi(this._core)}get unicode(){return this._checkProposedApi(),new u.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._register(new d.BufferNamespaceApi(this._core))}get markers(){return this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.mouseStateService.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,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:e.synchronizedOutput,win32InputMode:e.win32InputMode,wraparoundMode:e.wraparound}}get dimensions(){return this._core.dimensions}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._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return 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{get promptLabel(){return a.promptLabel.get()},set promptLabel(e){a.promptLabel.set(e)},get tooMuchOutput(){return a.tooMuchOutput.get()},set tooMuchOutput(e){a.tooMuchOutput.set(e)}}}_verifyIntegers(...e){for(p of e)if(p===1/0||isNaN(p)||p%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(p of e)if(p&&(p===1/0||isNaN(p)||p%1!=0||p<0))throw new Error("This API only accepts positive integers")}}t.Terminal=v},3955(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const o=i(1433),n=i(2744),a=i(9176),h=i(6181),l=i(2274),c=i(654),d=i(7098),_=i(4103),u=i(4812),f=i(6501),p=i(8636),v=i(4159);let g=1,m=class extends u.Disposable{constructor(e,t,i,s,r,a,d,_,f,m,b,w,y,C){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=d,this._charSizeService=f,this._optionsService=m,this._bufferService=b,this._coreService=w,this._coreBrowserService=y,this._themeService=C,this._terminalClass=g++,this._rowElements=[],this._selectionRenderModel=(0,l.createSelectionRenderModel)(),this._lastSelectionColumnMode=!1,this._rowHasBlinkingCells=[],this._rowHasBlinkingCellsCount=0,this._onRequestRedraw=this._register(new p.Emitter),this.onRequestRedraw=this._onRequestRedraw.event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),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=_.createInstance(o.DomRendererRowFactory,document),this._element.classList.add("xterm-dom-renderer-owner-"+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._cursorBlinkStateManager=new S(this._rowContainer,this._coreBrowserService),this._register((0,v.addDisposableListener)(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register((0,u.toDisposable)(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new c.TextBlinkStateManager(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register((0,u.toDisposable)(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new n.WidthCache,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} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${_.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;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} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${i} { color: ${s.css}; }${this._terminalSelector} .xterm-fg-${i}.xterm-dim { color: ${_.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .xterm-bg-${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR} { color: ${_.color.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${_.color.multiplyOpacity(_.color.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${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),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,i){const s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i);let r=0,o=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(r=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow));let n=0,a=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,i),this._selectionRenderModel.hasSelection){const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,o=this._selectionRenderModel.viewportCappedStartRow,h=this._selectionRenderModel.viewportCappedEndRow;n=o,a=h;const l=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];l.appendChild(this._createSelectionElement(o,i?t[0]:e[0],i?e[0]:t[0],h-o+1))}else{const i=s===o?e[0]:0,n=o===r?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(o,i,n));const a=h-o-1;if(l.appendChild(this._createSelectionElement(o+1,0,this._bufferService.cols,a)),o!==h){const e=r===h?t[0]:this._bufferService.cols;l.appendChild(this._createSelectionElement(h,0,e))}}this._selectionContainer.appendChild(l)}let h=Math.min(r,n),l=Math.max(o,a);if(l>=0){h=Math.max(h,0),l=Math.min(l,s-1);const e=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&e>=0&&ethis.dimensions.css.canvas.width&&(n=this.dimensions.css.canvas.width-o),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${o}px`,r.style.width=`${n}px`,r}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),o=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,n=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle,h={hasBlinkingCells:!1};for(let l=e;l<=t;l++){const e=l+i.ydisp,t=this._rowElements[l];if(!t)continue;const c=i.lines.get(e);c?(t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,n,a,r,o,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,h)),this._setRowBlinkState(l,h.hasBlinkingCells)):(t.replaceChildren(),this._setRowBlinkState(l,!1))}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,o){i<0&&(e=0),s<0&&(t=0);const n=this._bufferService.rows-1;i=Math.max(Math.min(i,n),0),s=Math.max(Math.min(s,n),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,l=Math.min(a.x,r-1),c=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle,u={hasBlinkingCells:!1};for(let n=i;n<=s;++n){const f=n+a.ydisp,p=this._rowElements[n];if(!p)continue;const v=a.lines.get(f);v?(p.replaceChildren(...this._rowFactory.createRow(v,f,f===h,d,_,l,c,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,o?n===i?e:0:-1,o?(n===s?t:r)-1:-1,u)),this._setRowBlinkState(n,u.hasBlinkingCells)):(p.replaceChildren(),this._setRowBlinkState(n,!1))}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};t.DomRenderer=m,t.DomRenderer=m=s([r(7,f.IInstantiationService),r(8,d.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,f.ICoreService),r(12,d.ICoreBrowserService),r(13,d.IThemeService)],m);class S{constructor(e,t){this._rowContainer=e,this._coreBrowserService=t,this._isIdlePaused=!1,this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){void 0!==this._idleTimeout&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}}},1433(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const o=i(9176),n=i(8938),a=i(3055),h=i(6501),l=i(4103),c=i(7098),d=i(945),_=i(6181),u=i(5451);let f=class{constructor(e,t,i,s,r,o,n){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=o,this._themeService=n,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,c,_,f,p,v,g){const m=[];g&&(g.hasBlinkingCells=!1);const S=this._characterJoinerService.getJoinedCharacters(t),b=this._themeService.colors;let w,y=e.getNoBgTrimmedLength();i&&y=B,F=I,W=this._workCell;if(S.length>0&&I===S[0][0]&&N){const s=S.shift(),r=this._isCellInSelection(s[0],t);for(C=s[0]+1;C=s[1],N?(H=!0,W=new d.JoinedCellData(this._workCell,e.translateToString(!0,s[0],s[1]),s[1]-s[0]),F=s[1]-1,y=W.getWidth()):B=s[1]}const z=this._isCellInSelection(I,t),K=i&&I===a,U=O&&I>=p&&I<=v;g&&W.isBlink()&&(g.hasBlinkingCells=!0),!c&&W.isBlink()&&A.push("xterm-blink-hidden");let j=!1;this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{j=!0});let V=W.getChars()||n.WHITESPACE_CELL_CHAR;if(" "===V&&(W.isUnderline()||W.isOverline())&&(V=" "),k=y*_-f.get(V,W.isBold(),W.isItalic()),w){if(D&&(z&&P||!z&&!P&&W.bg===x)&&(z&&P&&b.selectionForeground||W.fg===L)&&W.extended.ext===T&&U===R&&k===M&&!K&&!H&&!j&&N){W.isInvisible()?E+=n.WHITESPACE_CELL_CHAR:E+=V,D++;continue}D&&(w.textContent=E),w=this._document.createElement("span"),D=0,E=""}else w=this._document.createElement("span");if(x=W.bg,L=W.fg,T=W.extended.ext,R=U,M=k,P=z,H&&a>=I&&a<=F&&(a=I),!this._coreService.isCursorHidden&&K&&this._coreService.isCursorInitialized)if(A.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&A.push("xterm-cursor-blink"),A.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":A.push("xterm-cursor-outline");break;case"block":A.push("xterm-cursor-block");break;case"bar":A.push("xterm-cursor-bar");break;case"underline":A.push("xterm-cursor-underline")}if(W.isBold()&&A.push("xterm-bold"),W.isItalic()&&A.push("xterm-italic"),W.isDim()&&A.push("xterm-dim"),E=W.isInvisible()?n.WHITESPACE_CELL_CHAR:W.getChars()||n.WHITESPACE_CELL_CHAR,W.isUnderline()&&(A.push(`xterm-underline-${W.extended.underlineStyle}`)," "===E&&(E=" "),!W.isUnderlineColorDefault()))if(W.isUnderlineColorRGB())w.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(W.getUnderlineColor()).join(",")})`;else{let e=W.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&W.isBold()&&e<8&&(e+=8),w.style.textDecorationColor=b.ansi[e].css}W.isOverline()&&(A.push("xterm-overline")," "===E&&(E=" ")),W.isStrikethrough()&&A.push("xterm-strikethrough"),U&&(w.style.textDecoration="underline");let $=W.getFgColor(),q=W.getFgColorMode(),X=W.getBgColor(),Y=W.getBgColorMode();const G=!!W.isInverse();if(G){const e=$;$=X,X=e;const t=q;q=Y,Y=t}let J,Z,Q,ee=!1;switch(this._decorationService.forEachDecorationAtCell(I,t,void 0,e=>{"top"!==e.options.layer&&ee||(e.backgroundColorRGB&&(Y=50331648,X=e.backgroundColorRGB.rgba>>8&16777215,J=e.backgroundColorRGB),e.foregroundColorRGB&&(q=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,Z=e.foregroundColorRGB),ee="top"===e.options.layer)}),!ee&&z&&(J=this._coreBrowserService.isFocused?b.selectionBackgroundOpaque:b.selectionInactiveBackgroundOpaque,X=J.rgba>>8&16777215,Y=50331648,ee=!0,b.selectionForeground&&(q=50331648,$=b.selectionForeground.rgba>>8&16777215,Z=b.selectionForeground)),ee&&A.push("xterm-decoration-top"),Y){case 16777216:case 33554432:Q=b.ansi[X],A.push(`xterm-bg-${X}`);break;case 50331648:Q=l.channels.toColor(X>>16,X>>8&255,255&X),this._addStyle(w,`background-color:#${(X>>>0).toString(16).padStart(6,"0")}`);break;default:G?(Q=b.foreground,A.push(`xterm-bg-${o.INVERTED_DEFAULT_COLOR}`)):Q=b.background}switch(J||W.isDim()&&(J=l.color.multiplyOpacity(Q,.5)),q){case 16777216:case 33554432:W.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(w,Q,b.ansi[$],W,J,void 0)||A.push(`xterm-fg-${$}`);break;case 50331648:const e=l.channels.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(w,Q,e,W,J,Z)||this._addStyle(w,`color:#${$.toString(16).padStart(6,"0")}`);break;default:this._applyMinimumContrast(w,Q,b.foreground,W,J,Z)||G&&A.push(`xterm-fg-${o.INVERTED_DEFAULT_COLOR}`)}A.length&&(w.className=A.join(" "),A.length=0),K||H||j||!N?w.textContent=E:D++,k!==this.defaultSpacing&&(w.style.letterSpacing=`${k}px`),m.push(w),I=F}return w&&D&&(w.textContent=E),m}_applyMinimumContrast(e,t,i,s,r,o){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const n=this._getContrastCache(s);let a;if(r||o||(a=n.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=l.color.ensureContrastRatio(r??t,o??i,e),n.setColor((r??t).rgba,(o??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])}};t.DomRendererRowFactory=f,t.DomRendererRowFactory=f=s([r(1,c.ICharacterJoinerService),r(2,h.IOptionsService),r(3,c.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,c.IThemeService)],f)},2744(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0;const s=i(6181);t.WidthCache=class{constructor(e=()=>new r){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._canvasElements=[],this._canvasElements=[e(),e(),e(),e()],this.clear()}dispose(){this._canvasElements.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._canvasElements[0].setFont(e,t,i,!1),this._canvasElements[1].setFont(e,t,s,!1),this._canvasElements[2].setFont(e,t,i,!0),this._canvasElements[3].setFont(e,t,s,!0),this.clear())}get(e,t,i){let s;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 o=this._holey.get(r);if(void 0===o){let s=0;t&&(s|=1),i&&(s|=2),o=this._measure(e,s),o>0&&this._holey.set(r,o)}return o}_measure(e,t){return this._canvasElements[t].measure(e)}};class r{constructor(){"undefined"!=typeof OffscreenCanvas?(this._canvas=new OffscreenCanvas(1,1),this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=(0,s.throwIfFalsy)(this._canvas.getContext("2d")))}setFont(e,t,i,s){const r=s?"italic":"";this._ctx.font=`${r} ${i} ${t}px ${e}`.trim()}measure(e){return this._ctx.measureText(e).width}}},9176(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.INVERTED_DEFAULT_COLOR=void 0,t.INVERTED_DEFAULT_COLOR=257},6181(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.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,o){return 1===t&&r>Math.ceil(1.5*o)&&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))}},2274(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=function(){return new i};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,o=t[1]-r,n=i[1]-r,a=Math.max(o,0),h=Math.min(n,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=o,this.viewportEndRow=n,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)}}},654(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TextBlinkStateManager=void 0;const s=i(4812);class r extends s.Disposable{constructor(e,t,i){super(),this._renderCallback=e,this._coreBrowserService=t,this._optionsService=i,this._intervalDuration=0,this._blinkOn=!0,this._needsBlinkInViewport=!1,this._isViewportVisible=!0,this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",e=>{this.setIntervalDuration(e)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register((0,s.toDisposable)(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(void 0!==this._interval)return;const e=this._blinkOn;return this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),void(e||this._renderCallback())}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){void 0!==this._interval&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}}t.TextBlinkStateManager=r},8501(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._domNodePointerDown(e)))}_createArrow(e){const t=this._register(new c.ScrollbarArrow(e));return this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode),t}_createSlider(e,t,i,s){this.slider=new h.FastDomNode(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(e),this.slider.setLeft(t),"number"==typeof i&&this.slider.setWidth(i),"number"==typeof s&&this.slider.setHeight(s),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(a.addDisposableListener(this.slider.domNode,a.eventType.POINTER_DOWN,e=>{0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))})),this._onclick(this.slider.domNode,e=>{e.leftButton&&e.stopPropagation()})}_handleElementSize(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(e){e.target===this.domNode.domNode&&this._handlePointerDown(e)}delegatePointerDown(e){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),s=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderPointerPosition(e);i<=r&&r<=s?0===e.button&&(e.preventDefault(),this._sliderPointerDown(e)):this._handlePointerDown(e)}_handlePointerDown(e){let t,i;if(e.target===this.domNode.domNode&&"number"==typeof e.offsetX&&"number"==typeof e.offsetY)t=e.offsetX,i=e.offsetY;else{const s=a.getDomNodePagePosition(this.domNode.domNode);t=e.pageX-s.left,i=e.pageY-s.top}const s=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(s):this._scrollbarState.getDesiredScrollPositionFromOffset(s)),0===e.button&&(e.preventDefault(),this._sliderPointerDown(e))}_sliderPointerDown(e){if(!(e.target&&e.target instanceof Element))return;const t=this._sliderPointerPosition(e),i=this._sliderOrthogonalPointerPosition(e),s=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{const r=this._sliderOrthogonalPointerPosition(e),o=Math.abs(r-i);if(u.isWindows&&o>140)return void this._setDesiredScrollPositionNow(s.getScrollPosition());const n=this._sliderPointerPosition(e)-t;this._setDesiredScrollPositionNow(s.getDesiredScrollPositionFromDelta(n))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(e){const t={};this.writeScrollPosition(t,e),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(e){this._updateScrollbarSize(e),this._scrollbarState.setScrollbarSize(e),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}t.AbstractScrollbar=f},1203(e,t){function i(e){return"number"==typeof e?`${e}px`:e}Object.defineProperty(t,"__esModule",{value:!0}),t.FastDomNode=void 0,t.FastDomNode=class{constructor(e){this.domNode=e,this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._className="",this._position="",this._layerHint=!1,this._contain="none"}setWidth(e){const t=i(e);this._width!==t&&(this._width=t,this.domNode.style.width=this._width)}setHeight(e){const t=i(e);this._height!==t&&(this._height=t,this.domNode.style.height=this._height)}setTop(e){const t=i(e);this._top!==t&&(this._top=t,this.domNode.style.top=this._top)}setLeft(e){const t=i(e);this._left!==t&&(this._left=t,this.domNode.style.left=this._left)}setBottom(e){const t=i(e);this._bottom!==t&&(this._bottom=t,this.domNode.style.bottom=this._bottom)}setRight(e){const t=i(e);this._right!==t&&(this._right=t,this.domNode.style.right=this._right)}setClassName(e){this._className!==e&&(this._className=e,this.domNode.className=this._className)}toggleClassName(e,t){this.domNode.classList.toggle(e,t),this._className=this.domNode.className}setPosition(e){this._position!==e&&(this._position=e,this.domNode.style.position=this._position)}setLayerHinting(e){this._layerHint!==e&&(this._layerHint=e,this.domNode.style.transform=e?"translate3d(0px, 0px, 0px)":"")}setContain(e){this._contain!==e&&(this._contain=e,this.domNode.style.contain=this._contain)}setAttribute(e,t){this.domNode.setAttribute(e,t)}}},928(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{try{e.releasePointerCapture(t)}catch{}}))}catch{o=a.getWindow(e)}this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_MOVE,e=>{e.buttons===i?(e.preventDefault(),this._pointerMoveCallback(e)):this.stopMonitoring(!0)})),this._hooks.add(a.addDisposableListener(o,a.eventType.POINTER_UP,e=>this.stopMonitoring(!0)))}}},9699(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.HorizontalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(t.horizontalHasArrows?t.horizontalScrollbarSize:0,2===t.horizontal?0:t.horizontalScrollbarSize,2===t.vertical?0:t.verticalScrollbarSize,s.width,s.scrollWidth,o.scrollLeft),visibility:t.horizontal,extraScrollbarClassName:"xterm-horizontal",scrollable:e,scrollByPage:t.scrollByPage}),t.horizontalHasArrows)throw new Error("horizontalHasArrows is not supported in xterm.js");this._createSlider(Math.floor((t.horizontalScrollbarSize-t.horizontalSliderSize)/2),0,void 0,t.horizontalSliderSize)}_updateSlider(e,t){this.slider.setWidth(e),this.slider.setLeft(t)}_renderDomNode(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._handleElementSize(e.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return e}_sliderPointerPosition(e){return e.pageX}_sliderOrthogonalPointerPosition(e){return e.pageY}_updateScrollbarSize(e){this.slider.setHeight(e)}writeScrollPosition(e,t){e.scrollLeft=t}updateOptions(e){this.updateScrollbarSize(2===e.horizontal?0:e.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._visibilityController.setVisibility(e.horizontal),this._scrollByPage=e.scrollByPage}}t.HorizontalScrollbar=o},3988(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;ni&&(s=i-t),s<0&&(s=0),r<0&&(r=0),n+r>o&&(n=o-r),n<0&&(n=0),this.width=t,this.scrollWidth=i,this.scrollLeft=s,this.height=r,this.scrollHeight=o,this.scrollTop=n}equals(e){return this.rawScrollLeft===e.rawScrollLeft&&this.rawScrollTop===e.rawScrollTop&&this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop}withScrollDimensions(e,t){return new o(this._forceIntegerValues,void 0!==e.width?e.width:this.width,void 0!==e.scrollWidth?e.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,void 0!==e.height?e.height:this.height,void 0!==e.scrollHeight?e.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(e){return new o(this._forceIntegerValues,this.width,this.scrollWidth,void 0!==e.scrollLeft?e.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,void 0!==e.scrollTop?e.scrollTop:this.rawScrollTop)}createScrollEvent(e,t){const i=this.width!==e.width,s=this.scrollWidth!==e.scrollWidth,r=this.scrollLeft!==e.scrollLeft,o=this.height!==e.height,n=this.scrollHeight!==e.scrollHeight,a=this.scrollTop!==e.scrollTop;return{inSmoothScrolling:t,oldWidth:e.width,oldScrollWidth:e.scrollWidth,oldScrollLeft:e.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:e.height,oldScrollHeight:e.scrollHeight,oldScrollTop:e.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:s,scrollLeftChanged:r,heightChanged:o,scrollHeightChanged:n,scrollTopChanged:a}}}t.ScrollState=o;class n extends r.Disposable{constructor(e){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new s.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new o(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){const i=this._state.withScrollDimensions(e,t);this._setState(i,Boolean(this._smoothScrolling)),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){const t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(0!==this._smoothScrollDuration){if(this._smoothScrolling){e={scrollLeft:void 0===e.scrollLeft?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:void 0===e.scrollTop?this._smoothScrolling.to.scrollTop:e.scrollTop};const i=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===i.scrollLeft&&this._smoothScrolling.to.scrollTop===i.scrollTop)return;let s;s=t?new l(this._smoothScrolling.from,i,this._smoothScrolling.startTime,this._smoothScrolling.duration):l.start(this._state,i,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{const t=this._state.withScrollPosition(e);this._smoothScrolling=l.start(this._state,t,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}else this.setScrollPositionNow(e)}hasPendingScrollAnimation(){return Boolean(this._smoothScrolling)}_performSmoothScrolling(){if(!this._smoothScrolling)return;const e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);return this._setState(t,!0),this._smoothScrolling?e.isDone?(this._smoothScrolling.dispose(),void(this._smoothScrolling=null)):void(this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})):void 0}_setState(e,t){const i=this._state;i.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(i,t)))}}t.Scrollable=n;class a{constructor(e,t,i){this.scrollLeft=e,this.scrollTop=t,this.isDone=i}}function h(e,t){const i=t-e;return function(t){return e+i*(1-(s=1-t,Math.pow(s,3)));var s}}class l{constructor(e,t,i,s){this.from=e,this.to=t,this.duration=s,this.startTime=i,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this._scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this._scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(e,t,i){if(Math.abs(e-t)>2.5*i){let n,a;return e0&&Math.abs(e.deltaY)>0)return 1;let i=.5;if(this._isAlmostInt(e.deltaX)&&this._isAlmostInt(e.deltaY)||(i+=.25),t){const s=Math.abs(e.deltaX),r=Math.abs(e.deltaY),o=Math.abs(t.deltaX),n=Math.abs(t.deltaY),a=Math.max(Math.min(s,o),1),h=Math.max(Math.min(r,n),1),l=Math.max(s,o),c=Math.max(r,n);l%a===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(e){return Math.abs(Math.round(e)-e)<.01}}S.INSTANCE=new S;class b extends _.Widget{get options(){return this._options}constructor(e,t,i){let s;super(),this._onScroll=this._register(new f.Emitter),this.onScroll=this._onScroll.event,t=t??{};const r=!i;i?s=i:(t.mouseWheelSmoothScroll=!1,s=new g.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:t=>a.scheduleAtNextAnimationFrame(a.getWindow(e),t)})),this._options=function(e){const t={lazyRender:void 0!==e.lazyRender&&e.lazyRender,className:void 0!==e.className?e.className:"",useShadows:void 0===e.useShadows||e.useShadows,handleMouseWheel:void 0===e.handleMouseWheel||e.handleMouseWheel,flipAxes:void 0!==e.flipAxes&&e.flipAxes,consumeMouseWheelIfScrollbarIsNeeded:void 0!==e.consumeMouseWheelIfScrollbarIsNeeded&&e.consumeMouseWheelIfScrollbarIsNeeded,alwaysConsumeMouseWheel:void 0!==e.alwaysConsumeMouseWheel&&e.alwaysConsumeMouseWheel,scrollYToX:void 0!==e.scrollYToX&&e.scrollYToX,mouseWheelScrollSensitivity:void 0!==e.mouseWheelScrollSensitivity?e.mouseWheelScrollSensitivity:1,fastScrollSensitivity:void 0!==e.fastScrollSensitivity?e.fastScrollSensitivity:5,scrollPredominantAxis:void 0===e.scrollPredominantAxis||e.scrollPredominantAxis,mouseWheelSmoothScroll:void 0===e.mouseWheelSmoothScroll||e.mouseWheelSmoothScroll,listenOnDomNode:void 0!==e.listenOnDomNode?e.listenOnDomNode:null,horizontal:void 0!==e.horizontal?e.horizontal:1,horizontalScrollbarSize:void 0!==e.horizontalScrollbarSize?e.horizontalScrollbarSize:10,horizontalSliderSize:void 0!==e.horizontalSliderSize?e.horizontalSliderSize:0,horizontalHasArrows:void 0!==e.horizontalHasArrows&&e.horizontalHasArrows,vertical:void 0!==e.vertical?e.vertical:1,verticalScrollbarSize:void 0!==e.verticalScrollbarSize?e.verticalScrollbarSize:10,verticalHasArrows:void 0!==e.verticalHasArrows&&e.verticalHasArrows,verticalSliderSize:void 0!==e.verticalSliderSize?e.verticalSliderSize:0,scrollByPage:void 0!==e.scrollByPage&&e.scrollByPage};return t.horizontalSliderSize=void 0!==e.horizontalSliderSize?e.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=void 0!==e.verticalSliderSize?e.verticalSliderSize:t.verticalScrollbarSize,v.isMac&&(t.className+=" xterm-mac"),t}(t),this._scrollable=s,this._register(this._scrollable.onScroll(e=>{this._handleScroll(e),this._onScroll.fire(e)})),r&&this._register(this._scrollable);const o={handleMouseWheel:e=>this._handleMouseWheel(e),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new d.VerticalScrollbar(this._scrollable,this._options,o)),this._horizontalScrollbar=this._register(new c.HorizontalScrollbar(this._scrollable,this._options,o)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new h.FastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,e=>this._handleMouseOver(e)),this._onmouseleave(this._listenOnDomNode,e=>this._handleMouseLeave(e)),this._hideTimeout=this._register(new u.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,v.isMac&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){void 0!==e.handleMouseWheel&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),void 0!==e.mouseWheelScrollSensitivity&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),void 0!==e.fastScrollSensitivity&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),void 0!==e.scrollPredominantAxis&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),void 0!==e.horizontal&&(this._options.horizontal=e.horizontal),void 0!==e.vertical&&(this._options.vertical=e.vertical),void 0!==e.horizontalHasArrows&&(this._options.horizontalHasArrows=e.horizontalHasArrows),void 0!==e.verticalHasArrows&&(this._options.verticalHasArrows=e.verticalHasArrows),void 0!==e.horizontalScrollbarSize&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),void 0!==e.verticalScrollbarSize&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),void 0!==e.scrollByPage&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new l.StandardWheelEvent(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=(0,p.dispose)(this._mouseWheelToDispose),e)){const e=e=>{this._handleMouseWheel(new l.StandardWheelEvent(e))};this._mouseWheelToDispose.push(a.addDisposableListener(this._listenOnDomNode,a.eventType.MOUSE_WHEEL,e,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;const t=S.INSTANCE;t.acceptStandardWheelEvent(e);let i=!1;if(e.deltaY||e.deltaX){let s=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&r+s===0?r=s=0:Math.abs(s)>=Math.abs(r)?r=0:s=0),this._options.flipAxes&&([s,r]=[r,s]);const o=!v.isMac&&e.browserEvent&&e.browserEvent.shiftKey;!this._options.scrollYToX&&!o||r||(r=s,s=0),e.browserEvent&&e.browserEvent.altKey&&(r*=this._options.fastScrollSensitivity,s*=this._options.fastScrollSensitivity);const n=this._scrollable.getFutureScrollPosition();let a={};if(s){const e=50*s,t=n.scrollTop-(e<0?Math.floor(e):Math.ceil(e));this._verticalScrollbar.writeScrollPosition(a,t)}if(r){const e=50*r,t=n.scrollLeft-(e<0?Math.floor(e):Math.ceil(e));this._horizontalScrollbar.writeScrollPosition(a,t)}a=this._scrollable.validateScrollPosition(a),(n.scrollLeft!==a.scrollLeft||n.scrollTop!==a.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(a):this._scrollable.setScrollPositionNow(a),i=!0)}let s=i;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,i=e.scrollLeft>0,s=i?" xterm-shadow-left":"",r=t?" xterm-shadow-top":"",o=i||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${r}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${o}${r}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){this._mouseIsOver||this._isDragging||(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){this._mouseIsOver||this._isDragging||this._hideTimeout.cancelAndSet(()=>this._hide(),500)}}t.SmoothScrollableElement=b},9594(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._arrowPointerDown(e))),this._register(c.addStandardDisposableListener(this.domNode,c.eventType.POINTER_DOWN,e=>this._arrowPointerDown(e))),this._pointerdownRepeatTimer=this._register(new c.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new l.TimeoutTimer)}_arrowPointerDown(e){e.target&&e.target instanceof Element&&(this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,c.getWindow(e))},200),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,e=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),e.preventDefault())}}t.ScrollbarArrow=d},1270(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ScrollbarState=void 0;class i{constructor(e,t,i,s,r,o){this._scrollbarSize=Math.round(t),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(e),this._visibleSize=s,this._scrollSize=r,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new i(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(e){const t=Math.round(e);return this._visibleSize!==t&&(this._visibleSize=t,this._refreshComputedValues(),!0)}setScrollSize(e){const t=Math.round(e);return this._scrollSize!==t&&(this._scrollSize=t,this._refreshComputedValues(),!0)}setScrollPosition(e){const t=Math.round(e);return this._scrollPosition!==t&&(this._scrollPosition=t,this._refreshComputedValues(),!0)}setScrollbarSize(e){this._scrollbarSize=Math.round(e)}setArrowSize(e){const t=Math.round(e);this._arrowSize!==t&&(this._arrowSize=t,this._refreshComputedValues())}setOppositeScrollbarSize(e){this._oppositeScrollbarSize=Math.round(e)}static _computeValues(e,t,i,s,r){const o=Math.max(0,i-e),n=Math.max(0,o-2*t),a=s>0&&s>i;if(!a)return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(n),computedSliderRatio:0,computedSliderPosition:0};const h=Math.round(Math.max(20,Math.floor(i*n/s))),l=(n-h)/(s-i),c=r*l;return{computedAvailableSize:Math.round(o),computedIsNeeded:a,computedSliderSize:Math.round(h),computedSliderRatio:l,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){const e=i._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=e.computedAvailableSize,this._computedIsNeeded=e.computedIsNeeded,this._computedSliderSize=e.computedSliderSize,this._computedSliderRatio=e.computedSliderRatio,this._computedSliderPosition=e.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize-this._computedSliderSize/2;return Math.round(t/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize;let i=this._scrollPosition;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(e){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(e?" xterm-fade":"")))}}t.ScrollbarVisibilityController=o},2650(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;n{s||(s=!0,this._remove(i))}}_remove(e){if(e.prev!==_.Undefined&&e.next!==_.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===_.Undefined&&e.next===_.Undefined?(this._first=_.Undefined,this._last=_.Undefined):e.next===_.Undefined?(this._last=this._last.prev,this._last.next=_.Undefined):e.prev===_.Undefined&&(this._first=this._first.next,this._first.prev=_.Undefined)}*[Symbol.iterator](){let e=this._first;for(;e!==_.Undefined;)yield e.element,e=e.next}}var f;!function(e){e.TAP="-xterm-gesturetap",e.CHANGE="-xterm-gesturechange",e.START="-xterm-gesturestart",e.END="-xterm-gesturesend",e.CONTEXT_MENU="-xterm-gesturecontextmenu"}(f||(t.EventType=f={}));class p extends l.Disposable{constructor(){super(),this._dispatched=!1,this._targets=new u,this._ignoreTargets=new u,this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;const e=c;this._register(h.addDisposableListener(e.document,"touchstart",e=>this._handleTouchStart(e),{passive:!1})),this._register(h.addDisposableListener(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(h.addDisposableListener(e.document,"touchmove",e=>this._handleTouchMove(e),{passive:!1}))}static addTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._targets.push(e);return(0,l.toDisposable)(t)}static ignoreTarget(e){if(!p.isTouchDevice())return l.Disposable.None;p._instance||(p._instance=new p);const t=p._instance._ignoreTargets.push(e);return(0,l.toDisposable)(t)}static isTouchDevice(){return"ontouchstart"in c||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){const t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let i=0,s=e.targetTouches.length;i=p._holdDelay&&Math.abs(n.initialPageX-d(n.rollingPageX))<30&&Math.abs(n.initialPageY-d(n.rollingPageY))<30){const e=this._newGestureEvent(f.CONTEXT_MENU,n.initialTarget);e.pageX=d(n.rollingPageX),e.pageY=d(n.rollingPageY),this._dispatchEvent(e)}else if(1===s){const t=d(n.rollingPageX),s=d(n.rollingPageY),r=d(n.rollingTimestamps)-n.rollingTimestamps[0],o=t-n.rollingPageX[0],a=s-n.rollingPageY[0],h=[...this._targets].filter(e=>n.initialTarget instanceof Node&&e.contains(n.initialTarget));this._inertia(e,h,i,Math.abs(o)/r,o>0?1:-1,t,Math.abs(a)/r,a>0?1:-1,s)}this._dispatchEvent(this._newGestureEvent(f.END,n.initialTarget)),delete this._activeTouches[o.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){const i=document.createEvent("CustomEvent");return i.initEvent(e,!1,!0),i.initialTarget=t,i.tapCount=0,i}_dispatchEvent(e){if(e.type===f.TAP){const t=(new Date).getTime();let i;i=t-this._lastSetTapCountTime>p._clearTapCountTime?1:2,this._lastSetTapCountTime=t,e.tapCount=i}else e.type!==f.CHANGE&&e.type!==f.CONTEXT_MENU||(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(const t of this._ignoreTargets)if(t.contains(e.initialTarget))return;const t=[];for(const i of this._targets)if(i.contains(e.initialTarget)){let s=0,r=e.initialTarget;for(;r&&r!==i;)s++,r=r.parentElement;t.push([s,i])}t.sort((e,t)=>e[0]-t[0]);for(const[,i]of t)i.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,i,s,r,o,n,a,l){this._handle=h.scheduleAtNextAnimationFrame(e,()=>{const h=Date.now(),c=h-i;let d=0,_=0,u=!0;s+=p._scrollFriction*c,n+=p._scrollFriction*c,s>0&&(u=!1,d=r*s*c),n>0&&(u=!1,_=a*n*c);const v=this._newGestureEvent(f.CHANGE);v.translationX=d,v.translationY=_,t.forEach(e=>e.dispatchEvent(v)),u||this._inertia(e,t,h,s,r,o+d,n,a,l+_)})}_handleTouchMove(e){const t=Date.now();for(let i=0,s=e.changedTouches.length;i3&&(r.rollingPageX.shift(),r.rollingPageY.shift(),r.rollingTimestamps.shift()),r.rollingPageX.push(s.pageX),r.rollingPageY.push(s.pageY),r.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}}t.Gesture=p,p._scrollFriction=-.005,p._holdDelay=700,p._clearTapCountTime=400,n([function(e,t,i){let s=null,r=null;if("function"==typeof i.value?(s="value",r=i.value,0!==r.length&&console.warn("Memoize should only be used in functions with zero parameters")):"function"==typeof i.get&&(s="get",r=i.get),!r||!s)throw new Error("not supported");const o=`$memoize$${t}`;i[s]=function(...e){return this.hasOwnProperty(o)||Object.defineProperty(this,o,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,e)}),this[o]}}],p,"isTouchDevice",null)},8997(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VerticalScrollbar=void 0;const s=i(8501),r=i(1270);class o extends s.AbstractScrollbar{constructor(e,t,i){const s=e.getScrollDimensions(),o=e.getCurrentScrollPosition(),n=t.verticalHasArrows;super({lazyRender:t.lazyRender,host:i,scrollbarState:new r.ScrollbarState(n?t.verticalScrollbarSize:0,2===t.vertical?0:t.verticalScrollbarSize,0,s.height,s.scrollHeight,o.scrollTop),visibility:t.vertical,extraScrollbarClassName:"xterm-vertical",scrollable:e,scrollByPage:t.scrollByPage}),this._arrowScrollDelta=0,this._setArrows(n,t.verticalScrollbarSize),this._createSlider(0,Math.floor((t.verticalScrollbarSize-t.verticalSliderSize)/2),t.verticalSliderSize,void 0)}_updateSlider(e,t){this.slider.setHeight(e),this.slider.setTop(t)}_renderDomNode(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)}handleScroll(e){return this._shouldRender=this._handleElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._handleElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._handleElementSize(e.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return t}_sliderPointerPosition(e){return e.pageY}_sliderOrthogonalPointerPosition(e){return e.pageX}_updateScrollbarSize(e){this.slider.setWidth(e)}writeScrollPosition(e,t){e.scrollTop=t}_arrowScroll(e){const t=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollTop:t.scrollTop+e})}_setArrows(e,t){if(this._arrowScrollDelta=t,!this._arrowUp||!this._arrowDown){const e=0;this._arrowUp=this._createArrow({className:"xterm-scra xterm-arrow-up",top:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:e,left:e,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})}if(this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;const i=e?"":"none";this._arrowUp.bgDomNode.style.display=i,this._arrowUp.domNode.style.display=i,this._arrowDown.bgDomNode.style.display=i,this._arrowDown.domNode.style.display=i}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){const t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(2===e.vertical?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}}t.VerticalScrollbar=o},7741(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nt(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseover(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_OVER,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}_onmouseleave(e,t){this._register(a.addDisposableListener(e,a.eventType.MOUSE_LEAVE,i=>t(new h.StandardMouseEvent(a.getWindow(e),i))))}}t.Widget=c},5959(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=[0,0],!0)}}},4792(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const o=i(6501),n=i(4812),a=i(8636);let h=class extends n.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 a.Emitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new d(this._optionsService))}catch{this._measureStrategy=this._register(new c(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h,t.CharSizeService=h=s([r(2,o.IOptionsService)],h);class l extends n.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 c extends l{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 l{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}}},945(e,t,i){var s,r=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},o=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(5451),a=i(8938),h=i(3055),l=i(6501);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 d=s=class{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new h.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,h,n,t,o);for(let t=0;t1){const e=this._getJoinedRanges(s,h,n,t,o);for(let t=0;tthis._screenDprMonitor.setWindow(e))),this._register(s.EventUtils.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register((0,r.addDisposableListener)(this._textarea,"focus",()=>this._isFocused=!0)),this._register((0,r.addDisposableListener)(this._textarea,"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=n;class a extends o.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this._register(new o.MutableDisposable),this._onDprChange=this._register(new s.Emitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register((0,o.toDisposable)(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,r.addDisposableListener)(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)}}},2136(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.KeyboardService=void 0;const o=i(706),n=i(7241),a=i(9249),h=i(701),l=i(6501);let c=class{constructor(e,t){this._coreService=e,this._optionsService=t}_getWin32InputMode(){return this._win32InputMode??=new a.Win32InputMode,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new n.KittyKeyboard,this._kittyKeyboard}evaluateKeyDown(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!0);const t=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(e,t,e.repeat?2:1,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):(0,o.evaluateKeyboardEvent)(e,this._coreService.decPrivateModes.applicationCursorKeys,h.isMac,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(e){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(e,!1);const t=this._coreService.kittyKeyboard.flags;return this.useKitty&&2&t?this._getKittyKeyboard().evaluate(e,t,3,h.isMac&&this._optionsService.rawOptions.macOptionIsMeta):void 0}get useKitty(){const e=this._coreService.kittyKeyboard.flags;return!(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard||!n.KittyKeyboard.shouldUseProtocol(e))}get useWin32InputMode(){return!(!this._optionsService.rawOptions.vtExtensions?.win32InputMode||!this._coreService.decPrivateModes.win32InputMode)}};t.KeyboardService=c,t.KeyboardService=c=s([r(0,l.ICoreService),r(1,l.IOptionsService)],c)},9820(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(4812);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},8294(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseCoordsService=void 0;const o=i(4159),n=i(5251),a=i(7098);let h=class{constructor(e,t){this._charSizeService=e,this._renderService=t}getCoords(e,t,i,s,r){return(0,n.getCoords)((0,o.getWindow)(t),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,n.getCoordsRelativeToElement)((0,o.getWindow)(t),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.MouseCoordsService=h,t.MouseCoordsService=h=s([r(0,a.ICharSizeService),r(1,a.IRenderService)],h)},9784(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AltMouseCursorController=t.MouseService=void 0;const o=i(4159),n=i(6501),a=i(4812),h=i(7098),l=i(2650);let c=class{constructor(e,t,i,s,r,o,n,a,h){this._renderService=e,this._mouseCoordsService=t,this._mouseStateService=i,this._coreService=s,this._bufferService=r,this._optionsService=o,this._selectionService=n,this._logService=a,this._coreBrowserService=h,this._lastEvent=null,this._wheelPartialScroll=0,this._touchScrollAccumulator=0}bindMouse(e,t,i){const{element:s,document:r}=e,n=new a.MutableDisposable,h=new a.MutableDisposable;t(n),t(h);const c={target:e,focus:i,requestedEvents:{mouseup:null,wheel:null,mousedrag:null,mousemove:null},mouseupListener:n,mousedragListener:h},_={mouseup:e=>this._handleMouseUp(c,e),wheel:e=>this._handleWheel(c,e),mousedrag:e=>this._handleMouseDrag(c,e),mousemove:e=>this._handleMouseMove(c,e)};this._altMouseCursor=new d(s,r,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),t(this._altMouseCursor),t(this._mouseStateService.onProtocolChange(e=>{this._handleProtocolChange(c,_,e)})),t(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(s),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,t((0,o.addDisposableListener)(s,"mousedown",e=>this._handleMouseDown(c,e))),t((0,o.addDisposableListener)(s,"wheel",e=>this._handlePassiveWheel(c,e),{passive:!1})),t(l.Gesture.addTarget(e.screenElement)),t((0,o.addDisposableListener)(e.screenElement,l.EventType.START,()=>this._handleTouchStart())),t((0,o.addDisposableListener)(e.screenElement,l.EventType.CHANGE,e=>this._handleTouchChange(c,e)))}_sendEvent(e,t){const i=this._mouseCoordsService.getMouseReportCoords(t,e.target.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(!this._mouseStateService.allowCustomWheelEvent(t))return!1;const e=t.deltaY;if(0===e)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return!1;r=e<0?0:1,s=4;break;default:return!1}if(void 0===r||void 0===s||s>4)return!1;if(4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!t.altKey)return!1;const o=4!==s&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:!o&&t.altKey,shift:t.shiftKey})}_handleMouseUp(e,t){this._sendEvent(e,t),t.buttons||(e.mouseupListener.clear(),e.mousedragListener.clear())}_handleWheel(e,t){return this._sendEvent(e,t),t.preventDefault(),t.stopPropagation(),!1}_handleMouseDrag(e,t){t.buttons&&this._sendEvent(e,t)}_handleMouseMove(e,t){t.buttons||this._sendEvent(e,t)}_handleMouseDown(e,t){if(t.preventDefault(),e.focus(),!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(t))return;this._sendEvent(e,t);const{element:i,document:s}=e.target,r=i.ownerDocument??s;e.requestedEvents.mouseup&&(e.mouseupListener.value=(0,o.addDisposableListener)(r,"mouseup",e.requestedEvents.mouseup)),e.requestedEvents.mousedrag&&(e.mousedragListener.value=(0,o.addDisposableListener)(r,"mousemove",e.requestedEvents.mousedrag))}_handlePassiveWheel(e,t){if(!e.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(t))return!1;if(!this._bufferService.buffer.hasScrollback){if(0===t.deltaY)return!1;if(0===this._consumeWheelEvent(t,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr))return t.preventDefault(),t.stopPropagation(),!1;const e=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(e,!0),t.preventDefault(),t.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(e,t){t.preventDefault(),t.stopPropagation(),e.requestedEvents.wheel?this._handleTouchScrollAsWheel(e,t):this._bufferService.buffer.hasScrollback?e.target.handleTouchScroll?.(t.translationY):this._handleTouchScrollAsKeys(t)}_handleTouchScrollAsKeys(e){const t=this._renderService?.dimensions.css.cell.height;if(!t)return;this._touchScrollAccumulator-=e.translationY;const i=Math.trunc(this._touchScrollAccumulator/t);if(0===i)return;this._touchScrollAccumulator-=i*t;const s=""+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let e=0;e0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(r*=this._bufferService.rows),r}_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,this._mouseStateService.isPixelEncoding))return!1;if(!this._mouseStateService.restrictMouseEvent(e))return!1;const t=this._mouseStateService.encodeMouseEvent(e);return t&&(this._mouseStateService.isDefaultEncoding?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.MouseService=c,t.MouseService=c=s([r(0,h.IRenderService),r(1,h.IMouseCoordsService),r(2,n.IMouseStateService),r(3,n.ICoreService),r(4,n.IBufferService),r(5,n.IOptionsService),r(6,h.ISelectionService),r(7,n.ILogService),r(8,h.ICoreBrowserService)],c);class d{constructor(e,t,i){this._element=e,this._document=t,this._isActive=i,this._listeners=new a.MutableDisposable}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;const e=new a.DisposableStore,t=e=>this.syncFromModifier(e);e.add((0,o.addDisposableListener)(this._document,"keydown",t)),e.add((0,o.addDisposableListener)(this._document,"keyup",t)),e.add((0,o.addDisposableListener)(this._element,"mousemove",t));const i=this._element.ownerDocument?.defaultView;i&&e.add((0,o.addDisposableListener)(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=e}resetClass(){this._updateClass(!1)}syncFromModifier(e){this._isActive()&&this._updateClass(e.getModifierState("Alt"))}_updateClass(e){e?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}}t.AltMouseCursorController=d},5783(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const o=i(4852),n=i(7098),a=i(4812),h=i(6168),l=i(6501),c=i(8636);let d=class extends a.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,n,l,d,u,f){super(),this._rowCount=e,this._optionsService=i,this._logService=s,this._charSizeService=r,this._coreService=n,this._coreBrowserService=u,this._renderer=this._register(new a.MutableDisposable),this._observerDisposable=this._register(new a.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 c.Emitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this._register(new c.Emitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this._register(new c.Emitter),this.onRender=this._onRender.event,this._onRefreshRequest=this._register(new c.Emitter),this.onRefreshRequest=this._onRefreshRequest.event,this._pausedResizeTask=this._register(new h.DebouncedIdleTask(this._logService)),this._renderDebouncer=new o.RenderDebouncer((e,t)=>this._renderRows(e,t),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new _(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register((0,a.toDisposable)(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(d.onResize(()=>this._fullRefresh())),this._register(d.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(d.cols,d.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(d.buffer.y,d.buffer.y,void 0,!0))),this._register(f.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.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});this._observerDisposable.value=(0,a.toDisposable)(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=i,i.observe(t)}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),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,s=!1){if(this._isPaused)return void(this._needsFullRefresh=!0);if(this._coreService.decPrivateModes.synchronizedOutput)return void this._syncOutputHandler.bufferRows(e,t);const r=this._syncOutputHandler.flush();r&&(e=Math.min(e,r.start),t=Math.max(t,r.end)),s||(this._isNextRenderRedrawOnly=!1),i?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){this._renderer.value&&(this._coreService.decPrivateModes.synchronizedOutput?this._syncOutputHandler.bufferRows(e,t):(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,e.sync,!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,t.RenderService=d=s([r(2,l.IOptionsService),r(3,l.ILogService),r(4,n.ICharSizeService),r(5,l.ICoreService),r(6,l.IDecorationService),r(7,l.IBufferService),r(8,n.ICoreBrowserService),r(9,n.IThemeService)],d);class _{constructor(e,t,i){this._coreBrowserService=e,this._coreService=t,this._onTimeout=i,this._start=0,this._end=0,this._isBuffering=!1}bufferRows(e,t){this._isBuffering?(this._start=Math.min(this._start,e),this._end=Math.max(this._end,t)):(this._start=e,this._end=t,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;const e={start:this._start,end:this._end};return this._isBuffering=!1,e}dispose(){void 0!==this._timeout&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}}},2079(e,t,i){var s,r=this&&this.__createBinding||(Object.create?function(e,t,i,s){void 0===s&&(s=i);var r=Object.getOwnPropertyDescriptor(t,i);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,s,r)}:function(e,t,i,s){void 0===s&&(s=i),e[s]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},a=this&&this.__importStar||(s=function(e){return s=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},s(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i=s(e),n=0;nthis._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(e=>this._handleTrim(e)),this._register(this._bufferService.buffers.onBufferActivate(e=>this._handleBufferActivate(e))),this.enable(),this._model=new d.SelectionModel(this._bufferService),this._activeSelectionMode=0,this._register((0,u.toDisposable)(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(e=>{e.rowsChanged&&this.clearSelection()}))}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(b," ")).join(f.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())),f.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,p.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._mouseCoordsService.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,l.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 this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:f.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(2===e.button&&this.hasSelection||0!==e.button||this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){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){const t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);const i=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);i&&i.length!==this._model.selectionStart[0]&&0===i.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(!this._optionsService.rawOptions.mouseEventsRequireAlt||!this._mouseStateService.areMouseEventsActive)&&e.altKey&&!(f.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-1,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._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,c.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.value=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,o=r.lines.get(e[1]);if(!o)return;const n=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(o,e[0]),h=a;const l=e[0]-a;let c=0,d=0,_=0,u=0;if(" "===n.charAt(a)){for(;a>0&&" "===n.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(o.loadCell(t-1,this._workCell));){o.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(c++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+l-c+_,p=Math.min(this._bufferService.cols,h-a+c+d-_-u);if(t||""!==n.slice(a,h).trim()){if(i&&0===f&&32!==o.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&o.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,p+=e}}}if(s&&f+p===this._bufferService.cols&&32!==o.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&&(p+=t.length)}}return{start:f,length:p}}}_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,p.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=w,t.SelectionService=w=n([h(3,g.IBufferService),h(4,g.ICoreService),h(5,_.IMouseCoordsService),h(6,g.IOptionsService),h(7,g.IMouseStateService),h(8,_.IRenderService),h(9,_.ICoreBrowserService)],w)},7098(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.IKeyboardService=t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.IMouseCoordsService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(6201);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseCoordsService=(0,s.createDecorator)("MouseCoordsService"),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"),t.IKeyboardService=(0,s.createDecorator)("KeyboardService")},9078(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=void 0;const o=i(7174),n=i(9302),a=i(4103),h=i(4812),l=i(6501),c=i(8636),d=a.css.toColor("#ffffff"),_=a.css.toColor("#000000"),u=a.css.toColor("#ffffff"),f=_,p={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},v=d;let g=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new o.ColorContrastCache,this._halfContrastCache=new o.ColorContrastCache,this._onChangeColors=this._register(new c.Emitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:d,background:_,cursor:u,cursorAccent:f,selectionForeground:void 0,selectionBackgroundTransparent:p,selectionBackgroundOpaque:a.color.blend(_,p),selectionInactiveBackgroundTransparent:p,selectionInactiveBackgroundOpaque:a.color.blend(_,p),scrollbarSliderBackground:a.color.opacity(d,.2),scrollbarSliderHoverBackground:a.color.opacity(d,.4),scrollbarSliderActiveBackground:a.color.opacity(d,.5),overviewRulerBorder:d,ansi:n.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 t=this._colors;if(t.foreground=m(e.foreground,d),t.background=m(e.background,_),t.cursor=a.color.blend(t.background,m(e.cursor,u)),t.cursorAccent=a.color.blend(t.background,m(e.cursorAccent,f)),t.selectionBackgroundTransparent=m(e.selectionBackground,p),t.selectionBackgroundOpaque=a.color.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=m(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=a.color.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?m(e.selectionForeground,a.NULL_COLOR):void 0,t.selectionForeground===a.NULL_COLOR&&(t.selectionForeground=void 0),a.color.isOpaque(t.selectionBackgroundTransparent)){const e=.3;t.selectionBackgroundTransparent=a.color.opacity(t.selectionBackgroundTransparent,e)}if(a.color.isOpaque(t.selectionInactiveBackgroundTransparent)){const e=.3;t.selectionInactiveBackgroundTransparent=a.color.opacity(t.selectionInactiveBackgroundTransparent,e)}if(t.scrollbarSliderBackground=m(e.scrollbarSliderBackground,a.color.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=m(e.scrollbarSliderHoverBackground,a.color.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=m(e.scrollbarSliderActiveBackground,a.color.opacity(t.foreground,.5)),t.overviewRulerBorder=m(e.overviewRulerBorder,v),t.ansi=n.DEFAULT_ANSI_COLORS.slice(),t.ansi[0]=m(e.black,n.DEFAULT_ANSI_COLORS[0]),t.ansi[1]=m(e.red,n.DEFAULT_ANSI_COLORS[1]),t.ansi[2]=m(e.green,n.DEFAULT_ANSI_COLORS[2]),t.ansi[3]=m(e.yellow,n.DEFAULT_ANSI_COLORS[3]),t.ansi[4]=m(e.blue,n.DEFAULT_ANSI_COLORS[4]),t.ansi[5]=m(e.magenta,n.DEFAULT_ANSI_COLORS[5]),t.ansi[6]=m(e.cyan,n.DEFAULT_ANSI_COLORS[6]),t.ansi[7]=m(e.white,n.DEFAULT_ANSI_COLORS[7]),t.ansi[8]=m(e.brightBlack,n.DEFAULT_ANSI_COLORS[8]),t.ansi[9]=m(e.brightRed,n.DEFAULT_ANSI_COLORS[9]),t.ansi[10]=m(e.brightGreen,n.DEFAULT_ANSI_COLORS[10]),t.ansi[11]=m(e.brightYellow,n.DEFAULT_ANSI_COLORS[11]),t.ansi[12]=m(e.brightBlue,n.DEFAULT_ANSI_COLORS[12]),t.ansi[13]=m(e.brightMagenta,n.DEFAULT_ANSI_COLORS[13]),t.ansi[14]=m(e.brightCyan,n.DEFAULT_ANSI_COLORS[14]),t.ansi[15]=m(e.brightWhite,n.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const i=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;ssetTimeout(t,e))},t.disposableTimeout=function(e,t=0,i){const r=setTimeout(()=>{e(),i&&o.dispose()},t),o=(0,s.toDisposable)(()=>{clearTimeout(r)});return i?.add(o),o};const s=i(4812);t.TimeoutTimer=class{constructor(){this._token=-1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");-1===this._token&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}},t.MicrotaskTimer=class{constructor(){this._isScheduled=!1,this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(e){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,e())}))}},t.IntervalTimer=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(e,t,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();const s=i.setInterval(()=>{e()},t);this._disposable={dispose:()=>{i.clearInterval(s),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}}},5639(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(4812),r=i(8636);class o extends s.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this._register(new r.Emitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this._register(new r.Emitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this._register(new r.Emitter),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>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(n||(t.channels=n={})),function(e){function t(e,t){return o=Math.round(255*t),[i,s,r]=c.toChannels(e.rgba),{css:n.toCss(i,s,r,o),rgba:n.toRgba(i,s,r,o)}}e.blend=function(e,t){if(o=(255&t.rgba)/255,1===o)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),{css:n.toCss(i,s,r),rgba:n.toRgba(i,s,r)}},e.isOpaque=function(e){return!(255&~e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=c.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return n.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=c.toChannels(t),{css:n.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return o=255&e.rgba,t(e,o*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),n.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),o=parseInt(e.slice(4,5).repeat(2),16),n.toColor(i,s,r,o);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],10),s=parseInt(h[2],10),r=parseInt(h[3],10),o=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),n.toColor(i,s,r,o);if("transparent"===e)return{css:"transparent",rgba:0};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,o]=t.getImageData(0,0,1,1).data,255!==o)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(i,s,r,o),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(l||(t.rgb=l={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,c=_(l.relativeLuminance2(n,a,h),l.relativeLuminance2(s,r,o));for(;c>>0}e.blend=function(e,t){if(o=(255&t)/255,1===o)return t;const a=t>>24&255,h=t>>16&255,l=t>>8&255,c=e>>24&255,d=e>>16&255,_=e>>8&255;return i=c+Math.round((a-c)*o),s=d+Math.round((h-d)*o),r=_+Math.round((l-_)*o),n.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=l.relativeLuminance(e>>8),o=l.relativeLuminance(i>>8);if(_(r,o)>8));if(n_(r,l.relativeLuminance(t>>8))?o:t}return o}const n=a(e,i,s),h=_(r,l.relativeLuminance(n>>8));if(h_(r,l.relativeLuminance(o>>8))?n:o}return n}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(c||(t.rgba=c={}))},5777(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(6501),r=i(6025),o=i(7276),n=i(9640),a=i(56),h=i(4071),l=i(6478),c=i(7428),d=i(6415),_=i(5746),u=i(5882),f=i(2486),p=i(3562),v=i(8811),g=i(8636),m=i(4812);let S=!1;class b extends m.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new g.Emitter),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 m.MutableDisposable),this._onBinary=this._register(new g.Emitter),this.onBinary=this._onBinary.event,this._onData=this._register(new g.Emitter),this.onData=this._onData.event,this._onLineFeed=this._register(new g.Emitter),this.onLineFeed=this._onLineFeed.event,this._onRender=this._register(new g.Emitter),this.onRender=this._onRender.event,this._onResize=this._register(new g.Emitter),this.onResize=this._onResize.event,this._onWriteParsed=this._register(new g.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this._register(new g.Emitter),this._instantiationService=new r.InstantiationService,this.optionsService=this._register(new a.OptionsService(e)),this._instantiationService.setService(s.IOptionsService,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(s.ILogService,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(n.BufferService)),this._instantiationService.setService(s.IBufferService,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(h.CoreService)),this._instantiationService.setService(s.ICoreService,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(l.MouseStateService)),this._instantiationService.setService(s.IMouseStateService,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(d.UnicodeService)),this.unicodeService.register(new c.UnicodeV6),this._instantiationService.setService(s.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(_.CharsetService),this._instantiationService.setService(s.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(v.OscLinkService),this._instantiationService.setService(s.IOscLinkService,this._oscLinkService),this._inputHandler=this._register(new f.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(g.EventUtils.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(g.EventUtils.forward(this._bufferService.onResize,this._onResize)),this._register(g.EventUtils.forward(this.coreService.onData,this._onData)),this._register(g.EventUtils.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),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(g.EventUtils.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=s.LogLevelEnum.WARN&&!S&&(this._logService.warn("writeSync is unreliable and will be removed soon."),S=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.backend&&void 0!==t.buildNumber&&(e=!!("conpty"===t.backend&&t.buildNumber<21376)),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(u.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>((0,u.updateWindowsModeWrappedState)(this._bufferService),!1))),this._windowsWrappingHeuristics.value=(0,m.toDisposable)(()=>{for(const t of e)t.dispose()})}}}t.CoreTerminal=b},8636(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EventUtils=t.Emitter=void 0;const s=i(4812);var r;t.Emitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=(e,t,i)=>{if(this._disposed)return(0,s.toDisposable)(()=>{});const r={fn:e,thisArgs:t};this._listeners=this._listeners.slice(),this._listeners.push(r);const o=(0,s.toDisposable)(()=>{const e=this._listeners.indexOf(r);-1!==e&&(this._listeners=this._listeners.slice(),this._listeners.splice(e,1))});return i&&(Array.isArray(i)?i.push(o):i.add(o)),o}),this._event}fire(e){if(this._disposed||!this._listeners.length)return;if(1===this._listeners.length)return void this._listeners[0].fn.call(this._listeners[0].thisArgs,e);const t=this._listeners;for(let i=0,s=t.length;it.fire(e))},e.map=function(e,t){return(i,s,r)=>e(e=>i.call(s,t(e)),void 0,r)},e.any=function(...e){return(t,i,r)=>{const o=new s.DisposableStore;for(const s of e)o.add(s(e=>t.call(i,e)));return r&&(Array.isArray(r)?r.push(o):r.add(o)),o}},e.runAndSubscribe=function(e,t,i){return t(i),e(e=>t(e))}}(r||(t.EventUtils=r={}))},2486(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0,t.isValidColorIndex=x;const o=i(6760),n=i(6717),a=i(4812),h=i(726),l=i(6107),c=i(8938),d=i(3055),_=i(5451),u=i(6501),f=i(6415),p=i(1346),v=i(9823),g=i(2607),m=i(8693),S=i(8636),b=i(7804),w={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function y(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 C;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(C||(t.WindowsOptionsReportType=C={}));let k=0;class D extends a.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,a,c,d,_=new n.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=a,this._mouseStateService=c,this._unicodeService=d,this._parser=_,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new h.StringToUtf32,this._utf8Decoder=new h.Utf8ToUtf32,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 S.Emitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this._register(new S.Emitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this._register(new S.Emitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this._register(new S.Emitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this._register(new S.Emitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this._register(new S.Emitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this._register(new S.Emitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this._register(new S.Emitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this._register(new S.Emitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this._register(new S.Emitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this._register(new S.Emitter),this.onScroll=this._onScroll.event,this._onTitleChange=this._register(new S.Emitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this._register(new S.Emitter),this.onColor=this._onColor.event,this._onRequestColorSchemeQuery=this._register(new S.Emitter),this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 E(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.setApcHandlerFallback((e,t,i)=>{this._logService.debug("Unknown APC 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.scrollDown(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({prefix:">",final:"q"},e=>this.sendXtVersion(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.registerCsiHandler({prefix:"=",final:"u"},e=>this.kittyKeyboardSet(e)),this._parser.registerCsiHandler({prefix:"?",final:"u"},e=>this.kittyKeyboardQuery(e)),this._parser.registerCsiHandler({prefix:">",final:"u"},e=>this.kittyKeyboardPush(e)),this._parser.registerCsiHandler({prefix:"<",final:"u"},e=>this.kittyKeyboardPop(e)),this._parser.setExecuteHandler("",()=>this.bell()),this._parser.setExecuteHandler("\n",()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler("\t",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("„",()=>this.index()),this._parser.setExecuteHandler("…",()=>this.nextLine()),this._parser.setExecuteHandler("ˆ",()=>this.tabSet()),this._parser.registerOscHandler(0,new p.OscHandler(e=>(this.setTitle(e),this.setIconName(e),!0))),this._parser.registerOscHandler(1,new p.OscHandler(e=>this.setIconName(e))),this._parser.registerOscHandler(2,new p.OscHandler(e=>this.setTitle(e))),this._parser.registerOscHandler(4,new p.OscHandler(e=>this.setOrReportIndexedColor(e))),this._parser.registerOscHandler(8,new p.OscHandler(e=>this.setHyperlink(e))),this._parser.registerOscHandler(10,new p.OscHandler(e=>this.setOrReportFgColor(e))),this._parser.registerOscHandler(11,new p.OscHandler(e=>this.setOrReportBgColor(e))),this._parser.registerOscHandler(12,new p.OscHandler(e=>this.setOrReportCursorColor(e))),this._parser.registerOscHandler(104,new p.OscHandler(e=>this.restoreIndexedColor(e))),this._parser.registerOscHandler(110,new p.OscHandler(e=>this.restoreFgColor(e))),this._parser.registerOscHandler(111,new p.OscHandler(e=>this.restoreBgColor(e))),this._parser.registerOscHandler(112,new p.OscHandler(e=>this.restoreCursorColor(e))),this._parser.registerEscHandler({final:"7"},()=>this.saveCursor()),this._parser.registerEscHandler({final:"8"},()=>this.restoreCursor()),this._parser.registerEscHandler({final:"D"},()=>this.index()),this._parser.registerEscHandler({final:"E"},()=>this.nextLine()),this._parser.registerEscHandler({final:"H"},()=>this.tabSet()),this._parser.registerEscHandler({final:"M"},()=>this.reverseIndex()),this._parser.registerEscHandler({final:"="},()=>this.keypadApplicationMode()),this._parser.registerEscHandler({final:">"},()=>this.keypadNumericMode()),this._parser.registerEscHandler({final:"c"},()=>this.fullReset()),this._parser.registerEscHandler({final:"n"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"o"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"|"},()=>this.setgLevel(3)),this._parser.registerEscHandler({final:"}"},()=>this.setgLevel(2)),this._parser.registerEscHandler({final:"~"},()=>this.setgLevel(1)),this._parser.registerEscHandler({intermediates:"%",final:"@"},()=>this.selectDefaultCharset()),this._parser.registerEscHandler({intermediates:"%",final:"G"},()=>this.selectDefaultCharset());for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},()=>this.selectCharset("("+e)),this._parser.registerEscHandler({intermediates:")",final:e},()=>this.selectCharset(")"+e)),this._parser.registerEscHandler({intermediates:"*",final:e},()=>this.selectCharset("*"+e)),this._parser.registerEscHandler({intermediates:"+",final:e},()=>this.selectCharset("+"+e)),this._parser.registerEscHandler({intermediates:"-",final:e},()=>this.selectCharset("-"+e)),this._parser.registerEscHandler({intermediates:".",final:e},()=>this.selectCharset("."+e)),this._parser.registerEscHandler({intermediates:"/",final:e},()=>this.selectCharset("/"+e));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(e=>(this._logService.error("Parsing error: ",e),e)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new v.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){if(this._logService.logLevel<=u.LogLevelEnum.WARN){let t;const i=new Promise((e,i)=>{t=setTimeout(()=>i("#SLOW_TIMEOUT"),5e3)});Promise.race([e,i]).then(()=>{void 0!==t&&clearTimeout(t)},e=>{if(void 0!==t&&clearTimeout(t),"#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,o=0;const n=this._parseStack.paused;if(n){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>131072&&(o=this._parseStack.position+131072)}if(this._logService.logLevel<=u.LogLevelEnum.DEBUG&&this._logService.debug("parsing data "+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,e=>String.fromCharCode(e)).join("")}"`)),this._logService.logLevel===u.LogLevelEnum.TRACE&&this._logService.trace("parsing data (codes)","string"==typeof e?e.split("").map(e=>e.charCodeAt(0)):e),this._parseBuffer.length131072)for(let t=o;t0&&2===p.getWidth(this._activeBuffer.x-1)&&p.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(d){const e=p;let t=this._activeBuffer.x-m;if(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),p=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!p)return;for(m>0&&p instanceof l.BufferLine&&p.copyCellsFrom(e,t,0,m,!1);t=0;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(_&&(p.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===p.getWidth(a-1)&&p.setCellFromCodepoint(a-1,c.NULL_CELL_CODE,c.NULL_CELL_WIDTH,u)),p.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)p.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===p.getWidth(this._activeBuffer.x)&&!p.hasContent(this._activeBuffer.x)&&p.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=>!y(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new v.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new g.ApcHandler(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 o=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);o&&(o.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(o.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){const e=this._activeBuffer.lines.get(i+1);e&&(e.isWrapped=!1)}for(;i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(i=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,i-1);i--;){const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+i);if(e?.getTrimmedLength())break}for(;i>=0;i--)this._bufferService.scroll(this._eraseAttrData())}else{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._activeBuffer===this._bufferService.buffers.normal&&(this._bufferService.isUserScrolling=!1),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("[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`P>|xterm.js(${b.XTERM_VERSION})\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(o.triggerDataEvent(`[${t?"":"?"}${e};${i}$y`),!0),_=e=>e?1:2,u=e.params[0];return t?d(u,2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(c.convertEol):0):1===u?d(u,_(i.applicationCursorKeys)):3===u?d(u,c.windowOptions.setWinLines?80===a?2:132===a?1:0:0):6===u?d(u,_(i.origin)):7===u?d(u,_(i.wraparound)):8===u?d(u,3):9===u?d(u,_("X10"===s)):12===u?d(u,_(c.cursorBlink)):25===u?d(u,_(!o.isCursorHidden)):45===u?d(u,_(i.reverseWraparound)):66===u?d(u,_(i.applicationKeypad)):67===u?d(u,4):1e3===u?d(u,_("VT200"===s)):1002===u?d(u,_("DRAG"===s)):1003===u?d(u,_("ANY"===s)):1004===u?d(u,_(i.sendFocus)):1005===u?d(u,4):1006===u?d(u,_("SGR"===r)):1015===u?d(u,4):1016===u?d(u,_("SGR_PIXELS"===r)):1048===u?d(u,1):47===u||1047===u||1049===u?d(u,_(h===l)):2004===u?d(u,_(i.bracketedPasteMode)):2026===u?d(u,_(i.synchronizedOutput)):9001===u&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?d(u,_(i.win32InputMode)):d(u,0)}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=_.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-67108864,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,o=0;do{if(s[o+r]=e.params[t+o],e.hasSubParams(t+o)){const i=e.getSubParams(t+o);let n=0;do{5===s[1]&&(r=1),s[o+n+1+r]=i[n]}while(++n=2||2===s[1]&&o+r>=5)break;s[1]&&(r=1)}while(++o+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&=-67108864,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-67108864,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-67108864,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-67108864,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:221===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.fg&=-134217729:222===i&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??1)?s.bg&=-134217729:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("");break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[${e};${t}R`)}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`[?${e};${t}R`);break;case 15:case 25:case 26:case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??1)&&this._onRequestColorSchemeQuery.fire()}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=0===e.length?1:e.params[0];if(0===t)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar"}const e=t%2==1;this._coreService.decPrivateModes.cursorBlink=e}return!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(!y(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(C.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(C.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`[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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let e=0;e1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e,10);if(x(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.indexOf(";");if(-1===t)return!0;const i=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(i,s):!i.trim()&&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,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=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 d.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(`${e}\\`),!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)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(i){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=e.params[0]||0,i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;return s.length>=16&&s.shift(),s.push(i.flags),i.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;const t=Math.max(1,e.params[0]||1),i=this._coreService.kittyKeyboard,s=this._bufferService.buffer===this._bufferService.buffers.alt?i.altStack:i.mainStack;for(let e=0;e0;e++)i.flags=s.pop();return 0===s.length&&t>0&&(i.flags=0),!0}}t.InputHandler=D;let E=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&&(k=e,e=t,t=k),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function x(e){return 0<=e&&e<256}E=s([r(0,u.IBufferService)],E)},4812(e,t){function i(e){return{dispose:e}}function s(e){if(!e)return e;if(Array.isArray(e)){for(const t of e)t.dispose();return[]}return e.dispose(),e}Object.defineProperty(t,"__esModule",{value:!0}),t.MutableDisposable=t.Disposable=t.DisposableStore=void 0,t.toDisposable=i,t.dispose=s,t.combinedDisposable=function(...e){return i(()=>s(e))};class r{constructor(){this._disposables=new Set,this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(e){return this._isDisposed?e.dispose():this._disposables.add(e),e}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.clear()}}clear(){for(const e of this._disposables)e.dispose();this._disposables.clear()}}t.DisposableStore=r;class o{constructor(){this._store=new r}dispose(){this._store.dispose()}_register(e){return this._store.add(e)}}t.Disposable=o,o.None=Object.freeze({dispose(){}}),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}}},7710(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},701(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isMac=t.isSafari=t.isLegacyEdge=t.isChrome=t.isFirefox=t.isNode=void 0,t.getZoomFactor=function(e){return 1},t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1],10)},t.isNode=!("undefined"==typeof process||!("title"in process)||"undefined"!=typeof navigator&&!navigator.userAgent.startsWith("Node.js/"));const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isChrome=i.includes("Chrome"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},3087(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;const s=i(6168);let r=0;t.SortedList=class{constructor(e,t){this._getKey=e,this._array=[],this._insertedValues=[],this._isFlushingInserted=!1,this._deletedIndices=[],this._isFlushingDeleted=!1,this._flushInsertedTask=new s.IdleTaskQueue(t),this._flushDeletedTask=new s.IdleTaskQueue(t)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(e){this._flushCleanupDeleted(),0===this._insertedValues.length&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(e)}_flushInserted(){const e=this._insertedValues.sort((e,t)=>this._getKey(e)-this._getKey(t));let t=0,i=0;const s=new Array(this._array.length+this._insertedValues.length);for(let r=0;r=this._array.length||this._getKey(e[t])<=this._getKey(this._array[i])?(s[r]=e[t],t++):s[r]=this._array[i++];this._array=s,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(e){if(this._flushCleanupInserted(),0===this._array.length)return!1;const t=this._getKey(e);return void 0!==t&&(!!this._deleteAtKey(e,t)||0!==this._deletedIndices.length&&(this._flushCleanupDeleted(),this._deleteAtKey(e,t)))}_deleteAtKey(e,t){if(r=this._search(t),-1===r)return!1;if(this._getKey(this._array[r])!==t)return!1;do{if(this._array[r]===e)return 0===this._deletedIndices.length&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(r),!0}while(++re-t);let t=0;const i=new Array(this._array.length-e.length);let s=0;for(let r=0;r0&&this._flushDeletedTask.flush()}*getKeyIterator(e){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),0!==this._array.length&&(r=this._search(e),!(r<0||r>=this._array.length)&&this._getKey(this._array[r])===e))do{yield this._array[r]}while(++r=this._array.length)&&this._getKey(this._array[r])===e))do{t(this._array[r])}while(++r=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}}},4220(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LimitedStringBuilder=t.StringBuilder=void 0;class i{constructor(){this._chunks=[],this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(e){this._chunks.push(e),this._length+=e.length}toString(){return this._chunks.join("")}}t.StringBuilder=i,t.LimitedStringBuilder=class{constructor(e){this._limit=e,this._builder=new i}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(e){return this._builder.append(e),this._builder.length>this._limit&&(this._builder.reset(),!0)}toString(){return this._builder.toString()}}},6168(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;class i{constructor(e){this._tasks=[],this._i=0,this._logService=e}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ii)return r-t<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-t))}ms`),void this._start();r=i}this.clear()}}class s extends i{_requestCallback(e){return setTimeout(()=>e(this._createDeadline(16)))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=performance.now()+e;return{timeRemaining:()=>Math.max(0,t-performance.now())}}}t.PriorityTaskQueue=s,t.IdleTaskQueue="requestIdleCallback"in globalThis?class extends i{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:s,t.DebouncedIdleTask=class{constructor(e){this._queue=new t.IdleTaskQueue(e)}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}dispose(){this._queue.clear()}}},7804(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.XTERM_VERSION=void 0,t.XTERM_VERSION="6.1.0-beta.303"},5882(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),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)};const s=i(8938)},5451(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&~this.fg)}isBgRGB(){return!(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!(50331648&this.fg)}isBgDefault(){return!(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&~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?!(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},1073(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(5639),r=i(4812),o=i(6168),n=i(5451),a=i(6107),h=i(732),l=i(3055),c=i(8938),d=i(8158),_=i(6760);t.MAX_BUFFER_SIZE=4294967295;class u extends r.Disposable{constructor(e,t,i,n){super(),this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this._logService=n,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=a.DEFAULT_ATTR_DATA.clone(),this.savedCharset=_.DEFAULT_CHARSET,this.savedCharsets=[],this.savedGlevel=0,this.savedOriginMode=!1,this.savedWraparoundMode=!0,this.markers=[],this._nullCell=l.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=l.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,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(),this._memoryCleanupQueue=new o.IdleTaskQueue(this._logService),this._register((0,r.toDisposable)(()=>this._memoryCleanupQueue.clear())),this._register((0,r.toDisposable)(()=>this.clearAllMarkers()))}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 a.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){e??=a.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(a.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+o+1?(this.ybase--,o++,this.ydisp>0&&this.ydisp--):this.lines.push(new a.BufferLine(e,i,!1)));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),o&&(this.y+=o),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;t0){const e=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,e)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._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}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=this._optionsService.rawOptions.reflowCursorLine,s=(0,h.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(a.DEFAULT_ATTR_DATA),i);if(s.length>0){const i=(0,h.reflowLargerCreateNewLayout)(this.lines,s);(0,h.reflowLargerApplyNewLayout)(this.lines,i.layout),this._reflowLargerAdjustViewport(e,t,i.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(a.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length=0;n--){let l=this.lines.get(n);if(!l||!l.isWrapped&&l.getTrimmedLength()<=e)continue;const c=[l];for(;l.isWrapped&&n>0;)l=this.lines.get(--n),c.unshift(l);if(!i){const e=this.ybase+this.y;if(e>=n&&e0&&(r.push({start:n+c.length+o,newLines:p}),o+=p.length),c.push(...p);let v=_.length-1,g=_[v];0===g&&(v--,g=_[v]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[v])break;if(c[v].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(v--,g=_[v]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,h.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;l--)if(a&&a.start>s+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(l--,a.newLines[e]);l++,e.push({index:s+1,amount:a.newLines.length}),h+=a.newLines.length,a=r[++n]}else this.lines.set(l,t[s--]);let l=0;for(let t=e.length-1;t>=0;t--)e[t].index+=l,this.lines.onInsertEmitter.fire(e[t]),l+=e[t].amount;const c=Math.max(0,i+o-this.lines.maxLength);c>0&&this.lines.onTrimEmitter.fire(c)}}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(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)}}t.Buffer=u},6107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(5451),r=i(3055),o=i(8938),n=i(726);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;const h=new r.CellData,l=t.DEFAULT_ATTR_DATA.extended.clone();class c{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._cacheValid=!1,this._cache="",this._cacheTrimmed=!1,this._data=new Uint32Array(3*e);const s=t??r.CellData.fromCharData([0,o.NULL_CELL_CHAR,o.NULL_CELL_WIDTH,o.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._cacheValid=!1,this._data[3*e+1]=t[o.CHAR_DATA_ATTR_INDEX],t[o.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[o.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[o.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[o.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,n.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]:t.combinedData="",268435456&t.bg?t.extended=this._extendedAttrs[e]:(l._ext=0,l._urlId=0,t.extended=l),t}setCell(e,t){this._cacheValid=!1,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){this._cacheValid=!1,268435456&s.bg&&(this._extendedAttrs[e]=s.extended);const r=3*e;this._data[r+0]=t|i<<22,this._data[r+1]=s.fg,this._data[r+2]=s.bg}addCodepointToCell(e,t,i){this._cacheValid=!1;let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,n.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,n.stringFromCodePoint)(2097151&s)+(0,n.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(this._cacheValid=!1,(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,h));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){this._cacheValid=!1;const o=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]=o[3*(t+r)+e];this._copyCellMapsFrom(e,t+r,i+r)}else for(let r=0;r>22||1}s&&s.push(t);const h=a.join("");return r&&(this._cache=h,this._cacheValid=!0,this._cacheTrimmed=!!e),h}_copyCellMapsFrom(e,t,i){const s=3*t;2097152&e._data[s+0]&&(this._combined[i]=e._combined[t]),268435456&e._data[s+2]&&(this._extendedAttrs[i]=e._extendedAttrs[t])}_copySparseMapsFrom(e){this._combined={},this._extendedAttrs={};for(let t=0;te.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)}},732(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.reflowLargerGetLinesToRemove=function(e,t,s,r,o,n){const a=[];for(let h=0;h=h&&r0&&(e>_||0===d[e].getTrimmedLength());e--)v++;v>0&&(a.push(h+d.length-v),a.push(v)),h+=d.length-1}return a},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],o=0;for(let n=0;nl&&(n-=l,a++);const c=2===e[a].getWidth(n-1);c&&n--;const d=c?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},4097(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(4812),r=i(1073),o=i(8636);class n extends s.Disposable{constructor(e,t,i){super(),this._optionsService=e,this._bufferService=t,this._logService=i,this._normalBuffer=this._register(new s.MutableDisposable),this._altBuffer=this._register(new s.MutableDisposable),this._onBufferActivate=this._register(new o.Emitter),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 r.Buffer(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new r.Buffer(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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=n},3055(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(726),r=i(8938),o=i(5451);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor())return!1;if(this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor())return!1;if(this.isInverse()!==e.isInverse())return!1;if(this.isBold()!==e.isBold())return!1;if(this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;const t=this.isUnderlineColorDefault(),i=e.isUnderlineColorDefault();if(!t||!i){if(t!==i)return!1;if(this.getUnderlineColor()!==e.getUnderlineColor())return!1;if(this.getUnderlineColorMode()!==e.getUnderlineColorMode())return!1}}return this.isOverline()===e.isOverline()&&this.isBlink()===e.isBlink()&&this.isInvisible()===e.isInvisible()&&this.isItalic()===e.isItalic()&&this.isDim()===e.isDim()&&this.isStrikethrough()===e.isStrikethrough()}}t.CellData=n},8938(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=t.DEFAULT_COLOR<<9|256,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},8158(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(4812),r=i(8636);class o{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=o._nextId++,this._onDispose=this.register(new r.Emitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,s.dispose)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=o,o._nextId=1},6760(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["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},706(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=function(e,t,s,r){const o={type:0,cancel:!1,key:void 0},n=(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?"OA":"":"UIKeyInputLeftArrow"===e.key?o.key=t?"OD":"":"UIKeyInputRightArrow"===e.key?o.key=t?"OC":"":"UIKeyInputDownArrow"===e.key&&(o.key=t?"OB":"");break;case 8:o.key=e.ctrlKey?"\b":"",e.altKey&&(o.key=""+o.key);break;case 9:if(e.shiftKey){o.key="";break}o.key="\t",o.cancel=!0;break;case 13:"c"===e.key&&e.ctrlKey?o.key="":o.key=e.altKey?"\r":"\r",o.cancel=!0;break;case 27:o.key="",e.altKey&&(o.key=""),o.cancel=!0;break;case 37:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"D":t?"OD":"";break;case 39:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"C":t?"OC":"";break;case 38:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"A":t?"OA":"";break;case 40:if(e.metaKey)break;o.key=n?"[1;"+(n+1)+"B":t?"OB":"";break;case 45:e.shiftKey||e.ctrlKey||(o.key="[2~");break;case 46:o.key=n?"[3;"+(n+1)+"~":"[3~";break;case 36:o.key=n?"[1;"+(n+1)+"H":t?"OH":"";break;case 35:o.key=n?"[1;"+(n+1)+"F":t?"OF":"";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key="[5;"+(n+1)+"~":o.key="[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key="[6;"+(n+1)+"~":o.key="[6~";break;case 112:o.key=n?"[1;"+(n+1)+"P":"OP";break;case 113:o.key=n?"[1;"+(n+1)+"Q":"OQ";break;case 114:o.key=n?"[1;"+(n+1)+"R":"OR";break;case 115:o.key=n?"[1;"+(n+1)+"S":"OS";break;case 116:o.key=n?"[15;"+(n+1)+"~":"[15~";break;case 117:o.key=n?"[17;"+(n+1)+"~":"[17~";break;case 118:o.key=n?"[18;"+(n+1)+"~":"[18~";break;case 119:o.key=n?"[19;"+(n+1)+"~":"[19~";break;case 120:o.key=n?"[20;"+(n+1)+"~":"[20~";break;case 121:o.key=n?"[21;"+(n+1)+"~":"[21~";break;case 122:o.key=n?"[23;"+(n+1)+"~":"[23~";break;case 123:o.key=n?"[24;"+(n+1)+"~":"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(s&&!r||!e.altKey||e.metaKey)if(!s||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey){if(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length)o.key=e.key;else if(e.key&&e.ctrlKey&&e.shiftKey)switch(e.code){case"Minus":o.key="";break;case"Digit2":o.key="\0";break;case"Digit6":o.key=""}}else 65===e.keyCode&&(o.type=1);else{const t=i[e.keyCode],s=t?.[e.shiftKey?1:0];if(s)o.key=""+s;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=""+i}else if(32===e.keyCode)o.key=""+(e.ctrlKey?"\0":" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=""+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key="\0":e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key="":"/"===e.key?o.key="":219===e.keyCode?o.key="":220===e.keyCode?o.key="":221===e.keyCode&&(o.key="")}return o};const i={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:["'",'"']}},7241(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.KittyKeyboard=void 0,t.KittyKeyboard=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440},this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24},this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"},this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(e){if(e.code.startsWith("Numpad")){const t=e.code.slice(6);if(t>="0"&&t<="9")return 57399+parseInt(t,10);switch(t){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(e){switch(e.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(e){let t=0;return e.shiftKey&&(t|=1),e.altKey&&(t|=2),e.ctrlKey&&(t|=4),e.metaKey&&(t|=8),t>0?t+1:0}_getKeyCode(e,t){const i=this._getNumpadKeyCode(e);if(void 0!==i)return i;const s=this._getModifierKeyCode(e);if(void 0!==s)return s;const r=this._functionalKeyCodes[e.key];if(void 0!==r)return r;if((e.shiftKey||t&&e.altKey)&&e.code){if(e.code.startsWith("Digit")&&6===e.code.length){const t=e.code.charAt(5);if(t>="0"&&t<="9")return t.charCodeAt(0)}if(e.code.startsWith("Key")&&4===e.code.length)return e.code.charAt(3).toLowerCase().charCodeAt(0)}if(1===e.key.length){const t=e.key.codePointAt(0);return t>=65&&t<=90?t+32:t}}_isModifierKey(e){return"Shift"===e.key||"Control"===e.key||"Alt"===e.key||"Meta"===e.key}_isLockKey(e){return"CapsLock"===e.key||"NumLock"===e.key||"ScrollLock"===e.key}_buildCsiLetterSequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"["+e}_buildSs3Sequence(e,t,i,s){const r=s&&1!==i;if(t>0||r){let s="[1;"+(t>0?t:"1");return r&&(s+=":"+i),s+=e,s}return"O"+e}_buildCsiTildeSequence(e,t,i,s){const r=s&&1!==i;let o="["+e;return(t>0||r)&&(o+=";"+(t>0?t:"1"),r&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(e,t,i,s,r,o,n){const a=!!(2&r);let h,l="["+t;4&r&&e.shiftKey&&1===e.key.length&&!o&&!n&&(h=e.key.codePointAt(0),l+=":"+h);const c=16&r&&3!==s&&1===e.key.length&&!o&&!n&&!e.ctrlKey?e.key.codePointAt(0):void 0,d=a&&1!==s&&(3===s||void 0===c);return(i>0||d||void 0!==c)&&(l+=";",i>0?l+=i:d&&(l+="1"),d&&(l+=":"+s)),void 0!==c&&(l+=";"+c),l+="u",l}evaluate(e,t,i=1,s=!1){const r={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(e),n=this._isModifierKey(e),a=!!(2&t);if(!a&&3===i)return r;if(n&&!(8&t))return r;if(this._isLockKey(e)&&!(8&t))return r;const h=this._csiLetterKeys[e.key];if(h)return r.key=this._buildCsiLetterSequence(h,o,i,a),r.cancel=!0,r;const l=this._ss3FunctionKeys[e.key];if(l)return r.key=this._buildSs3Sequence(l,o,i,a),r.cancel=!0,r;const c=this._csiTildeKeys[e.key];if(void 0!==c)return r.key=this._buildCsiTildeSequence(c,o,i,a),r.cancel=!0,r;const d=this._getKeyCode(e,s);if(void 0===d)return r;const _=13===d||9===d||127===d;if(_&&3===i&&!(8&t))return r;const u=void 0!==this._functionalKeyCodes[e.key]||void 0!==this._getNumpadKeyCode(e);if(8&t||a&&3===i||(1&t||a)&&(u&&!_||o>0&&1!==e.key.length||o-1>1))r.key=this._buildCsiUSequence(e,d,o,i,t,u,n),r.cancel=!0;else{const t=13===d?"\r":9===d?"\t":127===d?"":void 0;t?r.key=t:1!==e.key.length||e.ctrlKey||e.altKey||e.metaKey||(r.key=e.key)}return r}static shouldUseProtocol(e){return e>0}}},726(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=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 o=r;o=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n);continue}65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=this.interim[++n])&&n<4;)r<<=6,r|=63&o;const a=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=a-n;for(;l=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===a?r<128?l--:t[h++]=r:3===a?r<2048||r>=55296&&r<=57343||65279===r||(t[h++]=r):r<65536||r>1114111||(t[h++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(a=(31&s)<<6|63&r,a<128){d--;continue}t[h++]=a}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(a=(15&s)<<12|(63&r)<<6|63&o,a<2048||a>=55296&&a<=57343||65279===a)continue;t[h++]=a}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,h;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,h;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,h;if(n=e[d++],128!=(192&n)){d--;continue}if(a=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,a<65536||a>1114111)continue;t[h++]=a}}return h}}},7428(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(6415),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]],o=[[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 n;t.UnicodeV6=class{constructor(){if(this.version="6",!n){n=new Uint8Array(65536),n.fill(1),n[0]=0,n.fill(0,1,32),n.fill(0,127,160),n.fill(2,4352,4448),n[9001]=2,n[9002]=2,n.fill(2,11904,42192),n[12351]=1,n.fill(2,44032,55204),n.fill(2,63744,64256),n.fill(2,65040,65050),n.fill(2,65072,65136),n.fill(2,65280,65377),n.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)}}},9249(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Win32InputMode=void 0,t.Win32InputMode=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226},this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40},this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]),this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(e){const t=this._codeToVk[e.code];return void 0!==t?t:e.keyCode||0}_getScanCode(e){return this._codeToScancode[e.code]||0}_getUnicodeChar(e){if(e.ctrlKey&&!e.altKey&&!e.metaKey){if("Enter"===e.key)return 10;if("Backspace"===e.key)return 127}const t=this._keyToControlChar[e.key];if(void 0!==t)return t;if(1===e.key.length){const t=e.key.codePointAt(0)||0;if(e.ctrlKey&&!e.altKey&&!e.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(e){let t=0;return e.shiftKey&&(t|=16),e.ctrlKey&&("ControlRight"===e.code?t|=4:t|=8),e.altKey&&("AltRight"===e.code?t|=1:t|=2),this._enhancedKeyCodes.has(e.code)&&(t|=256),t}evaluateKeyboardEvent(e,t){return{type:0,cancel:!0,key:`[${this._getVirtualKeyCode(e)};${this._getScanCode(e)};${this._getUnicodeChar(e)};${t?1:0};${this._getControlKeyState(e)};1_`}}}},3562(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(3132),r=i(4812),o=i(8636);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._innerWriteTimer=this._register(new s.TimeoutTimer),this._onWriteParsed=this._register(new o.Emitter),this.onWriteParsed=this._onWriteParsed.event,this._register((0,r.toDisposable)(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed)return;if(this._isSyncWriting)return;let e;this._isSyncWriting=!0;let t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);const i=this._callbacks.shift();i&&i()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;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._store.isDisposed){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();this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;const i=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>{this._store.isDisposed||(performance.now()-i>=12?this._scheduleInnerWrite(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,performance.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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},8693(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(t.startsWith("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(t.startsWith("#")&&(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,o]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(o,t)}`};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}}},2607(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ApcHandler=t.ApcParser=void 0;const s=i(726),r=i(4220),o=[];t.ApcParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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].end(!1);this._stack.paused=!1,this._active=o,this._ident=0}start(e){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].start();else this._handlerFb(this._ident,"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._ident,"PUT",(0,s.utf32ToString)(e,t,i))}end(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].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._ident,"END",e);this._active=o,this._ident=0}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.ApcHandler=n,n._payloadLimit=1e7},9823(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(726),r=i(7262),o=i(4220),n=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=n,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}registerHandler(e,t){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=n,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||n,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=n,this._ident=0}};const a=new r.Params;a.addParam(0);class h{constructor(e){this._handler=e,this._data=new o.LimitedStringBuilder(h._payloadLimit),this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString(),this._params),t instanceof Promise))return t.then(e=>(this._params=a,this._data.reset(),this._hitLimit=!1,e));return this._params=a,this._data.reset(),this._hitLimit=!1,t}}t.DcsHandler=h,h._payloadLimit=1e7},6717(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(4812),r=i(7262),o=i(1346),n=i(9823),a=i(2607);class h{constructor(e){this.table=new Uint16Array(e)}setDefault(e,t){this.table.fill(e<<8|t)}add(e,t,i,s){this.table[t<<8|e]=i<<8|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 o=i(0,17);e.setDefault(1,0),e.addMany(s,0,2,0);for(const t of o)e.addMany([24,26,153,154],t,3,0),e.addMany(i(128,144),t,3,0),e.addMany(i(144,152),t,3,0),e.add(156,t,0,0),e.add(27,t,11,1),e.add(157,t,4,8),e.addMany([152,158],t,0,7),e.add(159,t,11,14),e.add(155,t,11,3),e.add(144,t,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],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(95,1,11,14),e.addMany(r,14,0,14),e.add(127,14,0,14),e.addMany(i(32,48),14,9,15),e.addMany(i(48,127),14,15,16),e.addMany(i(48,127),15,15,16),e.addMany(r,15,0,15),e.addMany(i(32,48),15,9,15),e.add(127,15,0,15),e.addMany(s,16,16,16),e.addMany(r,16,0,16),e.addMany(i(8,14),16,16,16),e.add(127,16,0,16),e.addMany([27,156,24,26],16,17,0),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(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(r,10,0,10),e.add(127,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(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(l,0,2,0),e.add(l,8,5,8),e.add(l,6,0,6),e.add(l,11,0,11),e.add(l,13,13,13),e.add(l,16,16,16),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._executeHandlersArr=new Array(24).fill(void 0),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._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new o.OscParser),this._dcsParser=this._register(new n.DcsParser),this._apcParser=this._register(new a.ApcParser),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>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]);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){const i=e.charCodeAt(0);this._executeHandlers[i]=t,i<24&&(this._executeHandlersArr[i]=t)}clearExecuteHandler(e){const t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),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,o,n=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,n=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 r=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](this._params),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 4:if(!1===i&&r>-1)for(;r>=0&&(o=t[r](),!0!==o);r--)if(o instanceof Promise)return this._parseStack.handlerPos=r,o;this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],o=this._dcsParser.unhook(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],o=this._oscParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],o=this._apcParser.end(24!==s&&26!==s,i),o)return o;27===s&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0}this._parseStack.state=0,n=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=255&this._parseStack.transition}for(let i=n;i=60&&n<=63&&(this._collect=n,s++);let a=!1;for(;s=48&&n<=57)this._params.addDigit(n-48);else if(59===n)this._params.addParam(0);else{if(58!==n){if(n>=64&&n<=126){const e=this._csiHandlers[this._collect<<8|n];let t=e?e.length-1:-1;for(;t>=0&&(o=e[t](this._params),!0!==o);t--)if(o instanceof Promise)return r=1792,this._preserveStack(3,e,t,r,s),o;t<0&&this._csiHandlerFb(this._collect<<8|n,this._params),this.precedingJoinState=0,i=s,this.currentState=0,a=!0;break}break}this._params.addSubParam(-1)}a||(i=s-1,this.currentState=4);continue}switch(r=this._transitions.table[this.currentState<<8|(s>8){case 2:let n=i;const a=t-4;for(;n=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l)&&e[++n]>=32&&(e[n]<=126||e[n]>=l););if(n>=a)for(;n=32&&(e[n]<=126||e[n]>=l);)n++;this._printHandler(e,i,n),i=n-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const h=this._csiHandlers[this._collect<<8|s];let c=h?h.length-1:-1;for(;c>=0&&(o=h[c](this._params),!0!==o);c--)if(o instanceof Promise)return this._preserveStack(3,h,c,r,i),o;c<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do{switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}}while(++i47&&s<60);i--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:const d=this._escHandlers[this._collect<<8|s];let _=d?d.length-1:-1;for(;_>=0&&(o=d[_](),!0!==o);_--)if(o instanceof Promise)return this._preserveStack(4,d,_,r,i),o;_<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let r=i+1;;++r)if(r>=t||24===(s=e[r])||26===s||27===s||s>127&&s=t||(s=e[r])<32||s>127&&s=32&&e[s]<127||e[s]>=8&&e[s]<14||e[s]>=l))){this._apcParser.put(e,i,s),i=s-1;break}break;case 17:if(o=this._apcParser.end(24!==s&&26!==s),o)return this._preserveStack(7,[],0,r,i),o;27===s&&(r|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0}this.currentState=255&r}}}t.EscapeSequenceParser=c},1346(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(726),r=i(4220),o=[];t.OscParser=class{constructor(){this._state=0,this._active=o,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){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=o}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=o,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||o,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,s.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=o,this._id=-1,this._state=0}}};class n{constructor(e){this._handler=e,this._data=new r.LimitedStringBuilder(n._payloadLimit),this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(e,t,i){this._hitLimit||this._data.append((0,s.utf32ToString)(e,t,i))&&(this._hitLimit=!0)}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data.toString()),t instanceof Promise))return t.then(e=>(this._data.reset(),this._hitLimit=!1,e));return this._data.reset(),this._hitLimit=!1,t}}t.OscHandler=n,n._payloadLimit=1e7},7262(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;class i{static fromArray(e){const t=new i;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 i(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}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>2147483647?2147483647: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 less than -1 are not allowed");this._subParams[this._subParamsLength++]=e>2147483647?2147483647: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 i=this._digitIsSub?this._subParams:this.params,s=i[t-1];i[t-1]=~s?Math.min(10*s+e,2147483647):e}}t.Params=i},3027(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i=this._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)}}},5101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(3235),r=i(4812),o=i(8636);class n extends r.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this._register(new o.Emitter),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._register(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=n},6097(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)}registerApcHandler(e,t){return this._core.registerApcHandler(e,t)}}},4335(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}}},9640(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=void 0;const o=i(4812),n=i(4097),a=i(6501),h=i(8636);let l=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e,t){super(),this.isUserScrolling=!1,this._onResize=this._register(new h.Emitter),this.onResize=this._onResize.event,this._onScroll=this._register(new h.Emitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new n.BufferSet(e,this,t)),this._register(this.buffers.onBufferActivate(e=>{this._onScroll.fire(e.activeBuffer.ydisp)}))}resize(e,t){const i=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:i,rowsChanged:s})}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,o=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;o===i.lines.length-1?e?i.lines.recycle().copyFrom(s,!0):i.lines.push(s.clone(!0)):i.lines.splice(o+1,0,s.clone(!0)),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=o-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(o,s.clone(!0))}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t){const i=this.buffer;if(e<0){if(0===i.ydisp)return;this.isUserScrolling=!0}else e+i.ydisp>=i.ybase&&(this.isUserScrolling=!1);const s=i.ydisp;i.ydisp=Math.max(Math.min(i.ydisp+e,i.ybase),0),s!==i.ydisp&&(t||this._onScroll.fire(i.ydisp))}};t.BufferService=l,t.BufferService=l=s([r(0,a.IOptionsService),r(1,a.ILogService)],l)},5746(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}get charsets(){return 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)}}},4071(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const o=i(4812),n=i(6501),a=i(8636),h=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0});let c=class extends o.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorHidden=!1,this._onData=this._register(new a.Emitter),this.onData=this._onData.event,this._onUserInput=this._register(new a.Emitter),this.onUserInput=this._onUserInput.event,this._onBinary=this._register(new a.Emitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this._register(new a.Emitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.isCursorInitialized=i.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}reset(){this.modes=structuredClone(h),this.decPrivateModes=structuredClone(l),this.kittyKeyboard={flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}}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}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(e=>e.charCodeAt(0))),this._onBinary.fire(e))}};t.CoreService=c,t.CoreService=c=s([r(0,n.IBufferService),r(1,n.ILogService),r(2,n.IOptionsService)],c)},4720(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationLineCache=t.DecorationService=void 0;const o=i(3132),n=i(4103),a=i(4812),h=i(6501),l=i(3087),c=i(8636);let d=0,_=0,u=class extends a.Disposable{get decorations(){return this._decorations.values()}constructor(e,t){super(),this._logService=e,this._bufferService=t,this._lineCache=this._register(new f),this._onDecorationRegistered=this._register(new c.Emitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this._register(new c.Emitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this._decorations=new l.SortedList(e=>e?.marker.line,this._logService),this._register((0,a.toDisposable)(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}registerDecoration(e){if(e.marker.isDisposed)return;const t=new p(e);if(t){const e=t.marker.onDispose(()=>t.dispose()),i=t.onDispose(()=>{i.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),e.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,i){const s=this._lineCache.getDecorationsOnLine(t);if(s)for(const t of s)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&(yield t)}forEachDecorationAtCell(e,t,i,s){const r=this._lineCache.getDecorationsOnLine(t);if(r)for(const t of r)d=t.options.x??0,_=d+(t.options.width??1),e>=d&&e<_&&(!i||(t.options.layer??"bottom")===i)&&s(t)}};t.DecorationService=u,t.DecorationService=u=s([r(0,h.ILogService),r(1,h.IBufferService)],u);class f extends a.Disposable{constructor(){super(...arguments),this._decorationsByLine=new Map,this._decorations=new Set,this._bufferLineListeners=this._register(new a.MutableDisposable),this._lineIndexSyncTimer=this._register(new o.MicrotaskTimer),this._lineIndexSyncCallbacks=[]}clear(){this._lineIndexSyncCallbacks.length=0,this._lineIndexSyncTimer.cancel(),this._decorationsByLine.clear(),this._decorations.clear()}add(e){this._decorations.add(e),this._addToLineBuckets(e)}remove(e){this._decorations.delete(e),this._removeFromLineBuckets(e)}getDecorationsOnLine(e){return this._decorationsByLine.get(e)}attachToBufferLines(e){const t=new a.DisposableStore;this._bufferLineListeners.value=t,t.add(e.onTrim(e=>this._handleBufferLinesTrim(e))),t.add(e.onInsert(e=>this._handleBufferLinesInsert(e))),t.add(e.onDelete(e=>this._handleBufferLinesDelete(e)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){const t=e.marker.line;if(t<0)return;e._indexedStartLine=t;const i=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{const e=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(const t of e)t()})}_handleBufferLinesTrim(e){if(e<=0||!this._decorationsByLine.size)return;const t=new Map;for(const[i,s]of this._decorationsByLine){const r=i-e;r<0||this._mergeLineBucket(t,r,s)}this._decorationsByLine.clear();for(const[e,i]of t)this._decorationsByLine.set(e,i);for(const t of this._decorations)t.marker.isDisposed||(t._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,i){const s=e.get(t);if(s)for(let e=0,t=i.length;et&&(s.push(e),this._removeFromLineBuckets(e))}const r=new Map;for(const[e,s]of this._decorationsByLine){const o=e>=t?e+i:e;this._mergeLineBucket(r,o,s)}this._decorationsByLine.clear();for(const[e,t]of r)this._decorationsByLine.set(e,t);for(const e of this._decorations)e.marker.isDisposed||e._indexedStartLine>=t&&(e._indexedStartLine=e.marker.line);for(const e of s)this._addToLineBuckets(e)}_applyBufferLinesDelete(e){const t=e.index+e.amount,i=new Map;for(const[s,r]of this._decorationsByLine){if(s>=e.index&&s=t?s-e.amount:s;this._mergeLineBucket(i,o,r)}this._decorationsByLine.clear();for(const[e,t]of i)this._decorationsByLine.set(e,t);const s=[];for(const i of this._decorations){if(i.marker.isDisposed)continue;const r=i._indexedStartLine,o=this._getDecorationHeight(i);r>=t?i._indexedStartLine=i.marker.line:rt&&s.push(i)}for(const e of s)this._reindexDecoration(e)}}t.DecorationLineCache=f;class p extends a.DisposableStore{get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=n.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=n.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.add(new c.Emitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.add(new c.Emitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},6025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(6501),r=i(6201);class o{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=o,t.InstantiationService=class{constructor(){this._services=new o,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._id}.`);s.push(i)}const o=i.length>0?i[0].index:t.length;if(t.length!==o)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${o+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7276(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.LogService=void 0;const o=i(4812),n=i(6501),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t!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 n(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 a=String.fromCharCode,h={DEFAULT:e=>{const t=[n(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${a(t[0])}${a(t[1])}${a(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${n(e,!0)};${e.x};${e.y}${t}`}};class l extends s.Disposable{constructor(){super(),this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._onProtocolChange=this._register(new r.Emitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(o))this.addProtocol(e,o[e]);for(const e of Object.keys(h))this.addEncoding(e,h[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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return!this._customWheelEventHandler||!1!==this._customWheelEventHandler(e)}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return"DEFAULT"===this._activeEncoding}get isPixelEncoding(){return"SGR_PIXELS"===this._activeEncoding}}t.MouseStateService=l},56(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(4812),r=i(701),o=i(8636);t.DEFAULT_OPTIONS={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:r.isMac,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}};const n=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends s.Disposable{constructor(e){super(),this._onOptionChange=this._register(new o.Emitter),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,s.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=n.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"blinkIntervalDuration":if((i=Math.floor(i))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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},8811(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const o=i(6501);let n=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 o=t.addMarker(t.ybase+t.y),n={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(n,o)),this._entriesWithId.set(n.key,n),this._dataByLinkId.set(n.id,n),n.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=n,t.OscLinkService=n=s([r(0,o.IBufferService)],n)},6201(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.serviceRegistry=void 0,t.getServiceDependencies=function(e){return e.di$dependencies||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const i=function(e,t,s){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,i){t.di$target===t?t.di$dependencies.push({id:e,index:i}):(t.di$dependencies=[{id:e,index:i}],t.di$target=t)}(i,e,s)};return i._id=e,t.serviceRegistry.set(e,i),i},t.serviceRegistry=new Map},6501(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.IMouseStateService=t.IBufferService=void 0;const s=i(6201);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.IMouseStateService=(0,s.createDecorator)("MouseStateService"),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")},6415(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8636);class r{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.Emitter,this.onChange=this._onChange.event}static extractShouldJoin(e){return!!(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)}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,this._active||(this.activeVersion=e.version)}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let o=0;o=s)return t+this.wcwidth(n);const i=e.charCodeAt(o);56320<=i&&i<=57343?n=1024*(n-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(n,i);let h=r.extractWidth(a);r.extractShouldJoin(a)&&(h-=r.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=r}},t={};return function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}(6081)})()); //# sourceMappingURL=xterm.js.map \ No newline at end of file diff --git a/lib/xterm.js.map b/lib/xterm.js.map -index ba88618b821ff21e51e8c58a63813d82b939fc77..be12122fa3471670a18034cbc0c935fb1c0462a1 100644 +index 0b1e449edf51c1629cfab178ca10c7b0cc405feb..5b2f716cc8f4c3220deb87893786433d99d1304d 100644 --- a/lib/xterm.js.map +++ b/lib/xterm.js.map @@ -1 +1 @@ --{"version":3,"file":"xterm.js","mappings":"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AAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,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","sources":["webpack://@xterm/xterm/webpack/universalModuleDefinition","webpack://@xterm/xterm/./src/browser/AccessibilityManager.ts","webpack://@xterm/xterm/./src/browser/Clipboard.ts","webpack://@xterm/xterm/./src/browser/ColorContrastCache.ts","webpack://@xterm/xterm/./src/browser/CoreBrowserTerminal.ts","webpack://@xterm/xterm/./src/browser/Dom.ts","webpack://@xterm/xterm/./src/browser/Linkifier.ts","webpack://@xterm/xterm/./src/browser/LocalizableStrings.ts","webpack://@xterm/xterm/./src/browser/OscLinkProvider.ts","webpack://@xterm/xterm/./src/browser/RenderDebouncer.ts","webpack://@xterm/xterm/./src/browser/TimeBasedDebouncer.ts","webpack://@xterm/xterm/./src/browser/Types.ts","webpack://@xterm/xterm/./src/browser/Viewport.ts","webpack://@xterm/xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://@xterm/xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://@xterm/xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://@xterm/xterm/./src/browser/input/CompositionHelper.ts","webpack://@xterm/xterm/./src/browser/input/Mouse.ts","webpack://@xterm/xterm/./src/browser/input/MoveToCell.ts","webpack://@xterm/xterm/./src/browser/public/Terminal.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/Constants.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/SelectionRenderModel.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://@xterm/xterm/./src/browser/scrollable/abstractScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/fastDomNode.ts","webpack://@xterm/xterm/./src/browser/scrollable/globalPointerMoveMonitor.ts","webpack://@xterm/xterm/./src/browser/scrollable/horizontalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/mouseEvent.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollable.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollableElement.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarArrow.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarState.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarVisibilityController.ts","webpack://@xterm/xterm/./src/browser/scrollable/touch.ts","webpack://@xterm/xterm/./src/browser/scrollable/verticalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/widget.ts","webpack://@xterm/xterm/./src/browser/selection/SelectionModel.ts","webpack://@xterm/xterm/./src/browser/services/CharSizeService.ts","webpack://@xterm/xterm/./src/browser/services/CharacterJoinerService.ts","webpack://@xterm/xterm/./src/browser/services/CoreBrowserService.ts","webpack://@xterm/xterm/./src/browser/services/KeyboardService.ts","webpack://@xterm/xterm/./src/browser/services/LinkProviderService.ts","webpack://@xterm/xterm/./src/browser/services/MouseCoordsService.ts","webpack://@xterm/xterm/./src/browser/services/MouseService.ts","webpack://@xterm/xterm/./src/browser/services/RenderService.ts","webpack://@xterm/xterm/./src/browser/services/SelectionService.ts","webpack://@xterm/xterm/./src/browser/services/Services.ts","webpack://@xterm/xterm/./src/browser/services/ThemeService.ts","webpack://@xterm/xterm/./src/common/Async.ts","webpack://@xterm/xterm/./src/common/CircularList.ts","webpack://@xterm/xterm/./src/common/Color.ts","webpack://@xterm/xterm/./src/common/CoreTerminal.ts","webpack://@xterm/xterm/./src/common/Event.ts","webpack://@xterm/xterm/./src/common/InputHandler.ts","webpack://@xterm/xterm/./src/common/Lifecycle.ts","webpack://@xterm/xterm/./src/common/MultiKeyMap.ts","webpack://@xterm/xterm/./src/common/Platform.ts","webpack://@xterm/xterm/./src/common/SortedList.ts","webpack://@xterm/xterm/./src/common/StringBuilder.ts","webpack://@xterm/xterm/./src/common/TaskQueue.ts","webpack://@xterm/xterm/./src/common/Version.ts","webpack://@xterm/xterm/./src/common/WindowsMode.ts","webpack://@xterm/xterm/./src/common/buffer/AttributeData.ts","webpack://@xterm/xterm/./src/common/buffer/Buffer.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLine.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLineStringCache.ts","webpack://@xterm/xterm/./src/common/buffer/BufferRange.ts","webpack://@xterm/xterm/./src/common/buffer/BufferReflow.ts","webpack://@xterm/xterm/./src/common/buffer/BufferSet.ts","webpack://@xterm/xterm/./src/common/buffer/CellData.ts","webpack://@xterm/xterm/./src/common/buffer/Constants.ts","webpack://@xterm/xterm/./src/common/buffer/Marker.ts","webpack://@xterm/xterm/./src/common/data/Charsets.ts","webpack://@xterm/xterm/./src/common/input/Keyboard.ts","webpack://@xterm/xterm/./src/common/input/KittyKeyboard.ts","webpack://@xterm/xterm/./src/common/input/TextDecoder.ts","webpack://@xterm/xterm/./src/common/input/UnicodeV6.ts","webpack://@xterm/xterm/./src/common/input/Win32InputMode.ts","webpack://@xterm/xterm/./src/common/input/WriteBuffer.ts","webpack://@xterm/xterm/./src/common/input/XParseColor.ts","webpack://@xterm/xterm/./src/common/parser/ApcParser.ts","webpack://@xterm/xterm/./src/common/parser/DcsParser.ts","webpack://@xterm/xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://@xterm/xterm/./src/common/parser/OscParser.ts","webpack://@xterm/xterm/./src/common/parser/Params.ts","webpack://@xterm/xterm/./src/common/public/AddonManager.ts","webpack://@xterm/xterm/./src/common/public/BufferApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferLineApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferNamespaceApi.ts","webpack://@xterm/xterm/./src/common/public/ParserApi.ts","webpack://@xterm/xterm/./src/common/public/UnicodeApi.ts","webpack://@xterm/xterm/./src/common/services/BufferService.ts","webpack://@xterm/xterm/./src/common/services/CharsetService.ts","webpack://@xterm/xterm/./src/common/services/CoreService.ts","webpack://@xterm/xterm/./src/common/services/DecorationService.ts","webpack://@xterm/xterm/./src/common/services/InstantiationService.ts","webpack://@xterm/xterm/./src/common/services/LogService.ts","webpack://@xterm/xterm/./src/common/services/MouseStateService.ts","webpack://@xterm/xterm/./src/common/services/OptionsService.ts","webpack://@xterm/xterm/./src/common/services/OscLinkService.ts","webpack://@xterm/xterm/./src/common/services/ServiceRegistry.ts","webpack://@xterm/xterm/./src/common/services/Services.ts","webpack://@xterm/xterm/./src/common/services/UnicodeService.ts","webpack://@xterm/xterm/webpack/bootstrap","webpack://@xterm/xterm/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (␛).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long\n // compositions\n this._compositionView.textContent = `\\u200E${ev.data}\\u200E`;\n this.updateCompositionElements();\n setTimeout(() => {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max( this._compositionPosition.start, end);\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n const currentCompositionSuffix = this._compositionSuffix;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the start position of the new composition to get the string\n // if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, this._compositionPosition.start);\n } else {\n // Keep support for non-composition characters typed immediately after composition end\n // while avoiding re-sending the trailing text that was already present\n // before composition started.\n const value = this._textarea.value;\n const valueEnd = currentCompositionSuffix.length > 0 && value.endsWith(currentCompositionSuffix)\n ? value.length - currentCompositionSuffix.length\n : value.length;\n input = value.substring(currentCompositionPosition.start, Math.max(currentCompositionPosition.start, valueEnd));\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n this._compositionView.style.direction = 'rtl';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n","import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const ctx: IMouseBindContext = { target, focus, requestedEvents };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n // Ensure document-level listeners are removed on dispose\n register(toDisposable(() => {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }));\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element, document } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed) {\n return;\n }\n switch (this._listeners.length) {\n case 0: return;\n case 1: {\n const { fn, thisArgs } = this._listeners[0];\n fn.call(thisArgs, event);\n return;\n }\n default: {\n // Snapshot listeners to allow modifications during iteration (2+ listeners)\n const listeners = this._listeners.slice();\n for (const { fn, thisArgs } of listeners) {\n fn.call(thisArgs, event);\n }\n }\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n²) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.287';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { BufferLineStringCache } from './BufferLineStringCache';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n private readonly _stringCache: BufferLineStringCache;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n this._stringCache = this._register(new BufferLineStringCache());\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._stringCache, this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this._stringCache.clear();\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n this._stringCache.clear();\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { StringBuilder } from '../StringBuilder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $translateToStringBuilder = new StringBuilder();\n\nexport interface IBufferLineStringCacheEntry {\n value: string | undefined;\n isTrimmed: boolean;\n generation: number;\n}\n\nexport interface IBufferLineStringCache {\n generation: number;\n allocateEntry(): IBufferLineStringCacheEntry;\n touch?(): void;\n}\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n protected _stringCacheEntryRef: WeakRef | undefined;\n public length: number;\n\n constructor(\n protected readonly _stringCache: IBufferLineStringCache,\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._invalidateStringCache();\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n cell.extended = DEFAULT_ATTR_DATA.extended.clone();\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._invalidateStringCache();\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._invalidateStringCache();\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = attrs.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._invalidateStringCache();\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._invalidateStringCache();\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n this._invalidateStringCache();\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._copySparseMapsFrom(line);\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(this._stringCache, 0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n newLine._copySparseMapsFrom(this);\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._invalidateStringCache();\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonicalRequest = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonicalRequest) {\n this._stringCache.touch?.();\n }\n const stringCacheEntry = isCanonicalRequest ? this._getStringCacheEntry(false) : undefined;\n if (isCanonicalRequest && stringCacheEntry?.value !== undefined) {\n if (trimRight) {\n return stringCacheEntry.isTrimmed ? stringCacheEntry.value : stringCacheEntry.value.trimEnd();\n }\n if (!stringCacheEntry.isTrimmed) {\n return stringCacheEntry.value;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n $translateToStringBuilder.reset();\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n $translateToStringBuilder.append(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = $translateToStringBuilder.toString();\n $translateToStringBuilder.reset();\n if (isCanonicalRequest) {\n const cacheEntry = this._getStringCacheEntry(true)!;\n cacheEntry.value = result;\n cacheEntry.isTrimmed = !!trimRight;\n }\n return result;\n }\n\n protected _getStringCacheEntry(createIfNeeded: boolean): IBufferLineStringCacheEntry | undefined {\n const cachedEntry = this._stringCacheEntryRef?.deref();\n if (cachedEntry) {\n if (cachedEntry.generation === this._stringCache.generation) {\n return cachedEntry;\n }\n }\n if (!createIfNeeded) {\n return undefined;\n }\n const cacheEntry = this._stringCache.allocateEntry();\n this._stringCacheEntryRef = new WeakRef(cacheEntry);\n return cacheEntry;\n }\n\n private _invalidateStringCache(): void {\n const cacheEntry = this._getStringCacheEntry(false);\n if (cacheEntry) {\n cacheEntry.value = undefined;\n cacheEntry.isTrimmed = false;\n }\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLineStringCache, IBufferLineStringCacheEntry } from './BufferLine';\nimport { disposableTimeout } from '../Async';\nimport { Disposable, MutableDisposable, toDisposable, type IDisposable } from '../Lifecycle';\n\nconst enum Constants {\n CACHE_TTL_MS = 15000\n}\n\nexport class BufferLineStringCache extends Disposable implements IBufferLineStringCache {\n public generation: number = 0;\n public readonly entries: Set = new Set();\n private readonly _clearTimeout = this._register(new MutableDisposable());\n private _lastAccessTimestamp: number = 0;\n\n constructor() {\n super();\n this._register(toDisposable(() => this.entries.clear()));\n }\n\n public touch(): void {\n this._scheduleClear();\n }\n\n public allocateEntry(): IBufferLineStringCacheEntry {\n const entry: IBufferLineStringCacheEntry = {\n value: undefined,\n isTrimmed: false,\n generation: this.generation\n };\n this.entries.add(entry);\n this._scheduleClear();\n return entry;\n }\n\n public clear(): void {\n this._clearTimeout.clear();\n this._lastAccessTimestamp = 0;\n this.generation++;\n for (const entry of this.entries) {\n entry.value = undefined;\n entry.isTrimmed = false;\n }\n this.entries.clear();\n }\n\n private _scheduleClear(): void {\n this._lastAccessTimestamp = Date.now();\n if (this._clearTimeout.value) {\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS);\n }\n\n private _scheduleClearTimeout(timeoutMs: number): void {\n this._clearTimeout.value = disposableTimeout(() => {\n const elapsed = Date.now() - this._lastAccessTimestamp;\n if (elapsed >= Constants.CACHE_TTL_MS) {\n this.clear();\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS - elapsed);\n }, timeoutMs);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '␤' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec § \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" — i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(6081);\n"],"names":["root","factory","exports","module","define","amd","a","i","globalThis","Strings","__importStar","__webpack_require__","TimeBasedDebouncer_1","Lifecycle_1","Services_1","Services_2","Dom_1","AccessibilityManager","Disposable","constructor","_terminal","instantiationService","_coreBrowserService","_renderService","super","this","_rowColumns","WeakMap","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","doc","mainDocument","_accessibilityContainer","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_liveRegion","_liveRegionDebouncer","_register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_refreshRowsDimensions","addDisposableListener","_handleSelectionChange","onDprChange","toDisposable","remove","shift","textContent","tooMuchOutput","get","keyChar","test","push","refresh","buffer","setSize","lines","toString","line","ydisp","columns","lineData","translateToString","undefined","posInSet","set","_alignRowWidth","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","selection","getSelection","isCollapsed","contains","anchorNode","clearSelection","focusNode","console","error","begin","node","offset","anchorOffset","focusOffset","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_FOLLOWING","childNodes","lastRowElement","slice","toRowColumn","rowElement","Text","parentNode","row","parseInt","isNaN","warn","column","cols","beginRowColumn","endRowColumn","select","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","Object","assign","style","width","canvas","fontSize","options","transform","getBoundingClientRect","lastColumn","targetWidth","__decorate","__param","IInstantiationService","ICoreBrowserService","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","MultiKeyMap_1","_color","TwoKeyMap","_css","setCss","bg","fg","getCss","setColor","getColor","clear","Clipboard_1","OscLinkProvider_1","Viewport_1","BufferDecorationRenderer_1","OverviewRulerRenderer_1","CompositionHelper_1","DomRenderer_1","CharSizeService_1","CharacterJoinerService_1","CoreBrowserService_1","LinkProviderService_1","MouseCoordsService_1","MouseService_1","RenderService_1","SelectionService_1","ThemeService_1","KeyboardService_1","Color_1","CoreTerminal_1","Browser","BufferLine_1","XParseColor_1","DecorationService_1","InputHandler_1","AccessibilityManager_1","Linkifier_1","Event_1","CoreBrowserTerminal","CoreTerminal","linkifier","_linkifier","onFocus","_onFocus","event","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","device","MutableDisposable","browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","_onCursorMove","Emitter","onCursorMove","_onKey","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_onDimensionsChange","_setup","_decorationService","_instantiationService","createInstance","DecorationService","setService","IDecorationService","_keyboardService","KeyboardService","IKeyboardService","_linkProviderService","LinkProviderService","ILinkProviderService","registerLinkProvider","OscLinkProvider","_inputHandler","onRequestBell","fire","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","type","_reportWindowsOptions","onColor","_handleColorEvent","EventUtils","forward","_bufferService","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","index","colorRgb","color","toColorRGB","colors","ansi","toRgbString","modifyColors","channels","toColor","narrowedAcc","restoreColor","_reportColorScheme","colorSchemeMode","rgb","relativeLuminance","background","rgba","foreground","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","_showCursor","blur","_handleTextAreaBlur","y","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","Math","min","x","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","updateCompositionElements","compositionupdate","compositionend","_inputEvent","open","parent","isConnected","_logService","debug","ownerDocument","defaultView","window","_document","documentOverride","Document","dir","toggle","allowTransparency","onSpecificOptionChange","fragment","createDocumentFragment","_viewportElement","updateCursorStyle","_helperContainer","promptLabel","isChromeOS","readOnly","disableStdin","CoreBrowserService","document","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","onRequestColorSchemeQuery","onChangeColors","colorSchemeUpdates","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","onRenderedViewportChange","_onRender","resize","_compositionView","CompositionHelper","_mouseCoordsService","MouseCoordsService","IMouseCoordsService","Linkifier","hasRenderer","setRenderer","_createRenderer","handleCursorMove","handleResize","handleBlur","handleFocus","_viewport","Viewport","onRequestScrollLines","SelectionService","ISelectionService","_mouseService","MouseService","IMouseService","amount","suppressScrollEvent","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","any","_onScroll","queueSync","BufferDecorationRenderer","handleMouseDown","mouseStateService","areMouseEventsActive","mouseEventsRequireAlt","disable","enable","screenReaderMode","showScrollbar","scrollbar","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","shouldShow","measure","bindMouse","handleTouchScroll","disposable","DomRenderer","sync","refreshRows","shouldColumnSelect","isCursorInitialized","disp","scrollPages","pageCount","scrollToTop","scrollToBottom","disableSmoothScroll","scrollToLine","scrollAmount","data","attachCustomKeyEventHandler","customKeyEventHandler","attachCustomWheelEventHandler","customWheelEventHandler","setCustomWheelEventHandler","linkProvider","registerCharacterJoiner","handler","joinerId","register","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","setSelection","getSelectionPosition","selectionStart","selectionEnd","selectAll","selectLines","shouldIgnoreComposition","isMac","macOptionIsMeta","altKey","keydown","scrollOnUserInput","result","evaluateKeyDown","scrollCount","_isThirdLevelShift","cancel","useKitty","useWin32InputMode","ctrlKey","metaKey","charCodeAt","wasModifierOnly","wasModifierKeyOnlyEvent","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","evaluateKeyUp","charCode","which","String","fromCharCode","inputType","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","useCapture","domNode","bb","win","getWindow","scrollX","scrollY","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","sort","execute","animationFrameRunner","Async_1","candidateNode","candidateEvent","view","DomListener","_node","_type","_handler","_options","dispose","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","b","animationFrameState","Map","WindowIntervalTimer","IntervalTimer","_defaultTarget","cancelAndSet","interval","currentLink","_currentLink","_element","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","onShowLinkUnderline","_onHideLinkUnderline","onHideLinkUnderline","_lastMouseEvent","_activeProviderReplies","_clearCurrentLink","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","_lastBufferCell","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","forEach","reply","linkWithState","linkProvided","linkProviders","entries","existingReply","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","has","splice","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","v","_fireUnderlineEvent","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","lower","upper","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabelInternal","tooMuchOutputInternal","CellData_1","_optionsService","_oscLinkService","_workCell","CellData","callback","linkHandler","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","_getRangeWithLineWrap","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","linkId","startY","finalStartX","endY","finalEndX","currentLine","isWrapped","previousLine","previousLineLength","_hasUrlId","previousStartX","nextLine","nextLineLength","nextEndX","confirm","newWindow","opener","location","href","IOptionsService","IOscLinkService","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","max","_runRefreshCallbacks","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","performance","now","elapsed","waitPeriodBeforeTrailingRefresh","setTimeout","DEFAULT_ANSI_COLORS","freeze","r","g","toCss","toRgba","c","scrollableElement_1","scrollable_1","coreBrowserService","_coreService","themeService","_onRequestScrollLines","_isSyncing","_isHandlingScroll","_suppressOnScrollHandler","_needsSyncOnRender","scrollable","Scrollable","forceIntegerValues","smoothScrollDuration","scheduleAtNextAnimationFrame","cb","setSmoothScrollDuration","_scrollableElement","SmoothScrollableElement","vertical","horizontal","useShadows","mouseWheelSmoothScroll","verticalHasArrows","showArrows","_getChangeOptions","onMultipleOptionChange","updateOptions","onProtocolChange","handleMouseWheel","setScrollDimensions","scrollHeight","runAndSubscribe","backgroundColor","getDomNode","_styleElement","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","join","onBufferActivate","_latestYDisp","_sync","_handleScroll","getScrollPosition","setScrollPosition","reuseAnimation","scrollTop","verticalScrollbarSize","mouseWheelScrollSensitivity","scrollSensitivity","fastScrollSensitivity","_queuedAnimationFrame","synchronizedOutput","newRow","round","diff","translationY","ICoreService","IMouseStateService","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","alt","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","ColorZoneStore_1","drawHeight","drawWidth","drawX","_width","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_refreshDrawConstants","outerWidth","floor","innerWidth","ceil","dpr","pixelsPerLine","nonFullHeight","_store","isDisposed","cssCanvasHeight","deviceCanvasHeight","_refreshDecorations","clearRect","lineWidth","_renderRulerOutline","_renderColorZone","fillStyle","overviewRulerBorder","fillRect","overviewRuler","showTopBorder","showBottomBorder","updateCanvasDimensions","updateAnchor","_isComposing","_textarea","_isSendingComposition","_compositionPosition","_compositionSuffix","_dataAlreadySent","substring","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","currentCompositionPosition","currentCompositionSuffix","input","valueEnd","endsWith","_textareaChangeTimer","oldValue","newValue","dontRecurse","fontFamily","maxWidth","overflow","direction","compositionViewBounds","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","abs","wrappedRows","verticalDirection","wrappedRowsCount","repeat","sequence","currentRow","lineWraps","startCol","endCol","currentCol","bufferStr","translateBufferLineToString","count","str","rpt","targetX","hasScrollback","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","CoreBrowserTerminal_1","AddonManager_1","BufferNamespaceApi_1","ParserApi_1","UnicodeApi_1","CONSTRUCTOR_ONLY_OPTIONS","$value","Terminal","_core","_addonManager","AddonManager","_publicOptions","getter","propName","setter","_checkReadonlyOptions","desc","defineProperty","_checkProposedApi","allowProposedApi","onBinary","onData","onWriteParsed","parser","_parser","ParserApi","unicode","UnicodeApi","_buffer","BufferNamespaceApi","modes","m","mouseTrackingMode","activeProtocol","applicationCursorKeysMode","applicationCursorKeys","applicationKeypadMode","applicationKeypad","insertMode","originMode","origin","reverseWraparoundMode","reverseWraparound","sendFocusMode","showCursor","isCursorHidden","synchronizedOutputMode","win32InputMode","wraparoundMode","wraparound","wasUserInput","_verifyIntegers","_verifyPositiveIntegers","write","writeln","loadAddon","addon","strings","values","Infinity","DomRendererRowFactory_1","WidthCache_1","Constants_1","RendererUtils_1","SelectionRenderModel_1","TextBlinkStateManager_1","nextTerminalId","_linkifier2","_terminalClass","_selectionRenderModel","createSelectionRenderModel","_lastSelectionColumnMode","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_onRequestRedraw","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_cursorBlinkStateManager","CursorBlinkStateManager","restartBlinkAnimation","_textBlinkStateManager","TextBlinkStateManager","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","styles","_terminalSelector","multiplyOpacity","blinkAnimationUnderlineId","blinkAnimationBarId","blinkAnimationBlockId","cursor","cursorAccent","cursorWidth","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","INVERTED_DEFAULT_COLOR","opaque","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","pause","renderRows","resume","handleViewportVisibilityChange","isVisible","setViewportVisible","replaceChildren","oldViewportStart","oldViewportEnd","_lastSelectionStart","_lastSelectionEnd","update","viewportCappedStartRow","viewportCappedEndRow","newViewportStart","newViewportEnd","viewportStartRow","viewportEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","finalEndCol","renderStartRow","renderEndRow","cursorViewportRow","colStart","colEnd","fill","setNeedsBlinkInViewport","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowInfo","hasBlinkingCells","createRow","isBlinkOn","_setRowBlinkState","_updateTextBlinkState","_setCellUnderline","enabled","maxY","bufferline","_isIdlePaused","isFocused","_resetIdleTimer","_clearIdleTimer","_idleTimeout","_stopBlinkingDueToIdle","Constants_2","AttributeData_1","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","blinkOn","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","skipJoinedCheckUntilX","classes","hasHover","isJoined","isValidJoinRange","lastCharX","firstSelectionState","_isCellInSelection","JoinedCellData","isInSelection","isCursorCell","isLinkHover","isBlink","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isInvisible","isDim","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","drawBoldTextInBrightColors","isStrikethrough","textDecoration","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","className","minimumContrastRatio","treatGlyphAsBackgroundColor","getCode","cache","_getContrastCache","adjustedColor","ratio","ensureContrastRatio","halfContrastCache","contrastCache","canvasFactory","WidthCacheFontVariantCanvas","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_canvasElements","_holey","font","weight","weightBold","bold","italic","cp","_measure","variant","OffscreenCanvas","throwIfFalsy","fontStyle","trim","measureText","isPowerlineGlyph","codepoint","isEmoji","glyphSizeX","deviceCellWidth","isNerdFontGlyph","isBoxOrBlockGlyph","currentOffset","SelectionRenderModel","terminal","viewportY","isCellSelected","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","duration","setIntervalDuration","blinkIntervalDuration","_clearInterval","isEnabled","needsBlinkInViewport","_updateIntervalState","_interval","wasBlinkOn","setInterval","clearInterval","dom","fastDomNode_1","globalPointerMoveMonitor_1","scrollbarArrow_1","scrollbarVisibilityController_1","widget_1","platform","AbstractScrollbar","Widget","opts","_lazyRender","lazyRender","_host","host","_scrollable","_scrollByPage","scrollByPage","_scrollbarState","scrollbarState","_visibilityController","ScrollbarVisibilityController","visibility","extraScrollbarClassName","setIsNeeded","isNeeded","_pointerMoveMonitor","GlobalPointerMoveMonitor","_shouldRender","FastDomNode","setDomNode","setPosition","_domNodePointerDown","_createArrow","arrow","ScrollbarArrow","bgDomNode","_createSlider","slider","setClassName","setTop","setLeft","setWidth","setHeight","setLayerHinting","setContain","_sliderPointerDown","_onclick","leftButton","_handleElementSize","visibleSize","setVisibleSize","render","_handleElementScrollSize","elementScrollSize","setScrollSize","_handleElementScrollPosition","elementScrollPosition","beginReveal","setShouldBeVisible","beginHide","_renderDomNode","getRectangleLargeSize","getRectangleSmallSize","_updateSlider","getSliderSize","getArrowSize","getSliderPosition","_handlePointerDown","delegatePointerDown","domTop","getClientRects","sliderStart","sliderStop","pointerPos","_sliderPointerPosition","offsetX","offsetY","domNodePosition","getDomNodePagePosition","pageX","pageY","_pointerDownRelativePosition","_setDesiredScrollPositionNow","getDesiredScrollPositionFromOffsetPaged","getDesiredScrollPositionFromOffset","Element","initialPointerPosition","initialPointerOrthogonalPosition","_sliderOrthogonalPointerPosition","initialScrollbarState","clone","toggleClassName","startMonitoring","pointerId","buttons","pointerMoveData","pointerOrthogonalPosition","pointerOrthogonalDelta","pointerDelta","getDesiredScrollPositionFromDelta","handleDragEnd","handleDragStart","_desiredScrollPosition","desiredScrollPosition","writeScrollPosition","setScrollPositionNow","updateScrollbarSize","scrollbarSize","_updateScrollbarSize","setScrollbarSize","numberAsPixels","_height","_top","_left","_bottom","_right","_className","_position","_layerHint","_contain","setBottom","bottom","setRight","shouldHaveIt","layerHint","contain","name","_hooks","DisposableStore","_pointerMoveCallback","_onStopCallback","stopMonitoring","invokeStopCallback","isMonitoring","onStopCallback","initialElement","initialButtons","pointerMoveCallback","eventSource","setPointerCapture","releasePointerCapture","abstractScrollbar_1","scrollbarState_1","HorizontalScrollbar","scrollDimensions","getScrollDimensions","scrollPosition","getCurrentScrollPosition","ScrollbarState","horizontalHasArrows","horizontalScrollbarSize","scrollWidth","scrollLeft","horizontalSliderSize","sliderSize","sliderPosition","largeSize","smallSize","handleScroll","setOppositeScrollbarSize","setVisibility","sameOriginWindowChainCache","getParentWindowIfSameOrigin","w","parentLocation","IframeUtils","_getSameOriginWindowChain","windowChainCache","WeakRef","iframeElement","frameElement","getPositionOfChildWindowRelativeToAncestorWindow","childWindow","ancestorWindow","windowChain","windowChainEl","windowInChain","deref","boundingRect","timestamp","Date","browserEvent","middleButton","rightButton","detail","shiftKey","posx","posy","body","documentElement","iframeOffsets","deltaX","deltaY","targetNode","srcElement","shouldFactorDPR","isChrome","chromeVersionMatch","navigator","userAgent","match","e1","e2","devicePixelRatio","wheelDeltaY","VERTICAL_AXIS","axis","deltaMode","DOM_DELTA_LINE","wheelDeltaX","isSafari","HORIZONTAL_AXIS","wheelDelta","ScrollState","_forceIntegerValues","_scrollStateBrand","rawScrollLeft","rawScrollTop","equals","other","withScrollDimensions","useRawScrollPositions","withScrollPosition","createScrollEvent","previous","inSmoothScrolling","widthChanged","scrollWidthChanged","scrollLeftChanged","heightChanged","scrollHeightChanged","scrollTopChanged","oldWidth","oldScrollWidth","oldScrollLeft","oldHeight","oldScrollHeight","oldScrollTop","_scrollableBrand","_smoothScrollDuration","_scheduleAtNextAnimationFrame","_state","_smoothScrolling","validateScrollPosition","newState","_setState","Boolean","acceptScrollDimensions","getFutureScrollPosition","to","setScrollPositionSmooth","validTarget","newSmoothScrolling","SmoothScrollingOperation","from","startTime","animationFrameDisposable","_performSmoothScrolling","hasPendingScrollAnimation","tick","isDone","oldState","SmoothScrollingUpdate","createEaseOutCubic","delta","completion","t","pow","_initAnimations","_scrollLeft","_initAnimation","_scrollTop","viewportSize","stop1","stop2","cut","_tick","newScrollLeft","newScrollTop","mouseEvent_1","horizontalScrollbar_1","verticalScrollbar_1","MouseWheelClassifierItem","score","MouseWheelClassifier","_capacity","_memory","_front","_rear","isPhysicalMouseWheel","remainingInfluence","iteration","influence","acceptStandardWheelEvent","pageZoomFactor","getZoomFactor","accept","previousItem","_computeScore","_isAlmostInt","absDeltaX","absDeltaY","absPreviousDeltaX","absPreviousDeltaY","minDeltaX","minDeltaY","maxDeltaX","maxDeltaY","INSTANCE","resolvedScrollable","ownsScrollable","flipAxes","consumeMouseWheelIfScrollbarIsNeeded","alwaysConsumeMouseWheel","scrollYToX","scrollPredominantAxis","listenOnDomNode","verticalSliderSize","resolveOptions","scrollbarHost","mouseWheelEvent","_handleMouseWheel","_handleDragStart","_handleDragEnd","_verticalScrollbar","VerticalScrollbar","_horizontalScrollbar","_domNode","_leftShadowDomNode","_topShadowDomNode","_topLeftShadowDomNode","_listenOnDomNode","_mouseWheelToDispose","_setListeningToMouseWheel","_onmouseover","_handleMouseOver","_onmouseleave","_handleMouseLeave","_hideTimeout","TimeoutTimer","_isDragging","_mouseIsOver","_revealOnScroll","updateClassName","newClassName","newOptions","_render","delegateScrollFromMouseWheelEvent","StandardWheelEvent","shouldListen","onMouseWheel","passive","defaultPrevented","classifier","didScroll","shiftConvert","futureScrollPosition","deltaScrollTop","desiredScrollTop","deltaScrollLeft","desiredScrollLeft","consumeMouseWheel","_reveal","renderNow","scrollState","enableTop","enableLeft","leftClassName","topClassName","topLeftClassName","_hide","_scheduleHide","_handleActivate","handleActivate","bgWidth","bgHeight","arrowSize","addStandardDisposableListener","_arrowPointerDown","_pointerdownRepeatTimer","_pointerdownScheduleRepeatTimer","oppositeScrollbarSize","scrollSize","_scrollbarSize","_oppositeScrollbarSize","_arrowSize","_visibleSize","_scrollSize","_scrollPosition","_computedAvailableSize","_computedIsNeeded","_computedSliderSize","_computedSliderRatio","_computedSliderPosition","_refreshComputedValues","iVisibleSize","iScrollSize","iScrollPosition","setArrowSize","iArrowSize","_computeValues","computedAvailableSize","computedRepresentableSize","computedIsNeeded","computedSliderSize","computedSliderRatio","computedSliderPosition","desiredSliderPosition","correctedOffset","visibleClassName","invisibleClassName","_visibility","_visibleClassName","_invisibleClassName","_isVisible","_isNeeded","_rawShouldBeVisible","_shouldBeVisible","_revealTimer","_updateShouldBeVisible","rawShouldBeVisible","_applyVisibilitySetting","shouldBeVisible","ensureVisibility","setIfNotSet","withFadeAway","DomUtils","mainWindow","tail","array","n","LinkedListNode","Undefined","prev","LinkedList","_first","_last","_insert","atTheEnd","newNode","oldLast","oldFirst","didRemove","_remove","Symbol","iterator","EventType","TAP","START","END","CONTEXT_MENU","Gesture","_dispatched","_targets","_ignoreTargets","_activeTouches","_handle","_lastSetTapCountTime","_handleTouchStart","_handleTouchEnd","_handleTouchMove","addTarget","isTouchDevice","None","_instance","ignoreTarget","maxTouchPoints","len","targetTouches","touch","identifier","id","initialTarget","initialTimeStamp","initialPageX","initialPageY","rollingTimestamps","rollingPageX","rollingPageY","evt","_newGestureEvent","_dispatchEvent","activeTouchCount","keys","changedTouches","hasOwnProperty","holdTime","_holdDelay","finalX","finalY","deltaT","dispatchTo","filter","_inertia","createEvent","initEvent","tapCount","currentTime","getTime","setTapCount","_clearTapCountTime","targets","depth","dispatchEvent","t1","vX","dirX","vY","dirY","deltaPosX","deltaPosY","stopped","_scrollFriction","translationX","_target","descriptor","fnKey","fn","memoizeKey","args","configurable","enumerable","writable","apply","hasArrows","_arrowScrollDelta","_setArrows","_arrowScroll","currentPosition","_arrowUp","_arrowDown","arrowDelta","_updateArrowSize","listener","StandardMouseEvent","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","TextMetricsMeasureStrategy","DomMeasureStrategy","BaseMeasureStategy","_result","_validateAndSet","_parentElement","_measureElement","whiteSpace","fontKerning","Number","offsetWidth","offsetHeight","metrics","fontBoundingBoxAscent","fontBoundingBoxDescent","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","ranges","lineStr","trimmedLength","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_window","_isFocused","_cachedIsFocused","_onDprChange","_onWindowChange","onWindowChange","_screenDprMonitor","ScreenDprMonitor","setWindow","hasFocus","queueMicrotask","_parentWindow","_windowResizeListener","_outerListener","_setDprAndFireIfDiffers","_currentDevicePixelRatio","_updateDpr","_setWindowResizeListener","clearListener","parentWindow","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Keyboard_1","KittyKeyboard_1","Win32InputMode_1","Platform_1","_getWin32InputMode","_win32InputMode","Win32InputMode","_getKittyKeyboard","_kittyKeyboard","KittyKeyboard","evaluateKeyboardEvent","kittyFlags","kittyKeyboard","flags","evaluate","vtExtensions","shouldUseProtocol","providerIndex","indexOf","Mouse_1","getMouseReportCoords","col","touch_1","_mouseStateService","_lastEvent","_wheelPartialScroll","_touchScrollAccumulator","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","_handleWheel","_handleMouseDrag","_altMouseCursor","AltMouseCursorController","events","_handleProtocolChange","_syncMouseModeState","_handlePassiveWheel","_handleTouchChange","_sendEvent","but","action","overrideType","allowCustomWheelEvent","_consumeWheelEvent","stripAltFromReport","_triggerMouseEvent","ctrl","shouldForceSelection","_handleTouchScrollAsWheel","_handleTouchScrollAsKeys","trunc","resetClass","logLevel","_explainEvents","_applyScrollModifier","targetWheelEventPixels","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_PAGE","_equalEvents","isPixelEncoding","restrictMouseEvent","report","encodeMouseEvent","isDefaultEncoding","triggerBinaryEvent","down","up","drag","move","pixels","ILogService","_isActive","_listeners","store","syncFromModifier","_updateClass","altHeld","RenderDebouncer_1","TaskQueue_1","_renderer","decorationService","_observerDisposable","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_pausedResizeTask","DebouncedIdleTask","_renderDebouncer","RenderDebouncer","_syncOutputHandler","SynchronizedOutputHandler","_fullRefresh","_registerIntersectionObserver","observer","IntersectionObserver","_handleIntersectionChange","threshold","_intersectionObserver","disconnect","observe","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","bufferRows","buffered","_fireOnCanvasResize","renderer","_onTimeout","_start","_end","_isBuffering","_timeout","MoveToCell_1","SelectionModel_1","BufferRange_1","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_dragScrollAmount","_enabled","_trimListener","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","rowsChanged","lineText","startRowEndCol","isLinuxMouseSelection","_refreshAnimationFrame","_refresh","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","timeStamp","_handleIncrementalClick","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","hadSelection","_fireOnSelectionChange","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","ServiceRegistry_1","createDecorator","ColorContrastCache_1","Types_1","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_OVERVIEW_RULER_BORDER","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","opacity","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","millis","Promise","resolve","timeout","timer","_token","_isDisposed","_isScheduled","_disposable","context","handle","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","$r","$g","$b","$a","toPaddedHex","s","contrastRatio","l1","l2","color_1","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","css_1","$ctx","$litmusColor","willReadFrequently","globalCompositeOperation","createLinearGradient","rgbaMatch","parseFloat","getImageData","rgb_1","relativeLuminance2","rs","gs","bs","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","InstantiationService_1","LogService_1","BufferService_1","OptionsService_1","CoreService_1","MouseStateService_1","UnicodeV6_1","UnicodeService_1","CharsetService_1","WindowsMode_1","WriteBuffer_1","OscLinkService_1","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","_onData","_onLineFeed","_onResize","_onWriteParsed","InstantiationService","OptionsService","LogService","BufferService","CoreService","MouseStateService","unicodeService","UnicodeService","UnicodeV6","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","flushSync","scroll","eraseAttr","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","registerApcHandler","windowsPty","backend","buildNumber","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_disposed","_event","thisArgs","idx","isArray","call","listeners","initial","Charsets_1","EscapeSequenceParser_1","TextDecoder_1","OscParser_1","DcsParser_1","ApcParser_1","Version_1","GLEVEL","paramToWindowOption","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_unicodeService","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_onRequestColorSchemeQuery","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","_activeBuffer","setCsiHandlerFallback","params","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","code","setOscHandlerFallback","setDcsHandlerFallback","payload","setApcHandlerFallback","setPrintHandler","print","insertChars","intermediates","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","sendXtVersion","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","kittyKeyboardSet","kittyKeyboardQuery","kittyKeyboardPush","kittyKeyboardPop","setExecuteHandler","bell","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","slowTimeout","slowPromise","_res","rej","race","then","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","TRACE","trace","split","clearRange","decode","subarray","viewportEnd","viewportStart","chWidth","charset","curAttr","bufferRow","markDirty","setCellFromCodepoint","precedingJoinState","ch","currentInfo","charProperties","extractWidth","shouldJoin","extractShouldJoin","stringFromCodePoint","addLineToLink","oldRow","oldCol","_eraseAttrData","BufferLine","copyCellsFrom","addCodepointToCell","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","ApcHandler","convertEol","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollOnEraseInDisplay","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","joinState","idata","itext","codePointAt","tlength","copyWithin","_is","XTERM_VERSION","term","termName","startsWith","setgCharset","DEFAULT_CHARSET","quirks","allowSetCursorBlink","activeEncoding","mainFlags","altFlags","activateAltBuffer","colorSchemeQuery","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","f","b2v","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","kittySgrBoldFaintControl","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","second","savedCharsets","charsets","savedGlevel","glevel","savedOriginMode","savedWraparoundMode","slots","spec","exec","isValidColorIndex","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","isProtected","block","bar","stack","altStack","mainStack","arg","_disposables","o","_value","_data","third","fourth","_targetWindow","majorVersion","isNode","process","isLegacyEdge","_getKey","logService","_insertedValues","_isFlushingInserted","_deletedIndices","_isFlushingDeleted","_flushInsertedTask","IdleTaskQueue","_flushDeletedTask","insert","_flushCleanupDeleted","enqueue","_flushInserted","sortedAddedValues","sortedAddedValuesIndex","arrayIndex","newArrayIndex","_flushCleanupInserted","_search","_flushDeleted","sortedDeletedIndices","sortedDeletedIndicesIndex","getKeyIterator","forEachByKey","mid","midKey","StringBuilder","_chunks","append","chunk","_limit","_builder","limit","TaskQueue","_tasks","_i","task","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","PriorityTaskQueue","_createDeadline","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","_urlId","_ext","val","CircularList_1","BufferLineStringCache_1","BufferReflow_1","Marker_1","MAX_BUFFER_SIZE","Buffer","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","_memoryCleanupQueue","_stringCache","BufferLineStringCache","getWhitespaceCell","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","reflowCursorLine","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","StringBuilder_1","$startIndex","$workCell","$translateToStringBuilder","fillCellData","_combined","_extendedAttrs","_invalidateStringCache","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","attrs","byteLength","uint32Cells","extKeys","copyFrom","_copySparseMapsFrom","src","applyInReverse","srcData","_copyCellMapsFrom","outColumns","isCanonicalRequest","stringCacheEntry","_getStringCacheEntry","isTrimmed","trimEnd","cacheEntry","createIfNeeded","cachedEntry","_stringCacheEntryRef","generation","allocateEntry","srcStart","_clearTimeout","_lastAccessTimestamp","_scheduleClear","_scheduleClearTimeout","timeoutMs","disposableTimeout","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","Buffer_1","BufferSet","_normalBuffer","_altBuffer","_onBufferActivate","_normal","_alt","inactiveBuffer","obj","combined","attributesEquals","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","_nextId","_onDispose","h","k","q","u","A","B","C","R","Q","K","Y","E","Z","H","_","applicationCursorMode","modifiers","keyMapping","KEYCODE_KEY_MAPPINGS","keyString","toUpperCase","toLowerCase","_functionalKeyCodes","Escape","Enter","Tab","Backspace","CapsLock","ScrollLock","NumLock","PrintScreen","Pause","ContextMenu","F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24","F25","KP_0","KP_1","KP_2","KP_3","KP_4","KP_5","KP_6","KP_7","KP_8","KP_9","KP_Decimal","KP_Divide","KP_Multiply","KP_Subtract","KP_Add","KP_Enter","KP_Equal","ShiftLeft","ShiftRight","ControlLeft","ControlRight","AltLeft","AltRight","MetaLeft","MetaRight","MediaPlayPause","MediaStop","MediaTrackNext","MediaTrackPrevious","AudioVolumeDown","AudioVolumeUp","AudioVolumeMute","_csiTildeKeys","Insert","Delete","PageUp","PageDown","F5","F6","F7","F8","F9","F10","F11","F12","_csiLetterKeys","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","End","_ss3FunctionKeys","F1","F2","F3","F4","_getNumpadKeyCode","suffix","_getModifierKeyCode","_encodeModifiers","mods","_getKeyCode","macOptionAsAlt","numpadCode","modifierCode","funcCode","digit","_isModifierKey","_isLockKey","_buildCsiLetterSequence","letter","reportEventTypes","needsEventType","seq","_buildSs3Sequence","_buildCsiTildeSequence","number","_buildCsiUSequence","isFunc","isMod","shiftedKey","textCode","csiLetter","ss3Letter","tildeCode","specialKey","legacyByte","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","wcwidth","num","ucs","bisearch","preceding","createPropertyValue","_codeToVk","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadMultiply","NumpadAdd","NumpadSeparator","NumpadSubtract","NumpadDecimal","NumpadDivide","NumpadEnter","Space","Semicolon","Equal","Comma","Minus","Period","Slash","Backquote","BracketLeft","Backslash","BracketRight","Quote","IntlBackslash","_codeToScancode","_enhancedKeyCodes","_keyToControlChar","_getVirtualKeyCode","vk","_getScanCode","_getUnicodeChar","controlChar","_getControlKeyState","isKeyDown","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","_innerWriteTimer","didProcess","_innerWrite","_scheduleInnerWrite","lastTime","continuation","catch","low","RGB_REX","base","HASH_REX","adv","bits","pad","s2","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","put","utf32ToString","success","handlerResult","LimitedStringBuilder","_payloadLimit","_hitLimit","ret","res","Params_1","unhook","hook","EMPTY_PARAMS","Params","addParam","_params","TransitionTable","Uint16Array","setDefault","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_executeHandlersArr","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_apcParser","ApcParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearApcHandler","clearErrorHandler","resetZdm","csiDone","addDigit","addSubParam","l4","collect","abort","handlersEsc","jj","_put","fromArray","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","cur","_addons","instance","loadedAddon","_wrappedAddonDispose","BufferLineApiView_1","init","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferApiView_1","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","BufferSet_1","isUserScrolling","colsChanged","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","_charsets","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","showCursorImmediately","structuredClone","SortedList_1","$xmin","$xmax","_decorations","_lineCache","DecorationLineCache","_onDecorationRegistered","_onDecorationRemoved","SortedList","attachToBufferLines","Decoration","markerDispose","getDecorationsAtCell","bucket","getDecorationsOnLine","_decorationsByLine","_bufferLineListeners","_lineIndexSyncTimer","MicrotaskTimer","_lineIndexSyncCallbacks","_addToLineBuckets","_removeFromLineBuckets","_handleBufferLinesTrim","_handleBufferLinesInsert","_handleBufferLinesDelete","_getDecorationHeight","_indexedStartLine","_reindexDecoration","_scheduleLineIndexSync","callbacks","newMap","_mergeLineBucket","_applyBufferLinesInsert","_applyBufferLinesDelete","existing","spanCrossers","deleteEnd","toReindex","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","addProtocol","addEncoding","encoding","_customWheelEventHandler","DEFAULT_OPTIONS","rescaleOverlappingGlyphs","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","every","linkData","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","extractCharKind","_activeProvider","getStringCellWidth","precedingInfo","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} +-{"version":3,"file":"xterm.js","mappings":"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Q,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MA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","sources":["webpack://@xterm/xterm/webpack/universalModuleDefinition","webpack://@xterm/xterm/./src/browser/AccessibilityManager.ts","webpack://@xterm/xterm/./src/browser/Clipboard.ts","webpack://@xterm/xterm/./src/browser/ColorContrastCache.ts","webpack://@xterm/xterm/./src/browser/CoreBrowserTerminal.ts","webpack://@xterm/xterm/./src/browser/Dom.ts","webpack://@xterm/xterm/./src/browser/Linkifier.ts","webpack://@xterm/xterm/./src/browser/LocalizableStrings.ts","webpack://@xterm/xterm/./src/browser/OscLinkProvider.ts","webpack://@xterm/xterm/./src/browser/RenderDebouncer.ts","webpack://@xterm/xterm/./src/browser/TimeBasedDebouncer.ts","webpack://@xterm/xterm/./src/browser/Types.ts","webpack://@xterm/xterm/./src/browser/Viewport.ts","webpack://@xterm/xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://@xterm/xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://@xterm/xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://@xterm/xterm/./src/browser/input/CompositionHelper.ts","webpack://@xterm/xterm/./src/browser/input/Mouse.ts","webpack://@xterm/xterm/./src/browser/input/MoveToCell.ts","webpack://@xterm/xterm/./src/browser/public/Terminal.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/Constants.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/SelectionRenderModel.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://@xterm/xterm/./src/browser/scrollable/abstractScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/fastDomNode.ts","webpack://@xterm/xterm/./src/browser/scrollable/globalPointerMoveMonitor.ts","webpack://@xterm/xterm/./src/browser/scrollable/horizontalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/mouseEvent.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollable.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollableElement.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarArrow.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarState.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarVisibilityController.ts","webpack://@xterm/xterm/./src/browser/scrollable/touch.ts","webpack://@xterm/xterm/./src/browser/scrollable/verticalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/widget.ts","webpack://@xterm/xterm/./src/browser/selection/SelectionModel.ts","webpack://@xterm/xterm/./src/browser/services/CharSizeService.ts","webpack://@xterm/xterm/./src/browser/services/CharacterJoinerService.ts","webpack://@xterm/xterm/./src/browser/services/CoreBrowserService.ts","webpack://@xterm/xterm/./src/browser/services/KeyboardService.ts","webpack://@xterm/xterm/./src/browser/services/LinkProviderService.ts","webpack://@xterm/xterm/./src/browser/services/MouseCoordsService.ts","webpack://@xterm/xterm/./src/browser/services/MouseService.ts","webpack://@xterm/xterm/./src/browser/services/RenderService.ts","webpack://@xterm/xterm/./src/browser/services/SelectionService.ts","webpack://@xterm/xterm/./src/browser/services/Services.ts","webpack://@xterm/xterm/./src/browser/services/ThemeService.ts","webpack://@xterm/xterm/./src/common/Async.ts","webpack://@xterm/xterm/./src/common/CircularList.ts","webpack://@xterm/xterm/./src/common/Color.ts","webpack://@xterm/xterm/./src/common/CoreTerminal.ts","webpack://@xterm/xterm/./src/common/Event.ts","webpack://@xterm/xterm/./src/common/InputHandler.ts","webpack://@xterm/xterm/./src/common/Lifecycle.ts","webpack://@xterm/xterm/./src/common/MultiKeyMap.ts","webpack://@xterm/xterm/./src/common/Platform.ts","webpack://@xterm/xterm/./src/common/SortedList.ts","webpack://@xterm/xterm/./src/common/StringBuilder.ts","webpack://@xterm/xterm/./src/common/TaskQueue.ts","webpack://@xterm/xterm/./src/common/Version.ts","webpack://@xterm/xterm/./src/common/WindowsMode.ts","webpack://@xterm/xterm/./src/common/buffer/AttributeData.ts","webpack://@xterm/xterm/./src/common/buffer/Buffer.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLine.ts","webpack://@xterm/xterm/./src/common/buffer/BufferRange.ts","webpack://@xterm/xterm/./src/common/buffer/BufferReflow.ts","webpack://@xterm/xterm/./src/common/buffer/BufferSet.ts","webpack://@xterm/xterm/./src/common/buffer/CellData.ts","webpack://@xterm/xterm/./src/common/buffer/Constants.ts","webpack://@xterm/xterm/./src/common/buffer/Marker.ts","webpack://@xterm/xterm/./src/common/data/Charsets.ts","webpack://@xterm/xterm/./src/common/input/Keyboard.ts","webpack://@xterm/xterm/./src/common/input/KittyKeyboard.ts","webpack://@xterm/xterm/./src/common/input/TextDecoder.ts","webpack://@xterm/xterm/./src/common/input/UnicodeV6.ts","webpack://@xterm/xterm/./src/common/input/Win32InputMode.ts","webpack://@xterm/xterm/./src/common/input/WriteBuffer.ts","webpack://@xterm/xterm/./src/common/input/XParseColor.ts","webpack://@xterm/xterm/./src/common/parser/ApcParser.ts","webpack://@xterm/xterm/./src/common/parser/DcsParser.ts","webpack://@xterm/xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://@xterm/xterm/./src/common/parser/OscParser.ts","webpack://@xterm/xterm/./src/common/parser/Params.ts","webpack://@xterm/xterm/./src/common/public/AddonManager.ts","webpack://@xterm/xterm/./src/common/public/BufferApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferLineApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferNamespaceApi.ts","webpack://@xterm/xterm/./src/common/public/ParserApi.ts","webpack://@xterm/xterm/./src/common/public/UnicodeApi.ts","webpack://@xterm/xterm/./src/common/services/BufferService.ts","webpack://@xterm/xterm/./src/common/services/CharsetService.ts","webpack://@xterm/xterm/./src/common/services/CoreService.ts","webpack://@xterm/xterm/./src/common/services/DecorationService.ts","webpack://@xterm/xterm/./src/common/services/InstantiationService.ts","webpack://@xterm/xterm/./src/common/services/LogService.ts","webpack://@xterm/xterm/./src/common/services/MouseStateService.ts","webpack://@xterm/xterm/./src/common/services/OptionsService.ts","webpack://@xterm/xterm/./src/common/services/OscLinkService.ts","webpack://@xterm/xterm/./src/common/services/ServiceRegistry.ts","webpack://@xterm/xterm/./src/common/services/Services.ts","webpack://@xterm/xterm/./src/common/services/UnicodeService.ts","webpack://@xterm/xterm/webpack/bootstrap","webpack://@xterm/xterm/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (␛).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long\n // compositions\n this._compositionView.textContent = `\\u200E${ev.data}\\u200E`;\n this.updateCompositionElements();\n setTimeout(() => {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max( this._compositionPosition.start, end);\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n const currentCompositionSuffix = this._compositionSuffix;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the start position of the new composition to get the string\n // if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, this._compositionPosition.start);\n } else {\n // Keep support for non-composition characters typed immediately after composition end\n // while avoiding re-sending the trailing text that was already present\n // before composition started.\n const value = this._textarea.value;\n const valueEnd = currentCompositionSuffix.length > 0 && value.endsWith(currentCompositionSuffix)\n ? value.length - currentCompositionSuffix.length\n : value.length;\n input = value.substring(currentCompositionPosition.start, Math.max(currentCompositionPosition.start, valueEnd));\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n this._compositionView.style.direction = 'rtl';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n","import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n readonly mouseupListener: MutableDisposable;\n readonly mousedragListener: MutableDisposable;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const mouseupListener = new MutableDisposable();\n const mousedragListener = new MutableDisposable();\n register(mouseupListener);\n register(mousedragListener);\n const ctx: IMouseBindContext = { target, focus, requestedEvents, mouseupListener, mousedragListener };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n ctx.mouseupListener.clear();\n ctx.mousedragListener.clear();\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n // Use the element's current document in case it moved to another window after open.\n const { element, document: targetDocument } = ctx.target;\n const listenerDocument = element.ownerDocument ?? targetDocument;\n if (ctx.requestedEvents.mouseup) {\n ctx.mouseupListener.value = addDisposableListener(listenerDocument, 'mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.mousedragListener.value = addDisposableListener(listenerDocument, 'mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n ctx.mouseupListener.clear();\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n ctx.mousedragListener.clear();\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // isUserScrolling tracks the normal buffer's viewport, so ED3 on the alt\n // screen must not touch it\n if (this._activeBuffer === this._bufferService.buffers.normal) {\n this._bufferService.isUserScrolling = false;\n }\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n²) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.303';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\n\ninterface IExtendedAttrsExt extends IExtendedAttrs {\n _ext: number;\n _urlId: number;\n}\n\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $extended = DEFAULT_ATTR_DATA.extended.clone() as IExtendedAttrsExt;\n\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n public length: number;\n\n /** line text cache */\n protected _cacheValid = false;\n protected _cache: string = '';\n protected _cacheTrimmed = false;\n\n constructor(\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._cacheValid = false;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n // We use $extended as blueprint and reset the internals\n // mimicking the ctor to avoid a new allocation.\n $extended._ext = 0;\n $extended._urlId = 0;\n cell.extended = $extended;\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._cacheValid = false;\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._cacheValid = false;\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n const $idx = index * Constants.CELL_INDICIES;\n this._data[$idx + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[$idx + Cell.FG] = attrs.fg;\n this._data[$idx + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._cacheValid = false;\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._cacheValid = false;\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine, blank?: boolean): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n if (blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n this._combined = {};\n this._extendedAttrs = {};\n } else {\n this._copySparseMapsFrom(line);\n }\n this._cache = '';\n this._cacheValid = false;\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(blank?: boolean): IBufferLine {\n const newLine = new BufferLine(0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n if (!blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n newLine._copySparseMapsFrom(this);\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._cacheValid = false;\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonical = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonical && this._cacheValid) {\n if (trimRight) {\n return this._cacheTrimmed ? this._cache : this._cache.trimEnd();\n }\n if (!this._cacheTrimmed) {\n return this._cache;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n const cellContents: string[] = [];\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n cellContents.push(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = cellContents.join('');\n if (isCanonical) {\n this._cache = result;\n this._cacheValid = true;\n this._cacheTrimmed = !!trimRight;\n }\n return result;\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '␤' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec § \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" — i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine, true);\n } else {\n buffer.lines.push(newLine.clone(true));\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone(true));\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone(true));\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0 || !this._decorationsByLine.size) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(6081);\n"],"names":["root","factory","exports","module","define","amd","a","i","globalThis","Strings","__importStar","__webpack_require__","TimeBasedDebouncer_1","Lifecycle_1","Services_1","Services_2","Dom_1","AccessibilityManager","Disposable","constructor","_terminal","instantiationService","_coreBrowserService","_renderService","super","this","_rowColumns","WeakMap","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","doc","mainDocument","_accessibilityContainer","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_liveRegion","_liveRegionDebouncer","_register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_refreshRowsDimensions","addDisposableListener","_handleSelectionChange","onDprChange","toDisposable","remove","shift","textContent","tooMuchOutput","get","keyChar","test","push","refresh","buffer","setSize","lines","toString","line","ydisp","columns","lineData","translateToString","undefined","posInSet","set","_alignRowWidth","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","selection","getSelection","isCollapsed","contains","anchorNode","clearSelection","focusNode","console","error","begin","node","offset","anchorOffset","focusOffset","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_FOLLOWING","childNodes","lastRowElement","slice","toRowColumn","rowElement","Text","parentNode","row","parseInt","isNaN","warn","column","cols","beginRowColumn","endRowColumn","select","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","Object","assign","style","width","canvas","fontSize","options","transform","getBoundingClientRect","lastColumn","targetWidth","__decorate","__param","IInstantiationService","ICoreBrowserService","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","MultiKeyMap_1","_color","TwoKeyMap","_css","setCss","bg","fg","getCss","setColor","getColor","clear","Clipboard_1","OscLinkProvider_1","Viewport_1","BufferDecorationRenderer_1","OverviewRulerRenderer_1","CompositionHelper_1","DomRenderer_1","CharSizeService_1","CharacterJoinerService_1","CoreBrowserService_1","LinkProviderService_1","MouseCoordsService_1","MouseService_1","RenderService_1","SelectionService_1","ThemeService_1","KeyboardService_1","Color_1","CoreTerminal_1","Browser","BufferLine_1","XParseColor_1","DecorationService_1","InputHandler_1","AccessibilityManager_1","Linkifier_1","Event_1","CoreBrowserTerminal","CoreTerminal","linkifier","_linkifier","onFocus","_onFocus","event","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","device","MutableDisposable","browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","_onCursorMove","Emitter","onCursorMove","_onKey","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_onDimensionsChange","_setup","_decorationService","_instantiationService","createInstance","DecorationService","setService","IDecorationService","_keyboardService","KeyboardService","IKeyboardService","_linkProviderService","LinkProviderService","ILinkProviderService","registerLinkProvider","OscLinkProvider","_inputHandler","onRequestBell","fire","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","type","_reportWindowsOptions","onColor","_handleColorEvent","EventUtils","forward","_bufferService","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","index","colorRgb","color","toColorRGB","colors","ansi","toRgbString","modifyColors","channels","toColor","narrowedAcc","restoreColor","_reportColorScheme","colorSchemeMode","rgb","relativeLuminance","background","rgba","foreground","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","_showCursor","blur","_handleTextAreaBlur","y","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","Math","min","x","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","updateCompositionElements","compositionupdate","compositionend","_inputEvent","open","parent","isConnected","_logService","debug","ownerDocument","defaultView","window","_document","documentOverride","Document","dir","toggle","allowTransparency","onSpecificOptionChange","fragment","createDocumentFragment","_viewportElement","updateCursorStyle","_helperContainer","promptLabel","isChromeOS","readOnly","disableStdin","CoreBrowserService","document","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","onRequestColorSchemeQuery","onChangeColors","colorSchemeUpdates","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","onRenderedViewportChange","_onRender","resize","_compositionView","CompositionHelper","_mouseCoordsService","MouseCoordsService","IMouseCoordsService","Linkifier","hasRenderer","setRenderer","_createRenderer","handleCursorMove","handleResize","handleBlur","handleFocus","_viewport","Viewport","onRequestScrollLines","SelectionService","ISelectionService","_mouseService","MouseService","IMouseService","amount","suppressScrollEvent","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","any","_onScroll","queueSync","BufferDecorationRenderer","handleMouseDown","mouseStateService","areMouseEventsActive","mouseEventsRequireAlt","disable","enable","screenReaderMode","showScrollbar","scrollbar","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","shouldShow","measure","bindMouse","handleTouchScroll","disposable","DomRenderer","sync","refreshRows","shouldColumnSelect","isCursorInitialized","disp","scrollPages","pageCount","scrollToTop","scrollToBottom","disableSmoothScroll","scrollToLine","scrollAmount","data","attachCustomKeyEventHandler","customKeyEventHandler","attachCustomWheelEventHandler","customWheelEventHandler","setCustomWheelEventHandler","linkProvider","registerCharacterJoiner","handler","joinerId","register","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","setSelection","getSelectionPosition","selectionStart","selectionEnd","selectAll","selectLines","shouldIgnoreComposition","isMac","macOptionIsMeta","altKey","keydown","scrollOnUserInput","result","evaluateKeyDown","scrollCount","_isThirdLevelShift","cancel","useKitty","useWin32InputMode","ctrlKey","metaKey","charCodeAt","wasModifierOnly","wasModifierKeyOnlyEvent","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","evaluateKeyUp","charCode","which","String","fromCharCode","inputType","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","useCapture","domNode","bb","win","getWindow","scrollX","scrollY","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","sort","execute","animationFrameRunner","Async_1","candidateNode","candidateEvent","view","DomListener","_node","_type","_handler","_options","dispose","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","b","animationFrameState","Map","WindowIntervalTimer","IntervalTimer","_defaultTarget","cancelAndSet","interval","currentLink","_currentLink","_element","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","onShowLinkUnderline","_onHideLinkUnderline","onHideLinkUnderline","_lastMouseEvent","_activeProviderReplies","_clearCurrentLink","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","_lastBufferCell","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","forEach","reply","linkWithState","linkProvided","linkProviders","entries","existingReply","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","has","splice","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","v","_fireUnderlineEvent","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","lower","upper","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabelInternal","tooMuchOutputInternal","CellData_1","_optionsService","_oscLinkService","_workCell","CellData","callback","linkHandler","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","_getRangeWithLineWrap","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","linkId","startY","finalStartX","endY","finalEndX","currentLine","isWrapped","previousLine","previousLineLength","_hasUrlId","previousStartX","nextLine","nextLineLength","nextEndX","confirm","newWindow","opener","location","href","IOptionsService","IOscLinkService","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","max","_runRefreshCallbacks","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","performance","now","elapsed","waitPeriodBeforeTrailingRefresh","setTimeout","DEFAULT_ANSI_COLORS","freeze","r","g","toCss","toRgba","c","scrollableElement_1","scrollable_1","coreBrowserService","_coreService","themeService","_onRequestScrollLines","_isSyncing","_isHandlingScroll","_suppressOnScrollHandler","_needsSyncOnRender","scrollable","Scrollable","forceIntegerValues","smoothScrollDuration","scheduleAtNextAnimationFrame","cb","setSmoothScrollDuration","_scrollableElement","SmoothScrollableElement","vertical","horizontal","useShadows","mouseWheelSmoothScroll","verticalHasArrows","showArrows","_getChangeOptions","onMultipleOptionChange","updateOptions","onProtocolChange","handleMouseWheel","setScrollDimensions","scrollHeight","runAndSubscribe","backgroundColor","getDomNode","_styleElement","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","join","onBufferActivate","_latestYDisp","_sync","_handleScroll","getScrollPosition","setScrollPosition","reuseAnimation","scrollTop","verticalScrollbarSize","mouseWheelScrollSensitivity","scrollSensitivity","fastScrollSensitivity","_queuedAnimationFrame","synchronizedOutput","newRow","round","diff","translationY","ICoreService","IMouseStateService","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","alt","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","ColorZoneStore_1","drawHeight","drawWidth","drawX","_width","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_refreshDrawConstants","outerWidth","floor","innerWidth","ceil","dpr","pixelsPerLine","nonFullHeight","_store","isDisposed","cssCanvasHeight","deviceCanvasHeight","_refreshDecorations","clearRect","lineWidth","_renderRulerOutline","_renderColorZone","fillStyle","overviewRulerBorder","fillRect","overviewRuler","showTopBorder","showBottomBorder","updateCanvasDimensions","updateAnchor","_isComposing","_textarea","_isSendingComposition","_compositionPosition","_compositionSuffix","_dataAlreadySent","substring","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","currentCompositionPosition","currentCompositionSuffix","input","valueEnd","endsWith","_textareaChangeTimer","oldValue","newValue","dontRecurse","fontFamily","maxWidth","overflow","direction","compositionViewBounds","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","abs","wrappedRows","verticalDirection","wrappedRowsCount","repeat","sequence","currentRow","lineWraps","startCol","endCol","currentCol","bufferStr","translateBufferLineToString","count","str","rpt","targetX","hasScrollback","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","CoreBrowserTerminal_1","AddonManager_1","BufferNamespaceApi_1","ParserApi_1","UnicodeApi_1","CONSTRUCTOR_ONLY_OPTIONS","$value","Terminal","_core","_addonManager","AddonManager","_publicOptions","getter","propName","setter","_checkReadonlyOptions","desc","defineProperty","_checkProposedApi","allowProposedApi","onBinary","onData","onWriteParsed","parser","_parser","ParserApi","unicode","UnicodeApi","_buffer","BufferNamespaceApi","modes","m","mouseTrackingMode","activeProtocol","applicationCursorKeysMode","applicationCursorKeys","applicationKeypadMode","applicationKeypad","insertMode","originMode","origin","reverseWraparoundMode","reverseWraparound","sendFocusMode","showCursor","isCursorHidden","synchronizedOutputMode","win32InputMode","wraparoundMode","wraparound","wasUserInput","_verifyIntegers","_verifyPositiveIntegers","write","writeln","loadAddon","addon","strings","values","Infinity","DomRendererRowFactory_1","WidthCache_1","Constants_1","RendererUtils_1","SelectionRenderModel_1","TextBlinkStateManager_1","nextTerminalId","_linkifier2","_terminalClass","_selectionRenderModel","createSelectionRenderModel","_lastSelectionColumnMode","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_onRequestRedraw","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_cursorBlinkStateManager","CursorBlinkStateManager","restartBlinkAnimation","_textBlinkStateManager","TextBlinkStateManager","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","styles","_terminalSelector","multiplyOpacity","blinkAnimationUnderlineId","blinkAnimationBarId","blinkAnimationBlockId","cursor","cursorAccent","cursorWidth","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","INVERTED_DEFAULT_COLOR","opaque","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","pause","renderRows","resume","handleViewportVisibilityChange","isVisible","setViewportVisible","replaceChildren","oldViewportStart","oldViewportEnd","_lastSelectionStart","_lastSelectionEnd","update","viewportCappedStartRow","viewportCappedEndRow","newViewportStart","newViewportEnd","viewportStartRow","viewportEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","finalEndCol","renderStartRow","renderEndRow","cursorViewportRow","colStart","colEnd","fill","setNeedsBlinkInViewport","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowInfo","hasBlinkingCells","createRow","isBlinkOn","_setRowBlinkState","_updateTextBlinkState","_setCellUnderline","enabled","maxY","bufferline","_isIdlePaused","isFocused","_resetIdleTimer","_clearIdleTimer","_idleTimeout","_stopBlinkingDueToIdle","Constants_2","AttributeData_1","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","blinkOn","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","skipJoinedCheckUntilX","classes","hasHover","isJoined","isValidJoinRange","lastCharX","firstSelectionState","_isCellInSelection","JoinedCellData","isInSelection","isCursorCell","isLinkHover","isBlink","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isInvisible","isDim","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","drawBoldTextInBrightColors","isStrikethrough","textDecoration","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","className","minimumContrastRatio","treatGlyphAsBackgroundColor","getCode","cache","_getContrastCache","adjustedColor","ratio","ensureContrastRatio","halfContrastCache","contrastCache","canvasFactory","WidthCacheFontVariantCanvas","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_canvasElements","_holey","font","weight","weightBold","bold","italic","cp","_measure","variant","OffscreenCanvas","throwIfFalsy","fontStyle","trim","measureText","isPowerlineGlyph","codepoint","isEmoji","glyphSizeX","deviceCellWidth","isNerdFontGlyph","isBoxOrBlockGlyph","currentOffset","SelectionRenderModel","terminal","viewportY","isCellSelected","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","duration","setIntervalDuration","blinkIntervalDuration","_clearInterval","isEnabled","needsBlinkInViewport","_updateIntervalState","_interval","wasBlinkOn","setInterval","clearInterval","dom","fastDomNode_1","globalPointerMoveMonitor_1","scrollbarArrow_1","scrollbarVisibilityController_1","widget_1","platform","AbstractScrollbar","Widget","opts","_lazyRender","lazyRender","_host","host","_scrollable","_scrollByPage","scrollByPage","_scrollbarState","scrollbarState","_visibilityController","ScrollbarVisibilityController","visibility","extraScrollbarClassName","setIsNeeded","isNeeded","_pointerMoveMonitor","GlobalPointerMoveMonitor","_shouldRender","FastDomNode","setDomNode","setPosition","_domNodePointerDown","_createArrow","arrow","ScrollbarArrow","bgDomNode","_createSlider","slider","setClassName","setTop","setLeft","setWidth","setHeight","setLayerHinting","setContain","_sliderPointerDown","_onclick","leftButton","_handleElementSize","visibleSize","setVisibleSize","render","_handleElementScrollSize","elementScrollSize","setScrollSize","_handleElementScrollPosition","elementScrollPosition","beginReveal","setShouldBeVisible","beginHide","_renderDomNode","getRectangleLargeSize","getRectangleSmallSize","_updateSlider","getSliderSize","getArrowSize","getSliderPosition","_handlePointerDown","delegatePointerDown","domTop","getClientRects","sliderStart","sliderStop","pointerPos","_sliderPointerPosition","offsetX","offsetY","domNodePosition","getDomNodePagePosition","pageX","pageY","_pointerDownRelativePosition","_setDesiredScrollPositionNow","getDesiredScrollPositionFromOffsetPaged","getDesiredScrollPositionFromOffset","Element","initialPointerPosition","initialPointerOrthogonalPosition","_sliderOrthogonalPointerPosition","initialScrollbarState","clone","toggleClassName","startMonitoring","pointerId","buttons","pointerMoveData","pointerOrthogonalPosition","pointerOrthogonalDelta","pointerDelta","getDesiredScrollPositionFromDelta","handleDragEnd","handleDragStart","_desiredScrollPosition","desiredScrollPosition","writeScrollPosition","setScrollPositionNow","updateScrollbarSize","scrollbarSize","_updateScrollbarSize","setScrollbarSize","numberAsPixels","_height","_top","_left","_bottom","_right","_className","_position","_layerHint","_contain","setBottom","bottom","setRight","shouldHaveIt","layerHint","contain","name","_hooks","DisposableStore","_pointerMoveCallback","_onStopCallback","stopMonitoring","invokeStopCallback","isMonitoring","onStopCallback","initialElement","initialButtons","pointerMoveCallback","eventSource","setPointerCapture","releasePointerCapture","abstractScrollbar_1","scrollbarState_1","HorizontalScrollbar","scrollDimensions","getScrollDimensions","scrollPosition","getCurrentScrollPosition","ScrollbarState","horizontalHasArrows","horizontalScrollbarSize","scrollWidth","scrollLeft","horizontalSliderSize","sliderSize","sliderPosition","largeSize","smallSize","handleScroll","setOppositeScrollbarSize","setVisibility","sameOriginWindowChainCache","getParentWindowIfSameOrigin","w","parentLocation","IframeUtils","_getSameOriginWindowChain","windowChainCache","WeakRef","iframeElement","frameElement","getPositionOfChildWindowRelativeToAncestorWindow","childWindow","ancestorWindow","windowChain","windowChainEl","windowInChain","deref","boundingRect","timestamp","Date","browserEvent","middleButton","rightButton","detail","shiftKey","posx","posy","body","documentElement","iframeOffsets","deltaX","deltaY","targetNode","srcElement","shouldFactorDPR","isChrome","chromeVersionMatch","navigator","userAgent","match","e1","e2","devicePixelRatio","wheelDeltaY","VERTICAL_AXIS","axis","deltaMode","DOM_DELTA_LINE","wheelDeltaX","isSafari","HORIZONTAL_AXIS","wheelDelta","ScrollState","_forceIntegerValues","_scrollStateBrand","rawScrollLeft","rawScrollTop","equals","other","withScrollDimensions","useRawScrollPositions","withScrollPosition","createScrollEvent","previous","inSmoothScrolling","widthChanged","scrollWidthChanged","scrollLeftChanged","heightChanged","scrollHeightChanged","scrollTopChanged","oldWidth","oldScrollWidth","oldScrollLeft","oldHeight","oldScrollHeight","oldScrollTop","_scrollableBrand","_smoothScrollDuration","_scheduleAtNextAnimationFrame","_state","_smoothScrolling","validateScrollPosition","newState","_setState","Boolean","acceptScrollDimensions","getFutureScrollPosition","to","setScrollPositionSmooth","validTarget","newSmoothScrolling","SmoothScrollingOperation","from","startTime","animationFrameDisposable","_performSmoothScrolling","hasPendingScrollAnimation","tick","isDone","oldState","SmoothScrollingUpdate","createEaseOutCubic","delta","completion","t","pow","_initAnimations","_scrollLeft","_initAnimation","_scrollTop","viewportSize","stop1","stop2","cut","_tick","newScrollLeft","newScrollTop","mouseEvent_1","horizontalScrollbar_1","verticalScrollbar_1","MouseWheelClassifierItem","score","MouseWheelClassifier","_capacity","_memory","_front","_rear","isPhysicalMouseWheel","remainingInfluence","iteration","influence","acceptStandardWheelEvent","pageZoomFactor","getZoomFactor","accept","previousItem","_computeScore","_isAlmostInt","absDeltaX","absDeltaY","absPreviousDeltaX","absPreviousDeltaY","minDeltaX","minDeltaY","maxDeltaX","maxDeltaY","INSTANCE","resolvedScrollable","ownsScrollable","flipAxes","consumeMouseWheelIfScrollbarIsNeeded","alwaysConsumeMouseWheel","scrollYToX","scrollPredominantAxis","listenOnDomNode","verticalSliderSize","resolveOptions","scrollbarHost","mouseWheelEvent","_handleMouseWheel","_handleDragStart","_handleDragEnd","_verticalScrollbar","VerticalScrollbar","_horizontalScrollbar","_domNode","_leftShadowDomNode","_topShadowDomNode","_topLeftShadowDomNode","_listenOnDomNode","_mouseWheelToDispose","_setListeningToMouseWheel","_onmouseover","_handleMouseOver","_onmouseleave","_handleMouseLeave","_hideTimeout","TimeoutTimer","_isDragging","_mouseIsOver","_revealOnScroll","updateClassName","newClassName","newOptions","_render","delegateScrollFromMouseWheelEvent","StandardWheelEvent","shouldListen","onMouseWheel","passive","defaultPrevented","classifier","didScroll","shiftConvert","futureScrollPosition","deltaScrollTop","desiredScrollTop","deltaScrollLeft","desiredScrollLeft","consumeMouseWheel","_reveal","renderNow","scrollState","enableTop","enableLeft","leftClassName","topClassName","topLeftClassName","_hide","_scheduleHide","_handleActivate","handleActivate","bgWidth","bgHeight","arrowSize","addStandardDisposableListener","_arrowPointerDown","_pointerdownRepeatTimer","_pointerdownScheduleRepeatTimer","oppositeScrollbarSize","scrollSize","_scrollbarSize","_oppositeScrollbarSize","_arrowSize","_visibleSize","_scrollSize","_scrollPosition","_computedAvailableSize","_computedIsNeeded","_computedSliderSize","_computedSliderRatio","_computedSliderPosition","_refreshComputedValues","iVisibleSize","iScrollSize","iScrollPosition","setArrowSize","iArrowSize","_computeValues","computedAvailableSize","computedRepresentableSize","computedIsNeeded","computedSliderSize","computedSliderRatio","computedSliderPosition","desiredSliderPosition","correctedOffset","visibleClassName","invisibleClassName","_visibility","_visibleClassName","_invisibleClassName","_isVisible","_isNeeded","_rawShouldBeVisible","_shouldBeVisible","_revealTimer","_updateShouldBeVisible","rawShouldBeVisible","_applyVisibilitySetting","shouldBeVisible","ensureVisibility","setIfNotSet","withFadeAway","DomUtils","mainWindow","tail","array","n","LinkedListNode","Undefined","prev","LinkedList","_first","_last","_insert","atTheEnd","newNode","oldLast","oldFirst","didRemove","_remove","Symbol","iterator","EventType","TAP","START","END","CONTEXT_MENU","Gesture","_dispatched","_targets","_ignoreTargets","_activeTouches","_handle","_lastSetTapCountTime","_handleTouchStart","_handleTouchEnd","_handleTouchMove","addTarget","isTouchDevice","None","_instance","ignoreTarget","maxTouchPoints","len","targetTouches","touch","identifier","id","initialTarget","initialTimeStamp","initialPageX","initialPageY","rollingTimestamps","rollingPageX","rollingPageY","evt","_newGestureEvent","_dispatchEvent","activeTouchCount","keys","changedTouches","hasOwnProperty","holdTime","_holdDelay","finalX","finalY","deltaT","dispatchTo","filter","_inertia","createEvent","initEvent","tapCount","currentTime","getTime","setTapCount","_clearTapCountTime","targets","depth","dispatchEvent","t1","vX","dirX","vY","dirY","deltaPosX","deltaPosY","stopped","_scrollFriction","translationX","_target","descriptor","fnKey","fn","memoizeKey","args","configurable","enumerable","writable","apply","hasArrows","_arrowScrollDelta","_setArrows","_arrowScroll","currentPosition","_arrowUp","_arrowDown","arrowDelta","_updateArrowSize","listener","StandardMouseEvent","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","TextMetricsMeasureStrategy","DomMeasureStrategy","BaseMeasureStategy","_result","_validateAndSet","_parentElement","_measureElement","whiteSpace","fontKerning","Number","offsetWidth","offsetHeight","metrics","fontBoundingBoxAscent","fontBoundingBoxDescent","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","ranges","lineStr","trimmedLength","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_window","_isFocused","_cachedIsFocused","_onDprChange","_onWindowChange","onWindowChange","_screenDprMonitor","ScreenDprMonitor","setWindow","hasFocus","queueMicrotask","_parentWindow","_windowResizeListener","_outerListener","_setDprAndFireIfDiffers","_currentDevicePixelRatio","_updateDpr","_setWindowResizeListener","clearListener","parentWindow","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Keyboard_1","KittyKeyboard_1","Win32InputMode_1","Platform_1","_getWin32InputMode","_win32InputMode","Win32InputMode","_getKittyKeyboard","_kittyKeyboard","KittyKeyboard","evaluateKeyboardEvent","kittyFlags","kittyKeyboard","flags","evaluate","vtExtensions","shouldUseProtocol","providerIndex","indexOf","Mouse_1","getMouseReportCoords","col","touch_1","_mouseStateService","_lastEvent","_wheelPartialScroll","_touchScrollAccumulator","mouseupListener","mousedragListener","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","_handleWheel","_handleMouseDrag","_altMouseCursor","AltMouseCursorController","events","_handleProtocolChange","_syncMouseModeState","_handlePassiveWheel","_handleTouchChange","_sendEvent","but","action","overrideType","allowCustomWheelEvent","_consumeWheelEvent","stripAltFromReport","_triggerMouseEvent","ctrl","shouldForceSelection","targetDocument","listenerDocument","_handleTouchScrollAsWheel","_handleTouchScrollAsKeys","trunc","resetClass","logLevel","_explainEvents","_applyScrollModifier","targetWheelEventPixels","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_PAGE","_equalEvents","isPixelEncoding","restrictMouseEvent","report","encodeMouseEvent","isDefaultEncoding","triggerBinaryEvent","down","up","drag","move","pixels","ILogService","_isActive","_listeners","store","syncFromModifier","_updateClass","altHeld","RenderDebouncer_1","TaskQueue_1","_renderer","decorationService","_observerDisposable","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_pausedResizeTask","DebouncedIdleTask","_renderDebouncer","RenderDebouncer","_syncOutputHandler","SynchronizedOutputHandler","_fullRefresh","_registerIntersectionObserver","observer","IntersectionObserver","_handleIntersectionChange","threshold","_intersectionObserver","disconnect","observe","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","bufferRows","buffered","_fireOnCanvasResize","renderer","_onTimeout","_start","_end","_isBuffering","_timeout","MoveToCell_1","SelectionModel_1","BufferRange_1","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_dragScrollAmount","_enabled","_trimListener","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","rowsChanged","lineText","startRowEndCol","isLinuxMouseSelection","_refreshAnimationFrame","_refresh","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","timeStamp","_handleIncrementalClick","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","hadSelection","_fireOnSelectionChange","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","ServiceRegistry_1","createDecorator","ColorContrastCache_1","Types_1","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_OVERVIEW_RULER_BORDER","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","opacity","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","millis","Promise","resolve","timeout","timer","_token","_isDisposed","_isScheduled","_disposable","context","handle","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","$r","$g","$b","$a","toPaddedHex","s","contrastRatio","l1","l2","color_1","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","css_1","$ctx","$litmusColor","willReadFrequently","globalCompositeOperation","createLinearGradient","rgbaMatch","parseFloat","getImageData","rgb_1","relativeLuminance2","rs","gs","bs","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","InstantiationService_1","LogService_1","BufferService_1","OptionsService_1","CoreService_1","MouseStateService_1","UnicodeV6_1","UnicodeService_1","CharsetService_1","WindowsMode_1","WriteBuffer_1","OscLinkService_1","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","_onData","_onLineFeed","_onResize","_onWriteParsed","InstantiationService","OptionsService","LogService","BufferService","CoreService","MouseStateService","unicodeService","UnicodeService","UnicodeV6","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","flushSync","scroll","eraseAttr","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","registerApcHandler","windowsPty","backend","buildNumber","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_disposed","_event","thisArgs","idx","isArray","call","listeners","initial","Charsets_1","EscapeSequenceParser_1","TextDecoder_1","OscParser_1","DcsParser_1","ApcParser_1","Version_1","GLEVEL","paramToWindowOption","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_unicodeService","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_onRequestColorSchemeQuery","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","_activeBuffer","setCsiHandlerFallback","params","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","code","setOscHandlerFallback","setDcsHandlerFallback","payload","setApcHandlerFallback","setPrintHandler","print","insertChars","intermediates","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","sendXtVersion","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","kittyKeyboardSet","kittyKeyboardQuery","kittyKeyboardPush","kittyKeyboardPop","setExecuteHandler","bell","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","slowTimeout","slowPromise","_res","rej","race","then","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","TRACE","trace","split","clearRange","decode","subarray","viewportEnd","viewportStart","chWidth","charset","curAttr","bufferRow","markDirty","setCellFromCodepoint","precedingJoinState","ch","currentInfo","charProperties","extractWidth","shouldJoin","extractShouldJoin","stringFromCodePoint","addLineToLink","oldRow","oldCol","_eraseAttrData","BufferLine","copyCellsFrom","addCodepointToCell","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","ApcHandler","convertEol","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollOnEraseInDisplay","scrollBackSize","isUserScrolling","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","joinState","idata","itext","codePointAt","tlength","copyWithin","_is","XTERM_VERSION","term","termName","startsWith","setgCharset","DEFAULT_CHARSET","quirks","allowSetCursorBlink","activeEncoding","mainFlags","altFlags","activateAltBuffer","colorSchemeQuery","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","f","b2v","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","kittySgrBoldFaintControl","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","second","savedCharsets","charsets","savedGlevel","glevel","savedOriginMode","savedWraparoundMode","slots","spec","exec","isValidColorIndex","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","isProtected","block","bar","stack","altStack","mainStack","arg","_disposables","o","_value","_data","third","fourth","_targetWindow","majorVersion","isNode","process","isLegacyEdge","_getKey","logService","_insertedValues","_isFlushingInserted","_deletedIndices","_isFlushingDeleted","_flushInsertedTask","IdleTaskQueue","_flushDeletedTask","insert","_flushCleanupDeleted","enqueue","_flushInserted","sortedAddedValues","sortedAddedValuesIndex","arrayIndex","newArrayIndex","_flushCleanupInserted","_search","_flushDeleted","sortedDeletedIndices","sortedDeletedIndicesIndex","getKeyIterator","forEachByKey","mid","midKey","StringBuilder","_chunks","append","chunk","_limit","_builder","limit","TaskQueue","_tasks","_i","task","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","PriorityTaskQueue","_createDeadline","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","_urlId","_ext","val","CircularList_1","BufferReflow_1","Marker_1","MAX_BUFFER_SIZE","Buffer","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","_memoryCleanupQueue","getWhitespaceCell","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","reflowCursorLine","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","$startIndex","$workCell","$extended","fillCellData","_combined","_extendedAttrs","_cacheValid","_cache","_cacheTrimmed","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","attrs","$idx","byteLength","uint32Cells","extKeys","copyFrom","blank","_copySparseMapsFrom","src","applyInReverse","srcData","_copyCellMapsFrom","outColumns","isCanonical","trimEnd","cellContents","srcStart","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","Buffer_1","BufferSet","_normalBuffer","_altBuffer","_onBufferActivate","_normal","_alt","inactiveBuffer","obj","combined","attributesEquals","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","_nextId","_onDispose","h","k","q","u","A","B","C","R","Q","K","Y","E","Z","H","_","applicationCursorMode","modifiers","keyMapping","KEYCODE_KEY_MAPPINGS","keyString","toUpperCase","toLowerCase","_functionalKeyCodes","Escape","Enter","Tab","Backspace","CapsLock","ScrollLock","NumLock","PrintScreen","Pause","ContextMenu","F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24","F25","KP_0","KP_1","KP_2","KP_3","KP_4","KP_5","KP_6","KP_7","KP_8","KP_9","KP_Decimal","KP_Divide","KP_Multiply","KP_Subtract","KP_Add","KP_Enter","KP_Equal","ShiftLeft","ShiftRight","ControlLeft","ControlRight","AltLeft","AltRight","MetaLeft","MetaRight","MediaPlayPause","MediaStop","MediaTrackNext","MediaTrackPrevious","AudioVolumeDown","AudioVolumeUp","AudioVolumeMute","_csiTildeKeys","Insert","Delete","PageUp","PageDown","F5","F6","F7","F8","F9","F10","F11","F12","_csiLetterKeys","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","End","_ss3FunctionKeys","F1","F2","F3","F4","_getNumpadKeyCode","suffix","_getModifierKeyCode","_encodeModifiers","mods","_getKeyCode","macOptionAsAlt","numpadCode","modifierCode","funcCode","digit","_isModifierKey","_isLockKey","_buildCsiLetterSequence","letter","reportEventTypes","needsEventType","seq","_buildSs3Sequence","_buildCsiTildeSequence","number","_buildCsiUSequence","isFunc","isMod","shiftedKey","textCode","csiLetter","ss3Letter","tildeCode","specialKey","legacyByte","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","wcwidth","num","ucs","bisearch","preceding","createPropertyValue","_codeToVk","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadMultiply","NumpadAdd","NumpadSeparator","NumpadSubtract","NumpadDecimal","NumpadDivide","NumpadEnter","Space","Semicolon","Equal","Comma","Minus","Period","Slash","Backquote","BracketLeft","Backslash","BracketRight","Quote","IntlBackslash","_codeToScancode","_enhancedKeyCodes","_keyToControlChar","_getVirtualKeyCode","vk","_getScanCode","_getUnicodeChar","controlChar","_getControlKeyState","isKeyDown","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","_innerWriteTimer","didProcess","_innerWrite","_scheduleInnerWrite","lastTime","continuation","catch","low","RGB_REX","base","HASH_REX","adv","bits","pad","s2","StringBuilder_1","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","put","utf32ToString","success","handlerResult","LimitedStringBuilder","_payloadLimit","_hitLimit","ret","res","Params_1","unhook","hook","EMPTY_PARAMS","Params","addParam","_params","TransitionTable","Uint16Array","setDefault","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_executeHandlersArr","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_apcParser","ApcParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearApcHandler","clearErrorHandler","resetZdm","csiDone","addDigit","addSubParam","l4","collect","abort","handlersEsc","jj","_put","fromArray","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","cur","_addons","instance","loadedAddon","_wrappedAddonDispose","BufferLineApiView_1","init","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferApiView_1","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","BufferSet_1","colsChanged","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","_charsets","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","showCursorImmediately","structuredClone","SortedList_1","$xmin","$xmax","_decorations","_lineCache","DecorationLineCache","_onDecorationRegistered","_onDecorationRemoved","SortedList","attachToBufferLines","Decoration","markerDispose","getDecorationsAtCell","bucket","getDecorationsOnLine","_decorationsByLine","_bufferLineListeners","_lineIndexSyncTimer","MicrotaskTimer","_lineIndexSyncCallbacks","_addToLineBuckets","_removeFromLineBuckets","_handleBufferLinesTrim","_handleBufferLinesInsert","_handleBufferLinesDelete","_getDecorationHeight","_indexedStartLine","_reindexDecoration","_scheduleLineIndexSync","callbacks","newMap","_mergeLineBucket","_applyBufferLinesInsert","_applyBufferLinesDelete","existing","spanCrossers","deleteEnd","toReindex","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","addProtocol","addEncoding","encoding","_customWheelEventHandler","DEFAULT_OPTIONS","rescaleOverlappingGlyphs","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","every","linkData","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","extractCharKind","_activeProvider","getStringCellWidth","precedingInfo","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file -+{"version":3,"file":"xterm.js","mappings":"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,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAA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","sources":["webpack://@xterm/xterm/webpack/universalModuleDefinition","webpack://@xterm/xterm/./src/browser/AccessibilityManager.ts","webpack://@xterm/xterm/./src/browser/Clipboard.ts","webpack://@xterm/xterm/./src/browser/ColorContrastCache.ts","webpack://@xterm/xterm/./src/browser/CoreBrowserTerminal.ts","webpack://@xterm/xterm/./src/browser/Dom.ts","webpack://@xterm/xterm/./src/browser/Linkifier.ts","webpack://@xterm/xterm/./src/browser/LocalizableStrings.ts","webpack://@xterm/xterm/./src/browser/OscLinkProvider.ts","webpack://@xterm/xterm/./src/browser/RenderDebouncer.ts","webpack://@xterm/xterm/./src/browser/TimeBasedDebouncer.ts","webpack://@xterm/xterm/./src/browser/Types.ts","webpack://@xterm/xterm/./src/browser/Viewport.ts","webpack://@xterm/xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://@xterm/xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://@xterm/xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://@xterm/xterm/./src/browser/input/CompositionHelper.ts","webpack://@xterm/xterm/./src/browser/input/Mouse.ts","webpack://@xterm/xterm/./src/browser/input/MoveToCell.ts","webpack://@xterm/xterm/./src/browser/public/Terminal.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/Constants.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/SelectionRenderModel.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://@xterm/xterm/./src/browser/scrollable/abstractScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/fastDomNode.ts","webpack://@xterm/xterm/./src/browser/scrollable/globalPointerMoveMonitor.ts","webpack://@xterm/xterm/./src/browser/scrollable/horizontalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/mouseEvent.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollable.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollableElement.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarArrow.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarState.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarVisibilityController.ts","webpack://@xterm/xterm/./src/browser/scrollable/touch.ts","webpack://@xterm/xterm/./src/browser/scrollable/verticalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/widget.ts","webpack://@xterm/xterm/./src/browser/selection/SelectionModel.ts","webpack://@xterm/xterm/./src/browser/services/CharSizeService.ts","webpack://@xterm/xterm/./src/browser/services/CharacterJoinerService.ts","webpack://@xterm/xterm/./src/browser/services/CoreBrowserService.ts","webpack://@xterm/xterm/./src/browser/services/KeyboardService.ts","webpack://@xterm/xterm/./src/browser/services/LinkProviderService.ts","webpack://@xterm/xterm/./src/browser/services/MouseCoordsService.ts","webpack://@xterm/xterm/./src/browser/services/MouseService.ts","webpack://@xterm/xterm/./src/browser/services/RenderService.ts","webpack://@xterm/xterm/./src/browser/services/SelectionService.ts","webpack://@xterm/xterm/./src/browser/services/Services.ts","webpack://@xterm/xterm/./src/browser/services/ThemeService.ts","webpack://@xterm/xterm/./src/common/Async.ts","webpack://@xterm/xterm/./src/common/CircularList.ts","webpack://@xterm/xterm/./src/common/Color.ts","webpack://@xterm/xterm/./src/common/CoreTerminal.ts","webpack://@xterm/xterm/./src/common/Event.ts","webpack://@xterm/xterm/./src/common/InputHandler.ts","webpack://@xterm/xterm/./src/common/Lifecycle.ts","webpack://@xterm/xterm/./src/common/MultiKeyMap.ts","webpack://@xterm/xterm/./src/common/Platform.ts","webpack://@xterm/xterm/./src/common/SortedList.ts","webpack://@xterm/xterm/./src/common/StringBuilder.ts","webpack://@xterm/xterm/./src/common/TaskQueue.ts","webpack://@xterm/xterm/./src/common/Version.ts","webpack://@xterm/xterm/./src/common/WindowsMode.ts","webpack://@xterm/xterm/./src/common/buffer/AttributeData.ts","webpack://@xterm/xterm/./src/common/buffer/Buffer.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLine.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLineStringCache.ts","webpack://@xterm/xterm/./src/common/buffer/BufferRange.ts","webpack://@xterm/xterm/./src/common/buffer/BufferReflow.ts","webpack://@xterm/xterm/./src/common/buffer/BufferSet.ts","webpack://@xterm/xterm/./src/common/buffer/CellData.ts","webpack://@xterm/xterm/./src/common/buffer/Constants.ts","webpack://@xterm/xterm/./src/common/buffer/Marker.ts","webpack://@xterm/xterm/./src/common/data/Charsets.ts","webpack://@xterm/xterm/./src/common/input/Keyboard.ts","webpack://@xterm/xterm/./src/common/input/KittyKeyboard.ts","webpack://@xterm/xterm/./src/common/input/TextDecoder.ts","webpack://@xterm/xterm/./src/common/input/UnicodeV6.ts","webpack://@xterm/xterm/./src/common/input/Win32InputMode.ts","webpack://@xterm/xterm/./src/common/input/WriteBuffer.ts","webpack://@xterm/xterm/./src/common/input/XParseColor.ts","webpack://@xterm/xterm/./src/common/parser/ApcParser.ts","webpack://@xterm/xterm/./src/common/parser/DcsParser.ts","webpack://@xterm/xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://@xterm/xterm/./src/common/parser/OscParser.ts","webpack://@xterm/xterm/./src/common/parser/Params.ts","webpack://@xterm/xterm/./src/common/public/AddonManager.ts","webpack://@xterm/xterm/./src/common/public/BufferApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferLineApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferNamespaceApi.ts","webpack://@xterm/xterm/./src/common/public/ParserApi.ts","webpack://@xterm/xterm/./src/common/public/UnicodeApi.ts","webpack://@xterm/xterm/./src/common/services/BufferService.ts","webpack://@xterm/xterm/./src/common/services/CharsetService.ts","webpack://@xterm/xterm/./src/common/services/CoreService.ts","webpack://@xterm/xterm/./src/common/services/DecorationService.ts","webpack://@xterm/xterm/./src/common/services/InstantiationService.ts","webpack://@xterm/xterm/./src/common/services/LogService.ts","webpack://@xterm/xterm/./src/common/services/MouseStateService.ts","webpack://@xterm/xterm/./src/common/services/OptionsService.ts","webpack://@xterm/xterm/./src/common/services/OscLinkService.ts","webpack://@xterm/xterm/./src/common/services/ServiceRegistry.ts","webpack://@xterm/xterm/./src/common/services/Services.ts","webpack://@xterm/xterm/./src/common/services/UnicodeService.ts","webpack://@xterm/xterm/webpack/bootstrap","webpack://@xterm/xterm/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (␛).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.blur();\n }\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', (e: CompositionEvent) => {\n if (this._compositionHelper instanceof CompositionHelper) {\n if (this._compositionHelper.compositionend(e)) {\n this.textarea!.dispatchEvent(new CustomEvent(\n 'xterm-composition-transaction-accepted',\n { bubbles: true }\n ));\n }\n } else {\n this._compositionHelper!.compositionend();\n }\n }));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._register(toDisposable(() => {\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.dispose();\n }\n }));\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n if (!this._compositionHelper!.keypress?.(key)) {\n this.coreService.triggerDataEvent(key, true);\n }\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n if (\n ev.data &&\n ev.inputType === 'insertText' &&\n !this.optionsService.rawOptions.screenReaderMode &&\n this._compositionHelper instanceof CompositionHelper &&\n this._compositionHelper.input(ev.data)\n ) {\n return true;\n }\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): boolean | void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n keypress?(text: string): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService, IThemeService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { color } from '../../common/Color';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\ninterface IPendingComposition {\n transactionId: number;\n finalizerTimer?: ReturnType;\n lifecycleSettled: boolean;\n sessionEnded: boolean;\n position: IPosition;\n suffix: string;\n dataAlreadySent: string;\n compositionData: string;\n endData: string;\n inputData: string;\n keypressData: string;\n keypressMayOverlapComposition: boolean;\n expectsPostCompositionInput: boolean;\n nextCompositionStart?: number;\n}\n\nconst XTERM_COMPOSITION_SESSION_START_EVENT = 'xterm-composition-session-start';\nconst XTERM_COMPOSITION_SESSION_END_EVENT = 'xterm-composition-session-end';\nconst XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT =\n 'xterm-composition-transaction-accepted';\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n public get hasPendingCompositionFinalization(): boolean {\n return this._pendingComposition !== undefined;\n }\n public get _isSendingComposition(): boolean {\n return this.hasPendingCompositionFinalization;\n }\n public get _pendingKeypressData(): string {\n return this._pendingComposition?.keypressData ?? '';\n }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n private _pendingComposition?: IPendingComposition;\n\n private _isAwaitingCompositionEnd: boolean;\n\n private _compositionInputData: string;\n\n private _lastCompositionData: string;\n\n private _compositionStartValue: string;\n\n private _compositionStartSelection: IPosition;\n\n private _compositionHasObservedProgress: boolean;\n\n private _canceledKey?: Pick;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n /**\n * Whether the IME consumed the last keydown and still owes the commit it produced. Nothing is\n * forwarded for such a keydown, so the commit is claimed by whichever observes it first.\n */\n private _imeKeydownAwaitingCommit: boolean;\n\n /**\n * Identifies the composition transaction that owns deferred work.\n */\n private _compositionTransactionId: number;\n\n /**\n * Timers that still own deferred composition state.\n */\n private _compositionTimers: Set>;\n\n private _compositionPositionTimer?: ReturnType;\n\n private _compositionViewTimer?: ReturnType;\n\n private _compositionEndTimer?: ReturnType;\n\n /** The preedit's own span, used to anchor the native candidate window. */\n private _compositionPreedit?: HTMLElement;\n\n /** The rendered row tail, set only while the cursor sits mid-line. */\n private _compositionRemainder?: HTMLElement;\n\n /** The insertion caret painted above the renderer cursor the composition view covers. */\n private _compositionCaret?: HTMLElement;\n\n /** The last preedit rendered, so a row repaint can re-render without a composition event. */\n private _compositionViewData?: string;\n\n // Keep the six-argument form callable: upstream's own CompositionHelper.test.ts constructs\n // this class directly, and `.npmignore` strips src/**/*.test.ts from the published tarball, so\n // the shipped patch has no hunk that could update that call. Dropping this overload fails the\n // upstream build with TS2554. The theme service is therefore optional, and every color read\n // below keeps the stock fallback that path needs.\n constructor(\n textarea: HTMLTextAreaElement,\n compositionView: HTMLElement,\n bufferService: IBufferService,\n optionsService: IOptionsService,\n coreService: ICoreService,\n renderService: IRenderService\n );\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService,\n @IThemeService private readonly _themeService?: IThemeService\n ) {\n this._isComposing = false;\n this._isAwaitingCompositionEnd = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionStartValue = '';\n this._compositionStartSelection = { start: 0, end: 0 };\n this._compositionHasObservedProgress = false;\n this._compositionTransactionId = 0;\n this._compositionTimers = new Set();\n this._imeKeydownAwaitingCommit = false;\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = undefined;\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = undefined;\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionStartValue = this._textarea.value;\n this._compositionStartSelection = { start, end };\n this._compositionHasObservedProgress = false;\n // A real session owns everything it commits, so no keydown is left owing one.\n this._imeKeydownAwaitingCommit = false;\n if (this._pendingComposition) {\n this._pendingComposition.nextCompositionStart = this._compositionPosition.start;\n }\n this._compositionTransactionId++;\n this._isComposing = true;\n this._isAwaitingCompositionEnd = true;\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._resetCompositionView();\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionView.classList.add('active');\n this._dispatchCompositionSessionEvent(new CustomEvent(XTERM_COMPOSITION_SESSION_START_EVENT, {\n bubbles: true,\n detail: { id: this._compositionTransactionId }\n }));\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n if (ev.data && !this._isComposing) {\n this.compositionstart();\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (ev.data?.length > 0) {\n this._lastCompositionData = ev.data;\n }\n this._renderCompositionView(ev.data ?? '');\n // Some IMEs resume without compositionstart; keep that inferred transaction visible until\n // compositionend settles it. An empty update hides the overlay without ending the transaction.\n this._compositionView.classList.toggle('active', Boolean(ev.data));\n this.updateCompositionElements();\n const transactionId = this._compositionTransactionId;\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = this._defer(() => {\n if (this._isComposing && this._compositionTransactionId === transactionId) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n });\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(ev?: Pick): boolean {\n if (!this._isAwaitingCompositionEnd) {\n return false;\n }\n if (!this._isComposing) {\n const pending = this._pendingComposition;\n if (pending?.transactionId === this._compositionTransactionId) {\n pending.endData = ev?.data ?? '';\n this._updatePostCompositionInputExpectation(pending);\n }\n return false;\n }\n const endData = ev?.data ?? '';\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n const pending = this._pendingComposition;\n if (pending && pending.transactionId !== this._compositionTransactionId) {\n this._sendPendingComposition(pending);\n }\n this._deferCompositionEnd(endData);\n return false;\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n return true;\n }\n\n public blur(): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._isComposing) {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n this._finalizeComposition(false);\n }\n }\n\n public dispose(): void {\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n for (const timer of this._compositionTimers) {\n clearTimeout(timer);\n }\n this._compositionTimers.clear();\n this._compositionPositionTimer = undefined;\n this._compositionViewTimer = undefined;\n this._compositionEndTimer = undefined;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionTransactionId++;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._canceledKey?.code === ev.code && this._canceledKey.timeStamp === ev.timeStamp) {\n this._canceledKey = undefined;\n return false;\n }\n if (ev.key === 'Escape' && (this._isComposing || this.hasPendingCompositionFinalization)) {\n this._canceledKey = { code: ev.code, timeStamp: ev.timeStamp };\n this._cancelComposition();\n return false;\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n // A key the IME swallows can also empty the preedit — backspacing over the last radical of a\n // Cangjie composition — and some IMEs report that with no composition event at all.\n this._deferPreeditResync(this._composedRegionLength() > 0);\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n // Nothing is forwarded for a keydown the IME consumed, so it is left owing its commit; any\n // other keydown either forwards its own text or produces none, and clears the debt.\n this._imeKeydownAwaitingCommit = ev.keyCode === 229;\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Defers keypress text while a composition finalizer is pending so all input is emitted once\n * after reconciliation with the final textarea candidate.\n */\n public keypress(text: string): boolean {\n const pending = this._pendingComposition;\n if (!pending) {\n return false;\n }\n if (pending.keypressMayOverlapComposition) {\n pending.keypressData += text;\n return true;\n }\n if (pending.expectsPostCompositionInput && pending.keypressData.length === 0) {\n pending.keypressData = text;\n return true;\n }\n this._sendPendingComposition(pending);\n return false;\n }\n\n public input(text: string): boolean {\n if (this._isComposing) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n this._compositionInputData += text;\n return true;\n }\n const pending = this._pendingComposition;\n if (!pending) {\n return this._claimImeKeydownCommit(text);\n }\n if (pending.expectsPostCompositionInput) {\n pending.inputData += text;\n pending.expectsPostCompositionInput = false;\n this._sendPendingComposition(pending);\n return true;\n }\n const repeatsPendingTextareaInput =\n text.length > 0 &&\n this._getPendingTextareaInput(pending) === text &&\n this._getPendingTextareaInput(pending, true) === text;\n this._sendPendingComposition(pending);\n if (!repeatsPendingTextareaInput) {\n this._coreService.triggerDataEvent(text, true);\n }\n return true;\n }\n\n /**\n * Settles the commit a keydown the IME consumed still owes. That commit normally arrives as the\n * deferred textarea diff, but an asynchronous IME can deliver it after the diff has already run\n * and found the textarea unchanged, and with the key still down the terminal drops the input\n * event instead (#12099). Whichever path sees the commit first sends it and cancels the other, so\n * an IME that commits before the diff runs still sends once.\n */\n private _claimImeKeydownCommit(text: string): boolean {\n if (!this._imeKeydownAwaitingCommit) {\n return false;\n }\n this._imeKeydownAwaitingCommit = false;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n this._coreService.triggerDataEvent(text, true);\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean, endData: string = ''): void {\n const wasComposing = this._isComposing;\n this._compositionView.classList.remove('active');\n // Cleared, not just hidden: a rendered tail left in the view is stale DOM the next composition\n // would have to correct before its own first update lands.\n this._resetCompositionView();\n this._isComposing = false;\n if (waitForPropagation && !wasComposing) {\n return;\n }\n\n if (!waitForPropagation) {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition, true);\n }\n if (wasComposing) {\n const input = this._getCompositionInput(\n this._compositionPosition.start + this._dataAlreadySent.length,\n this._compositionSuffix\n );\n this._sendCompositionInput(this._compositionTransactionId, input);\n }\n } else {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition);\n }\n const pending: IPendingComposition = {\n transactionId: this._compositionTransactionId,\n lifecycleSettled: false,\n sessionEnded: false,\n position: {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n },\n suffix: this._compositionSuffix,\n dataAlreadySent: this._dataAlreadySent,\n compositionData: this._lastCompositionData,\n endData,\n inputData: this._compositionInputData,\n keypressData: '',\n keypressMayOverlapComposition:\n this._lastCompositionData.length === 0 && endData.length === 0,\n expectsPostCompositionInput: false\n };\n this._updatePostCompositionInputExpectation(pending);\n this._pendingComposition = pending;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n pending.finalizerTimer = this._defer(() => {\n pending.finalizerTimer = undefined;\n if (this._compositionTransactionId === pending.transactionId) {\n this._isAwaitingCompositionEnd = false;\n }\n if (this._pendingComposition === pending) {\n this._sendPendingComposition(pending, true);\n }\n });\n }\n }\n\n private _sendPendingComposition(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): void {\n this._cancelPendingFinalizer(pending);\n if (this._pendingComposition === pending) {\n this._pendingComposition = undefined;\n }\n const textareaInput = this._getPendingTextareaInput(pending, includeFollowingInput);\n const observedInput = this._removeAlreadySentData(\n pending.inputData || pending.keypressData,\n pending.dataAlreadySent\n );\n // Why: with no textarea, end, input, or keypress evidence the composition\n // was cancelled (e.g. Backspace over the whole preedit); stale\n // compositionupdate data must not be replayed as committed text.\n const input = this._mergeTextObservations(\n textareaInput || pending.endData || (observedInput ? pending.compositionData : ''),\n observedInput,\n pending.keypressMayOverlapComposition\n );\n this._sendCompositionInput(pending.transactionId, input, !pending.sessionEnded);\n this._settlePendingComposition(pending);\n }\n\n private _cancelPendingFinalizer(pending: IPendingComposition): void {\n if (pending.finalizerTimer === undefined) {\n return;\n }\n clearTimeout(pending.finalizerTimer);\n this._compositionTimers.delete(pending.finalizerTimer);\n pending.finalizerTimer = undefined;\n }\n\n private _settlePendingComposition(pending: IPendingComposition): void {\n if (pending.lifecycleSettled) {\n return;\n }\n pending.lifecycleSettled = true;\n this._dispatchCompositionTransactionSettled();\n }\n\n private _mergeTextObservations(\n candidate: string,\n observed: string,\n findShortestOrder: boolean\n ): string {\n if (!observed || candidate.includes(observed)) {\n return candidate;\n }\n if (!candidate || observed.includes(candidate)) {\n return observed;\n }\n if (findShortestOrder) {\n let candidateFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n candidateFirstOverlap > 0 &&\n !candidate.endsWith(observed.substring(0, candidateFirstOverlap))\n ) {\n candidateFirstOverlap--;\n }\n let observedFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n observedFirstOverlap > 0 &&\n !observed.endsWith(candidate.substring(0, observedFirstOverlap))\n ) {\n observedFirstOverlap--;\n }\n return candidateFirstOverlap > observedFirstOverlap\n ? candidate + observed.substring(candidateFirstOverlap)\n : observed + candidate.substring(observedFirstOverlap);\n }\n let overlap = Math.min(candidate.length, observed.length);\n while (overlap > 0 && !candidate.endsWith(observed.substring(0, overlap))) {\n overlap--;\n }\n return candidate + observed.substring(overlap);\n }\n\n private _updatePostCompositionInputExpectation(pending: IPendingComposition): void {\n pending.expectsPostCompositionInput =\n (pending.endData.length > 0 || pending.compositionData.length > 0) &&\n pending.inputData.length === 0 &&\n this._getPendingTextareaInput(pending).length === 0;\n }\n\n private _getPendingTextareaInput(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): string {\n const value = this._textarea.value;\n const start = pending.position.start + pending.dataAlreadySent.length;\n if (pending.nextCompositionStart !== undefined) {\n return value.substring(start, Math.max(start, pending.nextCompositionStart));\n }\n const suffixEnd =\n pending.suffix.length > 0 && value.endsWith(pending.suffix)\n ? value.length - pending.suffix.length\n : value.length;\n const compositionLength = (pending.endData || pending.compositionData).length;\n const observedEnd = includeFollowingInput\n ? suffixEnd\n : Math.max(pending.position.end, start + compositionLength);\n return value.substring(start, Math.max(start, Math.min(suffixEnd, observedEnd)));\n }\n\n private _getCompositionInput(start: number, suffix: string): string {\n const value = this._textarea.value;\n const valueEnd =\n suffix.length > 0 && value.endsWith(suffix) ? value.length - suffix.length : value.length;\n return value.substring(start, Math.max(start, valueEnd));\n }\n\n private _removeAlreadySentData(input: string, dataAlreadySent: string): string {\n if (dataAlreadySent.length === 0) {\n return input;\n }\n if (input.startsWith(dataAlreadySent)) {\n return input.substring(dataAlreadySent.length);\n }\n return dataAlreadySent.includes(input) ? '' : input;\n }\n\n private _cancelComposition(): void {\n const pending = this._pendingComposition;\n if (\n pending &&\n this._isComposing &&\n pending.transactionId !== this._compositionTransactionId\n ) {\n this._sendPendingComposition(pending);\n }\n const transactionId = this._isComposing\n ? this._compositionTransactionId\n : this._pendingComposition?.transactionId ?? 0;\n const settlesPending = pending !== undefined && this._pendingComposition === pending;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n this._textarea.value =\n this._textarea.value.substring(0, this._compositionPosition.start) + this._compositionSuffix;\n this._sendCompositionInput(transactionId, '');\n if (settlesPending && pending) {\n this._settlePendingComposition(pending);\n }\n }\n\n private _sendCompositionInput(\n transactionId: number,\n input: string,\n dispatchSessionEnd: boolean = true\n ): void {\n let prevented = false;\n if (dispatchSessionEnd) {\n const event = new CustomEvent(XTERM_COMPOSITION_SESSION_END_EVENT, {\n bubbles: true,\n cancelable: true,\n detail: { id: transactionId, data: input }\n });\n this._dispatchCompositionSessionEvent(event);\n prevented = event.defaultPrevented;\n }\n if (input.length > 0 && !prevented) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n\n private _endPendingCompositionSession(pending: IPendingComposition): void {\n if (pending.sessionEnded) {\n return;\n }\n pending.sessionEnded = true;\n const input =\n this._getPendingTextareaInput(pending) ||\n pending.endData ||\n pending.compositionData;\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_SESSION_END_EVENT,\n {\n bubbles: true,\n cancelable: true,\n detail: {\n id: pending.transactionId,\n data: input,\n dataPendingReconciliation: true\n }\n }\n ));\n }\n\n private _dispatchCompositionSessionEvent(event: CustomEvent): void {\n if (typeof this._textarea.dispatchEvent === 'function') {\n this._textarea.dispatchEvent(event);\n }\n }\n\n private _dispatchCompositionTransactionSettled(): void {\n this._dispatchCompositionSessionEvent(new CustomEvent(\n 'xterm-composition-transaction-settled',\n { bubbles: true }\n ));\n }\n\n private _deferCompositionEnd(endData: string): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n const transactionId = this._compositionTransactionId;\n const timer = this._defer(() => {\n if (\n this._compositionEndTimer !== timer ||\n !this._isComposing ||\n this._compositionTransactionId !== transactionId ||\n !this._compositionEndBelongsToCurrentTransaction(endData)\n ) {\n return;\n }\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT,\n { bubbles: true }\n ));\n const pending = this._pendingComposition;\n if (pending?.transactionId === transactionId) {\n this._sendPendingComposition(pending, true);\n }\n });\n this._compositionEndTimer = timer;\n }\n\n /** How much of the textarea the IME currently owns; 0 means there is no preedit left. */\n private _composedRegionLength(): number {\n const end = this._textarea.value.length - this._compositionSuffix.length;\n return Math.max(0, end - this._compositionPosition.start);\n }\n\n /**\n * Re-derives the preedit from the textarea once the key that changed it has settled, and treats\n * a composition emptied that way as cancelled. Mirrors how native terminals clear a preedit on\n * the empty-marked-text state instead of on a specific key.\n */\n private _deferPreeditResync(hadPreedit: boolean): void {\n if (!hadPreedit || !this._isComposing) {\n return;\n }\n const transactionId = this._compositionTransactionId;\n this._defer(() => {\n if (\n this._isComposing &&\n this._compositionTransactionId === transactionId &&\n this._composedRegionLength() === 0\n ) {\n this._cancelComposition();\n }\n });\n }\n\n private _hasCompositionProgress(): boolean {\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n return this._compositionHasObservedProgress || (\n this._textarea.value !== this._compositionStartValue ||\n start !== this._compositionStartSelection.start ||\n end !== this._compositionStartSelection.end\n );\n }\n\n private _compositionEndBelongsToCurrentTransaction(endData: string): boolean {\n return (\n this._hasCompositionProgress() ||\n (endData.length > 0 && endData === this._lastCompositionData)\n );\n }\n\n private _defer(callback: () => void): ReturnType {\n const timer = setTimeout(() => {\n this._compositionTimers.delete(timer);\n callback();\n }, 0);\n this._compositionTimers.add(timer);\n return timer;\n }\n\n private _cancelDeferredTimer(timer?: ReturnType): void {\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n this._compositionTimers.delete(timer);\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n if (newValue !== oldValue) {\n this._imeKeydownAwaitingCommit = false;\n }\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Renders the preedit into the view and, when the cursor sits mid-line, the rest of the row\n * after it, so a composition reads as inserted text pushing the tail right rather than an opaque\n * box hiding the character under the cursor. Nothing reaches the pty while composing, so those\n * cells still hold their characters; only what the overlay shows changes.\n */\n private _renderCompositionView(data: string, rowRemainder = this._getRowRemainderText()): void {\n if (!data) {\n this._resetCompositionView();\n return;\n }\n // Keep DOM order LTR so the insertion caret follows the preedit.\n const preeditText = `‎${data}‎`;\n this._compositionViewData = data;\n const doc = this._compositionView.ownerDocument;\n const preedit = doc.createElement('span');\n preedit.className = 'xterm-composition-preedit';\n // Underlined so the composing text stays distinguishable from the tail it pushed right.\n preedit.style.flexShrink = '0';\n preedit.style.textDecoration = 'underline';\n preedit.textContent = preeditText;\n const caret = doc.createElement('span');\n caret.className = 'xterm-composition-caret';\n caret.setAttribute('aria-hidden', 'true');\n const children = [preedit, caret];\n let remainder: HTMLElement | undefined;\n if (rowRemainder) {\n remainder = doc.createElement('span');\n remainder.className = 'xterm-composition-remainder';\n // Why: the view is nowrap, which collapses runs of spaces, so committed padding would draw\n // its trailing glyph cells to the left of where the grid has them.\n remainder.style.whiteSpace = 'pre';\n remainder.textContent = rowRemainder;\n children.push(remainder);\n }\n this._compositionView.replaceChildren(...children);\n this._compositionPreedit = preedit;\n this._compositionCaret = caret;\n this._compositionRemainder = remainder;\n this._styleCompositionCaret();\n }\n\n /** The committed row text from the cursor rightwards — what a mid-line preedit would cover. */\n private _getRowRemainderText(): string {\n const buffer = this._bufferService.buffer;\n if (!buffer.isCursorInViewport) {\n return '';\n }\n const line = buffer.lines.get(buffer.ybase + buffer.y);\n // The explicit end column keeps this off the line string cache, whose self-renewing\n // idle-clear timer the composition path must not arm.\n return line\n ? line.translateToString(true, Math.min(buffer.x, this._bufferService.cols - 1), line.length)\n : '';\n }\n\n private _styleCompositionCaret(): void {\n const caret = this._compositionCaret;\n if (!caret) {\n return;\n }\n const width = Math.max(1, this._optionsService.rawOptions.cursorWidth);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const colors = this._themeService?.colors;\n const cursor = colors && (\n color.ensureContrastRatio(colors.background, colors.cursor, 3) ?? colors.cursor\n );\n caret.style.backgroundColor = cursor?.css ?? '#FFF';\n caret.style.display = 'inline-block';\n caret.style.flexShrink = '0';\n caret.style.height = cellHeight + 'px';\n caret.style.marginLeft = -width + 'px';\n caret.style.verticalAlign = 'top';\n caret.style.width = width + 'px';\n }\n\n private _resetCompositionView(): void {\n this._compositionView.textContent = '';\n this._compositionPreedit = undefined;\n this._compositionRemainder = undefined;\n this._compositionCaret = undefined;\n this._compositionViewData = '';\n this._compositionView.style.display = '';\n this._compositionView.style.justifyContent = '';\n }\n\n /**\n * The theme background with any alpha dropped. The view masks the cells it draws over, so a\n * see-through background would re-expose the very characters the rendered tail stands in for.\n */\n private _opaqueViewBackground(): string {\n const background = this._themeService?.colors.background;\n return background ? color.opaque(background).css : '#000';\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n // Empty updates hide the overlay without ending the inferred transaction.\n if (!this._compositionView.classList.contains('active')) {\n return;\n }\n\n // A TUI can repaint the row under an open composition (spinners, streamed output), and this\n // already runs on every render — so keep the rendered tail current with the buffer. A string\n // compare adds no layout read.\n const rowRemainder = this._getRowRemainderText();\n if (\n this._compositionViewData &&\n rowRemainder !== (this._compositionRemainder?.textContent ?? '')\n ) {\n this._renderCompositionView(this._compositionViewData, rowRemainder);\n }\n this._styleCompositionCaret();\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n const anchorBounds =\n (this._compositionPreedit ?? this._compositionView).getBoundingClientRect();\n const anchorLeft = cursorLeft + Math.min(0, maxWidth - anchorBounds.width);\n const showsRemainder =\n Boolean(this._compositionRemainder) && anchorBounds.width < maxWidth;\n if (this._compositionRemainder) {\n this._compositionRemainder.style.display = showsRemainder ? '' : 'none';\n }\n // End alignment keeps the caret visible when the preedit consumes the remaining width.\n this._compositionView.style.direction = 'ltr';\n this._compositionView.style.display = showsRemainder ? '' : 'flex';\n this._compositionView.style.justifyContent = showsRemainder ? '' : 'flex-end';\n // Themed rather than the stock #000/#FFF, so the pushed tail reads as ordinary terminal text\n // and light themes keep contrast.\n this._compositionView.style.background = this._opaqueViewBackground();\n this._compositionView.style.color = this._themeService?.colors.foreground.css ?? '#FFF';\n // Sized and placed to match the preedit, not the whole view, so the candidate window\n // anchors to the composing text rather than the end of the rendered tail. The clamp has to\n // be applied here and not only in Orca's terminal-ime-candidate-anchor.ts, because\n // CoreBrowserTerminal calls this from onRender as well as from composition events, and a\n // render can land after the last composition event that module can hear.\n this._textarea.style.left = anchorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(anchorBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(anchorBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = anchorBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = this._defer(() => this.updateCompositionElements(true));\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n","import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const ctx: IMouseBindContext = { target, focus, requestedEvents };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n // Ensure document-level listeners are removed on dispose\n register(toDisposable(() => {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }));\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element, document } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed) {\n return;\n }\n switch (this._listeners.length) {\n case 0: return;\n case 1: {\n const { fn, thisArgs } = this._listeners[0];\n fn.call(thisArgs, event);\n return;\n }\n default: {\n // Snapshot listeners to allow modifications during iteration (2+ listeners)\n const listeners = this._listeners.slice();\n for (const { fn, thisArgs } of listeners) {\n fn.call(thisArgs, event);\n }\n }\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n if (this._deleteAtKey(value, key)) {\n return true;\n }\n // A pending deletion whose key mutated after `delete()` (disposing a marker\n // resets `line` to -1, and `line` is the sort key) leaves `_array` out of\n // order, so the binary search above can miss a value that is present.\n // Compacting those entries out restores the order; retry before reporting\n // the value absent, else its `onDecorationRemoved` never fires and the\n // decoration paints forever. Miss path only, so the common bulk delete\n // keeps its O(log n) search and deferred-compaction batching.\n if (this._deletedIndices.length === 0) {\n return false;\n }\n this._flushCleanupDeleted();\n return this._deleteAtKey(value, key);\n }\n\n private _deleteAtKey(value: T, key: number): boolean {\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n²) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.287';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { BufferLineStringCache } from './BufferLineStringCache';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n private readonly _stringCache: BufferLineStringCache;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n this._stringCache = this._register(new BufferLineStringCache());\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._stringCache, this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this._stringCache.clear();\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n this._stringCache.clear();\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { StringBuilder } from '../StringBuilder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $translateToStringBuilder = new StringBuilder();\n\nexport interface IBufferLineStringCacheEntry {\n value: string | undefined;\n isTrimmed: boolean;\n generation: number;\n}\n\nexport interface IBufferLineStringCache {\n generation: number;\n allocateEntry(): IBufferLineStringCacheEntry;\n touch?(): void;\n}\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n protected _stringCacheEntryRef: WeakRef | undefined;\n public length: number;\n\n constructor(\n protected readonly _stringCache: IBufferLineStringCache,\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._invalidateStringCache();\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n cell.extended = DEFAULT_ATTR_DATA.extended.clone();\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._invalidateStringCache();\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._invalidateStringCache();\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = attrs.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._invalidateStringCache();\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._invalidateStringCache();\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n this._invalidateStringCache();\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._copySparseMapsFrom(line);\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(this._stringCache, 0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n newLine._copySparseMapsFrom(this);\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._invalidateStringCache();\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonicalRequest = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonicalRequest) {\n this._stringCache.touch?.();\n }\n const stringCacheEntry = isCanonicalRequest ? this._getStringCacheEntry(false) : undefined;\n if (isCanonicalRequest && stringCacheEntry?.value !== undefined) {\n if (trimRight) {\n return stringCacheEntry.isTrimmed ? stringCacheEntry.value : stringCacheEntry.value.trimEnd();\n }\n if (!stringCacheEntry.isTrimmed) {\n return stringCacheEntry.value;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n $translateToStringBuilder.reset();\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n $translateToStringBuilder.append(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = $translateToStringBuilder.toString();\n $translateToStringBuilder.reset();\n if (isCanonicalRequest) {\n const cacheEntry = this._getStringCacheEntry(true)!;\n cacheEntry.value = result;\n cacheEntry.isTrimmed = !!trimRight;\n }\n return result;\n }\n\n protected _getStringCacheEntry(createIfNeeded: boolean): IBufferLineStringCacheEntry | undefined {\n const cachedEntry = this._stringCacheEntryRef?.deref();\n if (cachedEntry) {\n if (cachedEntry.generation === this._stringCache.generation) {\n return cachedEntry;\n }\n }\n if (!createIfNeeded) {\n return undefined;\n }\n const cacheEntry = this._stringCache.allocateEntry();\n this._stringCacheEntryRef = new WeakRef(cacheEntry);\n return cacheEntry;\n }\n\n private _invalidateStringCache(): void {\n const cacheEntry = this._getStringCacheEntry(false);\n if (cacheEntry) {\n cacheEntry.value = undefined;\n cacheEntry.isTrimmed = false;\n }\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLineStringCache, IBufferLineStringCacheEntry } from './BufferLine';\nimport { disposableTimeout } from '../Async';\nimport { Disposable, MutableDisposable, toDisposable, type IDisposable } from '../Lifecycle';\n\nconst enum Constants {\n CACHE_TTL_MS = 15000\n}\n\nexport class BufferLineStringCache extends Disposable implements IBufferLineStringCache {\n public generation: number = 0;\n public readonly entries: Set = new Set();\n private readonly _clearTimeout = this._register(new MutableDisposable());\n private _lastAccessTimestamp: number = 0;\n\n constructor() {\n super();\n this._register(toDisposable(() => this.entries.clear()));\n }\n\n public touch(): void {\n this._scheduleClear();\n }\n\n public allocateEntry(): IBufferLineStringCacheEntry {\n const entry: IBufferLineStringCacheEntry = {\n value: undefined,\n isTrimmed: false,\n generation: this.generation\n };\n this.entries.add(entry);\n this._scheduleClear();\n return entry;\n }\n\n public clear(): void {\n this._clearTimeout.clear();\n this._lastAccessTimestamp = 0;\n this.generation++;\n for (const entry of this.entries) {\n entry.value = undefined;\n entry.isTrimmed = false;\n }\n this.entries.clear();\n }\n\n private _scheduleClear(): void {\n this._lastAccessTimestamp = Date.now();\n if (this._clearTimeout.value) {\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS);\n }\n\n private _scheduleClearTimeout(timeoutMs: number): void {\n this._clearTimeout.value = disposableTimeout(() => {\n const elapsed = Date.now() - this._lastAccessTimestamp;\n if (elapsed >= Constants.CACHE_TTL_MS) {\n this.clear();\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS - elapsed);\n }, timeoutMs);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '␤' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec § \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" — i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(6081);\n"],"names":["root","factory","exports","module","define","amd","a","i","globalThis","Strings","__importStar","__webpack_require__","TimeBasedDebouncer_1","Lifecycle_1","Services_1","Services_2","Dom_1","AccessibilityManager","Disposable","constructor","_terminal","instantiationService","_coreBrowserService","_renderService","super","this","_rowColumns","WeakMap","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","doc","mainDocument","_accessibilityContainer","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_liveRegion","_liveRegionDebouncer","_register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_refreshRowsDimensions","addDisposableListener","_handleSelectionChange","onDprChange","toDisposable","remove","shift","textContent","tooMuchOutput","get","keyChar","test","push","refresh","buffer","setSize","lines","toString","line","ydisp","columns","lineData","translateToString","undefined","posInSet","set","_alignRowWidth","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","selection","getSelection","isCollapsed","contains","anchorNode","clearSelection","focusNode","console","error","begin","node","offset","anchorOffset","focusOffset","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_FOLLOWING","childNodes","lastRowElement","slice","toRowColumn","rowElement","Text","parentNode","row","parseInt","isNaN","warn","column","cols","beginRowColumn","endRowColumn","select","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","Object","assign","style","width","canvas","fontSize","options","transform","getBoundingClientRect","lastColumn","targetWidth","__decorate","__param","IInstantiationService","ICoreBrowserService","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","MultiKeyMap_1","_color","TwoKeyMap","_css","setCss","bg","fg","getCss","setColor","getColor","clear","Clipboard_1","OscLinkProvider_1","Viewport_1","BufferDecorationRenderer_1","OverviewRulerRenderer_1","CompositionHelper_1","DomRenderer_1","CharSizeService_1","CharacterJoinerService_1","CoreBrowserService_1","LinkProviderService_1","MouseCoordsService_1","MouseService_1","RenderService_1","SelectionService_1","ThemeService_1","KeyboardService_1","Color_1","CoreTerminal_1","Browser","BufferLine_1","XParseColor_1","DecorationService_1","InputHandler_1","AccessibilityManager_1","Linkifier_1","Event_1","CoreBrowserTerminal","CoreTerminal","linkifier","_linkifier","onFocus","_onFocus","event","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","device","MutableDisposable","browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","_onCursorMove","Emitter","onCursorMove","_onKey","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_onDimensionsChange","_setup","_decorationService","_instantiationService","createInstance","DecorationService","setService","IDecorationService","_keyboardService","KeyboardService","IKeyboardService","_linkProviderService","LinkProviderService","ILinkProviderService","registerLinkProvider","OscLinkProvider","_inputHandler","onRequestBell","fire","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","type","_reportWindowsOptions","onColor","_handleColorEvent","EventUtils","forward","_bufferService","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","index","colorRgb","color","toColorRGB","colors","ansi","toRgbString","modifyColors","channels","toColor","narrowedAcc","restoreColor","_reportColorScheme","colorSchemeMode","rgb","relativeLuminance","background","rgba","foreground","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","_showCursor","blur","_handleTextAreaBlur","_compositionHelper","CompositionHelper","y","_syncTextArea","isCursorInViewport","isComposing","cursorY","ybase","bufferLine","cursorX","Math","min","x","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","updateCompositionElements","compositionupdate","compositionend","dispatchEvent","CustomEvent","bubbles","_inputEvent","open","parent","isConnected","_logService","debug","ownerDocument","defaultView","window","_document","documentOverride","Document","dir","toggle","allowTransparency","onSpecificOptionChange","fragment","createDocumentFragment","_viewportElement","updateCursorStyle","_helperContainer","promptLabel","isChromeOS","readOnly","disableStdin","CoreBrowserService","document","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","onRequestColorSchemeQuery","onChangeColors","colorSchemeUpdates","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","onRenderedViewportChange","_onRender","resize","_compositionView","dispose","_mouseCoordsService","MouseCoordsService","IMouseCoordsService","Linkifier","hasRenderer","setRenderer","_createRenderer","handleCursorMove","handleResize","handleBlur","handleFocus","_viewport","Viewport","onRequestScrollLines","SelectionService","ISelectionService","_mouseService","MouseService","IMouseService","amount","suppressScrollEvent","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","any","_onScroll","queueSync","BufferDecorationRenderer","handleMouseDown","mouseStateService","areMouseEventsActive","mouseEventsRequireAlt","disable","enable","screenReaderMode","showScrollbar","scrollbar","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","shouldShow","measure","bindMouse","handleTouchScroll","disposable","DomRenderer","sync","refreshRows","shouldColumnSelect","isCursorInitialized","disp","scrollPages","pageCount","scrollToTop","scrollToBottom","disableSmoothScroll","scrollToLine","scrollAmount","data","attachCustomKeyEventHandler","customKeyEventHandler","attachCustomWheelEventHandler","customWheelEventHandler","setCustomWheelEventHandler","linkProvider","registerCharacterJoiner","handler","joinerId","register","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","setSelection","getSelectionPosition","selectionStart","selectionEnd","selectAll","selectLines","shouldIgnoreComposition","isMac","macOptionIsMeta","altKey","keydown","scrollOnUserInput","result","evaluateKeyDown","scrollCount","_isThirdLevelShift","cancel","useKitty","useWin32InputMode","ctrlKey","metaKey","charCodeAt","wasModifierOnly","wasModifierKeyOnlyEvent","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","evaluateKeyUp","charCode","which","String","fromCharCode","keypress","inputType","input","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","useCapture","domNode","bb","win","getWindow","scrollX","scrollY","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","sort","execute","animationFrameRunner","Async_1","candidateNode","candidateEvent","view","DomListener","_node","_type","_handler","_options","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","b","animationFrameState","Map","WindowIntervalTimer","IntervalTimer","_defaultTarget","cancelAndSet","interval","currentLink","_currentLink","_element","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","onShowLinkUnderline","_onHideLinkUnderline","onHideLinkUnderline","_lastMouseEvent","_activeProviderReplies","_clearCurrentLink","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","_lastBufferCell","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","forEach","reply","linkWithState","linkProvided","linkProviders","entries","existingReply","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","has","splice","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","v","_fireUnderlineEvent","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","lower","upper","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabelInternal","tooMuchOutputInternal","CellData_1","_optionsService","_oscLinkService","_workCell","CellData","callback","linkHandler","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","_getRangeWithLineWrap","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","linkId","startY","finalStartX","endY","finalEndX","currentLine","isWrapped","previousLine","previousLineLength","_hasUrlId","previousStartX","nextLine","nextLineLength","nextEndX","confirm","newWindow","opener","location","href","IOptionsService","IOscLinkService","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","max","_runRefreshCallbacks","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","performance","now","elapsed","waitPeriodBeforeTrailingRefresh","setTimeout","DEFAULT_ANSI_COLORS","freeze","r","g","toCss","toRgba","c","scrollableElement_1","scrollable_1","coreBrowserService","_coreService","themeService","_onRequestScrollLines","_isSyncing","_isHandlingScroll","_suppressOnScrollHandler","_needsSyncOnRender","scrollable","Scrollable","forceIntegerValues","smoothScrollDuration","scheduleAtNextAnimationFrame","cb","setSmoothScrollDuration","_scrollableElement","SmoothScrollableElement","vertical","horizontal","useShadows","mouseWheelSmoothScroll","verticalHasArrows","showArrows","_getChangeOptions","onMultipleOptionChange","updateOptions","onProtocolChange","handleMouseWheel","setScrollDimensions","scrollHeight","runAndSubscribe","backgroundColor","getDomNode","_styleElement","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","join","onBufferActivate","_latestYDisp","_sync","_handleScroll","getScrollPosition","setScrollPosition","reuseAnimation","scrollTop","verticalScrollbarSize","mouseWheelScrollSensitivity","scrollSensitivity","fastScrollSensitivity","_queuedAnimationFrame","synchronizedOutput","newRow","round","diff","translationY","ICoreService","IMouseStateService","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","alt","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","ColorZoneStore_1","drawHeight","drawWidth","drawX","_width","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_refreshDrawConstants","outerWidth","floor","innerWidth","ceil","dpr","pixelsPerLine","nonFullHeight","_store","isDisposed","cssCanvasHeight","deviceCanvasHeight","_refreshDecorations","clearRect","lineWidth","_renderRulerOutline","_renderColorZone","fillStyle","overviewRulerBorder","fillRect","overviewRuler","showTopBorder","showBottomBorder","updateCanvasDimensions","updateAnchor","XTERM_COMPOSITION_SESSION_END_EVENT","_isComposing","hasPendingCompositionFinalization","_pendingComposition","_isSendingComposition","_pendingKeypressData","keypressData","_textarea","_isAwaitingCompositionEnd","_compositionPosition","_compositionSuffix","_dataAlreadySent","_compositionInputData","_lastCompositionData","_compositionStartValue","_compositionStartSelection","_compositionHasObservedProgress","_compositionTransactionId","_compositionTimers","_imeKeydownAwaitingCommit","_cancelDeferredTimer","_compositionPositionTimer","_compositionViewTimer","_compositionEndTimer","_textareaChangeTimer","nextCompositionStart","substring","_resetCompositionView","_dispatchCompositionSessionEvent","detail","id","_hasCompositionProgress","_renderCompositionView","Boolean","transactionId","_defer","pending","endData","_updatePostCompositionInputExpectation","_compositionEndBelongsToCurrentTransaction","_sendPendingComposition","_deferCompositionEnd","_finalizeComposition","timer","_canceledKey","code","timeStamp","_cancelComposition","_deferPreeditResync","_composedRegionLength","_handleAnyTextareaChanges","keypressMayOverlapComposition","expectsPostCompositionInput","_claimImeKeydownCommit","inputData","repeatsPendingTextareaInput","_getPendingTextareaInput","waitForPropagation","wasComposing","lifecycleSettled","sessionEnded","suffix","dataAlreadySent","compositionData","finalizerTimer","_getCompositionInput","_sendCompositionInput","includeFollowingInput","_cancelPendingFinalizer","textareaInput","observedInput","_removeAlreadySentData","_mergeTextObservations","_settlePendingComposition","_dispatchCompositionTransactionSettled","candidate","observed","findShortestOrder","candidateFirstOverlap","endsWith","observedFirstOverlap","overlap","suffixEnd","compositionLength","observedEnd","valueEnd","startsWith","settlesPending","dispatchSessionEnd","prevented","cancelable","defaultPrevented","_endPendingCompositionSession","dataPendingReconciliation","hadPreedit","oldValue","newValue","rowRemainder","_getRowRemainderText","preeditText","_compositionViewData","preedit","className","flexShrink","textDecoration","caret","remainder","whiteSpace","replaceChildren","_compositionPreedit","_compositionCaret","_compositionRemainder","_styleCompositionCaret","cursorWidth","cursor","ensureContrastRatio","marginLeft","verticalAlign","justifyContent","_opaqueViewBackground","opaque","dontRecurse","fontFamily","maxWidth","overflow","anchorBounds","anchorLeft","showsRemainder","direction","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","abs","wrappedRows","verticalDirection","wrappedRowsCount","repeat","sequence","currentRow","lineWraps","startCol","endCol","currentCol","bufferStr","translateBufferLineToString","count","str","rpt","targetX","hasScrollback","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","CoreBrowserTerminal_1","AddonManager_1","BufferNamespaceApi_1","ParserApi_1","UnicodeApi_1","CONSTRUCTOR_ONLY_OPTIONS","$value","Terminal","_core","_addonManager","AddonManager","_publicOptions","getter","propName","setter","_checkReadonlyOptions","desc","defineProperty","_checkProposedApi","allowProposedApi","onBinary","onData","onWriteParsed","parser","_parser","ParserApi","unicode","UnicodeApi","_buffer","BufferNamespaceApi","modes","m","mouseTrackingMode","activeProtocol","applicationCursorKeysMode","applicationCursorKeys","applicationKeypadMode","applicationKeypad","insertMode","originMode","origin","reverseWraparoundMode","reverseWraparound","sendFocusMode","showCursor","isCursorHidden","synchronizedOutputMode","win32InputMode","wraparoundMode","wraparound","wasUserInput","_verifyIntegers","_verifyPositiveIntegers","write","writeln","loadAddon","addon","strings","values","Infinity","DomRendererRowFactory_1","WidthCache_1","Constants_1","RendererUtils_1","SelectionRenderModel_1","TextBlinkStateManager_1","nextTerminalId","_linkifier2","_terminalClass","_selectionRenderModel","createSelectionRenderModel","_lastSelectionColumnMode","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_onRequestRedraw","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_cursorBlinkStateManager","CursorBlinkStateManager","restartBlinkAnimation","_textBlinkStateManager","TextBlinkStateManager","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","styles","_terminalSelector","multiplyOpacity","blinkAnimationUnderlineId","blinkAnimationBarId","blinkAnimationBlockId","cursorAccent","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","INVERTED_DEFAULT_COLOR","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","pause","renderRows","resume","handleViewportVisibilityChange","isVisible","setViewportVisible","oldViewportStart","oldViewportEnd","_lastSelectionStart","_lastSelectionEnd","update","viewportCappedStartRow","viewportCappedEndRow","newViewportStart","newViewportEnd","viewportStartRow","viewportEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","finalEndCol","renderStartRow","renderEndRow","cursorViewportRow","colStart","colEnd","fill","setNeedsBlinkInViewport","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowInfo","hasBlinkingCells","createRow","isBlinkOn","_setRowBlinkState","_updateTextBlinkState","_setCellUnderline","enabled","maxY","bufferline","_isIdlePaused","isFocused","_resetIdleTimer","_clearIdleTimer","_idleTimeout","_stopBlinkingDueToIdle","Constants_2","AttributeData_1","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","blinkOn","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","skipJoinedCheckUntilX","classes","hasHover","isJoined","isValidJoinRange","lastCharX","firstSelectionState","_isCellInSelection","JoinedCellData","isInSelection","isCursorCell","isLinkHover","isBlink","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isInvisible","isDim","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","drawBoldTextInBrightColors","isStrikethrough","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","minimumContrastRatio","treatGlyphAsBackgroundColor","getCode","cache","_getContrastCache","adjustedColor","ratio","halfContrastCache","contrastCache","canvasFactory","WidthCacheFontVariantCanvas","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_canvasElements","_holey","font","weight","weightBold","bold","italic","cp","_measure","variant","OffscreenCanvas","throwIfFalsy","fontStyle","trim","measureText","isPowerlineGlyph","codepoint","isEmoji","glyphSizeX","deviceCellWidth","isNerdFontGlyph","isBoxOrBlockGlyph","currentOffset","SelectionRenderModel","terminal","viewportY","isCellSelected","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","duration","setIntervalDuration","blinkIntervalDuration","_clearInterval","isEnabled","needsBlinkInViewport","_updateIntervalState","_interval","wasBlinkOn","setInterval","clearInterval","dom","fastDomNode_1","globalPointerMoveMonitor_1","scrollbarArrow_1","scrollbarVisibilityController_1","widget_1","platform","AbstractScrollbar","Widget","opts","_lazyRender","lazyRender","_host","host","_scrollable","_scrollByPage","scrollByPage","_scrollbarState","scrollbarState","_visibilityController","ScrollbarVisibilityController","visibility","extraScrollbarClassName","setIsNeeded","isNeeded","_pointerMoveMonitor","GlobalPointerMoveMonitor","_shouldRender","FastDomNode","setDomNode","setPosition","_domNodePointerDown","_createArrow","arrow","ScrollbarArrow","bgDomNode","_createSlider","slider","setClassName","setTop","setLeft","setWidth","setHeight","setLayerHinting","setContain","_sliderPointerDown","_onclick","leftButton","_handleElementSize","visibleSize","setVisibleSize","render","_handleElementScrollSize","elementScrollSize","setScrollSize","_handleElementScrollPosition","elementScrollPosition","beginReveal","setShouldBeVisible","beginHide","_renderDomNode","getRectangleLargeSize","getRectangleSmallSize","_updateSlider","getSliderSize","getArrowSize","getSliderPosition","_handlePointerDown","delegatePointerDown","domTop","getClientRects","sliderStart","sliderStop","pointerPos","_sliderPointerPosition","offsetX","offsetY","domNodePosition","getDomNodePagePosition","pageX","pageY","_pointerDownRelativePosition","_setDesiredScrollPositionNow","getDesiredScrollPositionFromOffsetPaged","getDesiredScrollPositionFromOffset","Element","initialPointerPosition","initialPointerOrthogonalPosition","_sliderOrthogonalPointerPosition","initialScrollbarState","clone","toggleClassName","startMonitoring","pointerId","buttons","pointerMoveData","pointerOrthogonalPosition","pointerOrthogonalDelta","pointerDelta","getDesiredScrollPositionFromDelta","handleDragEnd","handleDragStart","_desiredScrollPosition","desiredScrollPosition","writeScrollPosition","setScrollPositionNow","updateScrollbarSize","scrollbarSize","_updateScrollbarSize","setScrollbarSize","numberAsPixels","_height","_top","_left","_bottom","_right","_className","_position","_layerHint","_contain","setBottom","bottom","setRight","shouldHaveIt","layerHint","contain","name","_hooks","DisposableStore","_pointerMoveCallback","_onStopCallback","stopMonitoring","invokeStopCallback","isMonitoring","onStopCallback","initialElement","initialButtons","pointerMoveCallback","eventSource","setPointerCapture","releasePointerCapture","abstractScrollbar_1","scrollbarState_1","HorizontalScrollbar","scrollDimensions","getScrollDimensions","scrollPosition","getCurrentScrollPosition","ScrollbarState","horizontalHasArrows","horizontalScrollbarSize","scrollWidth","scrollLeft","horizontalSliderSize","sliderSize","sliderPosition","largeSize","smallSize","handleScroll","setOppositeScrollbarSize","setVisibility","sameOriginWindowChainCache","getParentWindowIfSameOrigin","w","parentLocation","IframeUtils","_getSameOriginWindowChain","windowChainCache","WeakRef","iframeElement","frameElement","getPositionOfChildWindowRelativeToAncestorWindow","childWindow","ancestorWindow","windowChain","windowChainEl","windowInChain","deref","boundingRect","timestamp","Date","browserEvent","middleButton","rightButton","shiftKey","posx","posy","body","documentElement","iframeOffsets","deltaX","deltaY","targetNode","srcElement","shouldFactorDPR","isChrome","chromeVersionMatch","navigator","userAgent","match","e1","e2","devicePixelRatio","wheelDeltaY","VERTICAL_AXIS","axis","deltaMode","DOM_DELTA_LINE","wheelDeltaX","isSafari","HORIZONTAL_AXIS","wheelDelta","ScrollState","_forceIntegerValues","_scrollStateBrand","rawScrollLeft","rawScrollTop","equals","other","withScrollDimensions","useRawScrollPositions","withScrollPosition","createScrollEvent","previous","inSmoothScrolling","widthChanged","scrollWidthChanged","scrollLeftChanged","heightChanged","scrollHeightChanged","scrollTopChanged","oldWidth","oldScrollWidth","oldScrollLeft","oldHeight","oldScrollHeight","oldScrollTop","_scrollableBrand","_smoothScrollDuration","_scheduleAtNextAnimationFrame","_state","_smoothScrolling","validateScrollPosition","newState","_setState","acceptScrollDimensions","getFutureScrollPosition","to","setScrollPositionSmooth","validTarget","newSmoothScrolling","SmoothScrollingOperation","from","startTime","animationFrameDisposable","_performSmoothScrolling","hasPendingScrollAnimation","tick","isDone","oldState","SmoothScrollingUpdate","createEaseOutCubic","delta","completion","t","pow","_initAnimations","_scrollLeft","_initAnimation","_scrollTop","viewportSize","stop1","stop2","cut","_tick","newScrollLeft","newScrollTop","mouseEvent_1","horizontalScrollbar_1","verticalScrollbar_1","MouseWheelClassifierItem","score","MouseWheelClassifier","_capacity","_memory","_front","_rear","isPhysicalMouseWheel","remainingInfluence","iteration","influence","acceptStandardWheelEvent","pageZoomFactor","getZoomFactor","accept","previousItem","_computeScore","_isAlmostInt","absDeltaX","absDeltaY","absPreviousDeltaX","absPreviousDeltaY","minDeltaX","minDeltaY","maxDeltaX","maxDeltaY","INSTANCE","resolvedScrollable","ownsScrollable","flipAxes","consumeMouseWheelIfScrollbarIsNeeded","alwaysConsumeMouseWheel","scrollYToX","scrollPredominantAxis","listenOnDomNode","verticalSliderSize","resolveOptions","scrollbarHost","mouseWheelEvent","_handleMouseWheel","_handleDragStart","_handleDragEnd","_verticalScrollbar","VerticalScrollbar","_horizontalScrollbar","_domNode","_leftShadowDomNode","_topShadowDomNode","_topLeftShadowDomNode","_listenOnDomNode","_mouseWheelToDispose","_setListeningToMouseWheel","_onmouseover","_handleMouseOver","_onmouseleave","_handleMouseLeave","_hideTimeout","TimeoutTimer","_isDragging","_mouseIsOver","_revealOnScroll","updateClassName","newClassName","newOptions","_render","delegateScrollFromMouseWheelEvent","StandardWheelEvent","shouldListen","onMouseWheel","passive","classifier","didScroll","shiftConvert","futureScrollPosition","deltaScrollTop","desiredScrollTop","deltaScrollLeft","desiredScrollLeft","consumeMouseWheel","_reveal","renderNow","scrollState","enableTop","enableLeft","leftClassName","topClassName","topLeftClassName","_hide","_scheduleHide","_handleActivate","handleActivate","bgWidth","bgHeight","arrowSize","addStandardDisposableListener","_arrowPointerDown","_pointerdownRepeatTimer","_pointerdownScheduleRepeatTimer","oppositeScrollbarSize","scrollSize","_scrollbarSize","_oppositeScrollbarSize","_arrowSize","_visibleSize","_scrollSize","_scrollPosition","_computedAvailableSize","_computedIsNeeded","_computedSliderSize","_computedSliderRatio","_computedSliderPosition","_refreshComputedValues","iVisibleSize","iScrollSize","iScrollPosition","setArrowSize","iArrowSize","_computeValues","computedAvailableSize","computedRepresentableSize","computedIsNeeded","computedSliderSize","computedSliderRatio","computedSliderPosition","desiredSliderPosition","correctedOffset","visibleClassName","invisibleClassName","_visibility","_visibleClassName","_invisibleClassName","_isVisible","_isNeeded","_rawShouldBeVisible","_shouldBeVisible","_revealTimer","_updateShouldBeVisible","rawShouldBeVisible","_applyVisibilitySetting","shouldBeVisible","ensureVisibility","setIfNotSet","withFadeAway","DomUtils","mainWindow","tail","array","n","LinkedListNode","Undefined","prev","LinkedList","_first","_last","_insert","atTheEnd","newNode","oldLast","oldFirst","didRemove","_remove","Symbol","iterator","EventType","TAP","START","END","CONTEXT_MENU","Gesture","_dispatched","_targets","_ignoreTargets","_activeTouches","_handle","_lastSetTapCountTime","_handleTouchStart","_handleTouchEnd","_handleTouchMove","addTarget","isTouchDevice","None","_instance","ignoreTarget","maxTouchPoints","len","targetTouches","touch","identifier","initialTarget","initialTimeStamp","initialPageX","initialPageY","rollingTimestamps","rollingPageX","rollingPageY","evt","_newGestureEvent","_dispatchEvent","activeTouchCount","keys","changedTouches","hasOwnProperty","holdTime","_holdDelay","finalX","finalY","deltaT","dispatchTo","filter","_inertia","createEvent","initEvent","tapCount","currentTime","getTime","setTapCount","_clearTapCountTime","targets","depth","t1","vX","dirX","vY","dirY","deltaPosX","deltaPosY","stopped","_scrollFriction","translationX","_target","descriptor","fnKey","fn","memoizeKey","args","configurable","enumerable","writable","apply","hasArrows","_arrowScrollDelta","_setArrows","_arrowScroll","currentPosition","_arrowUp","_arrowDown","arrowDelta","_updateArrowSize","listener","StandardMouseEvent","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","TextMetricsMeasureStrategy","DomMeasureStrategy","BaseMeasureStategy","_result","_validateAndSet","_parentElement","_measureElement","fontKerning","Number","offsetWidth","offsetHeight","metrics","fontBoundingBoxAscent","fontBoundingBoxDescent","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","ranges","lineStr","trimmedLength","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_window","_isFocused","_cachedIsFocused","_onDprChange","_onWindowChange","onWindowChange","_screenDprMonitor","ScreenDprMonitor","setWindow","hasFocus","queueMicrotask","_parentWindow","_windowResizeListener","_outerListener","_setDprAndFireIfDiffers","_currentDevicePixelRatio","_updateDpr","_setWindowResizeListener","clearListener","parentWindow","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Keyboard_1","KittyKeyboard_1","Win32InputMode_1","Platform_1","_getWin32InputMode","_win32InputMode","Win32InputMode","_getKittyKeyboard","_kittyKeyboard","KittyKeyboard","evaluateKeyboardEvent","kittyFlags","kittyKeyboard","flags","evaluate","vtExtensions","shouldUseProtocol","providerIndex","indexOf","Mouse_1","getMouseReportCoords","col","touch_1","_mouseStateService","_lastEvent","_wheelPartialScroll","_touchScrollAccumulator","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","_handleWheel","_handleMouseDrag","_altMouseCursor","AltMouseCursorController","events","_handleProtocolChange","_syncMouseModeState","_handlePassiveWheel","_handleTouchChange","_sendEvent","but","action","overrideType","allowCustomWheelEvent","_consumeWheelEvent","stripAltFromReport","_triggerMouseEvent","ctrl","shouldForceSelection","_handleTouchScrollAsWheel","_handleTouchScrollAsKeys","trunc","resetClass","logLevel","_explainEvents","_applyScrollModifier","targetWheelEventPixels","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_PAGE","_equalEvents","isPixelEncoding","restrictMouseEvent","report","encodeMouseEvent","isDefaultEncoding","triggerBinaryEvent","down","up","drag","move","pixels","ILogService","_isActive","_listeners","store","syncFromModifier","_updateClass","altHeld","RenderDebouncer_1","TaskQueue_1","_renderer","decorationService","_observerDisposable","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_pausedResizeTask","DebouncedIdleTask","_renderDebouncer","RenderDebouncer","_syncOutputHandler","SynchronizedOutputHandler","_fullRefresh","_registerIntersectionObserver","observer","IntersectionObserver","_handleIntersectionChange","threshold","_intersectionObserver","disconnect","observe","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","bufferRows","buffered","_fireOnCanvasResize","renderer","_onTimeout","_start","_end","_isBuffering","_timeout","MoveToCell_1","SelectionModel_1","BufferRange_1","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_dragScrollAmount","_enabled","_trimListener","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","rowsChanged","lineText","startRowEndCol","isLinuxMouseSelection","_refreshAnimationFrame","_refresh","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","_handleIncrementalClick","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","hadSelection","_fireOnSelectionChange","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","ServiceRegistry_1","createDecorator","ColorContrastCache_1","Types_1","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_OVERVIEW_RULER_BORDER","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","opacity","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","millis","Promise","resolve","timeout","_token","_isDisposed","_isScheduled","_disposable","context","handle","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","$r","$g","$b","$a","toPaddedHex","s","contrastRatio","l1","l2","color_1","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","css_1","$ctx","$litmusColor","willReadFrequently","globalCompositeOperation","createLinearGradient","rgbaMatch","parseFloat","getImageData","rgb_1","relativeLuminance2","rs","gs","bs","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","InstantiationService_1","LogService_1","BufferService_1","OptionsService_1","CoreService_1","MouseStateService_1","UnicodeV6_1","UnicodeService_1","CharsetService_1","WindowsMode_1","WriteBuffer_1","OscLinkService_1","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","_onData","_onLineFeed","_onResize","_onWriteParsed","InstantiationService","OptionsService","LogService","BufferService","CoreService","MouseStateService","unicodeService","UnicodeService","UnicodeV6","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","flushSync","scroll","eraseAttr","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","registerApcHandler","windowsPty","backend","buildNumber","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_disposed","_event","thisArgs","idx","isArray","call","listeners","initial","Charsets_1","EscapeSequenceParser_1","TextDecoder_1","OscParser_1","DcsParser_1","ApcParser_1","Version_1","GLEVEL","paramToWindowOption","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_unicodeService","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_onRequestColorSchemeQuery","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","_activeBuffer","setCsiHandlerFallback","params","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","setOscHandlerFallback","setDcsHandlerFallback","payload","setApcHandlerFallback","setPrintHandler","print","insertChars","intermediates","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","sendXtVersion","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","kittyKeyboardSet","kittyKeyboardQuery","kittyKeyboardPush","kittyKeyboardPop","setExecuteHandler","bell","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","slowTimeout","slowPromise","_res","rej","race","then","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","TRACE","trace","split","clearRange","decode","subarray","viewportEnd","viewportStart","chWidth","charset","curAttr","bufferRow","markDirty","setCellFromCodepoint","precedingJoinState","ch","currentInfo","charProperties","extractWidth","shouldJoin","extractShouldJoin","stringFromCodePoint","addLineToLink","oldRow","oldCol","_eraseAttrData","BufferLine","copyCellsFrom","addCodepointToCell","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","ApcHandler","convertEol","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollOnEraseInDisplay","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","joinState","idata","itext","codePointAt","tlength","copyWithin","_is","XTERM_VERSION","term","termName","setgCharset","DEFAULT_CHARSET","quirks","allowSetCursorBlink","activeEncoding","mainFlags","altFlags","activateAltBuffer","colorSchemeQuery","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","f","b2v","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","kittySgrBoldFaintControl","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","second","savedCharsets","charsets","savedGlevel","glevel","savedOriginMode","savedWraparoundMode","slots","spec","exec","isValidColorIndex","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","isProtected","block","bar","stack","altStack","mainStack","arg","_disposables","o","_value","_data","third","fourth","_targetWindow","majorVersion","isNode","process","isLegacyEdge","_getKey","logService","_insertedValues","_isFlushingInserted","_deletedIndices","_isFlushingDeleted","_flushInsertedTask","IdleTaskQueue","_flushDeletedTask","insert","_flushCleanupDeleted","enqueue","_flushInserted","sortedAddedValues","sortedAddedValuesIndex","arrayIndex","newArrayIndex","_flushCleanupInserted","_deleteAtKey","_search","_flushDeleted","sortedDeletedIndices","sortedDeletedIndicesIndex","getKeyIterator","forEachByKey","mid","midKey","StringBuilder","_chunks","append","chunk","_limit","_builder","limit","TaskQueue","_tasks","_i","task","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","PriorityTaskQueue","_createDeadline","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","_urlId","_ext","val","CircularList_1","BufferLineStringCache_1","BufferReflow_1","Marker_1","MAX_BUFFER_SIZE","Buffer","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","_memoryCleanupQueue","_stringCache","BufferLineStringCache","getWhitespaceCell","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","reflowCursorLine","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","StringBuilder_1","$startIndex","$workCell","$translateToStringBuilder","fillCellData","_combined","_extendedAttrs","_invalidateStringCache","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","attrs","byteLength","uint32Cells","extKeys","copyFrom","_copySparseMapsFrom","src","applyInReverse","srcData","_copyCellMapsFrom","outColumns","isCanonicalRequest","stringCacheEntry","_getStringCacheEntry","isTrimmed","trimEnd","cacheEntry","createIfNeeded","cachedEntry","_stringCacheEntryRef","generation","allocateEntry","srcStart","_clearTimeout","_lastAccessTimestamp","_scheduleClear","_scheduleClearTimeout","timeoutMs","disposableTimeout","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","Buffer_1","BufferSet","_normalBuffer","_altBuffer","_onBufferActivate","_normal","_alt","inactiveBuffer","obj","combined","attributesEquals","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","_nextId","_onDispose","h","k","q","u","A","B","C","R","Q","K","Y","E","Z","H","_","applicationCursorMode","modifiers","keyMapping","KEYCODE_KEY_MAPPINGS","keyString","toUpperCase","toLowerCase","_functionalKeyCodes","Escape","Enter","Tab","Backspace","CapsLock","ScrollLock","NumLock","PrintScreen","Pause","ContextMenu","F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24","F25","KP_0","KP_1","KP_2","KP_3","KP_4","KP_5","KP_6","KP_7","KP_8","KP_9","KP_Decimal","KP_Divide","KP_Multiply","KP_Subtract","KP_Add","KP_Enter","KP_Equal","ShiftLeft","ShiftRight","ControlLeft","ControlRight","AltLeft","AltRight","MetaLeft","MetaRight","MediaPlayPause","MediaStop","MediaTrackNext","MediaTrackPrevious","AudioVolumeDown","AudioVolumeUp","AudioVolumeMute","_csiTildeKeys","Insert","Delete","PageUp","PageDown","F5","F6","F7","F8","F9","F10","F11","F12","_csiLetterKeys","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","End","_ss3FunctionKeys","F1","F2","F3","F4","_getNumpadKeyCode","_getModifierKeyCode","_encodeModifiers","mods","_getKeyCode","macOptionAsAlt","numpadCode","modifierCode","funcCode","digit","_isModifierKey","_isLockKey","_buildCsiLetterSequence","letter","reportEventTypes","needsEventType","seq","_buildSs3Sequence","_buildCsiTildeSequence","number","_buildCsiUSequence","isFunc","isMod","shiftedKey","textCode","csiLetter","ss3Letter","tildeCode","specialKey","legacyByte","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","wcwidth","num","ucs","bisearch","preceding","createPropertyValue","_codeToVk","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadMultiply","NumpadAdd","NumpadSeparator","NumpadSubtract","NumpadDecimal","NumpadDivide","NumpadEnter","Space","Semicolon","Equal","Comma","Minus","Period","Slash","Backquote","BracketLeft","Backslash","BracketRight","Quote","IntlBackslash","_codeToScancode","_enhancedKeyCodes","_keyToControlChar","_getVirtualKeyCode","vk","_getScanCode","_getUnicodeChar","controlChar","_getControlKeyState","isKeyDown","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","_innerWriteTimer","didProcess","_innerWrite","_scheduleInnerWrite","lastTime","continuation","catch","low","RGB_REX","base","HASH_REX","adv","bits","pad","s2","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","put","utf32ToString","success","handlerResult","LimitedStringBuilder","_payloadLimit","_hitLimit","ret","res","Params_1","unhook","hook","EMPTY_PARAMS","Params","addParam","_params","TransitionTable","Uint16Array","setDefault","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_executeHandlersArr","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_apcParser","ApcParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearApcHandler","clearErrorHandler","resetZdm","csiDone","addDigit","addSubParam","l4","collect","abort","handlersEsc","jj","_put","fromArray","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","cur","_addons","instance","loadedAddon","_wrappedAddonDispose","BufferLineApiView_1","init","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferApiView_1","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","BufferSet_1","isUserScrolling","colsChanged","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","_charsets","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","showCursorImmediately","structuredClone","SortedList_1","$xmin","$xmax","_decorations","_lineCache","DecorationLineCache","_onDecorationRegistered","_onDecorationRemoved","SortedList","attachToBufferLines","Decoration","markerDispose","getDecorationsAtCell","bucket","getDecorationsOnLine","_decorationsByLine","_bufferLineListeners","_lineIndexSyncTimer","MicrotaskTimer","_lineIndexSyncCallbacks","_addToLineBuckets","_removeFromLineBuckets","_handleBufferLinesTrim","_handleBufferLinesInsert","_handleBufferLinesDelete","_getDecorationHeight","_indexedStartLine","_reindexDecoration","_scheduleLineIndexSync","callbacks","newMap","_mergeLineBucket","_applyBufferLinesInsert","_applyBufferLinesDelete","existing","spanCrossers","deleteEnd","toReindex","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","addProtocol","addEncoding","encoding","_customWheelEventHandler","DEFAULT_OPTIONS","rescaleOverlappingGlyphs","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","every","linkData","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","extractCharKind","_activeProvider","getStringCellWidth","precedingInfo","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} ++{"version":3,"file":"xterm.js","mappings":"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AAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,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","sources":["webpack://@xterm/xterm/webpack/universalModuleDefinition","webpack://@xterm/xterm/./src/browser/AccessibilityManager.ts","webpack://@xterm/xterm/./src/browser/Clipboard.ts","webpack://@xterm/xterm/./src/browser/ColorContrastCache.ts","webpack://@xterm/xterm/./src/browser/CoreBrowserTerminal.ts","webpack://@xterm/xterm/./src/browser/Dom.ts","webpack://@xterm/xterm/./src/browser/Linkifier.ts","webpack://@xterm/xterm/./src/browser/LocalizableStrings.ts","webpack://@xterm/xterm/./src/browser/OscLinkProvider.ts","webpack://@xterm/xterm/./src/browser/RenderDebouncer.ts","webpack://@xterm/xterm/./src/browser/TimeBasedDebouncer.ts","webpack://@xterm/xterm/./src/browser/Types.ts","webpack://@xterm/xterm/./src/browser/Viewport.ts","webpack://@xterm/xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://@xterm/xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://@xterm/xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://@xterm/xterm/./src/browser/input/CompositionHelper.ts","webpack://@xterm/xterm/./src/browser/input/Mouse.ts","webpack://@xterm/xterm/./src/browser/input/MoveToCell.ts","webpack://@xterm/xterm/./src/browser/public/Terminal.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://@xterm/xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/Constants.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/SelectionRenderModel.ts","webpack://@xterm/xterm/./src/browser/renderer/shared/TextBlinkStateManager.ts","webpack://@xterm/xterm/./src/browser/scrollable/abstractScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/fastDomNode.ts","webpack://@xterm/xterm/./src/browser/scrollable/globalPointerMoveMonitor.ts","webpack://@xterm/xterm/./src/browser/scrollable/horizontalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/mouseEvent.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollable.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollableElement.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarArrow.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarState.ts","webpack://@xterm/xterm/./src/browser/scrollable/scrollbarVisibilityController.ts","webpack://@xterm/xterm/./src/browser/scrollable/touch.ts","webpack://@xterm/xterm/./src/browser/scrollable/verticalScrollbar.ts","webpack://@xterm/xterm/./src/browser/scrollable/widget.ts","webpack://@xterm/xterm/./src/browser/selection/SelectionModel.ts","webpack://@xterm/xterm/./src/browser/services/CharSizeService.ts","webpack://@xterm/xterm/./src/browser/services/CharacterJoinerService.ts","webpack://@xterm/xterm/./src/browser/services/CoreBrowserService.ts","webpack://@xterm/xterm/./src/browser/services/KeyboardService.ts","webpack://@xterm/xterm/./src/browser/services/LinkProviderService.ts","webpack://@xterm/xterm/./src/browser/services/MouseCoordsService.ts","webpack://@xterm/xterm/./src/browser/services/MouseService.ts","webpack://@xterm/xterm/./src/browser/services/RenderService.ts","webpack://@xterm/xterm/./src/browser/services/SelectionService.ts","webpack://@xterm/xterm/./src/browser/services/Services.ts","webpack://@xterm/xterm/./src/browser/services/ThemeService.ts","webpack://@xterm/xterm/./src/common/Async.ts","webpack://@xterm/xterm/./src/common/CircularList.ts","webpack://@xterm/xterm/./src/common/Color.ts","webpack://@xterm/xterm/./src/common/CoreTerminal.ts","webpack://@xterm/xterm/./src/common/Event.ts","webpack://@xterm/xterm/./src/common/InputHandler.ts","webpack://@xterm/xterm/./src/common/Lifecycle.ts","webpack://@xterm/xterm/./src/common/MultiKeyMap.ts","webpack://@xterm/xterm/./src/common/Platform.ts","webpack://@xterm/xterm/./src/common/SortedList.ts","webpack://@xterm/xterm/./src/common/StringBuilder.ts","webpack://@xterm/xterm/./src/common/TaskQueue.ts","webpack://@xterm/xterm/./src/common/Version.ts","webpack://@xterm/xterm/./src/common/WindowsMode.ts","webpack://@xterm/xterm/./src/common/buffer/AttributeData.ts","webpack://@xterm/xterm/./src/common/buffer/Buffer.ts","webpack://@xterm/xterm/./src/common/buffer/BufferLine.ts","webpack://@xterm/xterm/./src/common/buffer/BufferRange.ts","webpack://@xterm/xterm/./src/common/buffer/BufferReflow.ts","webpack://@xterm/xterm/./src/common/buffer/BufferSet.ts","webpack://@xterm/xterm/./src/common/buffer/CellData.ts","webpack://@xterm/xterm/./src/common/buffer/Constants.ts","webpack://@xterm/xterm/./src/common/buffer/Marker.ts","webpack://@xterm/xterm/./src/common/data/Charsets.ts","webpack://@xterm/xterm/./src/common/input/Keyboard.ts","webpack://@xterm/xterm/./src/common/input/KittyKeyboard.ts","webpack://@xterm/xterm/./src/common/input/TextDecoder.ts","webpack://@xterm/xterm/./src/common/input/UnicodeV6.ts","webpack://@xterm/xterm/./src/common/input/Win32InputMode.ts","webpack://@xterm/xterm/./src/common/input/WriteBuffer.ts","webpack://@xterm/xterm/./src/common/input/XParseColor.ts","webpack://@xterm/xterm/./src/common/parser/ApcParser.ts","webpack://@xterm/xterm/./src/common/parser/DcsParser.ts","webpack://@xterm/xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://@xterm/xterm/./src/common/parser/OscParser.ts","webpack://@xterm/xterm/./src/common/parser/Params.ts","webpack://@xterm/xterm/./src/common/public/AddonManager.ts","webpack://@xterm/xterm/./src/common/public/BufferApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferLineApiView.ts","webpack://@xterm/xterm/./src/common/public/BufferNamespaceApi.ts","webpack://@xterm/xterm/./src/common/public/ParserApi.ts","webpack://@xterm/xterm/./src/common/public/UnicodeApi.ts","webpack://@xterm/xterm/./src/common/services/BufferService.ts","webpack://@xterm/xterm/./src/common/services/CharsetService.ts","webpack://@xterm/xterm/./src/common/services/CoreService.ts","webpack://@xterm/xterm/./src/common/services/DecorationService.ts","webpack://@xterm/xterm/./src/common/services/InstantiationService.ts","webpack://@xterm/xterm/./src/common/services/LogService.ts","webpack://@xterm/xterm/./src/common/services/MouseStateService.ts","webpack://@xterm/xterm/./src/common/services/OptionsService.ts","webpack://@xterm/xterm/./src/common/services/OscLinkService.ts","webpack://@xterm/xterm/./src/common/services/ServiceRegistry.ts","webpack://@xterm/xterm/./src/common/services/Services.ts","webpack://@xterm/xterm/./src/common/services/UnicodeService.ts","webpack://@xterm/xterm/webpack/bootstrap","webpack://@xterm/xterm/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(globalThis, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (␛).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.blur();\n }\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', (e: CompositionEvent) => {\n if (this._compositionHelper instanceof CompositionHelper) {\n if (this._compositionHelper.compositionend(e)) {\n this.textarea!.dispatchEvent(new CustomEvent(\n 'xterm-composition-transaction-accepted',\n { bubbles: true }\n ));\n }\n } else {\n this._compositionHelper!.compositionend();\n }\n }));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._register(toDisposable(() => {\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.dispose();\n }\n }));\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n if (!this._compositionHelper!.keypress?.(key)) {\n this.coreService.triggerDataEvent(key, true);\n }\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n if (\n ev.data &&\n ev.inputType === 'insertText' &&\n !this.optionsService.rawOptions.screenReaderMode &&\n this._compositionHelper instanceof CompositionHelper &&\n this._compositionHelper.input(ev.data)\n ) {\n return true;\n }\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): boolean | void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n keypress?(text: string): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n","/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService, IThemeService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { color } from '../../common/Color';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\ninterface IPendingComposition {\n transactionId: number;\n finalizerTimer?: ReturnType;\n lifecycleSettled: boolean;\n sessionEnded: boolean;\n position: IPosition;\n suffix: string;\n dataAlreadySent: string;\n compositionData: string;\n endData: string;\n inputData: string;\n keypressData: string;\n keypressMayOverlapComposition: boolean;\n expectsPostCompositionInput: boolean;\n nextCompositionStart?: number;\n}\n\nconst XTERM_COMPOSITION_SESSION_START_EVENT = 'xterm-composition-session-start';\nconst XTERM_COMPOSITION_SESSION_END_EVENT = 'xterm-composition-session-end';\nconst XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT =\n 'xterm-composition-transaction-accepted';\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n public get hasPendingCompositionFinalization(): boolean {\n return this._pendingComposition !== undefined;\n }\n public get _isSendingComposition(): boolean {\n return this.hasPendingCompositionFinalization;\n }\n public get _pendingKeypressData(): string {\n return this._pendingComposition?.keypressData ?? '';\n }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n private _pendingComposition?: IPendingComposition;\n\n private _isAwaitingCompositionEnd: boolean;\n\n private _compositionInputData: string;\n\n private _lastCompositionData: string;\n\n private _compositionStartValue: string;\n\n private _compositionStartSelection: IPosition;\n\n private _compositionHasObservedProgress: boolean;\n\n private _canceledKey?: Pick;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n /**\n * Whether the IME consumed the last keydown and still owes the commit it produced. Nothing is\n * forwarded for such a keydown, so the commit is claimed by whichever observes it first.\n */\n private _imeKeydownAwaitingCommit: boolean;\n\n /**\n * Identifies the composition transaction that owns deferred work.\n */\n private _compositionTransactionId: number;\n\n /**\n * Timers that still own deferred composition state.\n */\n private _compositionTimers: Set>;\n\n private _compositionPositionTimer?: ReturnType;\n\n private _compositionViewTimer?: ReturnType;\n\n private _compositionEndTimer?: ReturnType;\n\n /** The preedit's own span, used to anchor the native candidate window. */\n private _compositionPreedit?: HTMLElement;\n\n /** The rendered row tail, set only while the cursor sits mid-line. */\n private _compositionRemainder?: HTMLElement;\n\n /** The insertion caret painted above the renderer cursor the composition view covers. */\n private _compositionCaret?: HTMLElement;\n\n /** The last preedit rendered, so a row repaint can re-render without a composition event. */\n private _compositionViewData?: string;\n\n // Keep the six-argument form callable: upstream's own CompositionHelper.test.ts constructs\n // this class directly, and `.npmignore` strips src/**/*.test.ts from the published tarball, so\n // the shipped patch has no hunk that could update that call. Dropping this overload fails the\n // upstream build with TS2554. The theme service is therefore optional, and every color read\n // below keeps the stock fallback that path needs.\n constructor(\n textarea: HTMLTextAreaElement,\n compositionView: HTMLElement,\n bufferService: IBufferService,\n optionsService: IOptionsService,\n coreService: ICoreService,\n renderService: IRenderService\n );\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService,\n @IThemeService private readonly _themeService?: IThemeService\n ) {\n this._isComposing = false;\n this._isAwaitingCompositionEnd = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionStartValue = '';\n this._compositionStartSelection = { start: 0, end: 0 };\n this._compositionHasObservedProgress = false;\n this._compositionTransactionId = 0;\n this._compositionTimers = new Set();\n this._imeKeydownAwaitingCommit = false;\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = undefined;\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = undefined;\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionStartValue = this._textarea.value;\n this._compositionStartSelection = { start, end };\n this._compositionHasObservedProgress = false;\n // A real session owns everything it commits, so no keydown is left owing one.\n this._imeKeydownAwaitingCommit = false;\n if (this._pendingComposition) {\n this._pendingComposition.nextCompositionStart = this._compositionPosition.start;\n }\n this._compositionTransactionId++;\n this._isComposing = true;\n this._isAwaitingCompositionEnd = true;\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._resetCompositionView();\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionView.classList.add('active');\n this._dispatchCompositionSessionEvent(new CustomEvent(XTERM_COMPOSITION_SESSION_START_EVENT, {\n bubbles: true,\n detail: { id: this._compositionTransactionId }\n }));\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n if (ev.data && !this._isComposing) {\n this.compositionstart();\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (ev.data?.length > 0) {\n this._lastCompositionData = ev.data;\n }\n this._renderCompositionView(ev.data ?? '');\n // Some IMEs resume without compositionstart; keep that inferred transaction visible until\n // compositionend settles it. An empty update hides the overlay without ending the transaction.\n this._compositionView.classList.toggle('active', Boolean(ev.data));\n this.updateCompositionElements();\n const transactionId = this._compositionTransactionId;\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = this._defer(() => {\n if (this._isComposing && this._compositionTransactionId === transactionId) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n });\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(ev?: Pick): boolean {\n if (!this._isAwaitingCompositionEnd) {\n return false;\n }\n if (!this._isComposing) {\n const pending = this._pendingComposition;\n if (pending?.transactionId === this._compositionTransactionId) {\n pending.endData = ev?.data ?? '';\n this._updatePostCompositionInputExpectation(pending);\n }\n return false;\n }\n const endData = ev?.data ?? '';\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n const pending = this._pendingComposition;\n if (pending && pending.transactionId !== this._compositionTransactionId) {\n this._sendPendingComposition(pending);\n }\n this._deferCompositionEnd(endData);\n return false;\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n return true;\n }\n\n public blur(): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._isComposing) {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n this._finalizeComposition(false);\n }\n }\n\n public dispose(): void {\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n for (const timer of this._compositionTimers) {\n clearTimeout(timer);\n }\n this._compositionTimers.clear();\n this._compositionPositionTimer = undefined;\n this._compositionViewTimer = undefined;\n this._compositionEndTimer = undefined;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionTransactionId++;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._canceledKey?.code === ev.code && this._canceledKey.timeStamp === ev.timeStamp) {\n this._canceledKey = undefined;\n return false;\n }\n if (ev.key === 'Escape' && (this._isComposing || this.hasPendingCompositionFinalization)) {\n this._canceledKey = { code: ev.code, timeStamp: ev.timeStamp };\n this._cancelComposition();\n return false;\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n // A key the IME swallows can also empty the preedit — backspacing over the last radical of a\n // Cangjie composition — and some IMEs report that with no composition event at all.\n this._deferPreeditResync(this._composedRegionLength() > 0);\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n // Nothing is forwarded for a keydown the IME consumed, so it is left owing its commit; any\n // other keydown either forwards its own text or produces none, and clears the debt.\n this._imeKeydownAwaitingCommit = ev.keyCode === 229;\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Defers keypress text while a composition finalizer is pending so all input is emitted once\n * after reconciliation with the final textarea candidate.\n */\n public keypress(text: string): boolean {\n const pending = this._pendingComposition;\n if (!pending) {\n return false;\n }\n if (pending.keypressMayOverlapComposition) {\n pending.keypressData += text;\n return true;\n }\n if (pending.expectsPostCompositionInput && pending.keypressData.length === 0) {\n pending.keypressData = text;\n return true;\n }\n this._sendPendingComposition(pending);\n return false;\n }\n\n public input(text: string): boolean {\n if (this._isComposing) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n this._compositionInputData += text;\n return true;\n }\n const pending = this._pendingComposition;\n if (!pending) {\n return this._claimImeKeydownCommit(text);\n }\n if (pending.expectsPostCompositionInput) {\n pending.inputData += text;\n pending.expectsPostCompositionInput = false;\n this._sendPendingComposition(pending);\n return true;\n }\n const repeatsPendingTextareaInput =\n text.length > 0 &&\n this._getPendingTextareaInput(pending) === text &&\n this._getPendingTextareaInput(pending, true) === text;\n this._sendPendingComposition(pending);\n if (!repeatsPendingTextareaInput) {\n this._coreService.triggerDataEvent(text, true);\n }\n return true;\n }\n\n /**\n * Settles the commit a keydown the IME consumed still owes. That commit normally arrives as the\n * deferred textarea diff, but an asynchronous IME can deliver it after the diff has already run\n * and found the textarea unchanged, and with the key still down the terminal drops the input\n * event instead (#12099). Whichever path sees the commit first sends it and cancels the other, so\n * an IME that commits before the diff runs still sends once.\n */\n private _claimImeKeydownCommit(text: string): boolean {\n if (!this._imeKeydownAwaitingCommit) {\n return false;\n }\n this._imeKeydownAwaitingCommit = false;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n this._coreService.triggerDataEvent(text, true);\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean, endData: string = ''): void {\n const wasComposing = this._isComposing;\n this._compositionView.classList.remove('active');\n // Cleared, not just hidden: a rendered tail left in the view is stale DOM the next composition\n // would have to correct before its own first update lands.\n this._resetCompositionView();\n this._isComposing = false;\n if (waitForPropagation && !wasComposing) {\n return;\n }\n\n if (!waitForPropagation) {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition, true);\n }\n if (wasComposing) {\n const input = this._getCompositionInput(\n this._compositionPosition.start + this._dataAlreadySent.length,\n this._compositionSuffix\n );\n this._sendCompositionInput(this._compositionTransactionId, input);\n }\n } else {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition);\n }\n const pending: IPendingComposition = {\n transactionId: this._compositionTransactionId,\n lifecycleSettled: false,\n sessionEnded: false,\n position: {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n },\n suffix: this._compositionSuffix,\n dataAlreadySent: this._dataAlreadySent,\n compositionData: this._lastCompositionData,\n endData,\n inputData: this._compositionInputData,\n keypressData: '',\n keypressMayOverlapComposition:\n this._lastCompositionData.length === 0 && endData.length === 0,\n expectsPostCompositionInput: false\n };\n this._updatePostCompositionInputExpectation(pending);\n this._pendingComposition = pending;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n pending.finalizerTimer = this._defer(() => {\n pending.finalizerTimer = undefined;\n if (this._compositionTransactionId === pending.transactionId) {\n this._isAwaitingCompositionEnd = false;\n }\n if (this._pendingComposition === pending) {\n this._sendPendingComposition(pending, true);\n }\n });\n }\n }\n\n private _sendPendingComposition(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): void {\n this._cancelPendingFinalizer(pending);\n if (this._pendingComposition === pending) {\n this._pendingComposition = undefined;\n }\n const textareaInput = this._getPendingTextareaInput(pending, includeFollowingInput);\n const observedInput = this._removeAlreadySentData(\n pending.inputData || pending.keypressData,\n pending.dataAlreadySent\n );\n // Why: with no textarea, end, input, or keypress evidence the composition\n // was cancelled (e.g. Backspace over the whole preedit); stale\n // compositionupdate data must not be replayed as committed text.\n const input = this._mergeTextObservations(\n textareaInput || pending.endData || (observedInput ? pending.compositionData : ''),\n observedInput,\n pending.keypressMayOverlapComposition\n );\n this._sendCompositionInput(pending.transactionId, input, !pending.sessionEnded);\n this._settlePendingComposition(pending);\n }\n\n private _cancelPendingFinalizer(pending: IPendingComposition): void {\n if (pending.finalizerTimer === undefined) {\n return;\n }\n clearTimeout(pending.finalizerTimer);\n this._compositionTimers.delete(pending.finalizerTimer);\n pending.finalizerTimer = undefined;\n }\n\n private _settlePendingComposition(pending: IPendingComposition): void {\n if (pending.lifecycleSettled) {\n return;\n }\n pending.lifecycleSettled = true;\n this._dispatchCompositionTransactionSettled();\n }\n\n private _mergeTextObservations(\n candidate: string,\n observed: string,\n findShortestOrder: boolean\n ): string {\n if (!observed || candidate.includes(observed)) {\n return candidate;\n }\n if (!candidate || observed.includes(candidate)) {\n return observed;\n }\n if (findShortestOrder) {\n let candidateFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n candidateFirstOverlap > 0 &&\n !candidate.endsWith(observed.substring(0, candidateFirstOverlap))\n ) {\n candidateFirstOverlap--;\n }\n let observedFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n observedFirstOverlap > 0 &&\n !observed.endsWith(candidate.substring(0, observedFirstOverlap))\n ) {\n observedFirstOverlap--;\n }\n return candidateFirstOverlap > observedFirstOverlap\n ? candidate + observed.substring(candidateFirstOverlap)\n : observed + candidate.substring(observedFirstOverlap);\n }\n let overlap = Math.min(candidate.length, observed.length);\n while (overlap > 0 && !candidate.endsWith(observed.substring(0, overlap))) {\n overlap--;\n }\n return candidate + observed.substring(overlap);\n }\n\n private _updatePostCompositionInputExpectation(pending: IPendingComposition): void {\n pending.expectsPostCompositionInput =\n (pending.endData.length > 0 || pending.compositionData.length > 0) &&\n pending.inputData.length === 0 &&\n this._getPendingTextareaInput(pending).length === 0;\n }\n\n private _getPendingTextareaInput(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): string {\n const value = this._textarea.value;\n const start = pending.position.start + pending.dataAlreadySent.length;\n if (pending.nextCompositionStart !== undefined) {\n return value.substring(start, Math.max(start, pending.nextCompositionStart));\n }\n const suffixEnd =\n pending.suffix.length > 0 && value.endsWith(pending.suffix)\n ? value.length - pending.suffix.length\n : value.length;\n const compositionLength = (pending.endData || pending.compositionData).length;\n const observedEnd = includeFollowingInput\n ? suffixEnd\n : Math.max(pending.position.end, start + compositionLength);\n return value.substring(start, Math.max(start, Math.min(suffixEnd, observedEnd)));\n }\n\n private _getCompositionInput(start: number, suffix: string): string {\n const value = this._textarea.value;\n const valueEnd =\n suffix.length > 0 && value.endsWith(suffix) ? value.length - suffix.length : value.length;\n return value.substring(start, Math.max(start, valueEnd));\n }\n\n private _removeAlreadySentData(input: string, dataAlreadySent: string): string {\n if (dataAlreadySent.length === 0) {\n return input;\n }\n if (input.startsWith(dataAlreadySent)) {\n return input.substring(dataAlreadySent.length);\n }\n return dataAlreadySent.includes(input) ? '' : input;\n }\n\n private _cancelComposition(): void {\n const pending = this._pendingComposition;\n if (\n pending &&\n this._isComposing &&\n pending.transactionId !== this._compositionTransactionId\n ) {\n this._sendPendingComposition(pending);\n }\n const transactionId = this._isComposing\n ? this._compositionTransactionId\n : this._pendingComposition?.transactionId ?? 0;\n const settlesPending = pending !== undefined && this._pendingComposition === pending;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n this._textarea.value =\n this._textarea.value.substring(0, this._compositionPosition.start) + this._compositionSuffix;\n this._sendCompositionInput(transactionId, '');\n if (settlesPending && pending) {\n this._settlePendingComposition(pending);\n }\n }\n\n private _sendCompositionInput(\n transactionId: number,\n input: string,\n dispatchSessionEnd: boolean = true\n ): void {\n let prevented = false;\n if (dispatchSessionEnd) {\n const event = new CustomEvent(XTERM_COMPOSITION_SESSION_END_EVENT, {\n bubbles: true,\n cancelable: true,\n detail: { id: transactionId, data: input }\n });\n this._dispatchCompositionSessionEvent(event);\n prevented = event.defaultPrevented;\n }\n if (input.length > 0 && !prevented) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n\n private _endPendingCompositionSession(pending: IPendingComposition): void {\n if (pending.sessionEnded) {\n return;\n }\n pending.sessionEnded = true;\n const input =\n this._getPendingTextareaInput(pending) ||\n pending.endData ||\n pending.compositionData;\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_SESSION_END_EVENT,\n {\n bubbles: true,\n cancelable: true,\n detail: {\n id: pending.transactionId,\n data: input,\n dataPendingReconciliation: true\n }\n }\n ));\n }\n\n private _dispatchCompositionSessionEvent(event: CustomEvent): void {\n if (typeof this._textarea.dispatchEvent === 'function') {\n this._textarea.dispatchEvent(event);\n }\n }\n\n private _dispatchCompositionTransactionSettled(): void {\n this._dispatchCompositionSessionEvent(new CustomEvent(\n 'xterm-composition-transaction-settled',\n { bubbles: true }\n ));\n }\n\n private _deferCompositionEnd(endData: string): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n const transactionId = this._compositionTransactionId;\n const timer = this._defer(() => {\n if (\n this._compositionEndTimer !== timer ||\n !this._isComposing ||\n this._compositionTransactionId !== transactionId\n ) {\n return;\n }\n this._compositionEndTimer = undefined;\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n if (endData.length === 0 && !this._hasCompositionProgress()) {\n this._cancelComposition();\n }\n return;\n }\n this._finalizeComposition(true, endData);\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT,\n { bubbles: true }\n ));\n const pending = this._pendingComposition;\n if (pending?.transactionId === transactionId) {\n this._sendPendingComposition(pending, true);\n }\n });\n this._compositionEndTimer = timer;\n }\n\n /** How much of the textarea the IME currently owns; 0 means there is no preedit left. */\n private _composedRegionLength(): number {\n const end = this._textarea.value.length - this._compositionSuffix.length;\n return Math.max(0, end - this._compositionPosition.start);\n }\n\n /**\n * Re-derives the preedit from the textarea once the key that changed it has settled, and treats\n * a composition emptied that way as cancelled. Mirrors how native terminals clear a preedit on\n * the empty-marked-text state instead of on a specific key.\n */\n private _deferPreeditResync(hadPreedit: boolean): void {\n if (!hadPreedit || !this._isComposing) {\n return;\n }\n const transactionId = this._compositionTransactionId;\n this._defer(() => {\n if (\n this._isComposing &&\n this._compositionTransactionId === transactionId &&\n this._composedRegionLength() === 0\n ) {\n this._cancelComposition();\n }\n });\n }\n\n private _hasCompositionProgress(): boolean {\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n return this._compositionHasObservedProgress || (\n this._textarea.value !== this._compositionStartValue ||\n start !== this._compositionStartSelection.start ||\n end !== this._compositionStartSelection.end\n );\n }\n\n private _compositionEndBelongsToCurrentTransaction(endData: string): boolean {\n return (\n this._hasCompositionProgress() ||\n (endData.length > 0 && endData === this._lastCompositionData)\n );\n }\n\n private _defer(callback: () => void): ReturnType {\n const timer = setTimeout(() => {\n this._compositionTimers.delete(timer);\n callback();\n }, 0);\n this._compositionTimers.add(timer);\n return timer;\n }\n\n private _cancelDeferredTimer(timer?: ReturnType): void {\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n this._compositionTimers.delete(timer);\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n if (newValue !== oldValue) {\n this._imeKeydownAwaitingCommit = false;\n }\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Renders the preedit into the view and, when the cursor sits mid-line, the rest of the row\n * after it, so a composition reads as inserted text pushing the tail right rather than an opaque\n * box hiding the character under the cursor. Nothing reaches the pty while composing, so those\n * cells still hold their characters; only what the overlay shows changes.\n */\n private _renderCompositionView(data: string, rowRemainder = this._getRowRemainderText()): void {\n if (!data) {\n this._resetCompositionView();\n return;\n }\n // Keep DOM order LTR so the insertion caret follows the preedit.\n const preeditText = `‎${data}‎`;\n this._compositionViewData = data;\n const doc = this._compositionView.ownerDocument;\n const preedit = doc.createElement('span');\n preedit.className = 'xterm-composition-preedit';\n // Underlined so the composing text stays distinguishable from the tail it pushed right.\n preedit.style.flexShrink = '0';\n preedit.style.textDecoration = 'underline';\n preedit.textContent = preeditText;\n const caret = doc.createElement('span');\n caret.className = 'xterm-composition-caret';\n caret.setAttribute('aria-hidden', 'true');\n const children = [preedit, caret];\n let remainder: HTMLElement | undefined;\n if (rowRemainder) {\n remainder = doc.createElement('span');\n remainder.className = 'xterm-composition-remainder';\n // Why: the view is nowrap, which collapses runs of spaces, so committed padding would draw\n // its trailing glyph cells to the left of where the grid has them.\n remainder.style.whiteSpace = 'pre';\n remainder.textContent = rowRemainder;\n children.push(remainder);\n }\n this._compositionView.replaceChildren(...children);\n this._compositionPreedit = preedit;\n this._compositionCaret = caret;\n this._compositionRemainder = remainder;\n this._styleCompositionCaret();\n }\n\n /** The committed row text from the cursor rightwards — what a mid-line preedit would cover. */\n private _getRowRemainderText(): string {\n const buffer = this._bufferService.buffer;\n if (!buffer.isCursorInViewport) {\n return '';\n }\n const line = buffer.lines.get(buffer.ybase + buffer.y);\n // The explicit end column keeps this off the line string cache, whose self-renewing\n // idle-clear timer the composition path must not arm.\n return line\n ? line.translateToString(true, Math.min(buffer.x, this._bufferService.cols - 1), line.length)\n : '';\n }\n\n private _styleCompositionCaret(): void {\n const caret = this._compositionCaret;\n if (!caret) {\n return;\n }\n const width = Math.max(1, this._optionsService.rawOptions.cursorWidth);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const colors = this._themeService?.colors;\n const cursor = colors && (\n color.ensureContrastRatio(colors.background, colors.cursor, 3) ?? colors.cursor\n );\n caret.style.backgroundColor = cursor?.css ?? '#FFF';\n caret.style.display = 'inline-block';\n caret.style.flexShrink = '0';\n caret.style.height = cellHeight + 'px';\n caret.style.marginLeft = -width + 'px';\n caret.style.verticalAlign = 'top';\n caret.style.width = width + 'px';\n }\n\n private _resetCompositionView(): void {\n this._compositionView.textContent = '';\n this._compositionPreedit = undefined;\n this._compositionRemainder = undefined;\n this._compositionCaret = undefined;\n this._compositionViewData = '';\n this._compositionView.style.display = '';\n this._compositionView.style.justifyContent = '';\n }\n\n /**\n * The theme background with any alpha dropped. The view masks the cells it draws over, so a\n * see-through background would re-expose the very characters the rendered tail stands in for.\n */\n private _opaqueViewBackground(): string {\n const background = this._themeService?.colors.background;\n return background ? color.opaque(background).css : '#000';\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n // Empty updates hide the overlay without ending the inferred transaction.\n if (!this._compositionView.classList.contains('active')) {\n return;\n }\n\n // A TUI can repaint the row under an open composition (spinners, streamed output), and this\n // already runs on every render — so keep the rendered tail current with the buffer. A string\n // compare adds no layout read.\n const rowRemainder = this._getRowRemainderText();\n if (\n this._compositionViewData &&\n rowRemainder !== (this._compositionRemainder?.textContent ?? '')\n ) {\n this._renderCompositionView(this._compositionViewData, rowRemainder);\n }\n this._styleCompositionCaret();\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n const anchorBounds =\n (this._compositionPreedit ?? this._compositionView).getBoundingClientRect();\n const anchorLeft = cursorLeft + Math.min(0, maxWidth - anchorBounds.width);\n const showsRemainder =\n Boolean(this._compositionRemainder) && anchorBounds.width < maxWidth;\n if (this._compositionRemainder) {\n this._compositionRemainder.style.display = showsRemainder ? '' : 'none';\n }\n // End alignment keeps the caret visible when the preedit consumes the remaining width.\n this._compositionView.style.direction = 'ltr';\n this._compositionView.style.display = showsRemainder ? '' : 'flex';\n this._compositionView.style.justifyContent = showsRemainder ? '' : 'flex-end';\n // Themed rather than the stock #000/#FFF, so the pushed tail reads as ordinary terminal text\n // and light themes keep contrast.\n this._compositionView.style.background = this._opaqueViewBackground();\n this._compositionView.style.color = this._themeService?.colors.foreground.css ?? '#FFF';\n // Sized and placed to match the preedit, not the whole view, so the candidate window\n // anchors to the composing text rather than the end of the rendered tail. The clamp has to\n // be applied here and not only in Orca's terminal-ime-candidate-anchor.ts, because\n // CoreBrowserTerminal calls this from onRender as well as from composition events, and a\n // render can land after the last composition event that module can hear.\n this._textarea.style.left = anchorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(anchorBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(anchorBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = anchorBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = this._defer(() => this.updateCompositionElements(true));\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const enum RendererConstants {\n /**\n * The idle time after which cursor blinking stops.\n */\n CURSOR_BLINK_IDLE_TIMEOUT = 5 * 60 * 1000\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n","import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n readonly mouseupListener: MutableDisposable;\n readonly mousedragListener: MutableDisposable;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const mouseupListener = new MutableDisposable();\n const mousedragListener = new MutableDisposable();\n register(mouseupListener);\n register(mousedragListener);\n const ctx: IMouseBindContext = { target, focus, requestedEvents, mouseupListener, mousedragListener };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n ctx.mouseupListener.clear();\n ctx.mousedragListener.clear();\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n // Use the element's current document in case it moved to another window after open.\n const { element, document: targetDocument } = ctx.target;\n const listenerDocument = element.ownerDocument ?? targetDocument;\n if (ctx.requestedEvents.mouseup) {\n ctx.mouseupListener.value = addDisposableListener(listenerDocument, 'mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.mousedragListener.value = addDisposableListener(listenerDocument, 'mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n ctx.mouseupListener.clear();\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n ctx.mousedragListener.clear();\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // isUserScrolling tracks the normal buffer's viewport, so ED3 on the alt\n // screen must not touch it\n if (this._activeBuffer === this._bufferService.buffers.normal) {\n this._bufferService.isUserScrolling = false;\n }\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n if (this._deleteAtKey(value, key)) {\n return true;\n }\n // A pending deletion whose key mutated after `delete()` (disposing a marker\n // resets `line` to -1, and `line` is the sort key) leaves `_array` out of\n // order, so the binary search above can miss a value that is present.\n // Compacting those entries out restores the order; retry before reporting\n // the value absent, else its `onDecorationRemoved` never fires and the\n // decoration paints forever. Miss path only, so the common bulk delete\n // keeps its O(log n) search and deferred-compaction batching.\n if (this._deletedIndices.length === 0) {\n return false;\n }\n this._flushCleanupDeleted();\n return this._deleteAtKey(value, key);\n }\n\n private _deleteAtKey(value: T, key: number): boolean {\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n²) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.303';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\n\ninterface IExtendedAttrsExt extends IExtendedAttrs {\n _ext: number;\n _urlId: number;\n}\n\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $extended = DEFAULT_ATTR_DATA.extended.clone() as IExtendedAttrsExt;\n\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n public length: number;\n\n /** line text cache */\n protected _cacheValid = false;\n protected _cache: string = '';\n protected _cacheTrimmed = false;\n\n constructor(\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._cacheValid = false;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n // We use $extended as blueprint and reset the internals\n // mimicking the ctor to avoid a new allocation.\n $extended._ext = 0;\n $extended._urlId = 0;\n cell.extended = $extended;\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._cacheValid = false;\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._cacheValid = false;\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n const $idx = index * Constants.CELL_INDICIES;\n this._data[$idx + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[$idx + Cell.FG] = attrs.fg;\n this._data[$idx + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._cacheValid = false;\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._cacheValid = false;\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine, blank?: boolean): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n if (blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n this._combined = {};\n this._extendedAttrs = {};\n } else {\n this._copySparseMapsFrom(line);\n }\n this._cache = '';\n this._cacheValid = false;\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(blank?: boolean): IBufferLine {\n const newLine = new BufferLine(0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n if (!blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n newLine._copySparseMapsFrom(this);\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._cacheValid = false;\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonical = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonical && this._cacheValid) {\n if (trimRight) {\n return this._cacheTrimmed ? this._cache : this._cache.trimEnd();\n }\n if (!this._cacheTrimmed) {\n return this._cache;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n const cellContents: string[] = [];\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n cellContents.push(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = cellContents.join('');\n if (isCanonical) {\n this._cache = result;\n this._cacheValid = true;\n this._cacheTrimmed = !!trimRight;\n }\n return result;\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct alignment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.CODEPOINT_MASK;`\n * write: `content |= codepoint & Content.CODEPOINT_MASK;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indicating whether a cell contains combined content\n * read: `isCombined = content & Content.IS_COMBINED_MASK;`\n * set: `content |= Content.IS_COMBINED_MASK;`\n * clear: `content &= ~Content.IS_COMBINED_MASK;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.HAS_CONTENT_MASK)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.WIDTH_MASK) >> Content.WIDTH_SHIFT;`\n * `hasWidth = content & Content.WIDTH_MASK;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.WIDTH_SHIFT;`\n * write: `content |= (width << Content.WIDTH_SHIFT) & Content.WIDTH_MASK;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.WIDTH_SHIFT;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '␤' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec § \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" — i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n","/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine, true);\n } else {\n buffer.lines.push(newLine.clone(true));\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone(true));\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone(true));\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0 || !this._decorationsByLine.size) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(6081);\n"],"names":["root","factory","exports","module","define","amd","a","i","globalThis","Strings","__importStar","__webpack_require__","TimeBasedDebouncer_1","Lifecycle_1","Services_1","Services_2","Dom_1","AccessibilityManager","Disposable","constructor","_terminal","instantiationService","_coreBrowserService","_renderService","super","this","_rowColumns","WeakMap","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","doc","mainDocument","_accessibilityContainer","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_liveRegion","_liveRegionDebouncer","_register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_refreshRowsDimensions","addDisposableListener","_handleSelectionChange","onDprChange","toDisposable","remove","shift","textContent","tooMuchOutput","get","keyChar","test","push","refresh","buffer","setSize","lines","toString","line","ydisp","columns","lineData","translateToString","undefined","posInSet","set","_alignRowWidth","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","selection","getSelection","isCollapsed","contains","anchorNode","clearSelection","focusNode","console","error","begin","node","offset","anchorOffset","focusOffset","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINED_BY","DOCUMENT_POSITION_FOLLOWING","childNodes","lastRowElement","slice","toRowColumn","rowElement","Text","parentNode","row","parseInt","isNaN","warn","column","cols","beginRowColumn","endRowColumn","select","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","Object","assign","style","width","canvas","fontSize","options","transform","getBoundingClientRect","lastColumn","targetWidth","__decorate","__param","IInstantiationService","ICoreBrowserService","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","MultiKeyMap_1","_color","TwoKeyMap","_css","setCss","bg","fg","getCss","setColor","getColor","clear","Clipboard_1","OscLinkProvider_1","Viewport_1","BufferDecorationRenderer_1","OverviewRulerRenderer_1","CompositionHelper_1","DomRenderer_1","CharSizeService_1","CharacterJoinerService_1","CoreBrowserService_1","LinkProviderService_1","MouseCoordsService_1","MouseService_1","RenderService_1","SelectionService_1","ThemeService_1","KeyboardService_1","Color_1","CoreTerminal_1","Browser","BufferLine_1","XParseColor_1","DecorationService_1","InputHandler_1","AccessibilityManager_1","Linkifier_1","Event_1","CoreBrowserTerminal","CoreTerminal","linkifier","_linkifier","onFocus","_onFocus","event","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","device","MutableDisposable","browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","_onCursorMove","Emitter","onCursorMove","_onKey","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_onDimensionsChange","_setup","_decorationService","_instantiationService","createInstance","DecorationService","setService","IDecorationService","_keyboardService","KeyboardService","IKeyboardService","_linkProviderService","LinkProviderService","ILinkProviderService","registerLinkProvider","OscLinkProvider","_inputHandler","onRequestBell","fire","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","type","_reportWindowsOptions","onColor","_handleColorEvent","EventUtils","forward","_bufferService","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","index","colorRgb","color","toColorRGB","colors","ansi","toRgbString","modifyColors","channels","toColor","narrowedAcc","restoreColor","_reportColorScheme","colorSchemeMode","rgb","relativeLuminance","background","rgba","foreground","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","_showCursor","blur","_handleTextAreaBlur","_compositionHelper","CompositionHelper","y","_syncTextArea","isCursorInViewport","isComposing","cursorY","ybase","bufferLine","cursorX","Math","min","x","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","updateCompositionElements","compositionupdate","compositionend","dispatchEvent","CustomEvent","bubbles","_inputEvent","open","parent","isConnected","_logService","debug","ownerDocument","defaultView","window","_document","documentOverride","Document","dir","toggle","allowTransparency","onSpecificOptionChange","fragment","createDocumentFragment","_viewportElement","updateCursorStyle","_helperContainer","promptLabel","isChromeOS","readOnly","disableStdin","CoreBrowserService","document","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","onRequestColorSchemeQuery","onChangeColors","colorSchemeUpdates","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","onRenderedViewportChange","_onRender","resize","_compositionView","dispose","_mouseCoordsService","MouseCoordsService","IMouseCoordsService","Linkifier","hasRenderer","setRenderer","_createRenderer","handleCursorMove","handleResize","handleBlur","handleFocus","_viewport","Viewport","onRequestScrollLines","SelectionService","ISelectionService","_mouseService","MouseService","IMouseService","amount","suppressScrollEvent","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","any","_onScroll","queueSync","BufferDecorationRenderer","handleMouseDown","mouseStateService","areMouseEventsActive","mouseEventsRequireAlt","disable","enable","screenReaderMode","showScrollbar","scrollbar","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","shouldShow","measure","bindMouse","handleTouchScroll","disposable","DomRenderer","sync","refreshRows","shouldColumnSelect","isCursorInitialized","disp","scrollPages","pageCount","scrollToTop","scrollToBottom","disableSmoothScroll","scrollToLine","scrollAmount","data","attachCustomKeyEventHandler","customKeyEventHandler","attachCustomWheelEventHandler","customWheelEventHandler","setCustomWheelEventHandler","linkProvider","registerCharacterJoiner","handler","joinerId","register","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","setSelection","getSelectionPosition","selectionStart","selectionEnd","selectAll","selectLines","shouldIgnoreComposition","isMac","macOptionIsMeta","altKey","keydown","scrollOnUserInput","result","evaluateKeyDown","scrollCount","_isThirdLevelShift","cancel","useKitty","useWin32InputMode","ctrlKey","metaKey","charCodeAt","wasModifierOnly","wasModifierKeyOnlyEvent","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","evaluateKeyUp","charCode","which","String","fromCharCode","keypress","inputType","input","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","useCapture","domNode","bb","win","getWindow","scrollX","scrollY","targetWindow","runner","priority","state","getAnimationFrameState","item","AnimationFrameQueueItem","next","animFrameRequested","requestAnimationFrame","current","inAnimationFrameRunner","sort","execute","animationFrameRunner","Async_1","candidateNode","candidateEvent","view","DomListener","_node","_type","_handler","_options","useCaptureOrOptions","eventType","CLICK","MOUSE_DOWN","MOUSE_OVER","MOUSE_LEAVE","KEY_DOWN","KEY_UP","INPUT","BLUR","FOCUS","CHANGE","POINTER_DOWN","POINTER_MOVE","POINTER_UP","MOUSE_WHEEL","WHEEL","_runner","_canceled","b","animationFrameState","Map","WindowIntervalTimer","IntervalTimer","_defaultTarget","cancelAndSet","interval","currentLink","_currentLink","_element","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","onShowLinkUnderline","_onHideLinkUnderline","onHideLinkUnderline","_lastMouseEvent","_activeProviderReplies","_clearCurrentLink","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","_lastBufferCell","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","forEach","reply","linkWithState","linkProvided","linkProviders","entries","existingReply","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","has","splice","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","v","_fireUnderlineEvent","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","lower","upper","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabelInternal","tooMuchOutputInternal","CellData_1","_optionsService","_oscLinkService","_workCell","CellData","callback","linkHandler","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","_getRangeWithLineWrap","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","linkId","startY","finalStartX","endY","finalEndX","currentLine","isWrapped","previousLine","previousLineLength","_hasUrlId","previousStartX","nextLine","nextLineLength","nextEndX","confirm","newWindow","opener","location","href","IOptionsService","IOscLinkService","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","_rowEnd","max","_runRefreshCallbacks","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","performance","now","elapsed","waitPeriodBeforeTrailingRefresh","setTimeout","DEFAULT_ANSI_COLORS","freeze","r","g","toCss","toRgba","c","scrollableElement_1","scrollable_1","coreBrowserService","_coreService","themeService","_onRequestScrollLines","_isSyncing","_isHandlingScroll","_suppressOnScrollHandler","_needsSyncOnRender","scrollable","Scrollable","forceIntegerValues","smoothScrollDuration","scheduleAtNextAnimationFrame","cb","setSmoothScrollDuration","_scrollableElement","SmoothScrollableElement","vertical","horizontal","useShadows","mouseWheelSmoothScroll","verticalHasArrows","showArrows","_getChangeOptions","onMultipleOptionChange","updateOptions","onProtocolChange","handleMouseWheel","setScrollDimensions","scrollHeight","runAndSubscribe","backgroundColor","getDomNode","_styleElement","scrollbarSliderBackground","scrollbarSliderHoverBackground","scrollbarSliderActiveBackground","join","onBufferActivate","_latestYDisp","_sync","_handleScroll","getScrollPosition","setScrollPosition","reuseAnimation","scrollTop","verticalScrollbarSize","mouseWheelScrollSensitivity","scrollSensitivity","fastScrollSensitivity","_queuedAnimationFrame","synchronizedOutput","newRow","round","diff","translationY","ICoreService","IMouseStateService","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","alt","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","ColorZoneStore_1","drawHeight","drawWidth","drawX","_width","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_refreshDrawConstants","outerWidth","floor","innerWidth","ceil","dpr","pixelsPerLine","nonFullHeight","_store","isDisposed","cssCanvasHeight","deviceCanvasHeight","_refreshDecorations","clearRect","lineWidth","_renderRulerOutline","_renderColorZone","fillStyle","overviewRulerBorder","fillRect","overviewRuler","showTopBorder","showBottomBorder","updateCanvasDimensions","updateAnchor","XTERM_COMPOSITION_SESSION_END_EVENT","_isComposing","hasPendingCompositionFinalization","_pendingComposition","_isSendingComposition","_pendingKeypressData","keypressData","_textarea","_isAwaitingCompositionEnd","_compositionPosition","_compositionSuffix","_dataAlreadySent","_compositionInputData","_lastCompositionData","_compositionStartValue","_compositionStartSelection","_compositionHasObservedProgress","_compositionTransactionId","_compositionTimers","_imeKeydownAwaitingCommit","_cancelDeferredTimer","_compositionPositionTimer","_compositionViewTimer","_compositionEndTimer","_textareaChangeTimer","nextCompositionStart","substring","_resetCompositionView","_dispatchCompositionSessionEvent","detail","id","_hasCompositionProgress","_renderCompositionView","Boolean","transactionId","_defer","pending","endData","_updatePostCompositionInputExpectation","_compositionEndBelongsToCurrentTransaction","_sendPendingComposition","_deferCompositionEnd","_finalizeComposition","timer","_canceledKey","code","timeStamp","_cancelComposition","_deferPreeditResync","_composedRegionLength","_handleAnyTextareaChanges","keypressMayOverlapComposition","expectsPostCompositionInput","_claimImeKeydownCommit","inputData","repeatsPendingTextareaInput","_getPendingTextareaInput","waitForPropagation","wasComposing","lifecycleSettled","sessionEnded","suffix","dataAlreadySent","compositionData","finalizerTimer","_getCompositionInput","_sendCompositionInput","includeFollowingInput","_cancelPendingFinalizer","textareaInput","observedInput","_removeAlreadySentData","_mergeTextObservations","_settlePendingComposition","_dispatchCompositionTransactionSettled","candidate","observed","findShortestOrder","candidateFirstOverlap","endsWith","observedFirstOverlap","overlap","suffixEnd","compositionLength","observedEnd","valueEnd","startsWith","settlesPending","dispatchSessionEnd","prevented","cancelable","defaultPrevented","_endPendingCompositionSession","dataPendingReconciliation","hadPreedit","oldValue","newValue","rowRemainder","_getRowRemainderText","preeditText","_compositionViewData","preedit","className","flexShrink","textDecoration","caret","remainder","whiteSpace","replaceChildren","_compositionPreedit","_compositionCaret","_compositionRemainder","_styleCompositionCaret","cursorWidth","cursor","ensureContrastRatio","marginLeft","verticalAlign","justifyContent","_opaqueViewBackground","opaque","dontRecurse","fontFamily","maxWidth","overflow","anchorBounds","anchorLeft","showsRemainder","direction","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","abs","wrappedRows","verticalDirection","wrappedRowsCount","repeat","sequence","currentRow","lineWraps","startCol","endCol","currentCol","bufferStr","translateBufferLineToString","count","str","rpt","targetX","hasScrollback","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","CoreBrowserTerminal_1","AddonManager_1","BufferNamespaceApi_1","ParserApi_1","UnicodeApi_1","CONSTRUCTOR_ONLY_OPTIONS","$value","Terminal","_core","_addonManager","AddonManager","_publicOptions","getter","propName","setter","_checkReadonlyOptions","desc","defineProperty","_checkProposedApi","allowProposedApi","onBinary","onData","onWriteParsed","parser","_parser","ParserApi","unicode","UnicodeApi","_buffer","BufferNamespaceApi","modes","m","mouseTrackingMode","activeProtocol","applicationCursorKeysMode","applicationCursorKeys","applicationKeypadMode","applicationKeypad","insertMode","originMode","origin","reverseWraparoundMode","reverseWraparound","sendFocusMode","showCursor","isCursorHidden","synchronizedOutputMode","win32InputMode","wraparoundMode","wraparound","wasUserInput","_verifyIntegers","_verifyPositiveIntegers","write","writeln","loadAddon","addon","strings","values","Infinity","DomRendererRowFactory_1","WidthCache_1","Constants_1","RendererUtils_1","SelectionRenderModel_1","TextBlinkStateManager_1","nextTerminalId","_linkifier2","_terminalClass","_selectionRenderModel","createSelectionRenderModel","_lastSelectionColumnMode","_rowHasBlinkingCells","_rowHasBlinkingCellsCount","_onRequestRedraw","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_cursorBlinkStateManager","CursorBlinkStateManager","restartBlinkAnimation","_textBlinkStateManager","TextBlinkStateManager","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","styles","_terminalSelector","multiplyOpacity","blinkAnimationUnderlineId","blinkAnimationBarId","blinkAnimationBlockId","cursorAccent","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","INVERTED_DEFAULT_COLOR","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","pause","renderRows","resume","handleViewportVisibilityChange","isVisible","setViewportVisible","oldViewportStart","oldViewportEnd","_lastSelectionStart","_lastSelectionEnd","update","viewportCappedStartRow","viewportCappedEndRow","newViewportStart","newViewportEnd","viewportStartRow","viewportEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","finalEndCol","renderStartRow","renderEndRow","cursorViewportRow","colStart","colEnd","fill","setNeedsBlinkInViewport","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowInfo","hasBlinkingCells","createRow","isBlinkOn","_setRowBlinkState","_updateTextBlinkState","_setCellUnderline","enabled","maxY","bufferline","_isIdlePaused","isFocused","_resetIdleTimer","_clearIdleTimer","_idleTimeout","_stopBlinkingDueToIdle","Constants_2","AttributeData_1","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","blinkOn","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","skipJoinedCheckUntilX","classes","hasHover","isJoined","isValidJoinRange","lastCharX","firstSelectionState","_isCellInSelection","JoinedCellData","isInSelection","isCursorCell","isLinkHover","isBlink","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isInvisible","isDim","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","drawBoldTextInBrightColors","isStrikethrough","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","minimumContrastRatio","treatGlyphAsBackgroundColor","getCode","cache","_getContrastCache","adjustedColor","ratio","halfContrastCache","contrastCache","canvasFactory","WidthCacheFontVariantCanvas","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_canvasElements","_holey","font","weight","weightBold","bold","italic","cp","_measure","variant","OffscreenCanvas","throwIfFalsy","fontStyle","trim","measureText","isPowerlineGlyph","codepoint","isEmoji","glyphSizeX","deviceCellWidth","isNerdFontGlyph","isBoxOrBlockGlyph","currentOffset","SelectionRenderModel","terminal","viewportY","isCellSelected","_intervalDuration","_blinkOn","_needsBlinkInViewport","_isViewportVisible","duration","setIntervalDuration","blinkIntervalDuration","_clearInterval","isEnabled","needsBlinkInViewport","_updateIntervalState","_interval","wasBlinkOn","setInterval","clearInterval","dom","fastDomNode_1","globalPointerMoveMonitor_1","scrollbarArrow_1","scrollbarVisibilityController_1","widget_1","platform","AbstractScrollbar","Widget","opts","_lazyRender","lazyRender","_host","host","_scrollable","_scrollByPage","scrollByPage","_scrollbarState","scrollbarState","_visibilityController","ScrollbarVisibilityController","visibility","extraScrollbarClassName","setIsNeeded","isNeeded","_pointerMoveMonitor","GlobalPointerMoveMonitor","_shouldRender","FastDomNode","setDomNode","setPosition","_domNodePointerDown","_createArrow","arrow","ScrollbarArrow","bgDomNode","_createSlider","slider","setClassName","setTop","setLeft","setWidth","setHeight","setLayerHinting","setContain","_sliderPointerDown","_onclick","leftButton","_handleElementSize","visibleSize","setVisibleSize","render","_handleElementScrollSize","elementScrollSize","setScrollSize","_handleElementScrollPosition","elementScrollPosition","beginReveal","setShouldBeVisible","beginHide","_renderDomNode","getRectangleLargeSize","getRectangleSmallSize","_updateSlider","getSliderSize","getArrowSize","getSliderPosition","_handlePointerDown","delegatePointerDown","domTop","getClientRects","sliderStart","sliderStop","pointerPos","_sliderPointerPosition","offsetX","offsetY","domNodePosition","getDomNodePagePosition","pageX","pageY","_pointerDownRelativePosition","_setDesiredScrollPositionNow","getDesiredScrollPositionFromOffsetPaged","getDesiredScrollPositionFromOffset","Element","initialPointerPosition","initialPointerOrthogonalPosition","_sliderOrthogonalPointerPosition","initialScrollbarState","clone","toggleClassName","startMonitoring","pointerId","buttons","pointerMoveData","pointerOrthogonalPosition","pointerOrthogonalDelta","pointerDelta","getDesiredScrollPositionFromDelta","handleDragEnd","handleDragStart","_desiredScrollPosition","desiredScrollPosition","writeScrollPosition","setScrollPositionNow","updateScrollbarSize","scrollbarSize","_updateScrollbarSize","setScrollbarSize","numberAsPixels","_height","_top","_left","_bottom","_right","_className","_position","_layerHint","_contain","setBottom","bottom","setRight","shouldHaveIt","layerHint","contain","name","_hooks","DisposableStore","_pointerMoveCallback","_onStopCallback","stopMonitoring","invokeStopCallback","isMonitoring","onStopCallback","initialElement","initialButtons","pointerMoveCallback","eventSource","setPointerCapture","releasePointerCapture","abstractScrollbar_1","scrollbarState_1","HorizontalScrollbar","scrollDimensions","getScrollDimensions","scrollPosition","getCurrentScrollPosition","ScrollbarState","horizontalHasArrows","horizontalScrollbarSize","scrollWidth","scrollLeft","horizontalSliderSize","sliderSize","sliderPosition","largeSize","smallSize","handleScroll","setOppositeScrollbarSize","setVisibility","sameOriginWindowChainCache","getParentWindowIfSameOrigin","w","parentLocation","IframeUtils","_getSameOriginWindowChain","windowChainCache","WeakRef","iframeElement","frameElement","getPositionOfChildWindowRelativeToAncestorWindow","childWindow","ancestorWindow","windowChain","windowChainEl","windowInChain","deref","boundingRect","timestamp","Date","browserEvent","middleButton","rightButton","shiftKey","posx","posy","body","documentElement","iframeOffsets","deltaX","deltaY","targetNode","srcElement","shouldFactorDPR","isChrome","chromeVersionMatch","navigator","userAgent","match","e1","e2","devicePixelRatio","wheelDeltaY","VERTICAL_AXIS","axis","deltaMode","DOM_DELTA_LINE","wheelDeltaX","isSafari","HORIZONTAL_AXIS","wheelDelta","ScrollState","_forceIntegerValues","_scrollStateBrand","rawScrollLeft","rawScrollTop","equals","other","withScrollDimensions","useRawScrollPositions","withScrollPosition","createScrollEvent","previous","inSmoothScrolling","widthChanged","scrollWidthChanged","scrollLeftChanged","heightChanged","scrollHeightChanged","scrollTopChanged","oldWidth","oldScrollWidth","oldScrollLeft","oldHeight","oldScrollHeight","oldScrollTop","_scrollableBrand","_smoothScrollDuration","_scheduleAtNextAnimationFrame","_state","_smoothScrolling","validateScrollPosition","newState","_setState","acceptScrollDimensions","getFutureScrollPosition","to","setScrollPositionSmooth","validTarget","newSmoothScrolling","SmoothScrollingOperation","from","startTime","animationFrameDisposable","_performSmoothScrolling","hasPendingScrollAnimation","tick","isDone","oldState","SmoothScrollingUpdate","createEaseOutCubic","delta","completion","t","pow","_initAnimations","_scrollLeft","_initAnimation","_scrollTop","viewportSize","stop1","stop2","cut","_tick","newScrollLeft","newScrollTop","mouseEvent_1","horizontalScrollbar_1","verticalScrollbar_1","MouseWheelClassifierItem","score","MouseWheelClassifier","_capacity","_memory","_front","_rear","isPhysicalMouseWheel","remainingInfluence","iteration","influence","acceptStandardWheelEvent","pageZoomFactor","getZoomFactor","accept","previousItem","_computeScore","_isAlmostInt","absDeltaX","absDeltaY","absPreviousDeltaX","absPreviousDeltaY","minDeltaX","minDeltaY","maxDeltaX","maxDeltaY","INSTANCE","resolvedScrollable","ownsScrollable","flipAxes","consumeMouseWheelIfScrollbarIsNeeded","alwaysConsumeMouseWheel","scrollYToX","scrollPredominantAxis","listenOnDomNode","verticalSliderSize","resolveOptions","scrollbarHost","mouseWheelEvent","_handleMouseWheel","_handleDragStart","_handleDragEnd","_verticalScrollbar","VerticalScrollbar","_horizontalScrollbar","_domNode","_leftShadowDomNode","_topShadowDomNode","_topLeftShadowDomNode","_listenOnDomNode","_mouseWheelToDispose","_setListeningToMouseWheel","_onmouseover","_handleMouseOver","_onmouseleave","_handleMouseLeave","_hideTimeout","TimeoutTimer","_isDragging","_mouseIsOver","_revealOnScroll","updateClassName","newClassName","newOptions","_render","delegateScrollFromMouseWheelEvent","StandardWheelEvent","shouldListen","onMouseWheel","passive","classifier","didScroll","shiftConvert","futureScrollPosition","deltaScrollTop","desiredScrollTop","deltaScrollLeft","desiredScrollLeft","consumeMouseWheel","_reveal","renderNow","scrollState","enableTop","enableLeft","leftClassName","topClassName","topLeftClassName","_hide","_scheduleHide","_handleActivate","handleActivate","bgWidth","bgHeight","arrowSize","addStandardDisposableListener","_arrowPointerDown","_pointerdownRepeatTimer","_pointerdownScheduleRepeatTimer","oppositeScrollbarSize","scrollSize","_scrollbarSize","_oppositeScrollbarSize","_arrowSize","_visibleSize","_scrollSize","_scrollPosition","_computedAvailableSize","_computedIsNeeded","_computedSliderSize","_computedSliderRatio","_computedSliderPosition","_refreshComputedValues","iVisibleSize","iScrollSize","iScrollPosition","setArrowSize","iArrowSize","_computeValues","computedAvailableSize","computedRepresentableSize","computedIsNeeded","computedSliderSize","computedSliderRatio","computedSliderPosition","desiredSliderPosition","correctedOffset","visibleClassName","invisibleClassName","_visibility","_visibleClassName","_invisibleClassName","_isVisible","_isNeeded","_rawShouldBeVisible","_shouldBeVisible","_revealTimer","_updateShouldBeVisible","rawShouldBeVisible","_applyVisibilitySetting","shouldBeVisible","ensureVisibility","setIfNotSet","withFadeAway","DomUtils","mainWindow","tail","array","n","LinkedListNode","Undefined","prev","LinkedList","_first","_last","_insert","atTheEnd","newNode","oldLast","oldFirst","didRemove","_remove","Symbol","iterator","EventType","TAP","START","END","CONTEXT_MENU","Gesture","_dispatched","_targets","_ignoreTargets","_activeTouches","_handle","_lastSetTapCountTime","_handleTouchStart","_handleTouchEnd","_handleTouchMove","addTarget","isTouchDevice","None","_instance","ignoreTarget","maxTouchPoints","len","targetTouches","touch","identifier","initialTarget","initialTimeStamp","initialPageX","initialPageY","rollingTimestamps","rollingPageX","rollingPageY","evt","_newGestureEvent","_dispatchEvent","activeTouchCount","keys","changedTouches","hasOwnProperty","holdTime","_holdDelay","finalX","finalY","deltaT","dispatchTo","filter","_inertia","createEvent","initEvent","tapCount","currentTime","getTime","setTapCount","_clearTapCountTime","targets","depth","t1","vX","dirX","vY","dirY","deltaPosX","deltaPosY","stopped","_scrollFriction","translationX","_target","descriptor","fnKey","fn","memoizeKey","args","configurable","enumerable","writable","apply","hasArrows","_arrowScrollDelta","_setArrows","_arrowScroll","currentPosition","_arrowUp","_arrowDown","arrowDelta","_updateArrowSize","listener","StandardMouseEvent","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","TextMetricsMeasureStrategy","DomMeasureStrategy","BaseMeasureStategy","_result","_validateAndSet","_parentElement","_measureElement","fontKerning","Number","offsetWidth","offsetHeight","metrics","fontBoundingBoxAscent","fontBoundingBoxDescent","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","ranges","lineStr","trimmedLength","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_window","_isFocused","_cachedIsFocused","_onDprChange","_onWindowChange","onWindowChange","_screenDprMonitor","ScreenDprMonitor","setWindow","hasFocus","queueMicrotask","_parentWindow","_windowResizeListener","_outerListener","_setDprAndFireIfDiffers","_currentDevicePixelRatio","_updateDpr","_setWindowResizeListener","clearListener","parentWindow","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Keyboard_1","KittyKeyboard_1","Win32InputMode_1","Platform_1","_getWin32InputMode","_win32InputMode","Win32InputMode","_getKittyKeyboard","_kittyKeyboard","KittyKeyboard","evaluateKeyboardEvent","kittyFlags","kittyKeyboard","flags","evaluate","vtExtensions","shouldUseProtocol","providerIndex","indexOf","Mouse_1","getMouseReportCoords","col","touch_1","_mouseStateService","_lastEvent","_wheelPartialScroll","_touchScrollAccumulator","mouseupListener","mousedragListener","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","_handleWheel","_handleMouseDrag","_altMouseCursor","AltMouseCursorController","events","_handleProtocolChange","_syncMouseModeState","_handlePassiveWheel","_handleTouchChange","_sendEvent","but","action","overrideType","allowCustomWheelEvent","_consumeWheelEvent","stripAltFromReport","_triggerMouseEvent","ctrl","shouldForceSelection","targetDocument","listenerDocument","_handleTouchScrollAsWheel","_handleTouchScrollAsKeys","trunc","resetClass","logLevel","_explainEvents","_applyScrollModifier","targetWheelEventPixels","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_PAGE","_equalEvents","isPixelEncoding","restrictMouseEvent","report","encodeMouseEvent","isDefaultEncoding","triggerBinaryEvent","down","up","drag","move","pixels","ILogService","_isActive","_listeners","store","syncFromModifier","_updateClass","altHeld","RenderDebouncer_1","TaskQueue_1","_renderer","decorationService","_observerDisposable","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_pausedResizeTask","DebouncedIdleTask","_renderDebouncer","RenderDebouncer","_syncOutputHandler","SynchronizedOutputHandler","_fullRefresh","_registerIntersectionObserver","observer","IntersectionObserver","_handleIntersectionChange","threshold","_intersectionObserver","disconnect","observe","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","bufferRows","buffered","_fireOnCanvasResize","renderer","_onTimeout","_start","_end","_isBuffering","_timeout","MoveToCell_1","SelectionModel_1","BufferRange_1","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_dragScrollAmount","_enabled","_trimListener","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","rowsChanged","lineText","startRowEndCol","isLinuxMouseSelection","_refreshAnimationFrame","_refresh","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","_handleIncrementalClick","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","hadSelection","_fireOnSelectionChange","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","ServiceRegistry_1","createDecorator","ColorContrastCache_1","Types_1","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_OVERVIEW_RULER_BORDER","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","opacity","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","millis","Promise","resolve","timeout","_token","_isDisposed","_isScheduled","_disposable","context","handle","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","$r","$g","$b","$a","toPaddedHex","s","contrastRatio","l1","l2","color_1","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","css_1","$ctx","$litmusColor","willReadFrequently","globalCompositeOperation","createLinearGradient","rgbaMatch","parseFloat","getImageData","rgb_1","relativeLuminance2","rs","gs","bs","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","InstantiationService_1","LogService_1","BufferService_1","OptionsService_1","CoreService_1","MouseStateService_1","UnicodeV6_1","UnicodeService_1","CharsetService_1","WindowsMode_1","WriteBuffer_1","OscLinkService_1","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","_onData","_onLineFeed","_onResize","_onWriteParsed","InstantiationService","OptionsService","LogService","BufferService","CoreService","MouseStateService","unicodeService","UnicodeService","UnicodeV6","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","flushSync","scroll","eraseAttr","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","registerApcHandler","windowsPty","backend","buildNumber","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_disposed","_event","thisArgs","idx","isArray","call","listeners","initial","Charsets_1","EscapeSequenceParser_1","TextDecoder_1","OscParser_1","DcsParser_1","ApcParser_1","Version_1","GLEVEL","paramToWindowOption","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_unicodeService","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_onRequestColorSchemeQuery","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","_activeBuffer","setCsiHandlerFallback","params","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","setOscHandlerFallback","setDcsHandlerFallback","payload","setApcHandlerFallback","setPrintHandler","print","insertChars","intermediates","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","sendXtVersion","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","kittyKeyboardSet","kittyKeyboardQuery","kittyKeyboardPush","kittyKeyboardPop","setExecuteHandler","bell","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","slowTimeout","slowPromise","_res","rej","race","then","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","TRACE","trace","split","clearRange","decode","subarray","viewportEnd","viewportStart","chWidth","charset","curAttr","bufferRow","markDirty","setCellFromCodepoint","precedingJoinState","ch","currentInfo","charProperties","extractWidth","shouldJoin","extractShouldJoin","stringFromCodePoint","addLineToLink","oldRow","oldCol","_eraseAttrData","BufferLine","copyCellsFrom","addCodepointToCell","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","ApcHandler","convertEol","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollOnEraseInDisplay","scrollBackSize","isUserScrolling","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","joinState","idata","itext","codePointAt","tlength","copyWithin","_is","XTERM_VERSION","term","termName","setgCharset","DEFAULT_CHARSET","quirks","allowSetCursorBlink","activeEncoding","mainFlags","altFlags","activateAltBuffer","colorSchemeQuery","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","f","b2v","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","kittySgrBoldFaintControl","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","second","savedCharsets","charsets","savedGlevel","glevel","savedOriginMode","savedWraparoundMode","slots","spec","exec","isValidColorIndex","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","isProtected","block","bar","stack","altStack","mainStack","arg","_disposables","o","_value","_data","third","fourth","_targetWindow","majorVersion","isNode","process","isLegacyEdge","_getKey","logService","_insertedValues","_isFlushingInserted","_deletedIndices","_isFlushingDeleted","_flushInsertedTask","IdleTaskQueue","_flushDeletedTask","insert","_flushCleanupDeleted","enqueue","_flushInserted","sortedAddedValues","sortedAddedValuesIndex","arrayIndex","newArrayIndex","_flushCleanupInserted","_deleteAtKey","_search","_flushDeleted","sortedDeletedIndices","sortedDeletedIndicesIndex","getKeyIterator","forEachByKey","mid","midKey","StringBuilder","_chunks","append","chunk","_limit","_builder","limit","TaskQueue","_tasks","_i","task","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","deadlineRemaining","longestTask","lastDeadlineRemaining","timeRemaining","PriorityTaskQueue","_createDeadline","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","getUnderlineVariantOffset","underlineVariantOffset","_urlId","_ext","val","CircularList_1","BufferReflow_1","Marker_1","MAX_BUFFER_SIZE","Buffer","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","_memoryCleanupQueue","getWhitespaceCell","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","reflowCursorLine","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","$startIndex","$workCell","$extended","fillCellData","_combined","_extendedAttrs","_cacheValid","_cache","_cacheTrimmed","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","attrs","$idx","byteLength","uint32Cells","extKeys","copyFrom","blank","_copySparseMapsFrom","src","applyInReverse","srcData","_copyCellMapsFrom","outColumns","isCanonical","trimEnd","cellContents","srcStart","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","Buffer_1","BufferSet","_normalBuffer","_altBuffer","_onBufferActivate","_normal","_alt","inactiveBuffer","obj","combined","attributesEquals","thisDefault","otherDefault","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","_nextId","_onDispose","h","k","q","u","A","B","C","R","Q","K","Y","E","Z","H","_","applicationCursorMode","modifiers","keyMapping","KEYCODE_KEY_MAPPINGS","keyString","toUpperCase","toLowerCase","_functionalKeyCodes","Escape","Enter","Tab","Backspace","CapsLock","ScrollLock","NumLock","PrintScreen","Pause","ContextMenu","F13","F14","F15","F16","F17","F18","F19","F20","F21","F22","F23","F24","F25","KP_0","KP_1","KP_2","KP_3","KP_4","KP_5","KP_6","KP_7","KP_8","KP_9","KP_Decimal","KP_Divide","KP_Multiply","KP_Subtract","KP_Add","KP_Enter","KP_Equal","ShiftLeft","ShiftRight","ControlLeft","ControlRight","AltLeft","AltRight","MetaLeft","MetaRight","MediaPlayPause","MediaStop","MediaTrackNext","MediaTrackPrevious","AudioVolumeDown","AudioVolumeUp","AudioVolumeMute","_csiTildeKeys","Insert","Delete","PageUp","PageDown","F5","F6","F7","F8","F9","F10","F11","F12","_csiLetterKeys","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","End","_ss3FunctionKeys","F1","F2","F3","F4","_getNumpadKeyCode","_getModifierKeyCode","_encodeModifiers","mods","_getKeyCode","macOptionAsAlt","numpadCode","modifierCode","funcCode","digit","_isModifierKey","_isLockKey","_buildCsiLetterSequence","letter","reportEventTypes","needsEventType","seq","_buildSs3Sequence","_buildCsiTildeSequence","number","_buildCsiUSequence","isFunc","isMod","shiftedKey","textCode","csiLetter","ss3Letter","tildeCode","specialKey","legacyByte","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","wcwidth","num","ucs","bisearch","preceding","createPropertyValue","_codeToVk","KeyA","KeyB","KeyC","KeyD","KeyE","KeyF","KeyG","KeyH","KeyI","KeyJ","KeyK","KeyL","KeyM","KeyN","KeyO","KeyP","KeyQ","KeyR","KeyS","KeyT","KeyU","KeyV","KeyW","KeyX","KeyY","KeyZ","Digit0","Digit1","Digit2","Digit3","Digit4","Digit5","Digit6","Digit7","Digit8","Digit9","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","NumpadMultiply","NumpadAdd","NumpadSeparator","NumpadSubtract","NumpadDecimal","NumpadDivide","NumpadEnter","Space","Semicolon","Equal","Comma","Minus","Period","Slash","Backquote","BracketLeft","Backslash","BracketRight","Quote","IntlBackslash","_codeToScancode","_enhancedKeyCodes","_keyToControlChar","_getVirtualKeyCode","vk","_getScanCode","_getUnicodeChar","controlChar","_getControlKeyState","isKeyDown","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","_innerWriteTimer","didProcess","_innerWrite","_scheduleInnerWrite","lastTime","continuation","catch","low","RGB_REX","base","HASH_REX","adv","bits","pad","s2","StringBuilder_1","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","put","utf32ToString","success","handlerResult","LimitedStringBuilder","_payloadLimit","_hitLimit","ret","res","Params_1","unhook","hook","EMPTY_PARAMS","Params","addParam","_params","TransitionTable","Uint16Array","setDefault","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_executeHandlersArr","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_apcParser","ApcParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearApcHandler","clearErrorHandler","resetZdm","csiDone","addDigit","addSubParam","l4","collect","abort","handlersEsc","jj","_put","fromArray","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","cur","_addons","instance","loadedAddon","_wrappedAddonDispose","BufferLineApiView_1","init","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferApiView_1","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","BufferSet_1","colsChanged","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","_charsets","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","showCursorImmediately","structuredClone","SortedList_1","$xmin","$xmax","_decorations","_lineCache","DecorationLineCache","_onDecorationRegistered","_onDecorationRemoved","SortedList","attachToBufferLines","Decoration","markerDispose","getDecorationsAtCell","bucket","getDecorationsOnLine","_decorationsByLine","_bufferLineListeners","_lineIndexSyncTimer","MicrotaskTimer","_lineIndexSyncCallbacks","_addToLineBuckets","_removeFromLineBuckets","_handleBufferLinesTrim","_handleBufferLinesInsert","_handleBufferLinesDelete","_getDecorationHeight","_indexedStartLine","_reindexDecoration","_scheduleLineIndexSync","callbacks","newMap","_mergeLineBucket","_applyBufferLinesInsert","_applyBufferLinesDelete","existing","spanCrossers","deleteEnd","toReindex","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","info","INFO","ERROR","off","OFF","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","addProtocol","addEncoding","encoding","_customWheelEventHandler","DEFAULT_OPTIONS","rescaleOverlappingGlyphs","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","every","linkData","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","extractCharKind","_activeProvider","getStringCellWidth","precedingInfo","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/xterm.mjs b/lib/xterm.mjs -index 9bc5087a0729e74e20b59eddf5d8259e056de338..9b77f3f1ed2424e4f92725418535a8cbf843aa73 100644 +index 7be5c35968284a175066eaefc3be48fde9990601..b01fd3c618af931dc292ad45beffb735d4313095 100644 --- a/lib/xterm.mjs +++ b/lib/xterm.mjs @@ -14,14 +14,14 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ --var Ms=Object.defineProperty;var kn=Object.getOwnPropertyDescriptor;var Mn=(n,i)=>{for(var e in i)Ms(n,e,{get:i[e],enumerable:!0})};var y=(n,i,e,t)=>{for(var r=t>1?void 0:t?kn(i,e):i,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(t?o(i,e,r):o(r))||r);return t&&r&&Ms(i,e,r),r},m=(n,i)=>(e,t)=>i(e,t,n);var Bs="Terminal input",Ut={get:()=>Bs,set:n=>Bs=n},Ps="Too much output to announce, navigate to rows manually to read",Ze={get:()=>Ps,set:n=>Ps=n};function Bn(n){return n.replace(/\r?\n/g,"\r")}function Pn(n,i){return i?`\x1B[200~${n.replace(/\x1b/g,"\u241B")}\x1B[201~`:n}function Os(n,i){n.clipboardData&&n.clipboardData.setData("text/plain",i.selectionText),n.preventDefault()}function Ns(n,i,e,t){if(n.stopPropagation(),n.clipboardData){let r=n.clipboardData.getData("text/plain");Nr(r,i,e,t)}}function Nr(n,i,e,t){n=Bn(n),n=Pn(n,e.decPrivateModes.bracketedPasteMode&&t.rawOptions.ignoreBracketedPasteMode!==!0),e.triggerDataEvent(n,!0),i.value=""}function Fr(n,i,e){let t=e.getBoundingClientRect(),r=n.clientX-t.left-10,s=n.clientY-t.top-10;i.style.width="20px",i.style.height="20px",i.style.left=`${r}px`,i.style.top=`${s}px`,i.style.zIndex="1000",i.focus()}function Hr(n,i,e,t,r){Fr(n,i,e),r&&t.rightClickSelect(n),i.value=t.selectionText,i.select()}function be(n){return n>65535?(n-=65536,String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):String.fromCharCode(n)}function ye(n,i=0,e=n.length){let t="";for(let r=i;r65535?(s-=65536,t+=String.fromCharCode((s>>10)+55296)+String.fromCharCode(s%1024+56320)):t+=String.fromCharCode(s)}return t}var mi=class{constructor(){this._interim=0}clear(){this._interim=0}decode(i,e){let t=i.length;if(!t)return 0;let r=0,s=0;if(this._interim){let o=i.charCodeAt(s++);56320<=o&&o<=57343?e[r++]=(this._interim-55296)*1024+o-56320+65536:(e[r++]=this._interim,e[r++]=o),this._interim=0}for(let o=s;o=t)return this._interim=a,r;let l=i.charCodeAt(o);56320<=l&&l<=57343?e[r++]=(a-55296)*1024+l-56320+65536:(e[r++]=a,e[r++]=l);continue}a!==65279&&(e[r++]=a)}return r}},bi=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(i,e){let t=i.length;if(!t)return 0;let r=0,s,o,a,l,h,d=0;if(this.interim[0]){let _=!1,p=this.interim[0];p&=(p&224)===192?31:(p&240)===224?15:7;let v=0,f;for(;(f=this.interim[++v])&&v<4;)p<<=6,p|=f&63;let S=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,I=S-v;for(;d=t)return 0;if(f=i[d++],(f&192)!==128){d--,_=!0;break}else this.interim[v++]=f,p<<=6,p|=f&63}_||(S===2?p<128?d--:e[r++]=p:S===3?p<2048||p>=55296&&p<=57343||p===65279||(e[r++]=p):p<65536||p>1114111||(e[r++]=p)),this.interim.fill(0)}let c=t-4,u=d;for(;u=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(h=(s&31)<<6|o&63,h<128){u--;continue}e[r++]=h}else if((s&240)===224){if(u>=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,r;if(a=i[u++],(a&192)!==128){u--;continue}if(h=(s&15)<<12|(o&63)<<6|a&63,h<2048||h>=55296&&h<=57343||h===65279)continue;e[r++]=h}else if((s&248)===240){if(u>=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,r;if(a=i[u++],(a&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,this.interim[2]=a,r;if(l=i[u++],(l&192)!==128){u--;continue}if(h=(s&7)<<18|(o&63)<<12|(a&63)<<6|l&63,h<65536||h>1114111)continue;e[r++]=h}}return r}};var ue=class n{constructor(){this.fg=0;this.bg=0;this.extended=new ke}static toColorRGB(i){return[i>>>16&255,i>>>8&255,i&255]}static fromColorRGB(i){return(i[0]&255)<<16|(i[1]&255)<<8|i[2]&255}clone(){let i=new n;return i.fg=this.fg,i.bg=this.bg,i.extended=this.extended.clone(),i}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},ke=class n{constructor(i=0,e=0){this._ext=0;this._urlId=0;this._ext=i,this._urlId=e}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(i){this._ext=i}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(i){this._ext&=-469762049,this._ext|=i<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(i){this._ext&=-67108864,this._ext|=i&67108863}get urlId(){return this._urlId}set urlId(i){this._urlId=i}get underlineVariantOffset(){let i=(this._ext&3758096384)>>29;return i<0?i^4294967288:i}set underlineVariantOffset(i){this._ext&=536870911,this._ext|=i<<29&3758096384}clone(){return new n(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var F=class n extends ue{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new ke;this.combinedData=""}static fromCharData(e){let t=new n;return t.setFromCharData(e),t}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?be(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let r=e[1].charCodeAt(0);if(55296<=r&&r<=56319){let s=e[1].charCodeAt(1);56320<=s&&s<=57343?this.content=(r-55296)*1024+s-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor()||this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor()||this.isInverse()!==e.isInverse()||this.isBold()!==e.isBold()||this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;let t=this.isUnderlineColorDefault(),r=e.isUnderlineColorDefault();if(!(t&&r)&&(t!==r||this.getUnderlineColor()!==e.getUnderlineColor()||this.getUnderlineColorMode()!==e.getUnderlineColorMode()))return!1}return!(this.isOverline()!==e.isOverline()||this.isBlink()!==e.isBlink()||this.isInvisible()!==e.isInvisible()||this.isItalic()!==e.isItalic()||this.isDim()!==e.isDim()||this.isStrikethrough()!==e.isStrikethrough())}};var zr=new Map;function Hs(n){return n.di$dependencies||[]}function H(n){if(zr.has(n))return zr.get(n);let i=function(e,t,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Fn(i,e,r)};return i._id=n,zr.set(n,i),i}function Fn(n,i,e){i.di$target===i?i.di$dependencies.push({id:n,index:e}):(i.di$dependencies=[{id:n,index:e}],i.di$target=i)}var D=H("BufferService"),Me=H("MouseStateService"),Y=H("CoreService"),Ws=H("CharsetService"),Qe=H("InstantiationService");var fe=H("LogService"),R=H("OptionsService"),vi=H("OscLinkService"),Us=H("UnicodeService"),ge=H("DecorationService");var et=class{constructor(i,e,t){this._bufferService=i;this._optionsService=e;this._oscLinkService=t;this._workCell=new F}provideLinks(i,e){let t=this._bufferService.buffer.lines.get(i-1);if(!t){e(void 0);return}let r=[],s=this._optionsService.rawOptions.linkHandler,o=this._workCell,a=t.getTrimmedLength(),l=-1,h=-1,d=!1;for(let c=0;cs?s.activate(f,S,p):Hn(f,S),hover:(f,S)=>s?.hover?.(f,S,p),leave:(f,S)=>s?.leave?.(f,S,p)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(h=c,l=o.extended.urlId):(h=-1,l=-1)}}e(r)}_getRangeWithLineWrap(i,e,t,r){let s=i,o=e,a=i,l=t;for(;o===0&&this._bufferService.buffer.lines.get(s-1)?.isWrapped;){let d=this._bufferService.buffer.lines.get(s-2);if(!d)break;let c=d.getTrimmedLength();if(c===0||!this._hasUrlId(d,c-1,r))break;let u=c-1;for(;u>0&&this._hasUrlId(d,u-1,r);)u--;s--,o=u}for(;;){let h=this._bufferService.buffer.lines.get(a-1);if(!h)break;let d=h.getTrimmedLength();if(l!==d)break;let c=this._bufferService.buffer.lines.get(a);if(!c?.isWrapped)break;let u=c.getTrimmedLength();if(u===0||!this._hasUrlId(c,0,r))break;let _=1;for(;_{for(var e in t)Ps(n,e,{get:t[e],enumerable:!0})};var y=(n,t,e,i)=>{for(var r=i>1?void 0:i?Pn(t,e):t,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(t,e,r):o(r))||r);return i&&r&&Ps(t,e,r),r},m=(n,t)=>(e,i)=>t(e,i,n);var Ms="Terminal input",Ut={get:()=>Ms,set:n=>Ms=n},Bs="Too much output to announce, navigate to rows manually to read",Je={get:()=>Bs,set:n=>Bs=n};function Bn(n){return n.replace(/\r?\n/g,"\r")}function On(n,t){return t?`\x1B[200~${n.replace(/\x1b/g,"\u241B")}\x1B[201~`:n}function Os(n,t){n.clipboardData&&n.clipboardData.setData("text/plain",t.selectionText),n.preventDefault()}function Ns(n,t,e,i){if(n.stopPropagation(),n.clipboardData){let r=n.clipboardData.getData("text/plain");Nr(r,t,e,i)}}function Nr(n,t,e,i){n=Bn(n),n=On(n,e.decPrivateModes.bracketedPasteMode&&i.rawOptions.ignoreBracketedPasteMode!==!0),e.triggerDataEvent(n,!0),t.value=""}function Fr(n,t,e){let i=e.getBoundingClientRect(),r=n.clientX-i.left-10,s=n.clientY-i.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${s}px`,t.style.zIndex="1000",t.focus()}function Hr(n,t,e,i,r){Fr(n,t,e),r&&i.rightClickSelect(n),t.value=i.selectionText,t.select()}function be(n){return n>65535?(n-=65536,String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):String.fromCharCode(n)}function xe(n,t=0,e=n.length){let i="";for(let r=t;r65535?(s-=65536,i+=String.fromCharCode((s>>10)+55296)+String.fromCharCode(s%1024+56320)):i+=String.fromCharCode(s)}return i}var mi=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t,e){let i=t.length;if(!i)return 0;let r=0,s=0;if(this._interim){let o=t.charCodeAt(s++);56320<=o&&o<=57343?e[r++]=(this._interim-55296)*1024+o-56320+65536:(e[r++]=this._interim,e[r++]=o),this._interim=0}for(let o=s;o=i)return this._interim=a,r;let l=t.charCodeAt(o);56320<=l&&l<=57343?e[r++]=(a-55296)*1024+l-56320+65536:(e[r++]=a,e[r++]=l);continue}a!==65279&&(e[r++]=a)}return r}},bi=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t,e){let i=t.length;if(!i)return 0;let r=0,s,o,a,l,h,d=0;if(this.interim[0]){let _=!1,p=this.interim[0];p&=(p&224)===192?31:(p&240)===224?15:7;let v=0,f;for(;(f=this.interim[++v])&&v<4;)p<<=6,p|=f&63;let S=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,C=S-v;for(;d=i)return 0;if(f=t[d++],(f&192)!==128){d--,_=!0;break}else this.interim[v++]=f,p<<=6,p|=f&63}_||(S===2?p<128?d--:e[r++]=p:S===3?p<2048||p>=55296&&p<=57343||p===65279||(e[r++]=p):p<65536||p>1114111||(e[r++]=p)),this.interim.fill(0)}let c=i-4,u=d;for(;u=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(h=(s&31)<<6|o&63,h<128){u--;continue}e[r++]=h}else if((s&240)===224){if(u>=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,r;if(a=t[u++],(a&192)!==128){u--;continue}if(h=(s&15)<<12|(o&63)<<6|a&63,h<2048||h>=55296&&h<=57343||h===65279)continue;e[r++]=h}else if((s&248)===240){if(u>=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,r;if(a=t[u++],(a&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,this.interim[2]=a,r;if(l=t[u++],(l&192)!==128){u--;continue}if(h=(s&7)<<18|(o&63)<<12|(a&63)<<6|l&63,h<65536||h>1114111)continue;e[r++]=h}}return r}};var fe=class n{constructor(){this.fg=0;this.bg=0;this.extended=new Pe}static toColorRGB(t){return[t>>>16&255,t>>>8&255,t&255]}static fromColorRGB(t){return(t[0]&255)<<16|(t[1]&255)<<8|t[2]&255}clone(){let t=new n;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Pe=class n{constructor(t=0,e=0){this._ext=0;this._urlId=0;this._ext=t,this._urlId=e}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(t){this._ext&=-67108864,this._ext|=t&67108863}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){let t=(this._ext&3758096384)>>29;return t<0?t^4294967288:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}clone(){return new n(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var F=class n extends fe{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new Pe;this.combinedData=""}static fromCharData(e){let i=new n;return i.setFromCharData(e),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?be(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let i=!1;if(e[1].length>2)i=!0;else if(e[1].length===2){let r=e[1].charCodeAt(0);if(55296<=r&&r<=56319){let s=e[1].charCodeAt(1);56320<=s&&s<=57343?this.content=(r-55296)*1024+s-56320+65536|e[2]<<22:i=!0}else i=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;i&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor()||this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor()||this.isInverse()!==e.isInverse()||this.isBold()!==e.isBold()||this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;let i=this.isUnderlineColorDefault(),r=e.isUnderlineColorDefault();if(!(i&&r)&&(i!==r||this.getUnderlineColor()!==e.getUnderlineColor()||this.getUnderlineColorMode()!==e.getUnderlineColorMode()))return!1}return!(this.isOverline()!==e.isOverline()||this.isBlink()!==e.isBlink()||this.isInvisible()!==e.isInvisible()||this.isItalic()!==e.isItalic()||this.isDim()!==e.isDim()||this.isStrikethrough()!==e.isStrikethrough())}};var zr=new Map;function Hs(n){return n.di$dependencies||[]}function H(n){if(zr.has(n))return zr.get(n);let t=function(e,i,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Hn(t,e,r)};return t._id=n,zr.set(n,t),t}function Hn(n,t,e){t.di$target===t?t.di$dependencies.push({id:n,index:e}):(t.di$dependencies=[{id:n,index:e}],t.di$target=t)}var D=H("BufferService"),Me=H("MouseStateService"),Y=H("CoreService"),Ws=H("CharsetService"),et=H("InstantiationService");var _e=H("LogService"),R=H("OptionsService"),vi=H("OscLinkService"),Us=H("UnicodeService"),ge=H("DecorationService");var tt=class{constructor(t,e,i){this._bufferService=t;this._optionsService=e;this._oscLinkService=i;this._workCell=new F}provideLinks(t,e){let i=this._bufferService.buffer.lines.get(t-1);if(!i){e(void 0);return}let r=[],s=this._optionsService.rawOptions.linkHandler,o=this._workCell,a=i.getTrimmedLength(),l=-1,h=-1,d=!1;for(let c=0;cs?s.activate(f,S,p):Wn(f,S),hover:(f,S)=>s?.hover?.(f,S,p),leave:(f,S)=>s?.leave?.(f,S,p)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(h=c,l=o.extended.urlId):(h=-1,l=-1)}}e(r)}_getRangeWithLineWrap(t,e,i,r){let s=t,o=e,a=t,l=i;for(;o===0&&this._bufferService.buffer.lines.get(s-1)?.isWrapped;){let d=this._bufferService.buffer.lines.get(s-2);if(!d)break;let c=d.getTrimmedLength();if(c===0||!this._hasUrlId(d,c-1,r))break;let u=c-1;for(;u>0&&this._hasUrlId(d,u-1,r);)u--;s--,o=u}for(;;){let h=this._bufferService.buffer.lines.get(a-1);if(!h)break;let d=h.getTrimmedLength();if(l!==d)break;let c=this._bufferService.buffer.lines.get(a);if(!c?.isWrapped)break;let u=c.getTrimmedLength();if(u===0||!this._hasUrlId(c,0,r))break;let _=1;for(;_{for(var e in i)ks(n,e,{get:i[e],enumerable:!0})};var y=(n,i,e,t)=>{for(var r=t>1?void 0:t?Ln(i,e):i,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(t?o(i,e,r):o(r))||r);return t&&r&&ks(i,e,r),r},m=(n,i)=>(e,t)=>i(e,t,n);var Ms="Terminal input",Ut={get:()=>Ms,set:n=>Ms=n},Ps="Too much output to announce, navigate to rows manually to read",Ze={get:()=>Ps,set:n=>Ps=n};function kn(n){return n.replace(/\r?\n/g,"\r")}function Mn(n,i){return i?`\x1B[200~${n.replace(/\x1b/g,"\u241B")}\x1B[201~`:n}function Bs(n,i){n.clipboardData&&n.clipboardData.setData("text/plain",i.selectionText),n.preventDefault()}function Os(n,i,e,t){if(n.stopPropagation(),n.clipboardData){let r=n.clipboardData.getData("text/plain");Pr(r,i,e,t)}}function Pr(n,i,e,t){n=kn(n),n=Mn(n,e.decPrivateModes.bracketedPasteMode&&t.rawOptions.ignoreBracketedPasteMode!==!0),e.triggerDataEvent(n,!0),i.value=""}function Br(n,i,e){let t=e.getBoundingClientRect(),r=n.clientX-t.left-10,s=n.clientY-t.top-10;i.style.width="20px",i.style.height="20px",i.style.left=`${r}px`,i.style.top=`${s}px`,i.style.zIndex="1000",i.focus()}function Or(n,i,e,t,r){Br(n,i,e),r&&t.rightClickSelect(n),i.value=t.selectionText,i.select()}function be(n){return n>65535?(n-=65536,String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):String.fromCharCode(n)}function ye(n,i=0,e=n.length){let t="";for(let r=i;r65535?(s-=65536,t+=String.fromCharCode((s>>10)+55296)+String.fromCharCode(s%1024+56320)):t+=String.fromCharCode(s)}return t}var pi=class{constructor(){this._interim=0}clear(){this._interim=0}decode(i,e){let t=i.length;if(!t)return 0;let r=0,s=0;if(this._interim){let o=i.charCodeAt(s++);56320<=o&&o<=57343?e[r++]=(this._interim-55296)*1024+o-56320+65536:(e[r++]=this._interim,e[r++]=o),this._interim=0}for(let o=s;o=t)return this._interim=a,r;let l=i.charCodeAt(o);56320<=l&&l<=57343?e[r++]=(a-55296)*1024+l-56320+65536:(e[r++]=a,e[r++]=l);continue}a!==65279&&(e[r++]=a)}return r}},mi=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(i,e){let t=i.length;if(!t)return 0;let r=0,s,o,a,l,h,d=0;if(this.interim[0]){let _=!1,p=this.interim[0];p&=(p&224)===192?31:(p&240)===224?15:7;let v=0,f;for(;(f=this.interim[++v])&&v<4;)p<<=6,p|=f&63;let S=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,I=S-v;for(;d=t)return 0;if(f=i[d++],(f&192)!==128){d--,_=!0;break}else this.interim[v++]=f,p<<=6,p|=f&63}_||(S===2?p<128?d--:e[r++]=p:S===3?p<2048||p>=55296&&p<=57343||p===65279||(e[r++]=p):p<65536||p>1114111||(e[r++]=p)),this.interim.fill(0)}let c=t-4,u=d;for(;u=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(h=(s&31)<<6|o&63,h<128){u--;continue}e[r++]=h}else if((s&240)===224){if(u>=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,r;if(a=i[u++],(a&192)!==128){u--;continue}if(h=(s&15)<<12|(o&63)<<6|a&63,h<2048||h>=55296&&h<=57343||h===65279)continue;e[r++]=h}else if((s&248)===240){if(u>=t)return this.interim[0]=s,r;if(o=i[u++],(o&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,r;if(a=i[u++],(a&192)!==128){u--;continue}if(u>=t)return this.interim[0]=s,this.interim[1]=o,this.interim[2]=a,r;if(l=i[u++],(l&192)!==128){u--;continue}if(h=(s&7)<<18|(o&63)<<12|(a&63)<<6|l&63,h<65536||h>1114111)continue;e[r++]=h}}return r}};var ue=class n{constructor(){this.fg=0;this.bg=0;this.extended=new ke}static toColorRGB(i){return[i>>>16&255,i>>>8&255,i&255]}static fromColorRGB(i){return(i[0]&255)<<16|(i[1]&255)<<8|i[2]&255}clone(){let i=new n;return i.fg=this.fg,i.bg=this.bg,i.extended=this.extended.clone(),i}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},ke=class n{constructor(i=0,e=0){this._ext=0;this._urlId=0;this._ext=i,this._urlId=e}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(i){this._ext=i}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(i){this._ext&=-469762049,this._ext|=i<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(i){this._ext&=-67108864,this._ext|=i&67108863}get urlId(){return this._urlId}set urlId(i){this._urlId=i}get underlineVariantOffset(){let i=(this._ext&3758096384)>>29;return i<0?i^4294967288:i}set underlineVariantOffset(i){this._ext&=536870911,this._ext|=i<<29&3758096384}clone(){return new n(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var F=class n extends ue{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new ke;this.combinedData=""}static fromCharData(e){let t=new n;return t.setFromCharData(e),t}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?be(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let r=e[1].charCodeAt(0);if(55296<=r&&r<=56319){let s=e[1].charCodeAt(1);56320<=s&&s<=57343?this.content=(r-55296)*1024+s-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor()||this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor()||this.isInverse()!==e.isInverse()||this.isBold()!==e.isBold()||this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;let t=this.isUnderlineColorDefault(),r=e.isUnderlineColorDefault();if(!(t&&r)&&(t!==r||this.getUnderlineColor()!==e.getUnderlineColor()||this.getUnderlineColorMode()!==e.getUnderlineColorMode()))return!1}return!(this.isOverline()!==e.isOverline()||this.isBlink()!==e.isBlink()||this.isInvisible()!==e.isInvisible()||this.isItalic()!==e.isItalic()||this.isDim()!==e.isDim()||this.isStrikethrough()!==e.isStrikethrough())}};var Wr=new Map;function Fs(n){return n.di$dependencies||[]}function H(n){if(Wr.has(n))return Wr.get(n);let i=function(e,t,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");On(i,e,r)};return i._id=n,Wr.set(n,i),i}function On(n,i,e){i.di$target===i?i.di$dependencies.push({id:n,index:e}):(i.di$dependencies=[{id:n,index:e}],i.di$target=i)}var D=H("BufferService"),Me=H("MouseStateService"),Y=H("CoreService"),Hs=H("CharsetService"),Qe=H("InstantiationService");var fe=H("LogService"),R=H("OptionsService"),bi=H("OscLinkService"),Ws=H("UnicodeService"),ge=H("DecorationService");var et=class{constructor(i,e,t){this._bufferService=i;this._optionsService=e;this._oscLinkService=t;this._workCell=new F}provideLinks(i,e){let t=this._bufferService.buffer.lines.get(i-1);if(!t){e(void 0);return}let r=[],s=this._optionsService.rawOptions.linkHandler,o=this._workCell,a=t.getTrimmedLength(),l=-1,h=-1,d=!1;for(let c=0;cs?s.activate(f,S,p):Nn(f,S),hover:(f,S)=>s?.hover?.(f,S,p),leave:(f,S)=>s?.leave?.(f,S,p)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(h=c,l=o.extended.urlId):(h=-1,l=-1)}}e(r)}_getRangeWithLineWrap(i,e,t,r){let s=i,o=e,a=i,l=t;for(;o===0&&this._bufferService.buffer.lines.get(s-1)?.isWrapped;){let d=this._bufferService.buffer.lines.get(s-2);if(!d)break;let c=d.getTrimmedLength();if(c===0||!this._hasUrlId(d,c-1,r))break;let u=c-1;for(;u>0&&this._hasUrlId(d,u-1,r);)u--;s--,o=u}for(;;){let h=this._bufferService.buffer.lines.get(a-1);if(!h)break;let d=h.getTrimmedLength();if(l!==d)break;let c=this._bufferService.buffer.lines.get(a);if(!c?.isWrapped)break;let u=c.getTrimmedLength();if(u===0||!this._hasUrlId(c,0,r))break;let _=1;for(;_{for(var e in t)ks(n,e,{get:t[e],enumerable:!0})};var y=(n,t,e,i)=>{for(var r=i>1?void 0:i?An(t,e):t,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(t,e,r):o(r))||r);return i&&r&&ks(t,e,r),r},m=(n,t)=>(e,i)=>t(e,i,n);var Ps="Terminal input",Ut={get:()=>Ps,set:n=>Ps=n},Ms="Too much output to announce, navigate to rows manually to read",Je={get:()=>Ms,set:n=>Ms=n};function Pn(n){return n.replace(/\r?\n/g,"\r")}function Mn(n,t){return t?`\x1B[200~${n.replace(/\x1b/g,"\u241B")}\x1B[201~`:n}function Bs(n,t){n.clipboardData&&n.clipboardData.setData("text/plain",t.selectionText),n.preventDefault()}function Os(n,t,e,i){if(n.stopPropagation(),n.clipboardData){let r=n.clipboardData.getData("text/plain");Mr(r,t,e,i)}}function Mr(n,t,e,i){n=Pn(n),n=Mn(n,e.decPrivateModes.bracketedPasteMode&&i.rawOptions.ignoreBracketedPasteMode!==!0),e.triggerDataEvent(n,!0),t.value=""}function Br(n,t,e){let i=e.getBoundingClientRect(),r=n.clientX-i.left-10,s=n.clientY-i.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${s}px`,t.style.zIndex="1000",t.focus()}function Or(n,t,e,i,r){Br(n,t,e),r&&i.rightClickSelect(n),t.value=i.selectionText,t.select()}function be(n){return n>65535?(n-=65536,String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):String.fromCharCode(n)}function xe(n,t=0,e=n.length){let i="";for(let r=t;r65535?(s-=65536,i+=String.fromCharCode((s>>10)+55296)+String.fromCharCode(s%1024+56320)):i+=String.fromCharCode(s)}return i}var pi=class{constructor(){this._interim=0}clear(){this._interim=0}decode(t,e){let i=t.length;if(!i)return 0;let r=0,s=0;if(this._interim){let o=t.charCodeAt(s++);56320<=o&&o<=57343?e[r++]=(this._interim-55296)*1024+o-56320+65536:(e[r++]=this._interim,e[r++]=o),this._interim=0}for(let o=s;o=i)return this._interim=a,r;let l=t.charCodeAt(o);56320<=l&&l<=57343?e[r++]=(a-55296)*1024+l-56320+65536:(e[r++]=a,e[r++]=l);continue}a!==65279&&(e[r++]=a)}return r}},mi=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(t,e){let i=t.length;if(!i)return 0;let r=0,s,o,a,l,h,d=0;if(this.interim[0]){let _=!1,p=this.interim[0];p&=(p&224)===192?31:(p&240)===224?15:7;let v=0,f;for(;(f=this.interim[++v])&&v<4;)p<<=6,p|=f&63;let S=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,C=S-v;for(;d=i)return 0;if(f=t[d++],(f&192)!==128){d--,_=!0;break}else this.interim[v++]=f,p<<=6,p|=f&63}_||(S===2?p<128?d--:e[r++]=p:S===3?p<2048||p>=55296&&p<=57343||p===65279||(e[r++]=p):p<65536||p>1114111||(e[r++]=p)),this.interim.fill(0)}let c=i-4,u=d;for(;u=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(h=(s&31)<<6|o&63,h<128){u--;continue}e[r++]=h}else if((s&240)===224){if(u>=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,r;if(a=t[u++],(a&192)!==128){u--;continue}if(h=(s&15)<<12|(o&63)<<6|a&63,h<2048||h>=55296&&h<=57343||h===65279)continue;e[r++]=h}else if((s&248)===240){if(u>=i)return this.interim[0]=s,r;if(o=t[u++],(o&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,r;if(a=t[u++],(a&192)!==128){u--;continue}if(u>=i)return this.interim[0]=s,this.interim[1]=o,this.interim[2]=a,r;if(l=t[u++],(l&192)!==128){u--;continue}if(h=(s&7)<<18|(o&63)<<12|(a&63)<<6|l&63,h<65536||h>1114111)continue;e[r++]=h}}return r}};var fe=class n{constructor(){this.fg=0;this.bg=0;this.extended=new Pe}static toColorRGB(t){return[t>>>16&255,t>>>8&255,t&255]}static fromColorRGB(t){return(t[0]&255)<<16|(t[1]&255)<<8|t[2]&255}clone(){let t=new n;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Pe=class n{constructor(t=0,e=0){this._ext=0;this._urlId=0;this._ext=t,this._urlId=e}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(t){this._ext&=-67108864,this._ext|=t&67108863}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){let t=(this._ext&3758096384)>>29;return t<0?t^4294967288:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}clone(){return new n(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}};var F=class n extends fe{constructor(){super(...arguments);this.content=0;this.fg=0;this.bg=0;this.extended=new Pe;this.combinedData=""}static fromCharData(e){let i=new n;return i.setFromCharData(e),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?be(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let i=!1;if(e[1].length>2)i=!0;else if(e[1].length===2){let r=e[1].charCodeAt(0);if(55296<=r&&r<=56319){let s=e[1].charCodeAt(1);56320<=s&&s<=57343?this.content=(r-55296)*1024+s-56320+65536|e[2]<<22:i=!0}else i=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;i&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}attributesEquals(e){if(this.getFgColorMode()!==e.getFgColorMode()||this.getFgColor()!==e.getFgColor()||this.getBgColorMode()!==e.getBgColorMode()||this.getBgColor()!==e.getBgColor()||this.isInverse()!==e.isInverse()||this.isBold()!==e.isBold()||this.isUnderline()!==e.isUnderline())return!1;if(this.isUnderline()){if(this.getUnderlineStyle()!==e.getUnderlineStyle())return!1;let i=this.isUnderlineColorDefault(),r=e.isUnderlineColorDefault();if(!(i&&r)&&(i!==r||this.getUnderlineColor()!==e.getUnderlineColor()||this.getUnderlineColorMode()!==e.getUnderlineColorMode()))return!1}return!(this.isOverline()!==e.isOverline()||this.isBlink()!==e.isBlink()||this.isInvisible()!==e.isInvisible()||this.isItalic()!==e.isItalic()||this.isDim()!==e.isDim()||this.isStrikethrough()!==e.isStrikethrough())}};var Wr=new Map;function Fs(n){return n.di$dependencies||[]}function H(n){if(Wr.has(n))return Wr.get(n);let t=function(e,i,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Nn(t,e,r)};return t._id=n,Wr.set(n,t),t}function Nn(n,t,e){t.di$target===t?t.di$dependencies.push({id:n,index:e}):(t.di$dependencies=[{id:n,index:e}],t.di$target=t)}var D=H("BufferService"),Me=H("MouseStateService"),Y=H("CoreService"),Hs=H("CharsetService"),et=H("InstantiationService");var _e=H("LogService"),R=H("OptionsService"),bi=H("OscLinkService"),Ws=H("UnicodeService"),ge=H("DecorationService");var tt=class{constructor(t,e,i){this._bufferService=t;this._optionsService=e;this._oscLinkService=i;this._workCell=new F}provideLinks(t,e){let i=this._bufferService.buffer.lines.get(t-1);if(!i){e(void 0);return}let r=[],s=this._optionsService.rawOptions.linkHandler,o=this._workCell,a=i.getTrimmedLength(),l=-1,h=-1,d=!1;for(let c=0;cs?s.activate(f,S,p):Fn(f,S),hover:(f,S)=>s?.hover?.(f,S,p),leave:(f,S)=>s?.leave?.(f,S,p)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(h=c,l=o.extended.urlId):(h=-1,l=-1)}}e(r)}_getRangeWithLineWrap(t,e,i,r){let s=t,o=e,a=t,l=i;for(;o===0&&this._bufferService.buffer.lines.get(s-1)?.isWrapped;){let d=this._bufferService.buffer.lines.get(s-2);if(!d)break;let c=d.getTrimmedLength();if(c===0||!this._hasUrlId(d,c-1,r))break;let u=c-1;for(;u>0&&this._hasUrlId(d,u-1,r);)u--;s--,o=u}for(;;){let h=this._bufferService.buffer.lines.get(a-1);if(!h)break;let d=h.getTrimmedLength();if(l!==d)break;let c=this._bufferService.buffer.lines.get(a);if(!c?.isWrapped)break;let u=c.getTrimmedLength();if(u===0||!this._hasUrlId(c,0,r))break;let _=1;for(;_{n(),e&&r.dispose()},i),r=E(()=>{clearTimeout(t)});return e?.add(r),r}var Ie=class{constructor(){this._token=-1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(i,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,i()},e)}setIfNotSet(i,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,i()},e))}},Ci=class{constructor(){this._isScheduled=!1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(i){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,i())}))}},Ei=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(i,e,t=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();let r=t.setInterval(()=>{i()},e);this._disposable={dispose:()=>{t.clearInterval(r),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}};function se(n){let i=n;if(i?.ownerDocument?.defaultView)return i.ownerDocument.defaultView;let e=n;return e?.view?e.view:window}var Gr=class{constructor(i,e,t,r){this._node=i,this._type=e,this._handler=t,this._options=r,i.addEventListener(e,t,r)}dispose(){!this._node||!this._handler||(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}};function C(n,i,e,t){return new Gr(n,i,e,t)}function Vr(n,i,e,t){return C(n,i,e,t)}var le={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};function $s(n){let i=n.getBoundingClientRect(),e=se(n);return{left:i.left+e.scrollX,top:i.top+e.scrollY,width:i.width,height:i.height}}var yi=class{constructor(i,e){this._runner=i;this.priority=e;this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(i){console.error(i)}}static sort(i,e){return e.priority-i.priority}},Vs=new Map;function qs(n){let i=Vs.get(n);return i||(i={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},Vs.set(n,i)),i}function Wn(n){let i=qs(n);for(i.animFrameRequested=!1,i.current=i.next,i.next=[],i.inAnimationFrameRunner=!0;i.current.length>0;)i.current.sort(yi.sort),i.current.shift().execute();i.inAnimationFrameRunner=!1}function tt(n,i,e=0){let t=qs(n),r=new yi(i,e);return t.next.push(r),t.animFrameRequested||(t.animFrameRequested=!0,n.requestAnimationFrame(()=>Wn(n))),r}var xi=class extends Ei{constructor(i){super(),this._defaultTarget=i?se(i):void 0}cancelAndSet(i,e,t){super.cancelAndSet(i,e,t??this._defaultTarget??window)}};var we=class{constructor(i){this.domNode=i;this._width="";this._height="";this._top="";this._left="";this._bottom="";this._right="";this._className="";this._position="";this._layerHint=!1;this._contain="none"}setWidth(i){let e=rt(i);this._width!==e&&(this._width=e,this.domNode.style.width=this._width)}setHeight(i){let e=rt(i);this._height!==e&&(this._height=e,this.domNode.style.height=this._height)}setTop(i){let e=rt(i);this._top!==e&&(this._top=e,this.domNode.style.top=this._top)}setLeft(i){let e=rt(i);this._left!==e&&(this._left=e,this.domNode.style.left=this._left)}setBottom(i){let e=rt(i);this._bottom!==e&&(this._bottom=e,this.domNode.style.bottom=this._bottom)}setRight(i){let e=rt(i);this._right!==e&&(this._right=e,this.domNode.style.right=this._right)}setClassName(i){this._className!==i&&(this._className=i,this.domNode.className=this._className)}toggleClassName(i,e){this.domNode.classList.toggle(i,e),this._className=this.domNode.className}setPosition(i){this._position!==i&&(this._position=i,this.domNode.style.position=this._position)}setLayerHinting(i){this._layerHint!==i&&(this._layerHint=i,i?this.domNode.style.transform="translate3d(0px, 0px, 0px)":this.domNode.style.transform="")}setContain(i){this._contain!==i&&(this._contain=i,this.domNode.style.contain=this._contain)}setAttribute(i,e){this.domNode.setAttribute(i,e)}};function rt(n){return typeof n=="number"?`${n}px`:n}var Ke={};Mn(Ke,{getSafariVersion:()=>Kn,getZoomFactor:()=>Xr,isChrome:()=>Kt,isChromeOS:()=>Yr,isFirefox:()=>nt,isLegacyEdge:()=>Un,isLinux:()=>zt,isMac:()=>ie,isNode:()=>$r,isSafari:()=>wi,isWindows:()=>Ue});var $r=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),st=$r?"node":navigator.userAgent,qr=$r?"node":navigator.platform,nt=st.includes("Firefox"),Kt=st.includes("Chrome"),Un=st.includes("Edge"),wi=/^((?!chrome|android).)*safari/i.test(st);function Xr(n){return 1}function Kn(){if(!wi)return 0;let n=st.match(/Version\/(\d+)/);return n===null||n.length<2?0:parseInt(n[1],10)}var ie=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(qr),Ue=["Windows","Win16","Win32","WinCE"].includes(qr),zt=qr.indexOf("Linux")>=0,Yr=/\bCrOS\b/.test(st);var Xs=new WeakMap;function zn(n){if(!n.parent||n.parent===n)return null;try{let i=n.location,e=n.parent.location;if(i.origin!=="null"&&e.origin!=="null"&&i.origin!==e.origin)return null}catch{return null}return n.parent}var jr=class{static _getSameOriginWindowChain(i){let e=Xs.get(i);if(!e){e=[],Xs.set(i,e);let t=i,r;do r=zn(t),r?e.push({window:new WeakRef(t),iframeElement:t.frameElement??null}):e.push({window:new WeakRef(t),iframeElement:null}),t=r;while(t)}return e.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(i,e){if(!e||i===e)return{top:0,left:0};let t=0,r=0,s=this._getSameOriginWindowChain(i);for(let o of s){let a=o.window.deref();if(t+=a?.scrollY??0,r+=a?.scrollX??0,a===e||!o.iframeElement)break;let l=o.iframeElement.getBoundingClientRect();t+=l.top,r+=l.left}return{top:t,left:r}}},ot=class{constructor(i,e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=e.button===0,this.middleButton=e.button===1,this.rightButton=e.button===2,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail??1,e.type==="dblclick"&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,typeof e.pageX=="number"?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=e.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);let t=jr.getPositionOfChildWindowRelativeToAncestorWindow(i,e.view);this.posx-=t.left,this.posy-=t.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}},Gt=class{constructor(i,e=0,t=0){this.browserEvent=i??null,this.target=i?i.target??i.targetNode??i.srcElement??null:null,this.deltaY=t,this.deltaX=e;let r=!1;if(Kt){let s=navigator.userAgent.match(/Chrome\/(\d+)/);r=(s?parseInt(s[1],10):123)<=122}if(i){let s=i,o=i,a=i.view?.devicePixelRatio??1;if(typeof s.wheelDeltaY<"u")r?this.deltaY=s.wheelDeltaY/(120*a):this.deltaY=s.wheelDeltaY/120;else if(typeof o.VERTICAL_AXIS<"u"&&o.axis===o.VERTICAL_AXIS)this.deltaY=-o.detail/3;else if(i.type==="wheel"){let l=i;l.deltaMode===l.DOM_DELTA_LINE?nt&&!ie?this.deltaY=-i.deltaY/3:this.deltaY=-i.deltaY:this.deltaY=-i.deltaY/40}if(typeof s.wheelDeltaX<"u")wi&&Ue?this.deltaX=-(s.wheelDeltaX/120):r?this.deltaX=s.wheelDeltaX/(120*a):this.deltaX=s.wheelDeltaX/120;else if(typeof o.HORIZONTAL_AXIS<"u"&&o.axis===o.HORIZONTAL_AXIS)this.deltaX=-i.detail/3;else if(i.type==="wheel"){let l=i;l.deltaMode===l.DOM_DELTA_LINE?nt&&!ie?this.deltaX=-i.deltaX/3:this.deltaX=-i.deltaX:this.deltaX=-i.deltaX/40}this.deltaY===0&&this.deltaX===0&&i.wheelDelta&&(r?this.deltaY=i.wheelDelta/(120*a):this.deltaY=i.wheelDelta/120)}}preventDefault(){this.browserEvent?.preventDefault()}stopPropagation(){this.browserEvent?.stopPropagation()}};var at=class{constructor(){this._hooks=new pe;this._pointerMoveCallback=null;this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(i){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;let e=this._onStopCallback;this._onStopCallback=null,i&&e&&e()}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(i,e,t,r,s){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=r,this._onStopCallback=s;let o=i;try{i.setPointerCapture(e),this._hooks.add(E(()=>{try{i.releasePointerCapture(e)}catch{}}))}catch{o=se(i)}this._hooks.add(C(o,le.POINTER_MOVE,a=>{if(a.buttons!==t){this.stopMonitoring(!0);return}a.preventDefault(),this._pointerMoveCallback(a)})),this._hooks.add(C(o,le.POINTER_UP,a=>this.stopMonitoring(!0)))}};var Ne=class extends g{_onclick(i,e){this._register(C(i,le.CLICK,t=>e(new ot(se(i),t))))}_onmouseover(i,e){this._register(C(i,le.MOUSE_OVER,t=>e(new ot(se(i),t))))}_onmouseleave(i,e){this._register(C(i,le.MOUSE_LEAVE,t=>e(new ot(se(i),t))))}};var Ti=class extends Ne{constructor(i){super(),this._handleActivate=i.handleActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="xterm-arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=i.bgWidth+"px",this.bgDomNode.style.height=i.bgHeight+"px",typeof i.top<"u"&&(this.bgDomNode.style.top="0px"),typeof i.left<"u"&&(this.bgDomNode.style.left="0px"),typeof i.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof i.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=i.className,this.domNode.style.position="absolute";let e=Math.min(i.bgWidth,i.bgHeight);this.domNode.style.width=e+"px",this.domNode.style.height=e+"px",typeof i.top<"u"&&(this.domNode.style.top=i.top+"px"),typeof i.left<"u"&&(this.domNode.style.left=i.left+"px"),typeof i.bottom<"u"&&(this.domNode.style.bottom=i.bottom+"px"),typeof i.right<"u"&&(this.domNode.style.right=i.right+"px"),this._pointerMoveMonitor=this._register(new at),this._register(Vr(this.bgDomNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._register(Vr(this.domNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._pointerdownRepeatTimer=this._register(new xi),this._pointerdownScheduleRepeatTimer=this._register(new Ie)}_arrowPointerDown(i){if(!i.target||!(i.target instanceof Element))return;let e=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,se(i))};this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(e,200),this._pointerMoveMonitor.startMonitoring(i.target,i.pointerId,i.buttons,t=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),i.preventDefault()}};var b=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(i,e,t)=>{if(this._disposed)return E(()=>{});let r={fn:i,thisArgs:e};this._listeners.push(r);let s=E(()=>{let o=this._listeners.indexOf(r);o!==-1&&this._listeners.splice(o,1)});return t&&(Array.isArray(t)?t.push(s):t.add(s)),s},this._event)}fire(i){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{let{fn:e,thisArgs:t}=this._listeners[0];e.call(t,i);return}default:{let e=this._listeners.slice();for(let{fn:t,thisArgs:r}of e)t.call(r,i)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},j;(r=>{function n(s,o){return s(a=>o.fire(a))}r.forward=n;function i(s,o){return(a,l,h)=>s(d=>a.call(l,o(d)),void 0,h)}r.map=i;function e(...s){return(o,a,l)=>{let h=new pe;for(let d of s)h.add(d(c=>o.call(a,c)));return l&&(Array.isArray(l)?l.push(h):l.add(h)),h}}r.any=e;function t(s,o,a){return o(a),s(l=>o(l))}r.runAndSubscribe=t})(j||={});var Jr=class n{constructor(i,e,t,r,s,o,a){this._forceIntegerValues=i;this._scrollStateBrand=void 0;this._forceIntegerValues&&(e=e|0,t=t|0,r=r|0,s=s|0,o=o|0,a=a|0),this.rawScrollLeft=r,this.rawScrollTop=a,e<0&&(e=0),r+e>t&&(r=t-e),r<0&&(r=0),s<0&&(s=0),a+s>o&&(a=o-s),a<0&&(a=0),this.width=e,this.scrollWidth=t,this.scrollLeft=r,this.height=s,this.scrollHeight=o,this.scrollTop=a}equals(i){return this.rawScrollLeft===i.rawScrollLeft&&this.rawScrollTop===i.rawScrollTop&&this.width===i.width&&this.scrollWidth===i.scrollWidth&&this.scrollLeft===i.scrollLeft&&this.height===i.height&&this.scrollHeight===i.scrollHeight&&this.scrollTop===i.scrollTop}withScrollDimensions(i,e){return new n(this._forceIntegerValues,typeof i.width<"u"?i.width:this.width,typeof i.scrollWidth<"u"?i.scrollWidth:this.scrollWidth,e?this.rawScrollLeft:this.scrollLeft,typeof i.height<"u"?i.height:this.height,typeof i.scrollHeight<"u"?i.scrollHeight:this.scrollHeight,e?this.rawScrollTop:this.scrollTop)}withScrollPosition(i){return new n(this._forceIntegerValues,this.width,this.scrollWidth,typeof i.scrollLeft<"u"?i.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof i.scrollTop<"u"?i.scrollTop:this.rawScrollTop)}createScrollEvent(i,e){let t=this.width!==i.width,r=this.scrollWidth!==i.scrollWidth,s=this.scrollLeft!==i.scrollLeft,o=this.height!==i.height,a=this.scrollHeight!==i.scrollHeight,l=this.scrollTop!==i.scrollTop;return{inSmoothScrolling:e,oldWidth:i.width,oldScrollWidth:i.scrollWidth,oldScrollLeft:i.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:i.height,oldScrollHeight:i.scrollHeight,oldScrollTop:i.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:t,scrollWidthChanged:r,scrollLeftChanged:s,heightChanged:o,scrollHeightChanged:a,scrollTopChanged:l}}},lt=class extends g{constructor(e){super();this._scrollableBrand=void 0;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new Jr(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){let r=this._state.withScrollDimensions(e,t);this._setState(r,!!this._smoothScrolling),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){let t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(this._smoothScrollDuration===0){this.setScrollPositionNow(e);return}if(this._smoothScrolling){e={scrollLeft:typeof e.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:typeof e.scrollTop>"u"?this._smoothScrolling.to.scrollTop:e.scrollTop};let r=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===r.scrollLeft&&this._smoothScrolling.to.scrollTop===r.scrollTop)return;let s;t?s=new Vt(this._smoothScrolling.from,r,this._smoothScrolling.startTime,this._smoothScrolling.duration):s=Vt.start(this._state,r,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{let r=this._state.withScrollPosition(e);this._smoothScrolling=Vt.start(this._state,r,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;let e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);if(this._setState(t,!0),!!this._smoothScrolling){if(e.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(e,t){let r=this._state;r.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(r,t)))}},Di=class{constructor(i,e,t){this.scrollLeft=i,this.scrollTop=e,this.isDone=t}};function Zr(n,i){let e=i-n;return function(t){return n+e*$n(t)}}function Gn(n,i,e){return function(t){return t2.5*t){let s,o;return i{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(i){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(i?" xterm-fade":"")))}};var qn=140,ct=class extends Ne{constructor(i){super(),this._lazyRender=i.lazyRender,this._host=i.host,this._scrollable=i.scrollable,this._scrollByPage=i.scrollByPage,this._scrollbarState=i.scrollbarState,this._visibilityController=this._register(new Ri(i.visibility,"xterm-visible xterm-scrollbar "+i.extraScrollbarClassName,"xterm-invisible xterm-scrollbar "+i.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new at),this._shouldRender=!0,this.domNode=new we(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(C(this.domNode.domNode,le.POINTER_DOWN,e=>this._domNodePointerDown(e)))}_createArrow(i){let e=this._register(new Ti(i));return this.domNode.domNode.appendChild(e.bgDomNode),this.domNode.domNode.appendChild(e.domNode),e}_createSlider(i,e,t,r){this.slider=new we(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(i),this.slider.setLeft(e),typeof t=="number"&&this.slider.setWidth(t),typeof r=="number"&&this.slider.setHeight(r),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(C(this.slider.domNode,le.POINTER_DOWN,s=>{s.button===0&&(s.preventDefault(),this._sliderPointerDown(s))})),this._onclick(this.slider.domNode,s=>{s.leftButton&&s.stopPropagation()})}_handleElementSize(i){return this._scrollbarState.setVisibleSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(i){return this._scrollbarState.setScrollSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(i){return this._scrollbarState.setScrollPosition(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(i){i.target===this.domNode.domNode&&this._handlePointerDown(i)}delegatePointerDown(i){let e=this.domNode.domNode.getClientRects()[0].top,t=e+this._scrollbarState.getSliderPosition(),r=e+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),s=this._sliderPointerPosition(i);t<=s&&s<=r?i.button===0&&(i.preventDefault(),this._sliderPointerDown(i)):this._handlePointerDown(i)}_handlePointerDown(i){let e,t;if(i.target===this.domNode.domNode&&typeof i.offsetX=="number"&&typeof i.offsetY=="number")e=i.offsetX,t=i.offsetY;else{let s=$s(this.domNode.domNode);e=i.pageX-s.left,t=i.pageY-s.top}let r=this._pointerDownRelativePosition(e,t);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(r):this._scrollbarState.getDesiredScrollPositionFromOffset(r)),i.button===0&&(i.preventDefault(),this._sliderPointerDown(i))}_sliderPointerDown(i){if(!i.target||!(i.target instanceof Element))return;let e=this._sliderPointerPosition(i),t=this._sliderOrthogonalPointerPosition(i),r=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(i.target,i.pointerId,i.buttons,s=>{let o=this._sliderOrthogonalPointerPosition(s),a=Math.abs(o-t);if(Ue&&a>qn){this._setDesiredScrollPositionNow(r.getScrollPosition());return}let h=this._sliderPointerPosition(s)-e;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(i){let e={};this.writeScrollPosition(e,i),this._scrollable.setScrollPositionNow(e)}updateScrollbarSize(i){this._updateScrollbarSize(i),this._scrollbarState.setScrollbarSize(i),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}};var ht=class n{constructor(i,e,t,r,s,o){this._scrollbarSize=Math.round(e),this._oppositeScrollbarSize=Math.round(t),this._arrowSize=Math.round(i),this._visibleSize=r,this._scrollSize=s,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new n(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(i){let e=Math.round(i);return this._visibleSize!==e?(this._visibleSize=e,this._refreshComputedValues(),!0):!1}setScrollSize(i){let e=Math.round(i);return this._scrollSize!==e?(this._scrollSize=e,this._refreshComputedValues(),!0):!1}setScrollPosition(i){let e=Math.round(i);return this._scrollPosition!==e?(this._scrollPosition=e,this._refreshComputedValues(),!0):!1}setScrollbarSize(i){this._scrollbarSize=Math.round(i)}setArrowSize(i){let e=Math.round(i);this._arrowSize!==e&&(this._arrowSize=e,this._refreshComputedValues())}setOppositeScrollbarSize(i){this._oppositeScrollbarSize=Math.round(i)}static _computeValues(i,e,t,r,s){let o=Math.max(0,t-i),a=Math.max(0,o-2*e),l=r>0&&r>t;if(!l)return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};let h=Math.round(Math.max(20,Math.floor(t*a/r))),d=(a-h)/(r-t),c=s*d;return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(h),computedSliderRatio:d,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){let i=n._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=i.computedAvailableSize,this._computedIsNeeded=i.computedIsNeeded,this._computedSliderSize=i.computedSliderSize,this._computedSliderRatio=i.computedSliderRatio,this._computedSliderPosition=i.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(i){if(!this._computedIsNeeded)return 0;let e=i-this._arrowSize-this._computedSliderSize/2;return Math.round(e/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(i){if(!this._computedIsNeeded)return 0;let e=i-this._arrowSize,t=this._scrollPosition;return ethis._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:0,left:0,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})),this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;let r=e?"":"none";this._arrowUp.bgDomNode.style.display=r,this._arrowUp.domNode.style.display=r,this._arrowDown.bgDomNode.style.display=r,this._arrowDown.domNode.style.display=r}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){let t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}};var Qr=class{constructor(i,e,t){this.timestamp=i,this.deltaX=e,this.deltaY=t,this.score=0}},Bi=class Bi{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let i=1,e=0,t=1,r=this._rear;for(;r!==-1;){let s=r===this._front?i:Math.pow(2,-t);if(i-=s,e+=this._memory[r].score*s,r===this._front)break;r=(this._capacity+r-1)%this._capacity,t++}return e<=.5}acceptStandardWheelEvent(i){if(Kt){let e=se(i.browserEvent),t=Xr(e);this.accept(Date.now(),i.deltaX*t,i.deltaY*t)}else this.accept(Date.now(),i.deltaX,i.deltaY)}accept(i,e,t){let r=null,s=new Qr(i,e,t);this._front===-1&&this._rear===-1?(this._memory[0]=s,this._front=0,this._rear=0):(r=this._memory[this._rear],this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=s),s.score=this._computeScore(s,r)}_computeScore(i,e){if(Math.abs(i.deltaX)>0&&Math.abs(i.deltaY)>0)return 1;let t=.5;if((!this._isAlmostInt(i.deltaX)||!this._isAlmostInt(i.deltaY))&&(t+=.25),e){let r=Math.abs(i.deltaX),s=Math.abs(i.deltaY),o=Math.abs(e.deltaX),a=Math.abs(e.deltaY),l=Math.max(Math.min(r,o),1),h=Math.max(Math.min(s,a),1),d=Math.max(r,o),c=Math.max(s,a);d%l===0&&c%h===0&&(t-=.5)}return Math.min(Math.max(t,0),1)}_isAlmostInt(i){return Math.abs(Math.round(i)-i)<.01}};Bi.INSTANCE=new Bi;var es=Bi,Mi=class extends Ne{constructor(e,t,r){super();this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;t=t??{};let s,o=!r;r?s=r:(t.mouseWheelSmoothScroll=!1,s=new lt({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:l=>tt(se(e),l)})),this._options=Xn(t),this._scrollable=s,this._register(this._scrollable.onScroll(l=>{this._handleScroll(l),this._onScroll.fire(l)})),o&&this._register(this._scrollable);let a={handleMouseWheel:l=>this._handleMouseWheel(l),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new ki(this._scrollable,this._options,a)),this._horizontalScrollbar=this._register(new Ai(this._scrollable,this._options,a)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new we(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new we(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new we(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,l=>this._handleMouseOver(l)),this._onmouseleave(this._listenOnDomNode,l=>this._handleMouseLeave(l)),this._hideTimeout=this._register(new Ie),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}get options(){return this._options}dispose(){this._mouseWheelToDispose=Oe(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,ie&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){typeof e.handleMouseWheel<"u"&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof e.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),typeof e.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),typeof e.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),typeof e.horizontal<"u"&&(this._options.horizontal=e.horizontal),typeof e.vertical<"u"&&(this._options.vertical=e.vertical),typeof e.horizontalHasArrows<"u"&&(this._options.horizontalHasArrows=e.horizontalHasArrows),typeof e.verticalHasArrows<"u"&&(this._options.verticalHasArrows=e.verticalHasArrows),typeof e.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),typeof e.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),typeof e.scrollByPage<"u"&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new Gt(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=Oe(this._mouseWheelToDispose),e)){let r=s=>{this._handleMouseWheel(new Gt(s))};this._mouseWheelToDispose.push(C(this._listenOnDomNode,le.MOUSE_WHEEL,r,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;let t=es.INSTANCE;t.acceptStandardWheelEvent(e);let r=!1;if(e.deltaY||e.deltaX){let o=e.deltaY*this._options.mouseWheelScrollSensitivity,a=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&a+o===0?a=o=0:Math.abs(o)>=Math.abs(a)?a=0:o=0),this._options.flipAxes&&([o,a]=[a,o]);let l=!ie&&e.browserEvent&&e.browserEvent.shiftKey;(this._options.scrollYToX||l)&&!a&&(a=o,o=0),e.browserEvent&&e.browserEvent.altKey&&(a=a*this._options.fastScrollSensitivity,o=o*this._options.fastScrollSensitivity);let h=this._scrollable.getFutureScrollPosition(),d={};if(o){let c=50*o,u=h.scrollTop-(c<0?Math.floor(c):Math.ceil(c));this._verticalScrollbar.writeScrollPosition(d,u)}if(a){let c=50*a,u=h.scrollLeft-(c<0?Math.floor(c):Math.ceil(c));this._horizontalScrollbar.writeScrollPosition(d,u)}d=this._scrollable.validateScrollPosition(d),(h.scrollLeft!==d.scrollLeft||h.scrollTop!==d.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(d):this._scrollable.setScrollPositionNow(d),r=!0)}let s=r;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){let e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,r=e.scrollLeft>0,s=r?" xterm-shadow-left":"",o=t?" xterm-shadow-top":"",a=r||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${o}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${a}${o}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),500)}};function Xn(n){let i={lazyRender:typeof n.lazyRender<"u"?n.lazyRender:!1,className:typeof n.className<"u"?n.className:"",useShadows:typeof n.useShadows<"u"?n.useShadows:!0,handleMouseWheel:typeof n.handleMouseWheel<"u"?n.handleMouseWheel:!0,flipAxes:typeof n.flipAxes<"u"?n.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof n.consumeMouseWheelIfScrollbarIsNeeded<"u"?n.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof n.alwaysConsumeMouseWheel<"u"?n.alwaysConsumeMouseWheel:!1,scrollYToX:typeof n.scrollYToX<"u"?n.scrollYToX:!1,mouseWheelScrollSensitivity:typeof n.mouseWheelScrollSensitivity<"u"?n.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof n.fastScrollSensitivity<"u"?n.fastScrollSensitivity:5,scrollPredominantAxis:typeof n.scrollPredominantAxis<"u"?n.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof n.mouseWheelSmoothScroll<"u"?n.mouseWheelSmoothScroll:!0,listenOnDomNode:typeof n.listenOnDomNode<"u"?n.listenOnDomNode:null,horizontal:typeof n.horizontal<"u"?n.horizontal:1,horizontalScrollbarSize:typeof n.horizontalScrollbarSize<"u"?n.horizontalScrollbarSize:10,horizontalSliderSize:typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:0,horizontalHasArrows:typeof n.horizontalHasArrows<"u"?n.horizontalHasArrows:!1,vertical:typeof n.vertical<"u"?n.vertical:1,verticalScrollbarSize:typeof n.verticalScrollbarSize<"u"?n.verticalScrollbarSize:10,verticalHasArrows:typeof n.verticalHasArrows<"u"?n.verticalHasArrows:!1,verticalSliderSize:typeof n.verticalSliderSize<"u"?n.verticalSliderSize:0,scrollByPage:typeof n.scrollByPage<"u"?n.scrollByPage:!1};return i.horizontalSliderSize=typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:i.horizontalScrollbarSize,i.verticalSliderSize=typeof n.verticalSliderSize<"u"?n.verticalSliderSize:i.verticalScrollbarSize,ie&&(i.className+=" xterm-mac"),i}var dt=class extends g{constructor(e,t,r,s,o,a,l,h,d){super();this._bufferService=r;this._coreService=o;this._optionsService=h;this._renderService=d;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._isSyncing=!1;this._isHandlingScroll=!1;this._suppressOnScrollHandler=!1;this._needsSyncOnRender=!1;let c=this._register(new lt({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:u=>tt(s.window,u)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{c.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new Mi(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},c)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(a.onProtocolChange(u=>{this._scrollableElement.updateOptions({handleMouseWheel:!(u&16)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(j.runAndSubscribe(l.onChangeColors,()=>{e.style.backgroundColor=l.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=l.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register(E(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register(E(()=>this._styleElement.remove())),this._register(j.runAndSubscribe(l.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${l.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${l.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${l.colors.scrollbarSliderActiveBackground.css};`,"}"].join(` --`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(u=>this._handleScroll(u)))}scrollLines(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){let e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,r=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:r,verticalHasArrows:t}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){if(!(!this._renderService||this._isSyncing)){if(this._coreService.decPrivateModes.synchronizedOutput){this._needsSyncOnRender=!0;return}this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1}}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),r=t-this._bufferService.buffer.ydisp;r!==0&&(this._latestYDisp=t,this._onRequestScrollLines.fire(r)),this._isHandlingScroll=!1}handleTouchScroll(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};dt=y([m(2,D),m(3,G),m(4,Y),m(5,Me),m(6,_e),m(7,R),m(8,V)],dt);var ut=class extends g{constructor(e,t,r,s,o){super();this._screenElement=e;this._bufferService=t;this._coreBrowserService=r;this._decorationService=s;this._renderService=o;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(a=>this._removeDecoration(a))),this._register(E(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){let t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer",e?.options?.layer==="top"),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`;let r=e.options.x??0;return r&&r>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){let 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 r=this._decorationElements.get(e);r||(r=this._createElement(e),e.element=r,this._decorationElements.set(e,r),this._container.appendChild(r),e.onDispose(()=>{this._decorationElements.delete(e),r.remove()})),r.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(r.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,r.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,r.style.top=`${t*this._renderService.dimensions.css.cell.height}px`,r.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),e.onRenderEmitter.fire(r)}}_refreshXPosition(e,t=e.element){if(!t)return;let r=e.options.x??0;(e.options.anchor||"left")==="right"?t.style.right=r?`${r*this._renderService.dimensions.css.cell.width}px`:"":t.style.left=r?`${r*this._renderService.dimensions.css.cell.width}px`:""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};ut=y([m(1,D),m(2,G),m(3,ge),m(4,V)],ut);var Pi=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(i){if(i.options.overviewRulerOptions){for(let e of this._zones)if(e.color===i.options.overviewRulerOptions.color&&e.position===i.options.overviewRulerOptions.position){if(this._lineIntersectsZone(e,i.marker.line))return;if(this._lineAdjacentToZone(e,i.marker.line,i.options.overviewRulerOptions.position)){this._addLineToZone(e,i.marker.line);return}}if(this._zonePoolIndex=i.startBufferLine&&e<=i.endBufferLine}_lineAdjacentToZone(i,e,t){return e>=i.startBufferLine-this._linePadding[t||"full"]&&e<=i.endBufferLine+this._linePadding[t||"full"]}_addLineToZone(i,e){i.startBufferLine=Math.min(i.startBufferLine,e),i.endBufferLine=Math.max(i.endBufferLine,e)}};var Ce={full:0,left:0,center:0,right:0},Fe={full:0,left:0,center:0,right:0},$t={full:0,left:0,center:0,right:0},ze=class extends g{constructor(e,t,r,s,o,a,l,h){super();this._viewportElement=e;this._screenElement=t;this._bufferService=r;this._decorationService=s;this._renderService=o;this._optionsService=a;this._themeService=l;this._coreBrowserService=h;this._colorZoneStore=new Pi;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),this._register(E(()=>this._canvas?.remove()));let d=this._canvas.getContext("2d");if(d)this._ctx=d;else throw new Error("Ctx cannot be null");this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register(E(()=>{this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}get _width(){let e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??!0?e?.width??0:0}_refreshDrawConstants(){let e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);Fe.full=this._canvas.width,Fe.left=e,Fe.center=t,Fe.right=e,this._refreshDrawHeightConstants(),$t.full=1,$t.left=1,$t.center=1+Fe.left,$t.right=1+Fe.left+Fe.center}_refreshDrawHeightConstants(){Ce.full=Math.round(2*this._coreBrowserService.dpr);let e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);Ce.left=t,Ce.center=t,Ce.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;let e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(let t of this._decorationService.decorations)this._colorZoneStore.addDecoration(t);this._ctx.lineWidth=1,this._renderRulerOutline();let e=this._colorZoneStore.zones;for(let t of e)t.position!=="full"&&this._renderColorZone(t);for(let t of e)t.position==="full"&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect($t[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-Ce[e.position||"full"]/2),Fe[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+Ce[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};ze=y([m(2,D),m(3,ge),m(4,V),m(5,R),m(6,_e),m(7,G)],ze);var ft=class{constructor(i,e,t,r,s,o){this._textarea=i;this._compositionView=e;this._bufferService=t;this._optionsService=r;this._coreService=s;this._renderService=o;this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent=""}get isComposing(){return this._isComposing}compositionstart(){this._isComposing=!0;let i=this._textarea.selectionStart??this._textarea.value.length,e=this._textarea.selectionEnd??i;this._compositionPosition.start=Math.min(i,e),this._compositionPosition.end=Math.max(i,e),this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(i){this._compositionView.textContent=`\u200E${i.data}\u200E`,this.updateCompositionElements(),setTimeout(()=>{let e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)},0)}compositionend(){this._finalizeComposition(!0)}keydown(i){if(this._isComposing||this._isSendingComposition){if(i.keyCode===20||i.keyCode===229||i.keyCode===16||i.keyCode===17||i.keyCode===18)return!1;this._finalizeComposition(!1)}return i.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}_finalizeComposition(i){if(this._compositionView.classList.remove("active"),this._isComposing=!1,i){let e={start:this._compositionPosition.start,end:this._compositionPosition.end},t=this._compositionSuffix;this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){this._isSendingComposition=!1;let r;if(e.start+=this._dataAlreadySent.length,this._isComposing)r=this._textarea.value.substring(e.start,this._compositionPosition.start);else{let s=this._textarea.value,o=t.length>0&&s.endsWith(t)?s.length-t.length:s.length;r=s.substring(e.start,Math.max(e.start,o))}r.length>0&&this._coreService.triggerDataEvent(r,!0)}},0)}else{this._isSendingComposition=!1;let e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;let i=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){let e=this._textarea.value,t=e.replace(i,"");this._dataAlreadySent=t,e.length>i.length?this._coreService.triggerDataEvent(t,!0):e.lengththis.updateCompositionElements(!0),0)}}};ft=y([m(2,D),m(3,R),m(4,Y),m(5,V)],ft);var J=0,Q=0,ee=0,W=0,ts={css:"#00000000",rgba:0},O;(t=>{function n(r,s,o,a){return a!==void 0?`#${Ve(r)}${Ve(s)}${Ve(o)}${Ve(a)}`:`#${Ve(r)}${Ve(s)}${Ve(o)}`}t.toCss=n;function i(r,s,o,a=255){return(r<<24|s<<16|o<<8|a)>>>0}t.toRgba=i;function e(r,s,o,a){return{css:t.toCss(r,s,o,a),rgba:t.toRgba(r,s,o,a)}}t.toColor=e})(O||={});var k;(a=>{function n(l,h){if(W=(h.rgba&255)/255,W===1)return{css:h.css,rgba:h.rgba};let d=h.rgba>>24&255,c=h.rgba>>16&255,u=h.rgba>>8&255,_=l.rgba>>24&255,p=l.rgba>>16&255,v=l.rgba>>8&255;J=_+Math.round((d-_)*W),Q=p+Math.round((c-p)*W),ee=v+Math.round((u-v)*W);let f=O.toCss(J,Q,ee),S=O.toRgba(J,Q,ee);return{css:f,rgba:S}}a.blend=n;function i(l){return(l.rgba&255)===255}a.isOpaque=i;function e(l,h,d){let c=Oi.ensureContrastRatio(l.rgba,h.rgba,d);if(c)return O.toColor(c>>24&255,c>>16&255,c>>8&255)}a.ensureContrastRatio=e;function t(l){let h=(l.rgba|255)>>>0;return[J,Q,ee]=Oi.toChannels(h),{css:O.toCss(J,Q,ee),rgba:h}}a.opaque=t;function r(l,h){return W=Math.round(h*255),[J,Q,ee]=Oi.toChannels(l.rgba),{css:O.toCss(J,Q,ee,W),rgba:O.toRgba(J,Q,ee,W)}}a.opacity=r;function s(l,h){return W=l.rgba&255,r(l,W*h/255)}a.multiplyOpacity=s;function o(l){return[l.rgba>>24&255,l.rgba>>16&255,l.rgba>>8&255]}a.toColorRGB=o})(k||={});var B;(t=>{let n,i;try{let r=document.createElement("canvas");r.width=1,r.height=1;let s=r.getContext("2d",{willReadFrequently:!0});s&&(n=s,n.globalCompositeOperation="copy",i=n.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),O.toColor(J,Q,ee);case 5:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),W=parseInt(r.slice(4,5).repeat(2),16),O.toColor(J,Q,ee,W);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let s=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return J=parseInt(s[1],10),Q=parseInt(s[2],10),ee=parseInt(s[3],10),W=Math.round((s[5]===void 0?1:parseFloat(s[5]))*255),O.toColor(J,Q,ee,W);if(r==="transparent")return{css:"transparent",rgba:0};if(!n||!i)throw new Error("css.toColor: Unsupported css format");if(n.fillStyle=i,n.fillStyle=r,typeof n.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(n.fillRect(0,0,1,1),[J,Q,ee,W]=n.getImageData(0,0,1,1).data,W!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:O.toRgba(J,Q,ee,W),css:r}}t.toColor=e})(B||={});var Z;(e=>{function n(t){return i(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=n;function i(t,r,s){let o=t/255,a=r/255,l=s/255,h=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),d=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),c=l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4);return h*.2126+d*.7152+c*.0722}e.relativeLuminance2=i})(Z||={});var Oi;(s=>{function n(o,a){if(W=(a&255)/255,W===1)return a;let l=a>>24&255,h=a>>16&255,d=a>>8&255,c=o>>24&255,u=o>>16&255,_=o>>8&255;return J=c+Math.round((l-c)*W),Q=u+Math.round((h-u)*W),ee=_+Math.round((d-_)*W),O.toRgba(J,Q,ee)}s.blend=n;function i(o,a,l){let h=Z.relativeLuminance(o>>8),d=Z.relativeLuminance(a>>8);if(Te(h,d)>8));if(v>8));return v>S?p:f}return p}let u=t(o,a,l),_=Te(h,Z.relativeLuminance(u>>8));if(_>8));return _>v?u:p}return u}}s.ensureContrastRatio=i;function e(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v0||_>0||p>0);)u-=Math.max(0,Math.ceil(u*.1)),_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));return(u<<24|_<<16|p<<8|255)>>>0}s.reduceLuminance=e;function t(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v>>0}s.increaseLuminance=t;function r(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}s.toChannels=r})(Oi||={});function Ve(n){let i=n.toString(16);return i.length<2?"0"+i:i}function Te(n,i){return n1){let u=this._getJoinedRanges(r,l,a,e,o);for(let _=0;_1){let c=this._getJoinedRanges(r,l,a,e,o);for(let u=0;u=ks,Lr=ae,x=this._workCell;if(v.length>0&&ae===v[0][0]&&je){let A=v.shift(),Pr=this._isCellInSelection(A[0],e);for(T=A[0]+1;T=A[1],je?(fi=!0,x=new Ni(this._workCell,i.translateToString(!0,A[0],A[1]),A[1]-A[0]),Lr=A[1]-1,Rr=x.getWidth()):ks=A[1]}let Nt=this._isCellInSelection(ae,e),Ar=t&&ae===o,kr=An&&ae>=c&&ae<=u;_&&x.isBlink()&&(_.hasBlinkingCells=!0),!l&&x.isBlink()&&N.push("xterm-blink-hidden");let Mr=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,A=>{Mr=!0});let _i=x.getChars()||" ";if(_i===" "&&(x.isUnderline()||x.isOverline())&&(_i="\xA0"),Ot=Rr*h-d.get(_i,x.isBold(),x.isItalic()),!I)I=this._document.createElement("span");else if(w&&(Nt&&ui||!Nt&&!ui&&x.bg===te)&&(Nt&&ui&&f.selectionForeground||x.fg===Ds)&&x.extended.ext===Rs&&kr===Ls&&Ot===As&&!Ar&&!fi&&!Mr&&je){x.isInvisible()?L+=" ":L+=_i,w++;continue}else w&&(I.textContent=L),I=this._document.createElement("span"),w=0,L="";if(te=x.bg,Ds=x.fg,Rs=x.extended.ext,Ls=kr,As=Ot,ui=Nt,fi&&o>=ae&&o<=Lr&&(o=ae),!this._coreService.isCursorHidden&&Ar&&this._coreService.isCursorInitialized){if(N.push("xterm-cursor"),this._coreBrowserService.isFocused)a&&N.push("xterm-cursor-blink"),N.push(r==="bar"?"xterm-cursor-bar":r==="underline"?"xterm-cursor-underline":"xterm-cursor-block");else if(s)switch(s){case"outline":N.push("xterm-cursor-outline");break;case"block":N.push("xterm-cursor-block");break;case"bar":N.push("xterm-cursor-bar");break;case"underline":N.push("xterm-cursor-underline");break;default:break}}if(x.isBold()&&N.push("xterm-bold"),x.isItalic()&&N.push("xterm-italic"),x.isDim()&&N.push("xterm-dim"),x.isInvisible()?L=" ":L=x.getChars()||" ",x.isUnderline()&&(N.push(`xterm-underline-${x.extended.underlineStyle}`),L===" "&&(L="\xA0"),!x.isUnderlineColorDefault()))if(x.isUnderlineColorRGB())I.style.textDecorationColor=`rgb(${ue.toColorRGB(x.getUnderlineColor()).join(",")})`;else{let A=x.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&x.isBold()&&A<8&&(A+=8),I.style.textDecorationColor=f.ansi[A].css}x.isOverline()&&(N.push("xterm-overline"),L===" "&&(L="\xA0")),x.isStrikethrough()&&N.push("xterm-strikethrough"),kr&&(I.style.textDecoration="underline");let de=x.getFgColor(),Ft=x.getFgColorMode(),Se=x.getBgColor(),Ht=x.getBgColorMode(),Br=!!x.isInverse();if(Br){let A=de;de=Se,Se=A;let Pr=Ft;Ft=Ht,Ht=Pr}let Le,pi,Wt=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,A=>{A.options.layer!=="top"&&Wt||(A.backgroundColorRGB&&(Ht=50331648,Se=A.backgroundColorRGB.rgba>>8&16777215,Le=A.backgroundColorRGB),A.foregroundColorRGB&&(Ft=50331648,de=A.foregroundColorRGB.rgba>>8&16777215,pi=A.foregroundColorRGB),Wt=A.options.layer==="top")}),!Wt&&Nt&&(Le=this._coreBrowserService.isFocused?f.selectionBackgroundOpaque:f.selectionInactiveBackgroundOpaque,Se=Le.rgba>>8&16777215,Ht=50331648,Wt=!0,f.selectionForeground&&(Ft=50331648,de=f.selectionForeground.rgba>>8&16777215,pi=f.selectionForeground)),Wt&&N.push("xterm-decoration-top");let Ae;switch(Ht){case 16777216:case 33554432:Ae=f.ansi[Se],N.push(`xterm-bg-${Se}`);break;case 50331648:Ae=O.toColor(Se>>16,Se>>8&255,Se&255),this._addStyle(I,`background-color:#${(Se>>>0).toString(16).padStart(6,"0")}`);break;case 0:default:Br?(Ae=f.foreground,N.push(`xterm-bg-${257}`)):Ae=f.background}switch(Le||x.isDim()&&(Le=k.multiplyOpacity(Ae,.5)),Ft){case 16777216:case 33554432:x.isBold()&&de<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(de+=8),this._applyMinimumContrast(I,Ae,f.ansi[de],x,Le,void 0)||N.push(`xterm-fg-${de}`);break;case 50331648:let A=O.toColor(de>>16&255,de>>8&255,de&255);this._applyMinimumContrast(I,Ae,A,x,Le,pi)||this._addStyle(I,`color:#${de.toString(16).padStart(6,"0")}`);break;case 0:default:this._applyMinimumContrast(I,Ae,f.foreground,x,Le,pi)||Br&&N.push(`xterm-fg-${257}`)}N.length&&(I.className=N.join(" "),N.length=0),!Ar&&!fi&&!Mr&&je?w++:I.textContent=L,Ot!==this.defaultSpacing&&(I.style.letterSpacing=`${Ot}px`),p.push(I),ae=Lr}return I&&w&&(I.textContent=L),p}_applyMinimumContrast(i,e,t,r,s,o){if(this._optionsService.rawOptions.minimumContrastRatio===1||js(r.getCode()))return!1;let a=this._getContrastCache(r),l;if(!s&&!o&&(l=a.getColor(e.rgba,t.rgba)),l===void 0){let h=this._optionsService.rawOptions.minimumContrastRatio/(r.isDim()?2:1);l=k.ensureContrastRatio(s??e,o??t,h),a.setColor((s??e).rgba,(o??t).rgba,l??null)}return l?(this._addStyle(i,`color:${l.css}`),!0):!1}_getContrastCache(i){return i.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(i,e){i.setAttribute("style",`${i.getAttribute("style")||""}${e};`)}_isCellInSelection(i,e){let t=this._selectionStart,r=this._selectionEnd;return!t||!r?!1:this._columnSelectMode?t[0]<=r[0]?i>=t[0]&&e>=t[1]&&i=t[1]&&i>=r[0]&&e<=r[1]:e>t[1]&&e=t[0]&&i=t[0]}};_t=y([m(1,gi),m(2,R),m(3,G),m(4,Y),m(5,ge),m(6,_e)],_t);var Hi=class{constructor(i=()=>new rs){this._flat=new Float32Array(256);this._font="";this._fontSize=0;this._weight="normal";this._weightBold="bold";this._canvasElements=[];this._canvasElements=[i(),i(),i(),i()],this.clear()}dispose(){this._canvasElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(i,e,t,r){i===this._font&&e===this._fontSize&&t===this._weight&&r===this._weightBold||(this._font=i,this._fontSize=e,this._weight=t,this._weightBold=r,this._canvasElements[0].setFont(i,e,t,!1),this._canvasElements[1].setFont(i,e,r,!1),this._canvasElements[2].setFont(i,e,t,!0),this._canvasElements[3].setFont(i,e,r,!0),this.clear())}get(i,e,t){let r;if(!e&&!t&&i.length===1&&(r=i.charCodeAt(0))<256){if(this._flat[r]!==-9999)return this._flat[r];let a=this._measure(i,0);return a>0&&(this._flat[r]=a),a}let s=i;e&&(s+="B"),t&&(s+="I");let o=this._holey.get(s);if(o===void 0){let a=0;e&&(a|=1),t&&(a|=2),o=this._measure(i,a),o>0&&this._holey.set(s,o)}return o}_measure(i,e){return this._canvasElements[e].measure(i)}},rs=class{constructor(){typeof OffscreenCanvas<"u"?(this._canvas=new OffscreenCanvas(1,1),this._ctx=is(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=is(this._canvas.getContext("2d")))}setFont(i,e,t,r){let s=r?"italic":"";this._ctx.font=`${s} ${t} ${e}px ${i}`.trim()}measure(i){return this._ctx.measureText(i).width}};var ss=class{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(i,e,t,r=!1){if(this.selectionStart=e,this.selectionEnd=t,!e||!t||e[0]===t[0]&&e[1]===t[1]){this.clear();return}let s=i.buffers.active.ydisp,o=e[1]-s,a=t[1]-s,l=Math.max(o,0),h=Math.min(a,i.rows-1);if(l>=i.rows||h<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=r,this.viewportStartRow=o,this.viewportEndRow=a,this.viewportCappedStartRow=l,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=t[0]}isCellSelected(i,e,t){return this.hasSelection?(t-=i.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&t>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&t<=this.viewportCappedEndRow:t>this.viewportStartRow&&t=this.startCol&&e=this.startCol):!1}};function Js(){return new ss}var Wi=class extends g{constructor(e,t,r){super();this._renderCallback=e;this._coreBrowserService=t;this._optionsService=r;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",s=>{this.setIntervalDuration(s)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(E(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let t=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),t||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var Zn=1,mt=class extends g{constructor(e,t,r,s,o,a,l,h,d,c,u,_,p,v){super();this._terminal=e;this._document=t;this._element=r;this._screenElement=s;this._viewportElement=o;this._helperContainer=a;this._linkifier2=l;this._charSizeService=d;this._optionsService=c;this._bufferService=u;this._coreService=_;this._coreBrowserService=p;this._themeService=v;this._terminalClass=Zn++;this._rowElements=[];this._selectionRenderModel=Js();this._lastSelectionColumnMode=!1;this._rowHasBlinkingCells=[];this._rowHasBlinkingCellsCount=0;this._onRequestRedraw=this._register(new b);this.onRequestRedraw=this._onRequestRedraw.event;this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=Zs(),this._updateDimensions(),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._themeService.onChangeColors(f=>this._injectCss(f))),this._injectCss(this._themeService.colors),this._rowFactory=h.createInstance(_t,document),this._element.classList.add("xterm-dom-renderer-owner-"+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this._register(this._linkifier2.onShowLinkUnderline(f=>this._handleLinkHover(f))),this._register(this._linkifier2.onHideLinkUnderline(f=>this._handleLinkLeave(f))),this._cursorBlinkStateManager=new ns(this._rowContainer,this._coreBrowserService),this._register(C(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register(E(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new Wi(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register(E(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new Hi,this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){let 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(let r of this._rowElements)r.style.width=`${this.dimensions.css.canvas.width}px`,r.style.height=`${this.dimensions.css.cell.height}px`,r.style.lineHeight=`${this.dimensions.css.cell.height}px`,r.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));let t=`${this._terminalSelector} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${k.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;let r=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,o=`blink_block_${this._terminalClass}`;t+=`@keyframes ${r} { 50% { border-bottom-style: hidden; }}`,t+=`@keyframes ${s} { 50% { box-shadow: none; }}`,t+=`@keyframes ${o} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${o} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(let[a,l]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${a} { color: ${l.css}; }${this._terminalSelector} .xterm-fg-${a}.xterm-dim { color: ${k.multiplyOpacity(l,.5).css}; }${this._terminalSelector} .xterm-bg-${a} { background-color: ${l.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${257} { color: ${k.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${257}.xterm-dim { color: ${k.multiplyOpacity(k.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${257} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){let 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 r=this._rowElements.length;r<=t;r++){let s=this._document.createElement("div");this._rowContainer.appendChild(s),this._rowElements.push(s),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,r){let s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,r);let o=0,a=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(o=this._selectionRenderModel.viewportCappedStartRow,a=this._selectionRenderModel.viewportCappedEndRow));let l=0,h=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,r),this._selectionRenderModel.hasSelection){let u=this._selectionRenderModel.viewportStartRow,_=this._selectionRenderModel.viewportEndRow,p=this._selectionRenderModel.viewportCappedStartRow,v=this._selectionRenderModel.viewportCappedEndRow;l=p,h=v;let f=this._document.createDocumentFragment();if(r){let S=e[0]>t[0];f.appendChild(this._createSelectionElement(p,S?t[0]:e[0],S?e[0]:t[0],v-p+1))}else{let S=u===p?e[0]:0,I=p===_?t[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(p,S,I));let w=v-p-1;if(f.appendChild(this._createSelectionElement(p+1,0,this._bufferService.cols,w)),p!==v){let L=_===v?t[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(v,0,L))}}this._selectionContainer.appendChild(f)}let d=Math.min(o,l),c=Math.max(a,h);if(c>=0){d=Math.max(d,0),c=Math.min(c,s-1);let _=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&_>=0&&_this.dimensions.css.canvas.width&&(l=this.dimensions.css.canvas.width-a),o.style.height=`${s*this.dimensions.css.cell.height}px`,o.style.top=`${e*this.dimensions.css.cell.height}px`,o.style.left=`${a}px`,o.style.width=`${l}px`,o}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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(let e of this._rowElements)e.replaceChildren();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){let r=this._bufferService.buffer,s=r.ybase+r.y,o=Math.min(r.x,this._bufferService.cols-1),a=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,l=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,h=this._optionsService.rawOptions.cursorInactiveStyle,d={hasBlinkingCells:!1};for(let c=e;c<=t;c++){let u=c+r.ydisp,_=this._rowElements[c];if(!_)continue;let p=r.lines.get(u);if(!p){_.replaceChildren(),this._setRowBlinkState(c,!1);continue}_.replaceChildren(...this._rowFactory.createRow(p,u,u===s,l,h,o,a,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,d)),this._setRowBlinkState(c,d.hasBlinkingCells)}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,r,s,o,a){r<0&&(e=0),s<0&&(t=0);let l=this._bufferService.rows-1;r=Math.max(Math.min(r,l),0),s=Math.max(Math.min(s,l),0),o=Math.min(o,this._bufferService.cols);let h=this._bufferService.buffer,d=h.ybase+h.y,c=Math.min(h.x,o-1),u=this._optionsService.rawOptions.cursorBlink,_=this._optionsService.rawOptions.cursorStyle,p=this._optionsService.rawOptions.cursorInactiveStyle,v={hasBlinkingCells:!1};for(let f=r;f<=s;++f){let S=f+h.ydisp,I=this._rowElements[f];if(!I)continue;let w=h.lines.get(S);if(!w){I.replaceChildren(),this._setRowBlinkState(f,!1);continue}I.replaceChildren(...this._rowFactory.createRow(w,S,S===d,_,p,c,u,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,a?f===r?e:0:-1,a?(f===s?t:o)-1:-1,v)),this._setRowBlinkState(f,v.hasBlinkingCells)}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};mt=y([m(7,Qe),m(8,Be),m(9,R),m(10,D),m(11,Y),m(12,G),m(13,_e)],mt);var ns=class{constructor(i,e){this._rowContainer=i;this._coreBrowserService=e;this._isIdlePaused=!1;this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){this._idleTimeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}};var bt=class extends g{constructor(e,t,r){super();this._optionsService=r;this.width=0;this.height=0;this._onCharSizeChange=this._register(new b);this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new as(this._optionsService))}catch{this._measureStrategy=this._register(new os(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}get hasValidSize(){return this.width>0&&this.height>0}measure(){let e=this._measureStrategy.measure();(e.width!==this.width||e.height!==this.height)&&(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};bt=y([m(2,R)],bt);var Ui=class extends g{constructor(){super(...arguments);this._result={width:0,height:0}}_validateAndSet(e,t){e!==void 0&&e>0&&t!==void 0&&t>0&&(this._result.width=e,this._result.height=t)}},os=class extends Ui{constructor(e,t,r){super();this._document=e;this._parentElement=t;this._optionsService=r;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}},as=class extends Ui{constructor(e){super();this._optionsService=e;this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");let 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}`;let e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}};var Ki=class extends g{constructor(e,t,r){super();this._textarea=e;this._window=t;this.mainDocument=r;this._isFocused=!1;this._cachedIsFocused=void 0;this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._onWindowChange=this._register(new b);this.onWindowChange=this._onWindowChange.event;this._screenDprMonitor=this._register(new ls(this._window)),this._register(this.onWindowChange(s=>this._screenDprMonitor.setWindow(s))),this._register(j.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register(C(this._textarea,"focus",()=>this._isFocused=!0)),this._register(C(this._textarea,"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 this._cachedIsFocused===void 0&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask(()=>this._cachedIsFocused=void 0)),this._cachedIsFocused}},ls=class extends g{constructor(e){super();this._parentWindow=e;this._windowResizeListener=this._register(new P);this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register(E(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=C(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)}};var zi=class extends g{constructor(){super();this.linkProviders=[];this._register(E(()=>this.linkProviders.length=0))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{let t=this.linkProviders.indexOf(e);t!==-1&&this.linkProviders.splice(t,1)}}}};function qt(n,i,e){let t=e.getBoundingClientRect(),r=n.getComputedStyle(e),s=parseInt(r.getPropertyValue("padding-left"),10),o=parseInt(r.getPropertyValue("padding-top"),10);return[i.clientX-t.left-s,i.clientY-t.top-o]}function Qs(n,i,e,t,r,s,o,a,l){if(!s)return;let h=qt(n,i,e);return h[0]=Math.ceil((h[0]+(l?o/2:0))/o),h[1]=Math.ceil(h[1]/a),h[0]=Math.min(Math.max(h[0],1),t+(l?1:0)),h[1]=Math.min(Math.max(h[1],1),r),h}var vt=class{constructor(i,e){this._charSizeService=i;this._renderService=e}getCoords(i,e,t,r,s){return Qs(se(e),i,e,t,r,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,s)}getMouseReportCoords(i,e){let t=qt(se(e),i,e);if(this._charSizeService.hasValidSize)return t[0]=Math.min(Math.max(t[0],0),this._renderService.dimensions.css.canvas.width-1),t[1]=Math.min(Math.max(t[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(t[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(t[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(t[0]),y:Math.floor(t[1])}}};vt=y([m(0,Be),m(1,V)],vt);var en=typeof window=="object"?window:globalThis;function ce(n,i=0){return n[n.length-(1+i)]}function Jn(n,i,e){let t=null,r=null;if(typeof e.value=="function"?(t="value",r=e.value,r.length!==0&&console.warn("Memoize should only be used in functions with zero parameters")):typeof e.get=="function"&&(t="get",r=e.get),!r||!t)throw new Error("not supported");let s=`$memoize$${i}`,o=e;o[t]=function(...a){return this.hasOwnProperty(s)||Object.defineProperty(this,s,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,a)}),this[s]}}var St=class St{constructor(i){this.element=i,this.next=St.Undefined,this.prev=St.Undefined}};St.Undefined=new St(void 0);var re=St,Gi=class{constructor(){this._first=re.Undefined;this._last=re.Undefined}push(i){return this._insert(i,!0)}_insert(i,e){let t=new re(i);if(this._first===re.Undefined)this._first=t,this._last=t;else if(e){let s=this._last;this._last=t,t.prev=s,s.next=t}else{let s=this._first;this._first=t,t.next=s,s.prev=t}let r=!1;return()=>{r||(r=!0,this._remove(t))}}_remove(i){if(i.prev!==re.Undefined&&i.next!==re.Undefined){let e=i.prev;e.next=i.next,i.next.prev=e}else i.prev===re.Undefined&&i.next===re.Undefined?(this._first=re.Undefined,this._last=re.Undefined):i.next===re.Undefined?(this._last=this._last.prev,this._last.next=re.Undefined):i.prev===re.Undefined&&(this._first=this._first.next,this._first.prev=re.Undefined)}*[Symbol.iterator](){let i=this._first;for(;i!==re.Undefined;)yield i.element,i=i.next}},he;(s=>(s.TAP="-xterm-gesturetap",s.CHANGE="-xterm-gesturechange",s.START="-xterm-gesturestart",s.END="-xterm-gesturesend",s.CONTEXT_MENU="-xterm-gesturecontextmenu"))(he||={});var K=class K extends g{constructor(){super();this._dispatched=!1;this._targets=new Gi;this._ignoreTargets=new Gi;this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;let e=en;this._register(C(e.document,"touchstart",t=>this._handleTouchStart(t),{passive:!1})),this._register(C(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(C(e.document,"touchmove",t=>this._handleTouchMove(t),{passive:!1}))}static addTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let t=K._instance._targets.push(e);return E(t)}static ignoreTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let t=K._instance._ignoreTargets.push(e);return E(t)}static isTouchDevice(){return"ontouchstart"in en||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){let t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let r=0,s=e.targetTouches.length;r=K._holdDelay&&Math.abs(h.initialPageX-ce(h.rollingPageX))<30&&Math.abs(h.initialPageY-ce(h.rollingPageY))<30){let c=this._newGestureEvent(he.CONTEXT_MENU,h.initialTarget);c.pageX=ce(h.rollingPageX),c.pageY=ce(h.rollingPageY),this._dispatchEvent(c)}else if(s===1){let c=ce(h.rollingPageX),u=ce(h.rollingPageY),_=ce(h.rollingTimestamps)-h.rollingTimestamps[0],p=c-h.rollingPageX[0],v=u-h.rollingPageY[0],f=[...this._targets].filter(S=>h.initialTarget instanceof Node&&S.contains(h.initialTarget));this._inertia(e,f,r,Math.abs(p)/_,p>0?1:-1,c,Math.abs(v)/_,v>0?1:-1,u)}this._dispatchEvent(this._newGestureEvent(he.END,h.initialTarget)),delete this._activeTouches[l.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){let r=document.createEvent("CustomEvent");return r.initEvent(e,!1,!0),r.initialTarget=t,r.tapCount=0,r}_dispatchEvent(e){if(e.type===he.TAP){let t=new Date().getTime(),r;t-this._lastSetTapCountTime>K._clearTapCountTime?r=1:r=2,this._lastSetTapCountTime=t,e.tapCount=r}else(e.type===he.CHANGE||e.type===he.CONTEXT_MENU)&&(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(let r of this._ignoreTargets)if(r.contains(e.initialTarget))return;let t=[];for(let r of this._targets)if(r.contains(e.initialTarget)){let s=0,o=e.initialTarget;for(;o&&o!==r;)s++,o=o.parentElement;t.push([s,r])}t.sort((r,s)=>r[0]-s[0]);for(let[,r]of t)r.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,r,s,o,a,l,h,d){this._handle=tt(e,()=>{let c=Date.now(),u=c-r,_=0,p=0,v=!0;s+=K._scrollFriction*u,l+=K._scrollFriction*u,s>0&&(v=!1,_=o*s*u),l>0&&(v=!1,p=h*l*u);let f=this._newGestureEvent(he.CHANGE);f.translationX=_,f.translationY=p,t.forEach(S=>S.dispatchEvent(f)),v||this._inertia(e,t,c,s,o,a+_,l,h,d+p)})}_handleTouchMove(e){let t=Date.now();for(let r=0,s=e.changedTouches.length;r3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(o.pageX),a.rollingPageY.push(o.pageY),a.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}};K._scrollFriction=-.005,K._holdDelay=700,K._clearTapCountTime=400,y([Jn],K,"isTouchDevice",1);var Vi=K;var gt=class{constructor(i,e,t,r,s,o,a,l,h){this._renderService=i;this._mouseCoordsService=e;this._mouseStateService=t;this._coreService=r;this._bufferService=s;this._optionsService=o;this._selectionService=a;this._logService=l;this._coreBrowserService=h;this._lastEvent=null;this._wheelPartialScroll=0;this._touchScrollAccumulator=0}bindMouse(i,e,t){let{element:r,document:s}=i,o={mouseup:null,wheel:null,mousedrag:null,mousemove:null},a={target:i,focus:t,requestedEvents:o},l={mouseup:h=>this._handleMouseUp(a,h),wheel:h=>this._handleWheel(a,h),mousedrag:h=>this._handleMouseDrag(a,h),mousemove:h=>this._handleMouseMove(a,h)};this._altMouseCursor=new cs(r,s,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),e(this._altMouseCursor),e(this._mouseStateService.onProtocolChange(h=>{this._handleProtocolChange(a,l,h)})),e(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(r),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,e(E(()=>{o.mouseup&&s.removeEventListener("mouseup",o.mouseup),o.mousedrag&&s.removeEventListener("mousemove",o.mousedrag)})),e(C(r,"mousedown",h=>this._handleMouseDown(a,h))),e(C(r,"wheel",h=>this._handlePassiveWheel(a,h),{passive:!1})),e(Vi.addTarget(i.screenElement)),e(C(i.screenElement,he.START,()=>this._handleTouchStart())),e(C(i.screenElement,he.CHANGE,h=>this._handleTouchChange(a,h)))}_sendEvent(i,e){let t=this._mouseCoordsService.getMouseReportCoords(e,i.target.screenElement);if(!t)return!1;let r,s;switch(e.overrideType||e.type){case"mousemove":s=32,e.buttons===void 0?(r=3,e.button!==void 0&&(r=e.button<3?e.button:3)):r=e.buttons&1?0:e.buttons&4?1:e.buttons&2?2:3;break;case"mouseup":s=0,r=e.button<3?e.button:3;break;case"mousedown":s=1,r=e.button<3?e.button:3;break;case"wheel":if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;let a=e.deltaY;if(a===0||this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return!1;s=a<0?0:1,r=4;break;default:return!1}if(s===void 0||r===void 0||r>4||r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!e.altKey)return!1;let o=r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:t.col,row:t.row,x:t.x,y:t.y,button:r,action:s,ctrl:e.ctrlKey,alt:o?!1:e.altKey,shift:e.shiftKey})}_handleMouseUp(i,e){this._sendEvent(i,e),e.buttons||(i.requestedEvents.mouseup&&i.target.document.removeEventListener("mouseup",i.requestedEvents.mouseup),i.requestedEvents.mousedrag&&i.target.document.removeEventListener("mousemove",i.requestedEvents.mousedrag))}_handleWheel(i,e){return this._sendEvent(i,e),e.preventDefault(),e.stopPropagation(),!1}_handleMouseDrag(i,e){e.buttons&&this._sendEvent(i,e)}_handleMouseMove(i,e){e.buttons||this._sendEvent(i,e)}_handleMouseDown(i,e){e.preventDefault(),i.focus(),!(!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(e))&&(this._sendEvent(i,e),i.requestedEvents.mouseup&&i.target.document.addEventListener("mouseup",i.requestedEvents.mouseup),i.requestedEvents.mousedrag&&i.target.document.addEventListener("mousemove",i.requestedEvents.mousedrag))}_handlePassiveWheel(i,e){if(!i.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;if(!this._bufferService.buffer.hasScrollback){if(e.deltaY===0)return!1;if(this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return e.preventDefault(),e.stopPropagation(),!1;let s="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(s,!0),e.preventDefault(),e.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(i,e){if(e.preventDefault(),e.stopPropagation(),i.requestedEvents.wheel){this._handleTouchScrollAsWheel(i,e);return}if(!this._bufferService.buffer.hasScrollback){this._handleTouchScrollAsKeys(e);return}i.target.handleTouchScroll?.(e.translationY)}_handleTouchScrollAsKeys(i){let e=this._renderService?.dimensions.css.cell.height;if(!e)return;this._touchScrollAccumulator-=i.translationY;let t=Math.trunc(this._touchScrollAccumulator/e);if(t===0)return;this._touchScrollAccumulator-=t*e;let r="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t<0?"A":"B");for(let s=0;s0?1:-1),this._wheelPartialScroll%=1):i.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(s*=this._bufferService.rows),s}_triggerMouseEvent(i){if(i.col<0||i.col>=this._bufferService.cols||i.row<0||i.row>=this._bufferService.rows||i.button===4&&i.action===32||i.button===3&&i.action!==32||i.button!==4&&(i.action===2||i.action===3)||(i.col++,i.row++,i.action===32&&this._lastEvent&&this._equalEvents(this._lastEvent,i,this._mouseStateService.isPixelEncoding))||!this._mouseStateService.restrictMouseEvent(i))return!1;let e=this._mouseStateService.encodeMouseEvent(i);return e&&(this._mouseStateService.isDefaultEncoding?this._coreService.triggerBinaryEvent(e):this._coreService.triggerDataEvent(e,!0)),this._lastEvent=i,!0}_explainEvents(i){return{down:!!(i&1),up:!!(i&2),drag:!!(i&4),move:!!(i&8),wheel:!!(i&16)}}_equalEvents(i,e,t){if(t){if(i.x!==e.x||i.y!==e.y)return!1}else if(i.col!==e.col||i.row!==e.row)return!1;return!(i.button!==e.button||i.action!==e.action||i.ctrl!==e.ctrl||i.alt!==e.alt||i.shift!==e.shift)}};gt=y([m(0,V),m(1,Pe),m(2,Me),m(3,Y),m(4,D),m(5,R),m(6,Si),m(7,fe),m(8,G)],gt);var cs=class{constructor(i,e,t){this._element=i;this._document=e;this._isActive=t;this._listeners=new P}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;let i=new pe,e=r=>this.syncFromModifier(r);i.add(C(this._document,"keydown",e)),i.add(C(this._document,"keyup",e)),i.add(C(this._element,"mousemove",e));let t=this._element.ownerDocument?.defaultView;t&&i.add(C(t,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=i}resetClass(){this._updateClass(!1)}syncFromModifier(i){this._isActive()&&this._updateClass(i.getModifierState("Alt"))}_updateClass(i){i?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}};var $i=class{constructor(i,e){this._renderCallback=i;this._coreBrowserService=e;this._refreshCallbacks=[]}dispose(){this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(i){return this._refreshCallbacks.push(i),this._animationFrame??=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()),this._animationFrame}refresh(i,e,t){this._rowCount=t,i=i??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,i):i,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._animationFrame=void 0,this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0){this._runRefreshCallbacks();return}let i=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(i,e),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(let i of this._refreshCallbacks)i(0);this._refreshCallbacks=[]}};var qi=class{constructor(i){this._tasks=[];this._i=0;this._logService=i}enqueue(i){this._tasks.push(i),this._start()}flush(){for(;this._is){r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),this._start();return}r=s}this.clear()}},hs=class extends qi{_requestCallback(i){return setTimeout(()=>i(this._createDeadline(16)))}_cancelCallback(i){clearTimeout(i)}_createDeadline(i){let e=performance.now()+i;return{timeRemaining:()=>Math.max(0,e-performance.now())}}},ds=class extends qi{_requestCallback(i){return requestIdleCallback(i)}_cancelCallback(i){cancelIdleCallback(i)}},It="requestIdleCallback"in globalThis?ds:hs,Xi=class{constructor(i){this._queue=new It(i)}set(i){this._queue.clear(),this._queue.enqueue(i)}flush(){this._queue.flush()}dispose(){this._queue.clear()}};var Ct=class extends g{constructor(e,t,r,s,o,a,l,h,d,c){super();this._rowCount=e;this._optionsService=r;this._logService=s;this._charSizeService=o;this._coreService=a;this._coreBrowserService=d;this._renderer=this._register(new P);this._observerDisposable=this._register(new P);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 b);this.onDimensionsChange=this._onDimensionsChange.event;this._onRenderedViewportChange=this._register(new b);this.onRenderedViewportChange=this._onRenderedViewportChange.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onRefreshRequest=this._register(new b);this.onRefreshRequest=this._onRefreshRequest.event;this._pausedResizeTask=this._register(new Xi(this._logService)),this._renderDebouncer=new $i((u,_)=>this._renderRows(u,_),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new us(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register(E(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(h.onResize(()=>this._fullRefresh())),this._register(h.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(h.buffer.y,h.buffer.y,void 0,!0))),this._register(c.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.onWindowChange(u=>this._registerIntersectionObserver(u,t)))}get dimensions(){return this._renderer.value.dimensions}_registerIntersectionObserver(e,t){if("IntersectionObserver"in e){let r=new e.IntersectionObserver(s=>this._handleIntersectionChange(s[s.length-1]),{threshold:0});this._observerDisposable.value=E(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=r,r.observe(t)}}_handleIntersectionChange(e){this._isPaused=e.isIntersecting===void 0?e.intersectionRatio===0:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),!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,r=!1,s=!1){if(this._isPaused){this._needsFullRefresh=!0;return}if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,t);return}let o=this._syncOutputHandler.flush();o&&(e=Math.min(e,o.start),t=Math.max(t,o.end)),s||(this._isNextRenderRedrawOnly=!1),r?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){if(this._renderer.value){if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,t);return}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(t=>this.refreshRows(t.start,t.end,t.sync,!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,r){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=r,this._renderer.value?.handleSelectionChanged(e,t,r)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};Ct=y([m(2,R),m(3,fe),m(4,Be),m(5,Y),m(6,ge),m(7,D),m(8,G),m(9,_e)],Ct);var us=class{constructor(i,e,t){this._coreBrowserService=i;this._coreService=e;this._onTimeout=t;this._start=0;this._end=0;this._isBuffering=!1}bufferRows(i,e){this._isBuffering?(this._start=Math.min(this._start,i),this._end=Math.max(this._end,e)):(this._start=i,this._end=e,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;let i={start:this._start,end:this._end};return this._isBuffering=!1,i}dispose(){this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}};function tn(n,i,e,t){let r=e.buffer.x,s=e.buffer.y;if(!e.buffer.hasScrollback)return ro(r,s,n,i,e,t)+Yi(s,i,e,t)+so(r,s,n,i,e,t);let o;if(s===i)return o=r>n?"D":"C",Yt(Math.abs(r-n),Xt(o,t));o=s>i?"D":"C";let a=Math.abs(s-i),l=io(s>i?n:r,e)+(a-1)*e.cols+1+to(s>i?r:n,e);return Yt(l,Xt(o,t))}function to(n,i){return n-1}function io(n,i){return i.cols-n}function ro(n,i,e,t,r,s){return Yi(i,t,r,s).length===0?"":Yt(sn(n,i,n,i-$e(i,r),!1,r).length,Xt("D",s))}function Yi(n,i,e,t){let r=n-$e(n,e),s=i-$e(i,e),o=Math.abs(r-s)-no(n,i,e);return Yt(o,Xt(rn(n,i),t))}function so(n,i,e,t,r,s){let o;Yi(i,t,r,s).length>0?o=t-$e(t,r):o=i;let a=t,l=oo(n,i,e,t,r,s);return Yt(sn(n,o,e,a,l==="C",r).length,Xt(l,s))}function no(n,i,e){let t=0,r=n-$e(n,e),s=i-$e(i,e);for(let o=0;o=0&&n0?o=t-$e(t,r):o=i,n=e&&oi?"A":"B"}function sn(n,i,e,t,r,s){let o=n,a=i,l="";for(;(o!==e||a!==t)&&a>=0&&as.cols-1?(l+=s.buffer.translateBufferLineToString(a,!1,n,o),o=0,n=0,a++):!r&&o<0&&(l+=s.buffer.translateBufferLineToString(a,!1,0,n+1),o=s.cols-1,n=o,a--);return l+s.buffer.translateBufferLineToString(a,!1,n,o)}function Xt(n,i){let e=i?"O":"[";return"\x1B"+e+n}function Yt(n,i){n=Math.floor(n);let e="";for(let t=0;tthis._bufferService.cols?i%this._bufferService.cols===0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)-1]:[i%this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)]:[i,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){let i=this.selectionStart[0]+this.selectionStartLength;return i>this._bufferService.cols?[i%this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)]:[Math.max(i,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){let i=this.selectionStart,e=this.selectionEnd;return!i||!e?!1:i[1]>e[1]||i[1]===e[1]&&i[0]>e[0]}handleTrim(i){return this.selectionStart&&(this.selectionStart[1]-=i),this.selectionEnd&&(this.selectionEnd[1]-=i),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):this.selectionStart&&this.selectionStart[1]<0?(this.selectionStart=[0,0],!0):!1}};function fs(n,i){if(n.start.y>n.end.y)throw new Error(`Buffer range end (${n.end.x}, ${n.end.y}) cannot be before start (${n.start.x}, ${n.start.y})`);return i*(n.end.y-n.start.y)+(n.end.x-n.start.x+1)}var ao="\xA0",lo=new RegExp(ao,"g");var Et=class extends g{constructor(e,t,r,s,o,a,l,h,d,c){super();this._element=e;this._screenElement=t;this._linkifier=r;this._bufferService=s;this._coreService=o;this._mouseCoordsService=a;this._optionsService=l;this._mouseStateService=h;this._renderService=d;this._coreBrowserService=c;this._dragScrollAmount=0;this._enabled=!0;this._trimListener=this._register(new P);this._workCell=new F;this._mouseDownTimeStamp=0;this._oldHasSelection=!1;this._oldSelectionStart=void 0;this._oldSelectionEnd=void 0;this._onLinuxMouseSelection=this._register(new b);this.onLinuxMouseSelection=this._onLinuxMouseSelection.event;this._onRedrawRequest=this._register(new b);this.onRequestRedraw=this._onRedrawRequest.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._mouseMoveListener=u=>this._handleMouseMove(u),this._mouseUpListener=u=>this._handleMouseUp(u),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(u=>this._handleTrim(u)),this._register(this._bufferService.buffers.onBufferActivate(u=>this._handleBufferActivate(u))),this.enable(),this._model=new ji(this._bufferService),this._activeSelectionMode=0,this._register(E(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(u=>{u.rowsChanged&&this.clearSelection()}))}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(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!e||!t?!1:e[0]!==t[0]||e[1]!==t[1]}get selectionText(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";let r=this._bufferService.buffer,s=[];if(this._activeSelectionMode===3){if(e[0]===t[0])return"";let a=e[0]a.replace(lo," ")).join(Ue?`\r -+WARNING: This link could potentially be dangerous`)){let i=window.open();if(i){try{i.opener=null}catch{}i.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}var Be=H("CharSizeService"),G=H("CoreBrowserService"),Oe=H("MouseCoordsService"),Ks=H("MouseService"),V=H("RenderService"),Si=H("SelectionService"),gi=H("CharacterJoinerService"),ce=H("ThemeService"),Ci=H("LinkProviderService"),zs=H("KeyboardService");function E(n){return{dispose:n}}function Ne(n){if(!n)return n;if(Array.isArray(n)){for(let t of n)t.dispose();return[]}return n.dispose(),n}var pe=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(t){return this._isDisposed?t.dispose():this._disposables.add(t),t}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let t of this._disposables)t.dispose();this._disposables.clear()}}clear(){for(let t of this._disposables)t.dispose();this._disposables.clear()}},g=class{constructor(){this._store=new pe}dispose(){this._store.dispose()}_register(t){return this._store.add(t)}};g.None=Object.freeze({dispose(){}});var B=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(t){this._isDisposed||t===this._value||(this._value?.dispose(),this._value=t)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};function Gs(n,t=0,e){let i=setTimeout(()=>{n(),e&&r.dispose()},t),r=E(()=>{clearTimeout(i)});return e?.add(r),r}var Ce=class{constructor(){this._token=-1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,t()},e)}setIfNotSet(t,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,t()},e))}},Ii=class{constructor(){this._isScheduled=!1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(t){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,t())}))}},Ei=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t,e,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();let r=i.setInterval(()=>{t()},e);this._disposable={dispose:()=>{i.clearInterval(r),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}};function se(n){let t=n;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;let e=n;return e?.view?e.view:window}var Gr=class{constructor(t,e,i,r){this._node=t,this._type=e,this._handler=i,this._options=r,t.addEventListener(e,i,r)}dispose(){!this._node||!this._handler||(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}};function I(n,t,e,i){return new Gr(n,t,e,i)}function Vr(n,t,e,i){return I(n,t,e,i)}var le={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};function $s(n){let t=n.getBoundingClientRect(),e=se(n);return{left:t.left+e.scrollX,top:t.top+e.scrollY,width:t.width,height:t.height}}var yi=class{constructor(t,e){this._runner=t;this.priority=e;this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(t){console.error(t)}}static sort(t,e){return e.priority-t.priority}},Vs=new Map;function qs(n){let t=Vs.get(n);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},Vs.set(n,t)),t}function Un(n){let t=qs(n);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(yi.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}function it(n,t,e=0){let i=qs(n),r=new yi(t,e);return i.next.push(r),i.animFrameRequested||(i.animFrameRequested=!0,n.requestAnimationFrame(()=>Un(n))),r}var xi=class extends Ei{constructor(t){super(),this._defaultTarget=t?se(t):void 0}cancelAndSet(t,e,i){super.cancelAndSet(t,e,i??this._defaultTarget??window)}};var Te=class{constructor(t){this.domNode=t;this._width="";this._height="";this._top="";this._left="";this._bottom="";this._right="";this._className="";this._position="";this._layerHint=!1;this._contain="none"}setWidth(t){let e=st(t);this._width!==e&&(this._width=e,this.domNode.style.width=this._width)}setHeight(t){let e=st(t);this._height!==e&&(this._height=e,this.domNode.style.height=this._height)}setTop(t){let e=st(t);this._top!==e&&(this._top=e,this.domNode.style.top=this._top)}setLeft(t){let e=st(t);this._left!==e&&(this._left=e,this.domNode.style.left=this._left)}setBottom(t){let e=st(t);this._bottom!==e&&(this._bottom=e,this.domNode.style.bottom=this._bottom)}setRight(t){let e=st(t);this._right!==e&&(this._right=e,this.domNode.style.right=this._right)}setClassName(t){this._className!==t&&(this._className=t,this.domNode.className=this._className)}toggleClassName(t,e){this.domNode.classList.toggle(t,e),this._className=this.domNode.className}setPosition(t){this._position!==t&&(this._position=t,this.domNode.style.position=this._position)}setLayerHinting(t){this._layerHint!==t&&(this._layerHint=t,t?this.domNode.style.transform="translate3d(0px, 0px, 0px)":this.domNode.style.transform="")}setContain(t){this._contain!==t&&(this._contain=t,this.domNode.style.contain=this._contain)}setAttribute(t,e){this.domNode.setAttribute(t,e)}};function st(n){return typeof n=="number"?`${n}px`:n}var ze={};Mn(ze,{getSafariVersion:()=>zn,getZoomFactor:()=>Xr,isChrome:()=>Kt,isChromeOS:()=>Yr,isFirefox:()=>ot,isLegacyEdge:()=>Kn,isLinux:()=>zt,isMac:()=>ie,isNode:()=>$r,isSafari:()=>wi,isWindows:()=>Ke});var $r=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),nt=$r?"node":navigator.userAgent,qr=$r?"node":navigator.platform,ot=nt.includes("Firefox"),Kt=nt.includes("Chrome"),Kn=nt.includes("Edge"),wi=/^((?!chrome|android).)*safari/i.test(nt);function Xr(n){return 1}function zn(){if(!wi)return 0;let n=nt.match(/Version\/(\d+)/);return n===null||n.length<2?0:parseInt(n[1],10)}var ie=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(qr),Ke=["Windows","Win16","Win32","WinCE"].includes(qr),zt=qr.indexOf("Linux")>=0,Yr=/\bCrOS\b/.test(nt);var Xs=new WeakMap;function Gn(n){if(!n.parent||n.parent===n)return null;try{let t=n.location,e=n.parent.location;if(t.origin!=="null"&&e.origin!=="null"&&t.origin!==e.origin)return null}catch{return null}return n.parent}var jr=class{static _getSameOriginWindowChain(t){let e=Xs.get(t);if(!e){e=[],Xs.set(t,e);let i=t,r;do r=Gn(i),r?e.push({window:new WeakRef(i),iframeElement:i.frameElement??null}):e.push({window:new WeakRef(i),iframeElement:null}),i=r;while(i)}return e.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(t,e){if(!e||t===e)return{top:0,left:0};let i=0,r=0,s=this._getSameOriginWindowChain(t);for(let o of s){let a=o.window.deref();if(i+=a?.scrollY??0,r+=a?.scrollX??0,a===e||!o.iframeElement)break;let l=o.iframeElement.getBoundingClientRect();i+=l.top,r+=l.left}return{top:i,left:r}}},at=class{constructor(t,e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=e.button===0,this.middleButton=e.button===1,this.rightButton=e.button===2,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail??1,e.type==="dblclick"&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,typeof e.pageX=="number"?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=e.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);let i=jr.getPositionOfChildWindowRelativeToAncestorWindow(t,e.view);this.posx-=i.left,this.posy-=i.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}},Gt=class{constructor(t,e=0,i=0){this.browserEvent=t??null,this.target=t?t.target??t.targetNode??t.srcElement??null:null,this.deltaY=i,this.deltaX=e;let r=!1;if(Kt){let s=navigator.userAgent.match(/Chrome\/(\d+)/);r=(s?parseInt(s[1],10):123)<=122}if(t){let s=t,o=t,a=t.view?.devicePixelRatio??1;if(typeof s.wheelDeltaY<"u")r?this.deltaY=s.wheelDeltaY/(120*a):this.deltaY=s.wheelDeltaY/120;else if(typeof o.VERTICAL_AXIS<"u"&&o.axis===o.VERTICAL_AXIS)this.deltaY=-o.detail/3;else if(t.type==="wheel"){let l=t;l.deltaMode===l.DOM_DELTA_LINE?ot&&!ie?this.deltaY=-t.deltaY/3:this.deltaY=-t.deltaY:this.deltaY=-t.deltaY/40}if(typeof s.wheelDeltaX<"u")wi&&Ke?this.deltaX=-(s.wheelDeltaX/120):r?this.deltaX=s.wheelDeltaX/(120*a):this.deltaX=s.wheelDeltaX/120;else if(typeof o.HORIZONTAL_AXIS<"u"&&o.axis===o.HORIZONTAL_AXIS)this.deltaX=-t.detail/3;else if(t.type==="wheel"){let l=t;l.deltaMode===l.DOM_DELTA_LINE?ot&&!ie?this.deltaX=-t.deltaX/3:this.deltaX=-t.deltaX:this.deltaX=-t.deltaX/40}this.deltaY===0&&this.deltaX===0&&t.wheelDelta&&(r?this.deltaY=t.wheelDelta/(120*a):this.deltaY=t.wheelDelta/120)}}preventDefault(){this.browserEvent?.preventDefault()}stopPropagation(){this.browserEvent?.stopPropagation()}};var lt=class{constructor(){this._hooks=new pe;this._pointerMoveCallback=null;this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(t){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;let e=this._onStopCallback;this._onStopCallback=null,t&&e&&e()}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(t,e,i,r,s){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=r,this._onStopCallback=s;let o=t;try{t.setPointerCapture(e),this._hooks.add(E(()=>{try{t.releasePointerCapture(e)}catch{}}))}catch{o=se(t)}this._hooks.add(I(o,le.POINTER_MOVE,a=>{if(a.buttons!==i){this.stopMonitoring(!0);return}a.preventDefault(),this._pointerMoveCallback(a)})),this._hooks.add(I(o,le.POINTER_UP,a=>this.stopMonitoring(!0)))}};var Fe=class extends g{_onclick(t,e){this._register(I(t,le.CLICK,i=>e(new at(se(t),i))))}_onmouseover(t,e){this._register(I(t,le.MOUSE_OVER,i=>e(new at(se(t),i))))}_onmouseleave(t,e){this._register(I(t,le.MOUSE_LEAVE,i=>e(new at(se(t),i))))}};var Ti=class extends Fe{constructor(t){super(),this._handleActivate=t.handleActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="xterm-arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=t.bgWidth+"px",this.bgDomNode.style.height=t.bgHeight+"px",typeof t.top<"u"&&(this.bgDomNode.style.top="0px"),typeof t.left<"u"&&(this.bgDomNode.style.left="0px"),typeof t.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof t.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=t.className,this.domNode.style.position="absolute";let e=Math.min(t.bgWidth,t.bgHeight);this.domNode.style.width=e+"px",this.domNode.style.height=e+"px",typeof t.top<"u"&&(this.domNode.style.top=t.top+"px"),typeof t.left<"u"&&(this.domNode.style.left=t.left+"px"),typeof t.bottom<"u"&&(this.domNode.style.bottom=t.bottom+"px"),typeof t.right<"u"&&(this.domNode.style.right=t.right+"px"),this._pointerMoveMonitor=this._register(new lt),this._register(Vr(this.bgDomNode,le.POINTER_DOWN,i=>this._arrowPointerDown(i))),this._register(Vr(this.domNode,le.POINTER_DOWN,i=>this._arrowPointerDown(i))),this._pointerdownRepeatTimer=this._register(new xi),this._pointerdownScheduleRepeatTimer=this._register(new Ce)}_arrowPointerDown(t){if(!t.target||!(t.target instanceof Element))return;let e=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,se(t))};this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(e,200),this._pointerMoveMonitor.startMonitoring(t.target,t.pointerId,t.buttons,i=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),t.preventDefault()}};var b=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(t,e,i)=>{if(this._disposed)return E(()=>{});let r={fn:t,thisArgs:e};this._listeners.push(r);let s=E(()=>{let o=this._listeners.indexOf(r);o!==-1&&this._listeners.splice(o,1)});return i&&(Array.isArray(i)?i.push(s):i.add(s)),s},this._event)}fire(t){if(!this._disposed)switch(this._listeners.length){case 0:return;case 1:{let{fn:e,thisArgs:i}=this._listeners[0];e.call(i,t);return}default:{let e=this._listeners.slice();for(let{fn:i,thisArgs:r}of e)i.call(r,t)}}}dispose(){this._disposed||(this._disposed=!0,this._listeners.length=0)}},j;(r=>{function n(s,o){return s(a=>o.fire(a))}r.forward=n;function t(s,o){return(a,l,h)=>s(d=>a.call(l,o(d)),void 0,h)}r.map=t;function e(...s){return(o,a,l)=>{let h=new pe;for(let d of s)h.add(d(c=>o.call(a,c)));return l&&(Array.isArray(l)?l.push(h):l.add(h)),h}}r.any=e;function i(s,o,a){return o(a),s(l=>o(l))}r.runAndSubscribe=i})(j||={});var Jr=class n{constructor(t,e,i,r,s,o,a){this._forceIntegerValues=t;this._scrollStateBrand=void 0;this._forceIntegerValues&&(e=e|0,i=i|0,r=r|0,s=s|0,o=o|0,a=a|0),this.rawScrollLeft=r,this.rawScrollTop=a,e<0&&(e=0),r+e>i&&(r=i-e),r<0&&(r=0),s<0&&(s=0),a+s>o&&(a=o-s),a<0&&(a=0),this.width=e,this.scrollWidth=i,this.scrollLeft=r,this.height=s,this.scrollHeight=o,this.scrollTop=a}equals(t){return this.rawScrollLeft===t.rawScrollLeft&&this.rawScrollTop===t.rawScrollTop&&this.width===t.width&&this.scrollWidth===t.scrollWidth&&this.scrollLeft===t.scrollLeft&&this.height===t.height&&this.scrollHeight===t.scrollHeight&&this.scrollTop===t.scrollTop}withScrollDimensions(t,e){return new n(this._forceIntegerValues,typeof t.width<"u"?t.width:this.width,typeof t.scrollWidth<"u"?t.scrollWidth:this.scrollWidth,e?this.rawScrollLeft:this.scrollLeft,typeof t.height<"u"?t.height:this.height,typeof t.scrollHeight<"u"?t.scrollHeight:this.scrollHeight,e?this.rawScrollTop:this.scrollTop)}withScrollPosition(t){return new n(this._forceIntegerValues,this.width,this.scrollWidth,typeof t.scrollLeft<"u"?t.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof t.scrollTop<"u"?t.scrollTop:this.rawScrollTop)}createScrollEvent(t,e){let i=this.width!==t.width,r=this.scrollWidth!==t.scrollWidth,s=this.scrollLeft!==t.scrollLeft,o=this.height!==t.height,a=this.scrollHeight!==t.scrollHeight,l=this.scrollTop!==t.scrollTop;return{inSmoothScrolling:e,oldWidth:t.width,oldScrollWidth:t.scrollWidth,oldScrollLeft:t.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:t.height,oldScrollHeight:t.scrollHeight,oldScrollTop:t.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:r,scrollLeftChanged:s,heightChanged:o,scrollHeightChanged:a,scrollTopChanged:l}}},ct=class extends g{constructor(e){super();this._scrollableBrand=void 0;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new Jr(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,i){let r=this._state.withScrollDimensions(e,i);this._setState(r,!!this._smoothScrolling),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){let i=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(i,!1)}setScrollPositionSmooth(e,i){if(this._smoothScrollDuration===0){this.setScrollPositionNow(e);return}if(this._smoothScrolling){e={scrollLeft:typeof e.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:typeof e.scrollTop>"u"?this._smoothScrolling.to.scrollTop:e.scrollTop};let r=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===r.scrollLeft&&this._smoothScrolling.to.scrollTop===r.scrollTop)return;let s;i?s=new Vt(this._smoothScrolling.from,r,this._smoothScrolling.startTime,this._smoothScrolling.duration):s=Vt.start(this._state,r,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{let r=this._state.withScrollPosition(e);this._smoothScrolling=Vt.start(this._state,r,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;let e=this._smoothScrolling.tick(),i=this._state.withScrollPosition(e);if(this._setState(i,!0),!!this._smoothScrolling){if(e.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(e,i){let r=this._state;r.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(r,i)))}},Di=class{constructor(t,e,i){this.scrollLeft=t,this.scrollTop=e,this.isDone=i}};function Zr(n,t){let e=t-n;return function(i){return n+e*qn(i)}}function Vn(n,t,e){return function(i){return i2.5*i){let s,o;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(t){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(t?" xterm-fade":"")))}};var Xn=140,ht=class extends Fe{constructor(t){super(),this._lazyRender=t.lazyRender,this._host=t.host,this._scrollable=t.scrollable,this._scrollByPage=t.scrollByPage,this._scrollbarState=t.scrollbarState,this._visibilityController=this._register(new Ri(t.visibility,"xterm-visible xterm-scrollbar "+t.extraScrollbarClassName,"xterm-invisible xterm-scrollbar "+t.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new lt),this._shouldRender=!0,this.domNode=new Te(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(I(this.domNode.domNode,le.POINTER_DOWN,e=>this._domNodePointerDown(e)))}_createArrow(t){let e=this._register(new Ti(t));return this.domNode.domNode.appendChild(e.bgDomNode),this.domNode.domNode.appendChild(e.domNode),e}_createSlider(t,e,i,r){this.slider=new Te(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(t),this.slider.setLeft(e),typeof i=="number"&&this.slider.setWidth(i),typeof r=="number"&&this.slider.setHeight(r),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(I(this.slider.domNode,le.POINTER_DOWN,s=>{s.button===0&&(s.preventDefault(),this._sliderPointerDown(s))})),this._onclick(this.slider.domNode,s=>{s.leftButton&&s.stopPropagation()})}_handleElementSize(t){return this._scrollbarState.setVisibleSize(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(t){return this._scrollbarState.setScrollSize(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(t){return this._scrollbarState.setScrollPosition(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(t){t.target===this.domNode.domNode&&this._handlePointerDown(t)}delegatePointerDown(t){let e=this.domNode.domNode.getClientRects()[0].top,i=e+this._scrollbarState.getSliderPosition(),r=e+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),s=this._sliderPointerPosition(t);i<=s&&s<=r?t.button===0&&(t.preventDefault(),this._sliderPointerDown(t)):this._handlePointerDown(t)}_handlePointerDown(t){let e,i;if(t.target===this.domNode.domNode&&typeof t.offsetX=="number"&&typeof t.offsetY=="number")e=t.offsetX,i=t.offsetY;else{let s=$s(this.domNode.domNode);e=t.pageX-s.left,i=t.pageY-s.top}let r=this._pointerDownRelativePosition(e,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(r):this._scrollbarState.getDesiredScrollPositionFromOffset(r)),t.button===0&&(t.preventDefault(),this._sliderPointerDown(t))}_sliderPointerDown(t){if(!t.target||!(t.target instanceof Element))return;let e=this._sliderPointerPosition(t),i=this._sliderOrthogonalPointerPosition(t),r=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(t.target,t.pointerId,t.buttons,s=>{let o=this._sliderOrthogonalPointerPosition(s),a=Math.abs(o-i);if(Ke&&a>Xn){this._setDesiredScrollPositionNow(r.getScrollPosition());return}let h=this._sliderPointerPosition(s)-e;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(t){let e={};this.writeScrollPosition(e,t),this._scrollable.setScrollPositionNow(e)}updateScrollbarSize(t){this._updateScrollbarSize(t),this._scrollbarState.setScrollbarSize(t),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}};var dt=class n{constructor(t,e,i,r,s,o){this._scrollbarSize=Math.round(e),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(t),this._visibleSize=r,this._scrollSize=s,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new n(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(t){let e=Math.round(t);return this._visibleSize!==e?(this._visibleSize=e,this._refreshComputedValues(),!0):!1}setScrollSize(t){let e=Math.round(t);return this._scrollSize!==e?(this._scrollSize=e,this._refreshComputedValues(),!0):!1}setScrollPosition(t){let e=Math.round(t);return this._scrollPosition!==e?(this._scrollPosition=e,this._refreshComputedValues(),!0):!1}setScrollbarSize(t){this._scrollbarSize=Math.round(t)}setArrowSize(t){let e=Math.round(t);this._arrowSize!==e&&(this._arrowSize=e,this._refreshComputedValues())}setOppositeScrollbarSize(t){this._oppositeScrollbarSize=Math.round(t)}static _computeValues(t,e,i,r,s){let o=Math.max(0,i-t),a=Math.max(0,o-2*e),l=r>0&&r>i;if(!l)return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};let h=Math.round(Math.max(20,Math.floor(i*a/r))),d=(a-h)/(r-i),c=s*d;return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(h),computedSliderRatio:d,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){let t=n._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=t.computedAvailableSize,this._computedIsNeeded=t.computedIsNeeded,this._computedSliderSize=t.computedSliderSize,this._computedSliderRatio=t.computedSliderRatio,this._computedSliderPosition=t.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(t){if(!this._computedIsNeeded)return 0;let e=t-this._arrowSize-this._computedSliderSize/2;return Math.round(e/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(t){if(!this._computedIsNeeded)return 0;let e=t-this._arrowSize,i=this._scrollPosition;return ethis._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:0,left:0,bgWidth:i,bgHeight:i,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})),this._updateArrowSize(this._arrowUp,i),this._updateArrowSize(this._arrowDown,i),!this._arrowUp||!this._arrowDown)return;let r=e?"":"none";this._arrowUp.bgDomNode.style.display=r,this._arrowUp.domNode.style.display=r,this._arrowDown.bgDomNode.style.display=r,this._arrowDown.domNode.style.display=r}_updateArrowSize(e,i){e&&(e.bgDomNode.style.width=`${i}px`,e.bgDomNode.style.height=`${i}px`,e.domNode.style.width=`${i}px`,e.domNode.style.height=`${i}px`)}updateOptions(e){let i=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(i),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}};var Qr=class{constructor(t,e,i){this.timestamp=t,this.deltaX=e,this.deltaY=i,this.score=0}},Mi=class Mi{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let t=1,e=0,i=1,r=this._rear;for(;r!==-1;){let s=r===this._front?t:Math.pow(2,-i);if(t-=s,e+=this._memory[r].score*s,r===this._front)break;r=(this._capacity+r-1)%this._capacity,i++}return e<=.5}acceptStandardWheelEvent(t){if(Kt){let e=se(t.browserEvent),i=Xr(e);this.accept(Date.now(),t.deltaX*i,t.deltaY*i)}else this.accept(Date.now(),t.deltaX,t.deltaY)}accept(t,e,i){let r=null,s=new Qr(t,e,i);this._front===-1&&this._rear===-1?(this._memory[0]=s,this._front=0,this._rear=0):(r=this._memory[this._rear],this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=s),s.score=this._computeScore(s,r)}_computeScore(t,e){if(Math.abs(t.deltaX)>0&&Math.abs(t.deltaY)>0)return 1;let i=.5;if((!this._isAlmostInt(t.deltaX)||!this._isAlmostInt(t.deltaY))&&(i+=.25),e){let r=Math.abs(t.deltaX),s=Math.abs(t.deltaY),o=Math.abs(e.deltaX),a=Math.abs(e.deltaY),l=Math.max(Math.min(r,o),1),h=Math.max(Math.min(s,a),1),d=Math.max(r,o),c=Math.max(s,a);d%l===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(t){return Math.abs(Math.round(t)-t)<.01}};Mi.INSTANCE=new Mi;var es=Mi,Pi=class extends Fe{constructor(e,i,r){super();this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;i=i??{};let s,o=!r;r?s=r:(i.mouseWheelSmoothScroll=!1,s=new ct({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:l=>it(se(e),l)})),this._options=Yn(i),this._scrollable=s,this._register(this._scrollable.onScroll(l=>{this._handleScroll(l),this._onScroll.fire(l)})),o&&this._register(this._scrollable);let a={handleMouseWheel:l=>this._handleMouseWheel(l),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new ki(this._scrollable,this._options,a)),this._horizontalScrollbar=this._register(new Ai(this._scrollable,this._options,a)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new Te(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new Te(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new Te(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,l=>this._handleMouseOver(l)),this._onmouseleave(this._listenOnDomNode,l=>this._handleMouseLeave(l)),this._hideTimeout=this._register(new Ce),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}get options(){return this._options}dispose(){this._mouseWheelToDispose=Ne(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,ie&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){typeof e.handleMouseWheel<"u"&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof e.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),typeof e.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),typeof e.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),typeof e.horizontal<"u"&&(this._options.horizontal=e.horizontal),typeof e.vertical<"u"&&(this._options.vertical=e.vertical),typeof e.horizontalHasArrows<"u"&&(this._options.horizontalHasArrows=e.horizontalHasArrows),typeof e.verticalHasArrows<"u"&&(this._options.verticalHasArrows=e.verticalHasArrows),typeof e.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),typeof e.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),typeof e.scrollByPage<"u"&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new Gt(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=Ne(this._mouseWheelToDispose),e)){let r=s=>{this._handleMouseWheel(new Gt(s))};this._mouseWheelToDispose.push(I(this._listenOnDomNode,le.MOUSE_WHEEL,r,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;let i=es.INSTANCE;i.acceptStandardWheelEvent(e);let r=!1;if(e.deltaY||e.deltaX){let o=e.deltaY*this._options.mouseWheelScrollSensitivity,a=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&a+o===0?a=o=0:Math.abs(o)>=Math.abs(a)?a=0:o=0),this._options.flipAxes&&([o,a]=[a,o]);let l=!ie&&e.browserEvent&&e.browserEvent.shiftKey;(this._options.scrollYToX||l)&&!a&&(a=o,o=0),e.browserEvent&&e.browserEvent.altKey&&(a=a*this._options.fastScrollSensitivity,o=o*this._options.fastScrollSensitivity);let h=this._scrollable.getFutureScrollPosition(),d={};if(o){let c=50*o,u=h.scrollTop-(c<0?Math.floor(c):Math.ceil(c));this._verticalScrollbar.writeScrollPosition(d,u)}if(a){let c=50*a,u=h.scrollLeft-(c<0?Math.floor(c):Math.ceil(c));this._horizontalScrollbar.writeScrollPosition(d,u)}d=this._scrollable.validateScrollPosition(d),(h.scrollLeft!==d.scrollLeft||h.scrollTop!==d.scrollTop)&&(this._options.mouseWheelSmoothScroll&&i.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(d):this._scrollable.setScrollPositionNow(d),r=!0)}let s=r;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){let e=this._scrollable.getCurrentScrollPosition(),i=e.scrollTop>0,r=e.scrollLeft>0,s=r?" xterm-shadow-left":"",o=i?" xterm-shadow-top":"",a=r||i?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${o}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${a}${o}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),500)}};function Yn(n){let t={lazyRender:typeof n.lazyRender<"u"?n.lazyRender:!1,className:typeof n.className<"u"?n.className:"",useShadows:typeof n.useShadows<"u"?n.useShadows:!0,handleMouseWheel:typeof n.handleMouseWheel<"u"?n.handleMouseWheel:!0,flipAxes:typeof n.flipAxes<"u"?n.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof n.consumeMouseWheelIfScrollbarIsNeeded<"u"?n.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof n.alwaysConsumeMouseWheel<"u"?n.alwaysConsumeMouseWheel:!1,scrollYToX:typeof n.scrollYToX<"u"?n.scrollYToX:!1,mouseWheelScrollSensitivity:typeof n.mouseWheelScrollSensitivity<"u"?n.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof n.fastScrollSensitivity<"u"?n.fastScrollSensitivity:5,scrollPredominantAxis:typeof n.scrollPredominantAxis<"u"?n.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof n.mouseWheelSmoothScroll<"u"?n.mouseWheelSmoothScroll:!0,listenOnDomNode:typeof n.listenOnDomNode<"u"?n.listenOnDomNode:null,horizontal:typeof n.horizontal<"u"?n.horizontal:1,horizontalScrollbarSize:typeof n.horizontalScrollbarSize<"u"?n.horizontalScrollbarSize:10,horizontalSliderSize:typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:0,horizontalHasArrows:typeof n.horizontalHasArrows<"u"?n.horizontalHasArrows:!1,vertical:typeof n.vertical<"u"?n.vertical:1,verticalScrollbarSize:typeof n.verticalScrollbarSize<"u"?n.verticalScrollbarSize:10,verticalHasArrows:typeof n.verticalHasArrows<"u"?n.verticalHasArrows:!1,verticalSliderSize:typeof n.verticalSliderSize<"u"?n.verticalSliderSize:0,scrollByPage:typeof n.scrollByPage<"u"?n.scrollByPage:!1};return t.horizontalSliderSize=typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=typeof n.verticalSliderSize<"u"?n.verticalSliderSize:t.verticalScrollbarSize,ie&&(t.className+=" xterm-mac"),t}var ut=class extends g{constructor(e,i,r,s,o,a,l,h,d){super();this._bufferService=r;this._coreService=o;this._optionsService=h;this._renderService=d;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._isSyncing=!1;this._isHandlingScroll=!1;this._suppressOnScrollHandler=!1;this._needsSyncOnRender=!1;let c=this._register(new ct({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:u=>it(s.window,u)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{c.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new Pi(i,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},c)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(a.onProtocolChange(u=>{this._scrollableElement.updateOptions({handleMouseWheel:!(u&16)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(j.runAndSubscribe(l.onChangeColors,()=>{e.style.backgroundColor=l.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=l.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register(E(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),i.appendChild(this._styleElement),this._register(E(()=>this._styleElement.remove())),this._register(j.runAndSubscribe(l.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${l.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${l.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${l.colors.scrollbarSliderActiveBackground.css};`,"}"].join(` -+`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(u=>this._handleScroll(u)))}scrollLines(e){let i=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:i.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,i){i&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!i,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){let e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,i=this._optionsService.rawOptions.scrollbar?.showArrows??!1,r=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:r,verticalHasArrows:i}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){if(!(!this._renderService||this._isSyncing)){if(this._coreService.decPrivateModes.synchronizedOutput){this._needsSyncOnRender=!0;return}this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1}}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let i=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),r=i-this._bufferService.buffer.ydisp;r!==0&&(this._latestYDisp=i,this._onRequestScrollLines.fire(r)),this._isHandlingScroll=!1}handleTouchScroll(e){let i=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:i.scrollTop-e})}};ut=y([m(2,D),m(3,G),m(4,Y),m(5,Me),m(6,ce),m(7,R),m(8,V)],ut);var ft=class extends g{constructor(e,i,r,s,o){super();this._screenElement=e;this._bufferService=i;this._coreBrowserService=r;this._decorationService=s;this._renderService=o;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(a=>this._removeDecoration(a))),this._register(E(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){let i=this._coreBrowserService.mainDocument.createElement("div");i.classList.add("xterm-decoration"),i.classList.toggle("xterm-decoration-top-layer",e?.options?.layer==="top"),i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,i.style.top=`${(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height}px`,i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;let r=e.options.x??0;return r&&r>this._bufferService.cols&&(i.style.display="none"),this._refreshXPosition(e,i),i}_refreshStyle(e){let i=e.marker.line-this._bufferService.buffers.active.ydisp;if(i<0||i>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let r=this._decorationElements.get(e);r||(r=this._createElement(e),e.element=r,this._decorationElements.set(e,r),this._container.appendChild(r),e.onDispose(()=>{this._decorationElements.delete(e),r.remove()})),r.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(r.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,r.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,r.style.top=`${i*this._renderService.dimensions.css.cell.height}px`,r.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),e.onRenderEmitter.fire(r)}}_refreshXPosition(e,i=e.element){if(!i)return;let r=e.options.x??0;(e.options.anchor||"left")==="right"?i.style.right=r?`${r*this._renderService.dimensions.css.cell.width}px`:"":i.style.left=r?`${r*this._renderService.dimensions.css.cell.width}px`:""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};ft=y([m(1,D),m(2,G),m(3,ge),m(4,V)],ft);var Bi=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(t){if(t.options.overviewRulerOptions){for(let e of this._zones)if(e.color===t.options.overviewRulerOptions.color&&e.position===t.options.overviewRulerOptions.position){if(this._lineIntersectsZone(e,t.marker.line))return;if(this._lineAdjacentToZone(e,t.marker.line,t.options.overviewRulerOptions.position)){this._addLineToZone(e,t.marker.line);return}}if(this._zonePoolIndex=t.startBufferLine&&e<=t.endBufferLine}_lineAdjacentToZone(t,e,i){return e>=t.startBufferLine-this._linePadding[i||"full"]&&e<=t.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(t,e){t.startBufferLine=Math.min(t.startBufferLine,e),t.endBufferLine=Math.max(t.endBufferLine,e)}};var Ie={full:0,left:0,center:0,right:0},He={full:0,left:0,center:0,right:0},$t={full:0,left:0,center:0,right:0},Ge=class extends g{constructor(e,i,r,s,o,a,l,h){super();this._viewportElement=e;this._screenElement=i;this._bufferService=r;this._decorationService=s;this._renderService=o;this._optionsService=a;this._themeService=l;this._coreBrowserService=h;this._colorZoneStore=new Bi;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),this._register(E(()=>this._canvas?.remove()));let d=this._canvas.getContext("2d");if(d)this._ctx=d;else throw new Error("Ctx cannot be null");this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register(E(()=>{this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}get _width(){let e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??!0?e?.width??0:0}_refreshDrawConstants(){let e=Math.floor((this._canvas.width-1)/3),i=Math.ceil((this._canvas.width-1)/3);He.full=this._canvas.width,He.left=e,He.center=i,He.right=e,this._refreshDrawHeightConstants(),$t.full=1,$t.left=1,$t.center=1+He.left,$t.right=1+He.left+He.center}_refreshDrawHeightConstants(){Ie.full=Math.round(2*this._coreBrowserService.dpr);let e=this._canvas.height/this._bufferService.buffer.lines.length,i=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);Ie.left=i,Ie.center=i,Ie.right=i}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;let e=this._renderService.dimensions.css.canvas.height,i=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=i,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(let i of this._decorationService.decorations)this._colorZoneStore.addDecoration(i);this._ctx.lineWidth=1,this._renderRulerOutline();let e=this._colorZoneStore.zones;for(let i of e)i.position!=="full"&&this._renderColorZone(i);for(let i of e)i.position==="full"&&this._renderColorZone(i);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect($t[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-Ie[e.position||"full"]/2),He[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+Ie[e.position||"full"]))}_queueRefresh(e,i){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=i||this._shouldUpdateAnchor,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};Ge=y([m(2,D),m(3,ge),m(4,V),m(5,R),m(6,ce),m(7,G)],Ge);var J=0,Q=0,ee=0,W=0,ts={css:"#00000000",rgba:0},O;(i=>{function n(r,s,o,a){return a!==void 0?`#${Ve(r)}${Ve(s)}${Ve(o)}${Ve(a)}`:`#${Ve(r)}${Ve(s)}${Ve(o)}`}i.toCss=n;function t(r,s,o,a=255){return(r<<24|s<<16|o<<8|a)>>>0}i.toRgba=t;function e(r,s,o,a){return{css:i.toCss(r,s,o,a),rgba:i.toRgba(r,s,o,a)}}i.toColor=e})(O||={});var L;(a=>{function n(l,h){if(W=(h.rgba&255)/255,W===1)return{css:h.css,rgba:h.rgba};let d=h.rgba>>24&255,c=h.rgba>>16&255,u=h.rgba>>8&255,_=l.rgba>>24&255,p=l.rgba>>16&255,v=l.rgba>>8&255;J=_+Math.round((d-_)*W),Q=p+Math.round((c-p)*W),ee=v+Math.round((u-v)*W);let f=O.toCss(J,Q,ee),S=O.toRgba(J,Q,ee);return{css:f,rgba:S}}a.blend=n;function t(l){return(l.rgba&255)===255}a.isOpaque=t;function e(l,h,d){let c=Oi.ensureContrastRatio(l.rgba,h.rgba,d);if(c)return O.toColor(c>>24&255,c>>16&255,c>>8&255)}a.ensureContrastRatio=e;function i(l){let h=(l.rgba|255)>>>0;return[J,Q,ee]=Oi.toChannels(h),{css:O.toCss(J,Q,ee),rgba:h}}a.opaque=i;function r(l,h){return W=Math.round(h*255),[J,Q,ee]=Oi.toChannels(l.rgba),{css:O.toCss(J,Q,ee,W),rgba:O.toRgba(J,Q,ee,W)}}a.opacity=r;function s(l,h){return W=l.rgba&255,r(l,W*h/255)}a.multiplyOpacity=s;function o(l){return[l.rgba>>24&255,l.rgba>>16&255,l.rgba>>8&255]}a.toColorRGB=o})(L||={});var M;(i=>{let n,t;try{let r=document.createElement("canvas");r.width=1,r.height=1;let s=r.getContext("2d",{willReadFrequently:!0});s&&(n=s,n.globalCompositeOperation="copy",t=n.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),O.toColor(J,Q,ee);case 5:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),W=parseInt(r.slice(4,5).repeat(2),16),O.toColor(J,Q,ee,W);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let s=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return J=parseInt(s[1],10),Q=parseInt(s[2],10),ee=parseInt(s[3],10),W=Math.round((s[5]===void 0?1:parseFloat(s[5]))*255),O.toColor(J,Q,ee,W);if(r==="transparent")return{css:"transparent",rgba:0};if(!n||!t)throw new Error("css.toColor: Unsupported css format");if(n.fillStyle=t,n.fillStyle=r,typeof n.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(n.fillRect(0,0,1,1),[J,Q,ee,W]=n.getImageData(0,0,1,1).data,W!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:O.toRgba(J,Q,ee,W),css:r}}i.toColor=e})(M||={});var Z;(e=>{function n(i){return t(i>>16&255,i>>8&255,i&255)}e.relativeLuminance=n;function t(i,r,s){let o=i/255,a=r/255,l=s/255,h=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),d=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),c=l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4);return h*.2126+d*.7152+c*.0722}e.relativeLuminance2=t})(Z||={});var Oi;(s=>{function n(o,a){if(W=(a&255)/255,W===1)return a;let l=a>>24&255,h=a>>16&255,d=a>>8&255,c=o>>24&255,u=o>>16&255,_=o>>8&255;return J=c+Math.round((l-c)*W),Q=u+Math.round((h-u)*W),ee=_+Math.round((d-_)*W),O.toRgba(J,Q,ee)}s.blend=n;function t(o,a,l){let h=Z.relativeLuminance(o>>8),d=Z.relativeLuminance(a>>8);if(De(h,d)>8));if(v>8));return v>S?p:f}return p}let u=i(o,a,l),_=De(h,Z.relativeLuminance(u>>8));if(_>8));return _>v?u:p}return u}}s.ensureContrastRatio=t;function e(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v0||_>0||p>0);)u-=Math.max(0,Math.ceil(u*.1)),_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));return(u<<24|_<<16|p<<8|255)>>>0}s.reduceLuminance=e;function i(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v>>0}s.increaseLuminance=i;function r(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}s.toChannels=r})(Oi||={});function Ve(n){let t=n.toString(16);return t.length<2?"0"+t:t}function De(n,t){return n0&&(this._lastCompositionData=t.data),this._renderCompositionView(t.data??""),this._compositionView.classList.toggle("active",!!t.data),this.updateCompositionElements();let e=this._compositionTransactionId;this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=this._defer(()=>{if(this._isComposing&&this._compositionTransactionId===e){this._compositionHasObservedProgress||=this._hasCompositionProgress();let i=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,i)}})}compositionend(t){if(!this._isAwaitingCompositionEnd)return!1;if(!this._isComposing){let i=this._pendingComposition;return i?.transactionId===this._compositionTransactionId&&(i.endData=t?.data??"",this._updatePostCompositionInputExpectation(i)),!1}let e=t?.data??"";if(this._compositionHasObservedProgress||=this._hasCompositionProgress(),!this._compositionEndBelongsToCurrentTransaction(e)){let i=this._pendingComposition;return i&&i.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(i),this._deferCompositionEnd(e),!1}return this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._finalizeComposition(!0,e),!0}blur(){if(this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._isComposing){let t=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,t)}(this._isComposing||this.hasPendingCompositionFinalization)&&this._finalizeComposition(!1)}dispose(){this._textareaChangeTimer!==void 0&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);for(let t of this._compositionTimers)clearTimeout(t);this._compositionTimers.clear(),this._compositionPositionTimer=void 0,this._compositionViewTimer=void 0,this._compositionEndTimer=void 0,this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionTransactionId++,this._compositionView.classList.remove("active"),this._resetCompositionView()}keydown(t){if(this._canceledKey?.code===t.code&&this._canceledKey.timeStamp===t.timeStamp)return this._canceledKey=void 0,!1;if(t.key==="Escape"&&(this._isComposing||this.hasPendingCompositionFinalization))return this._canceledKey={code:t.code,timeStamp:t.timeStamp},this._cancelComposition(),!1;if(this._isComposing||this.hasPendingCompositionFinalization){if(this._deferPreeditResync(this._composedRegionLength()>0),t.keyCode===20||t.keyCode===229||t.keyCode===16||t.keyCode===17||t.keyCode===18)return!1;this._finalizeComposition(!1)}return this._imeKeydownAwaitingCommit=t.keyCode===229,t.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}keypress(t){let e=this._pendingComposition;return e?e.keypressMayOverlapComposition?(e.keypressData+=t,!0):e.expectsPostCompositionInput&&e.keypressData.length===0?(e.keypressData=t,!0):(this._sendPendingComposition(e),!1):!1}input(t){if(this._isComposing)return this._compositionHasObservedProgress||=this._hasCompositionProgress(),this._compositionInputData+=t,!0;let e=this._pendingComposition;if(!e)return this._claimImeKeydownCommit(t);if(e.expectsPostCompositionInput)return e.inputData+=t,e.expectsPostCompositionInput=!1,this._sendPendingComposition(e),!0;let i=t.length>0&&this._getPendingTextareaInput(e)===t&&this._getPendingTextareaInput(e,!0)===t;return this._sendPendingComposition(e),i||this._coreService.triggerDataEvent(t,!0),!0}_claimImeKeydownCommit(t){return this._imeKeydownAwaitingCommit?(this._imeKeydownAwaitingCommit=!1,this._textareaChangeTimer!==void 0&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0),this._coreService.triggerDataEvent(t,!0),!0):!1}_finalizeComposition(t,e=""){let i=this._isComposing;if(this._compositionView.classList.remove("active"),this._resetCompositionView(),this._isComposing=!1,!(t&&!i)){if(t){this._pendingComposition&&this._sendPendingComposition(this._pendingComposition);let r={transactionId:this._compositionTransactionId,lifecycleSettled:!1,sessionEnded:!1,position:{start:this._compositionPosition.start,end:this._compositionPosition.end},suffix:this._compositionSuffix,dataAlreadySent:this._dataAlreadySent,compositionData:this._lastCompositionData,endData:e,inputData:this._compositionInputData,keypressData:"",keypressMayOverlapComposition:this._lastCompositionData.length===0&&e.length===0,expectsPostCompositionInput:!1};this._updatePostCompositionInputExpectation(r),this._pendingComposition=r,r.finalizerTimer=this._defer(()=>{r.finalizerTimer=void 0,this._compositionTransactionId===r.transactionId&&(this._isAwaitingCompositionEnd=!1),this._pendingComposition===r&&this._sendPendingComposition(r,!0)})}else if(this._pendingComposition&&this._sendPendingComposition(this._pendingComposition,!0),i){let r=this._getCompositionInput(this._compositionPosition.start+this._dataAlreadySent.length,this._compositionSuffix);this._sendCompositionInput(this._compositionTransactionId,r)}}}_sendPendingComposition(t,e=!1){this._cancelPendingFinalizer(t),this._pendingComposition===t&&(this._pendingComposition=void 0);let i=this._getPendingTextareaInput(t,e),r=this._removeAlreadySentData(t.inputData||t.keypressData,t.dataAlreadySent),s=this._mergeTextObservations(i||t.endData||(r?t.compositionData:""),r,t.keypressMayOverlapComposition);this._sendCompositionInput(t.transactionId,s,!t.sessionEnded),this._settlePendingComposition(t)}_cancelPendingFinalizer(t){t.finalizerTimer!==void 0&&(clearTimeout(t.finalizerTimer),this._compositionTimers.delete(t.finalizerTimer),t.finalizerTimer=void 0)}_settlePendingComposition(t){t.lifecycleSettled||(t.lifecycleSettled=!0,this._dispatchCompositionTransactionSettled())}_mergeTextObservations(t,e,i){if(!e||t.includes(e))return t;if(!t||e.includes(t))return e;if(i){let s=Math.min(t.length,e.length);for(;s>0&&!t.endsWith(e.substring(0,s));)s--;let o=Math.min(t.length,e.length);for(;o>0&&!e.endsWith(t.substring(0,o));)o--;return s>o?t+e.substring(s):e+t.substring(o)}let r=Math.min(t.length,e.length);for(;r>0&&!t.endsWith(e.substring(0,r));)r--;return t+e.substring(r)}_updatePostCompositionInputExpectation(t){t.expectsPostCompositionInput=(t.endData.length>0||t.compositionData.length>0)&&t.inputData.length===0&&this._getPendingTextareaInput(t).length===0}_getPendingTextareaInput(t,e=!1){let i=this._textarea.value,r=t.position.start+t.dataAlreadySent.length;if(t.nextCompositionStart!==void 0)return i.substring(r,Math.max(r,t.nextCompositionStart));let s=t.suffix.length>0&&i.endsWith(t.suffix)?i.length-t.suffix.length:i.length,o=(t.endData||t.compositionData).length,a=e?s:Math.max(t.position.end,r+o);return i.substring(r,Math.max(r,Math.min(s,a)))}_getCompositionInput(t,e){let i=this._textarea.value,r=e.length>0&&i.endsWith(e)?i.length-e.length:i.length;return i.substring(t,Math.max(t,r))}_removeAlreadySentData(t,e){return e.length===0?t:t.startsWith(e)?t.substring(e.length):e.includes(t)?"":t}_cancelComposition(){let t=this._pendingComposition;t&&this._isComposing&&t.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(t);let e=this._isComposing?this._compositionTransactionId:this._pendingComposition?.transactionId??0,i=t!==void 0&&this._pendingComposition===t;this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionView.classList.remove("active"),this._resetCompositionView(),this._textarea.value=this._textarea.value.substring(0,this._compositionPosition.start)+this._compositionSuffix,this._sendCompositionInput(e,""),i&&t&&this._settlePendingComposition(t)}_sendCompositionInput(t,e,i=!0){let r=!1;if(i){let s=new CustomEvent(js,{bubbles:!0,cancelable:!0,detail:{id:t,data:e}});this._dispatchCompositionSessionEvent(s),r=s.defaultPrevented}e.length>0&&!r&&this._coreService.triggerDataEvent(e,!0)}_endPendingCompositionSession(t){if(t.sessionEnded)return;t.sessionEnded=!0;let e=this._getPendingTextareaInput(t)||t.endData||t.compositionData;this._dispatchCompositionSessionEvent(new CustomEvent(js,{bubbles:!0,cancelable:!0,detail:{id:t.transactionId,data:e,dataPendingReconciliation:!0}}))}_dispatchCompositionSessionEvent(t){typeof this._textarea.dispatchEvent=="function"&&this._textarea.dispatchEvent(t)}_dispatchCompositionTransactionSettled(){this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-settled",{bubbles:!0}))}_deferCompositionEnd(t){this._cancelDeferredTimer(this._compositionEndTimer);let e=this._compositionTransactionId,i=this._defer(()=>{if(this._compositionEndTimer!==i||!this._isComposing||this._compositionTransactionId!==e||!this._compositionEndBelongsToCurrentTransaction(t))return;this._compositionEndTimer=void 0,this._finalizeComposition(!0,t),this._dispatchCompositionSessionEvent(new CustomEvent(Zn,{bubbles:!0}));let r=this._pendingComposition;r?.transactionId===e&&this._sendPendingComposition(r,!0)});this._compositionEndTimer=i}_composedRegionLength(){let t=this._textarea.value.length-this._compositionSuffix.length;return Math.max(0,t-this._compositionPosition.start)}_deferPreeditResync(t){if(!t||!this._isComposing)return;let e=this._compositionTransactionId;this._defer(()=>{this._isComposing&&this._compositionTransactionId===e&&this._composedRegionLength()===0&&this._cancelComposition()})}_hasCompositionProgress(){let t=this._textarea.selectionStart??this._textarea.value.length,e=this._textarea.selectionEnd??t;return this._compositionHasObservedProgress||this._textarea.value!==this._compositionStartValue||t!==this._compositionStartSelection.start||e!==this._compositionStartSelection.end}_compositionEndBelongsToCurrentTransaction(t){return this._hasCompositionProgress()||t.length>0&&t===this._lastCompositionData}_defer(t){let e=setTimeout(()=>{this._compositionTimers.delete(e),t()},0);return this._compositionTimers.add(e),e}_cancelDeferredTimer(t){t!==void 0&&(clearTimeout(t),this._compositionTimers.delete(t))}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;let t=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){let e=this._textarea.value,i=e.replace(t,"");e!==t&&(this._imeKeydownAwaitingCommit=!1),this._dataAlreadySent=i,e.length>t.length?this._coreService.triggerDataEvent(i,!0):e.lengththis.updateCompositionElements(!0)))}};Ee=y([m(2,D),m(3,R),m(4,Y),m(5,V),m(6,ce)],Ee);var Ni=class extends fe{constructor(e,i,r){super();this.content=0;this.combinedData="";this.fg=e.fg,this.bg=e.bg,this.combinedData=i,this._width=r}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()]}},We=class{constructor(t){this._bufferService=t;this._characterJoiners=[];this._nextCharacterJoinerId=0;this._workCell=new F}register(t){let e={id:this._nextCharacterJoinerId++,handler:t};return this._characterJoiners.push(e),e.id}deregister(t){for(let e=0;e1){let u=this._getJoinedRanges(r,l,a,e,o);for(let _=0;_1){let c=this._getJoinedRanges(r,l,a,e,o);for(let u=0;u=ks,Lr=ae,x=this._workCell;if(v.length>0&&ae===v[0][0]&&Ze){let k=v.shift(),Br=this._isCellInSelection(k[0],e);for(T=k[0]+1;T=k[1],Ze?(fi=!0,x=new Ni(this._workCell,t.translateToString(!0,k[0],k[1]),k[1]-k[0]),Lr=k[1]-1,Rr=x.getWidth()):ks=k[1]}let Nt=this._isCellInSelection(ae,e),Ar=i&&ae===o,kr=kn&&ae>=c&&ae<=u;_&&x.isBlink()&&(_.hasBlinkingCells=!0),!l&&x.isBlink()&&N.push("xterm-blink-hidden");let Pr=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,k=>{Pr=!0});let _i=x.getChars()||" ";if(_i===" "&&(x.isUnderline()||x.isOverline())&&(_i="\xA0"),Ot=Rr*h-d.get(_i,x.isBold(),x.isItalic()),!C)C=this._document.createElement("span");else if(w&&(Nt&&ui||!Nt&&!ui&&x.bg===te)&&(Nt&&ui&&f.selectionForeground||x.fg===Ds)&&x.extended.ext===Rs&&kr===Ls&&Ot===As&&!Ar&&!fi&&!Pr&&Ze){x.isInvisible()?A+=" ":A+=_i,w++;continue}else w&&(C.textContent=A),C=this._document.createElement("span"),w=0,A="";if(te=x.bg,Ds=x.fg,Rs=x.extended.ext,Ls=kr,As=Ot,ui=Nt,fi&&o>=ae&&o<=Lr&&(o=ae),!this._coreService.isCursorHidden&&Ar&&this._coreService.isCursorInitialized){if(N.push("xterm-cursor"),this._coreBrowserService.isFocused)a&&N.push("xterm-cursor-blink"),N.push(r==="bar"?"xterm-cursor-bar":r==="underline"?"xterm-cursor-underline":"xterm-cursor-block");else if(s)switch(s){case"outline":N.push("xterm-cursor-outline");break;case"block":N.push("xterm-cursor-block");break;case"bar":N.push("xterm-cursor-bar");break;case"underline":N.push("xterm-cursor-underline");break;default:break}}if(x.isBold()&&N.push("xterm-bold"),x.isItalic()&&N.push("xterm-italic"),x.isDim()&&N.push("xterm-dim"),x.isInvisible()?A=" ":A=x.getChars()||" ",x.isUnderline()&&(N.push(`xterm-underline-${x.extended.underlineStyle}`),A===" "&&(A="\xA0"),!x.isUnderlineColorDefault()))if(x.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${fe.toColorRGB(x.getUnderlineColor()).join(",")})`;else{let k=x.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&x.isBold()&&k<8&&(k+=8),C.style.textDecorationColor=f.ansi[k].css}x.isOverline()&&(N.push("xterm-overline"),A===" "&&(A="\xA0")),x.isStrikethrough()&&N.push("xterm-strikethrough"),kr&&(C.style.textDecoration="underline");let ue=x.getFgColor(),Ft=x.getFgColorMode(),Se=x.getBgColor(),Ht=x.getBgColorMode(),Mr=!!x.isInverse();if(Mr){let k=ue;ue=Se,Se=k;let Br=Ft;Ft=Ht,Ht=Br}let Ae,pi,Wt=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,k=>{k.options.layer!=="top"&&Wt||(k.backgroundColorRGB&&(Ht=50331648,Se=k.backgroundColorRGB.rgba>>8&16777215,Ae=k.backgroundColorRGB),k.foregroundColorRGB&&(Ft=50331648,ue=k.foregroundColorRGB.rgba>>8&16777215,pi=k.foregroundColorRGB),Wt=k.options.layer==="top")}),!Wt&&Nt&&(Ae=this._coreBrowserService.isFocused?f.selectionBackgroundOpaque:f.selectionInactiveBackgroundOpaque,Se=Ae.rgba>>8&16777215,Ht=50331648,Wt=!0,f.selectionForeground&&(Ft=50331648,ue=f.selectionForeground.rgba>>8&16777215,pi=f.selectionForeground)),Wt&&N.push("xterm-decoration-top");let ke;switch(Ht){case 16777216:case 33554432:ke=f.ansi[Se],N.push(`xterm-bg-${Se}`);break;case 50331648:ke=O.toColor(Se>>16,Se>>8&255,Se&255),this._addStyle(C,`background-color:#${(Se>>>0).toString(16).padStart(6,"0")}`);break;case 0:default:Mr?(ke=f.foreground,N.push(`xterm-bg-${257}`)):ke=f.background}switch(Ae||x.isDim()&&(Ae=L.multiplyOpacity(ke,.5)),Ft){case 16777216:case 33554432:x.isBold()&&ue<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(ue+=8),this._applyMinimumContrast(C,ke,f.ansi[ue],x,Ae,void 0)||N.push(`xterm-fg-${ue}`);break;case 50331648:let k=O.toColor(ue>>16&255,ue>>8&255,ue&255);this._applyMinimumContrast(C,ke,k,x,Ae,pi)||this._addStyle(C,`color:#${ue.toString(16).padStart(6,"0")}`);break;case 0:default:this._applyMinimumContrast(C,ke,f.foreground,x,Ae,pi)||Mr&&N.push(`xterm-fg-${257}`)}N.length&&(C.className=N.join(" "),N.length=0),!Ar&&!fi&&!Pr&&Ze?w++:C.textContent=A,Ot!==this.defaultSpacing&&(C.style.letterSpacing=`${Ot}px`),p.push(C),ae=Lr}return C&&w&&(C.textContent=A),p}_applyMinimumContrast(t,e,i,r,s,o){if(this._optionsService.rawOptions.minimumContrastRatio===1||Zs(r.getCode()))return!1;let a=this._getContrastCache(r),l;if(!s&&!o&&(l=a.getColor(e.rgba,i.rgba)),l===void 0){let h=this._optionsService.rawOptions.minimumContrastRatio/(r.isDim()?2:1);l=L.ensureContrastRatio(s??e,o??i,h),a.setColor((s??e).rgba,(o??i).rgba,l??null)}return l?(this._addStyle(t,`color:${l.css}`),!0):!1}_getContrastCache(t){return t.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(t,e){t.setAttribute("style",`${t.getAttribute("style")||""}${e};`)}_isCellInSelection(t,e){let i=this._selectionStart,r=this._selectionEnd;return!i||!r?!1:this._columnSelectMode?i[0]<=r[0]?t>=i[0]&&e>=i[1]&&t=i[1]&&t>=r[0]&&e<=r[1]:e>i[1]&&e=i[0]&&t=i[0]}};_t=y([m(1,gi),m(2,R),m(3,G),m(4,Y),m(5,ge),m(6,ce)],_t);var Hi=class{constructor(t=()=>new rs){this._flat=new Float32Array(256);this._font="";this._fontSize=0;this._weight="normal";this._weightBold="bold";this._canvasElements=[];this._canvasElements=[t(),t(),t(),t()],this.clear()}dispose(){this._canvasElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(t,e,i,r){t===this._font&&e===this._fontSize&&i===this._weight&&r===this._weightBold||(this._font=t,this._fontSize=e,this._weight=i,this._weightBold=r,this._canvasElements[0].setFont(t,e,i,!1),this._canvasElements[1].setFont(t,e,r,!1),this._canvasElements[2].setFont(t,e,i,!0),this._canvasElements[3].setFont(t,e,r,!0),this.clear())}get(t,e,i){let r;if(!e&&!i&&t.length===1&&(r=t.charCodeAt(0))<256){if(this._flat[r]!==-9999)return this._flat[r];let a=this._measure(t,0);return a>0&&(this._flat[r]=a),a}let s=t;e&&(s+="B"),i&&(s+="I");let o=this._holey.get(s);if(o===void 0){let a=0;e&&(a|=1),i&&(a|=2),o=this._measure(t,a),o>0&&this._holey.set(s,o)}return o}_measure(t,e){return this._canvasElements[e].measure(t)}},rs=class{constructor(){typeof OffscreenCanvas<"u"?(this._canvas=new OffscreenCanvas(1,1),this._ctx=is(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=is(this._canvas.getContext("2d")))}setFont(t,e,i,r){let s=r?"italic":"";this._ctx.font=`${s} ${i} ${e}px ${t}`.trim()}measure(t){return this._ctx.measureText(t).width}};var ss=class{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(t,e,i,r=!1){if(this.selectionStart=e,this.selectionEnd=i,!e||!i||e[0]===i[0]&&e[1]===i[1]){this.clear();return}let s=t.buffers.active.ydisp,o=e[1]-s,a=i[1]-s,l=Math.max(o,0),h=Math.min(a,t.rows-1);if(l>=t.rows||h<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=r,this.viewportStartRow=o,this.viewportEndRow=a,this.viewportCappedStartRow=l,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=i[0]}isCellSelected(t,e,i){return this.hasSelection?(i-=t.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&i>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&e=this.startCol):!1}};function Qs(){return new ss}var Wi=class extends g{constructor(e,i,r){super();this._renderCallback=e;this._coreBrowserService=i;this._optionsService=r;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",s=>{this.setIntervalDuration(s)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(E(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let i=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),i||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var eo=1,mt=class extends g{constructor(e,i,r,s,o,a,l,h,d,c,u,_,p,v){super();this._terminal=e;this._document=i;this._element=r;this._screenElement=s;this._viewportElement=o;this._helperContainer=a;this._linkifier2=l;this._charSizeService=d;this._optionsService=c;this._bufferService=u;this._coreService=_;this._coreBrowserService=p;this._themeService=v;this._terminalClass=eo++;this._rowElements=[];this._selectionRenderModel=Qs();this._lastSelectionColumnMode=!1;this._rowHasBlinkingCells=[];this._rowHasBlinkingCellsCount=0;this._onRequestRedraw=this._register(new b);this.onRequestRedraw=this._onRequestRedraw.event;this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=Js(),this._updateDimensions(),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._themeService.onChangeColors(f=>this._injectCss(f))),this._injectCss(this._themeService.colors),this._rowFactory=h.createInstance(_t,document),this._element.classList.add("xterm-dom-renderer-owner-"+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this._register(this._linkifier2.onShowLinkUnderline(f=>this._handleLinkHover(f))),this._register(this._linkifier2.onHideLinkUnderline(f=>this._handleLinkLeave(f))),this._cursorBlinkStateManager=new ns(this._rowContainer,this._coreBrowserService),this._register(I(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register(E(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new Wi(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register(E(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new Hi,this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){let 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(let r of this._rowElements)r.style.width=`${this.dimensions.css.canvas.width}px`,r.style.height=`${this.dimensions.css.cell.height}px`,r.style.lineHeight=`${this.dimensions.css.cell.height}px`,r.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));let i=`${this._terminalSelector} .xterm-rows span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=i,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 i=`${this._terminalSelector} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;i+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,i+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${L.multiplyOpacity(e.foreground,.5).css};}`,i+=`${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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;let r=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,o=`blink_block_${this._terminalClass}`;i+=`@keyframes ${r} { 50% { border-bottom-style: hidden; }}`,i+=`@keyframes ${s} { 50% { box-shadow: none; }}`,i+=`@keyframes ${o} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,i+=`${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${o} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,i+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(let[a,l]of e.ansi.entries())i+=`${this._terminalSelector} .xterm-fg-${a} { color: ${l.css}; }${this._terminalSelector} .xterm-fg-${a}.xterm-dim { color: ${L.multiplyOpacity(l,.5).css}; }${this._terminalSelector} .xterm-bg-${a} { background-color: ${l.css}; }`;i+=`${this._terminalSelector} .xterm-fg-${257} { color: ${L.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${257}.xterm-dim { color: ${L.multiplyOpacity(L.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${257} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=i}_setDefaultSpacing(){let 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,i){for(let r=this._rowElements.length;r<=i;r++){let s=this._document.createElement("div");this._rowContainer.appendChild(s),this._rowElements.push(s),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>i;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}handleResize(e,i){this._refreshRowElements(e,i),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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,i,r){let s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,i,r);let o=0,a=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(o=this._selectionRenderModel.viewportCappedStartRow,a=this._selectionRenderModel.viewportCappedEndRow));let l=0,h=-1;if(!e||!i)return;if(this._selectionRenderModel.update(this._terminal,e,i,r),this._selectionRenderModel.hasSelection){let u=this._selectionRenderModel.viewportStartRow,_=this._selectionRenderModel.viewportEndRow,p=this._selectionRenderModel.viewportCappedStartRow,v=this._selectionRenderModel.viewportCappedEndRow;l=p,h=v;let f=this._document.createDocumentFragment();if(r){let S=e[0]>i[0];f.appendChild(this._createSelectionElement(p,S?i[0]:e[0],S?e[0]:i[0],v-p+1))}else{let S=u===p?e[0]:0,C=p===_?i[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(p,S,C));let w=v-p-1;if(f.appendChild(this._createSelectionElement(p+1,0,this._bufferService.cols,w)),p!==v){let A=_===v?i[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(v,0,A))}}this._selectionContainer.appendChild(f)}let d=Math.min(o,l),c=Math.max(a,h);if(c>=0){d=Math.max(d,0),c=Math.min(c,s-1);let _=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&_>=0&&_this.dimensions.css.canvas.width&&(l=this.dimensions.css.canvas.width-a),o.style.height=`${s*this.dimensions.css.cell.height}px`,o.style.top=`${e*this.dimensions.css.cell.height}px`,o.style.left=`${a}px`,o.style.width=`${l}px`,o}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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(let e of this._rowElements)e.replaceChildren();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,i){let r=this._bufferService.buffer,s=r.ybase+r.y,o=Math.min(r.x,this._bufferService.cols-1),a=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,l=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,h=this._optionsService.rawOptions.cursorInactiveStyle,d={hasBlinkingCells:!1};for(let c=e;c<=i;c++){let u=c+r.ydisp,_=this._rowElements[c];if(!_)continue;let p=r.lines.get(u);if(!p){_.replaceChildren(),this._setRowBlinkState(c,!1);continue}_.replaceChildren(...this._rowFactory.createRow(p,u,u===s,l,h,o,a,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,d)),this._setRowBlinkState(c,d.hasBlinkingCells)}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,i,r,s,o,a){r<0&&(e=0),s<0&&(i=0);let l=this._bufferService.rows-1;r=Math.max(Math.min(r,l),0),s=Math.max(Math.min(s,l),0),o=Math.min(o,this._bufferService.cols);let h=this._bufferService.buffer,d=h.ybase+h.y,c=Math.min(h.x,o-1),u=this._optionsService.rawOptions.cursorBlink,_=this._optionsService.rawOptions.cursorStyle,p=this._optionsService.rawOptions.cursorInactiveStyle,v={hasBlinkingCells:!1};for(let f=r;f<=s;++f){let S=f+h.ydisp,C=this._rowElements[f];if(!C)continue;let w=h.lines.get(S);if(!w){C.replaceChildren(),this._setRowBlinkState(f,!1);continue}C.replaceChildren(...this._rowFactory.createRow(w,S,S===d,_,p,c,u,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,a?f===r?e:0:-1,a?(f===s?i:o)-1:-1,v)),this._setRowBlinkState(f,v.hasBlinkingCells)}this._updateTextBlinkState()}_setRowBlinkState(e,i){this._rowHasBlinkingCells[e]!==i&&(this._rowHasBlinkingCells[e]=i,this._rowHasBlinkingCellsCount+=i?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};mt=y([m(7,et),m(8,Be),m(9,R),m(10,D),m(11,Y),m(12,G),m(13,ce)],mt);var ns=class{constructor(t,e){this._rowContainer=t;this._coreBrowserService=e;this._isIdlePaused=!1;this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){this._idleTimeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}};var bt=class extends g{constructor(e,i,r){super();this._optionsService=r;this.width=0;this.height=0;this._onCharSizeChange=this._register(new b);this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new as(this._optionsService))}catch{this._measureStrategy=this._register(new os(e,i,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}get hasValidSize(){return this.width>0&&this.height>0}measure(){let e=this._measureStrategy.measure();(e.width!==this.width||e.height!==this.height)&&(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};bt=y([m(2,R)],bt);var Ui=class extends g{constructor(){super(...arguments);this._result={width:0,height:0}}_validateAndSet(e,i){e!==void 0&&e>0&&i!==void 0&&i>0&&(this._result.width=e,this._result.height=i)}},os=class extends Ui{constructor(e,i,r){super();this._document=e;this._parentElement=i;this._optionsService=r;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}},as=class extends Ui{constructor(e){super();this._optionsService=e;this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");let i=this._ctx.measureText("W");if(!("width"in i&&"fontBoundingBoxAscent"in i&&"fontBoundingBoxDescent"in i))throw new Error("Required font metrics not supported")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;let e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}};var Ki=class extends g{constructor(e,i,r){super();this._textarea=e;this._window=i;this.mainDocument=r;this._isFocused=!1;this._cachedIsFocused=void 0;this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._onWindowChange=this._register(new b);this.onWindowChange=this._onWindowChange.event;this._screenDprMonitor=this._register(new ls(this._window)),this._register(this.onWindowChange(s=>this._screenDprMonitor.setWindow(s))),this._register(j.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register(I(this._textarea,"focus",()=>this._isFocused=!0)),this._register(I(this._textarea,"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 this._cachedIsFocused===void 0&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask(()=>this._cachedIsFocused=void 0)),this._cachedIsFocused}},ls=class extends g{constructor(e){super();this._parentWindow=e;this._windowResizeListener=this._register(new B);this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register(E(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=I(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)}};var zi=class extends g{constructor(){super();this.linkProviders=[];this._register(E(()=>this.linkProviders.length=0))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{let i=this.linkProviders.indexOf(e);i!==-1&&this.linkProviders.splice(i,1)}}}};function qt(n,t,e){let i=e.getBoundingClientRect(),r=n.getComputedStyle(e),s=parseInt(r.getPropertyValue("padding-left"),10),o=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-i.left-s,t.clientY-i.top-o]}function en(n,t,e,i,r,s,o,a,l){if(!s)return;let h=qt(n,t,e);return h[0]=Math.ceil((h[0]+(l?o/2:0))/o),h[1]=Math.ceil(h[1]/a),h[0]=Math.min(Math.max(h[0],1),i+(l?1:0)),h[1]=Math.min(Math.max(h[1],1),r),h}var vt=class{constructor(t,e){this._charSizeService=t;this._renderService=e}getCoords(t,e,i,r,s){return en(se(e),t,e,i,r,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,s)}getMouseReportCoords(t,e){let i=qt(se(e),t,e);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])}}};vt=y([m(0,Be),m(1,V)],vt);var tn=typeof window=="object"?window:globalThis;function he(n,t=0){return n[n.length-(1+t)]}function to(n,t,e){let i=null,r=null;if(typeof e.value=="function"?(i="value",r=e.value,r.length!==0&&console.warn("Memoize should only be used in functions with zero parameters")):typeof e.get=="function"&&(i="get",r=e.get),!r||!i)throw new Error("not supported");let s=`$memoize$${t}`,o=e;o[i]=function(...a){return this.hasOwnProperty(s)||Object.defineProperty(this,s,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,a)}),this[s]}}var St=class St{constructor(t){this.element=t,this.next=St.Undefined,this.prev=St.Undefined}};St.Undefined=new St(void 0);var re=St,Gi=class{constructor(){this._first=re.Undefined;this._last=re.Undefined}push(t){return this._insert(t,!0)}_insert(t,e){let i=new re(t);if(this._first===re.Undefined)this._first=i,this._last=i;else if(e){let s=this._last;this._last=i,i.prev=s,s.next=i}else{let s=this._first;this._first=i,i.next=s,s.prev=i}let r=!1;return()=>{r||(r=!0,this._remove(i))}}_remove(t){if(t.prev!==re.Undefined&&t.next!==re.Undefined){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev===re.Undefined&&t.next===re.Undefined?(this._first=re.Undefined,this._last=re.Undefined):t.next===re.Undefined?(this._last=this._last.prev,this._last.next=re.Undefined):t.prev===re.Undefined&&(this._first=this._first.next,this._first.prev=re.Undefined)}*[Symbol.iterator](){let t=this._first;for(;t!==re.Undefined;)yield t.element,t=t.next}},de;(s=>(s.TAP="-xterm-gesturetap",s.CHANGE="-xterm-gesturechange",s.START="-xterm-gesturestart",s.END="-xterm-gesturesend",s.CONTEXT_MENU="-xterm-gesturecontextmenu"))(de||={});var K=class K extends g{constructor(){super();this._dispatched=!1;this._targets=new Gi;this._ignoreTargets=new Gi;this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;let e=tn;this._register(I(e.document,"touchstart",i=>this._handleTouchStart(i),{passive:!1})),this._register(I(e.document,"touchend",i=>this._handleTouchEnd(e,i))),this._register(I(e.document,"touchmove",i=>this._handleTouchMove(i),{passive:!1}))}static addTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let i=K._instance._targets.push(e);return E(i)}static ignoreTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let i=K._instance._ignoreTargets.push(e);return E(i)}static isTouchDevice(){return"ontouchstart"in tn||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){let i=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let r=0,s=e.targetTouches.length;r=K._holdDelay&&Math.abs(h.initialPageX-he(h.rollingPageX))<30&&Math.abs(h.initialPageY-he(h.rollingPageY))<30){let c=this._newGestureEvent(de.CONTEXT_MENU,h.initialTarget);c.pageX=he(h.rollingPageX),c.pageY=he(h.rollingPageY),this._dispatchEvent(c)}else if(s===1){let c=he(h.rollingPageX),u=he(h.rollingPageY),_=he(h.rollingTimestamps)-h.rollingTimestamps[0],p=c-h.rollingPageX[0],v=u-h.rollingPageY[0],f=[...this._targets].filter(S=>h.initialTarget instanceof Node&&S.contains(h.initialTarget));this._inertia(e,f,r,Math.abs(p)/_,p>0?1:-1,c,Math.abs(v)/_,v>0?1:-1,u)}this._dispatchEvent(this._newGestureEvent(de.END,h.initialTarget)),delete this._activeTouches[l.identifier]}this._dispatched&&(i.preventDefault(),i.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,i){let r=document.createEvent("CustomEvent");return r.initEvent(e,!1,!0),r.initialTarget=i,r.tapCount=0,r}_dispatchEvent(e){if(e.type===de.TAP){let i=new Date().getTime(),r;i-this._lastSetTapCountTime>K._clearTapCountTime?r=1:r=2,this._lastSetTapCountTime=i,e.tapCount=r}else(e.type===de.CHANGE||e.type===de.CONTEXT_MENU)&&(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(let r of this._ignoreTargets)if(r.contains(e.initialTarget))return;let i=[];for(let r of this._targets)if(r.contains(e.initialTarget)){let s=0,o=e.initialTarget;for(;o&&o!==r;)s++,o=o.parentElement;i.push([s,r])}i.sort((r,s)=>r[0]-s[0]);for(let[,r]of i)r.dispatchEvent(e),this._dispatched=!0}}_inertia(e,i,r,s,o,a,l,h,d){this._handle=it(e,()=>{let c=Date.now(),u=c-r,_=0,p=0,v=!0;s+=K._scrollFriction*u,l+=K._scrollFriction*u,s>0&&(v=!1,_=o*s*u),l>0&&(v=!1,p=h*l*u);let f=this._newGestureEvent(de.CHANGE);f.translationX=_,f.translationY=p,i.forEach(S=>S.dispatchEvent(f)),v||this._inertia(e,i,c,s,o,a+_,l,h,d+p)})}_handleTouchMove(e){let i=Date.now();for(let r=0,s=e.changedTouches.length;r3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(o.pageX),a.rollingPageY.push(o.pageY),a.rollingTimestamps.push(i)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}};K._scrollFriction=-.005,K._holdDelay=700,K._clearTapCountTime=400,y([to],K,"isTouchDevice",1);var Vi=K;var gt=class{constructor(t,e,i,r,s,o,a,l,h){this._renderService=t;this._mouseCoordsService=e;this._mouseStateService=i;this._coreService=r;this._bufferService=s;this._optionsService=o;this._selectionService=a;this._logService=l;this._coreBrowserService=h;this._lastEvent=null;this._wheelPartialScroll=0;this._touchScrollAccumulator=0}bindMouse(t,e,i){let{element:r,document:s}=t,o={mouseup:null,wheel:null,mousedrag:null,mousemove:null},a={target:t,focus:i,requestedEvents:o},l={mouseup:h=>this._handleMouseUp(a,h),wheel:h=>this._handleWheel(a,h),mousedrag:h=>this._handleMouseDrag(a,h),mousemove:h=>this._handleMouseMove(a,h)};this._altMouseCursor=new cs(r,s,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),e(this._altMouseCursor),e(this._mouseStateService.onProtocolChange(h=>{this._handleProtocolChange(a,l,h)})),e(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(r),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,e(E(()=>{o.mouseup&&s.removeEventListener("mouseup",o.mouseup),o.mousedrag&&s.removeEventListener("mousemove",o.mousedrag)})),e(I(r,"mousedown",h=>this._handleMouseDown(a,h))),e(I(r,"wheel",h=>this._handlePassiveWheel(a,h),{passive:!1})),e(Vi.addTarget(t.screenElement)),e(I(t.screenElement,de.START,()=>this._handleTouchStart())),e(I(t.screenElement,de.CHANGE,h=>this._handleTouchChange(a,h)))}_sendEvent(t,e){let i=this._mouseCoordsService.getMouseReportCoords(e,t.target.screenElement);if(!i)return!1;let r,s;switch(e.overrideType||e.type){case"mousemove":s=32,e.buttons===void 0?(r=3,e.button!==void 0&&(r=e.button<3?e.button:3)):r=e.buttons&1?0:e.buttons&4?1:e.buttons&2?2:3;break;case"mouseup":s=0,r=e.button<3?e.button:3;break;case"mousedown":s=1,r=e.button<3?e.button:3;break;case"wheel":if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;let a=e.deltaY;if(a===0||this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return!1;s=a<0?0:1,r=4;break;default:return!1}if(s===void 0||r===void 0||r>4||r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!e.altKey)return!1;let o=r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:r,action:s,ctrl:e.ctrlKey,alt:o?!1:e.altKey,shift:e.shiftKey})}_handleMouseUp(t,e){this._sendEvent(t,e),e.buttons||(t.requestedEvents.mouseup&&t.target.document.removeEventListener("mouseup",t.requestedEvents.mouseup),t.requestedEvents.mousedrag&&t.target.document.removeEventListener("mousemove",t.requestedEvents.mousedrag))}_handleWheel(t,e){return this._sendEvent(t,e),e.preventDefault(),e.stopPropagation(),!1}_handleMouseDrag(t,e){e.buttons&&this._sendEvent(t,e)}_handleMouseMove(t,e){e.buttons||this._sendEvent(t,e)}_handleMouseDown(t,e){e.preventDefault(),t.focus(),!(!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(e))&&(this._sendEvent(t,e),t.requestedEvents.mouseup&&t.target.document.addEventListener("mouseup",t.requestedEvents.mouseup),t.requestedEvents.mousedrag&&t.target.document.addEventListener("mousemove",t.requestedEvents.mousedrag))}_handlePassiveWheel(t,e){if(!t.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;if(!this._bufferService.buffer.hasScrollback){if(e.deltaY===0)return!1;if(this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return e.preventDefault(),e.stopPropagation(),!1;let s="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(s,!0),e.preventDefault(),e.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(t,e){if(e.preventDefault(),e.stopPropagation(),t.requestedEvents.wheel){this._handleTouchScrollAsWheel(t,e);return}if(!this._bufferService.buffer.hasScrollback){this._handleTouchScrollAsKeys(e);return}t.target.handleTouchScroll?.(e.translationY)}_handleTouchScrollAsKeys(t){let e=this._renderService?.dimensions.css.cell.height;if(!e)return;this._touchScrollAccumulator-=t.translationY;let i=Math.trunc(this._touchScrollAccumulator/e);if(i===0)return;this._touchScrollAccumulator-=i*e;let r="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let s=0;s0?1:-1),this._wheelPartialScroll%=1):t.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(s*=this._bufferService.rows),s}_triggerMouseEvent(t){if(t.col<0||t.col>=this._bufferService.cols||t.row<0||t.row>=this._bufferService.rows||t.button===4&&t.action===32||t.button===3&&t.action!==32||t.button!==4&&(t.action===2||t.action===3)||(t.col++,t.row++,t.action===32&&this._lastEvent&&this._equalEvents(this._lastEvent,t,this._mouseStateService.isPixelEncoding))||!this._mouseStateService.restrictMouseEvent(t))return!1;let e=this._mouseStateService.encodeMouseEvent(t);return e&&(this._mouseStateService.isDefaultEncoding?this._coreService.triggerBinaryEvent(e):this._coreService.triggerDataEvent(e,!0)),this._lastEvent=t,!0}_explainEvents(t){return{down:!!(t&1),up:!!(t&2),drag:!!(t&4),move:!!(t&8),wheel:!!(t&16)}}_equalEvents(t,e,i){if(i){if(t.x!==e.x||t.y!==e.y)return!1}else if(t.col!==e.col||t.row!==e.row)return!1;return!(t.button!==e.button||t.action!==e.action||t.ctrl!==e.ctrl||t.alt!==e.alt||t.shift!==e.shift)}};gt=y([m(0,V),m(1,Oe),m(2,Me),m(3,Y),m(4,D),m(5,R),m(6,Si),m(7,_e),m(8,G)],gt);var cs=class{constructor(t,e,i){this._element=t;this._document=e;this._isActive=i;this._listeners=new B}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;let t=new pe,e=r=>this.syncFromModifier(r);t.add(I(this._document,"keydown",e)),t.add(I(this._document,"keyup",e)),t.add(I(this._element,"mousemove",e));let i=this._element.ownerDocument?.defaultView;i&&t.add(I(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=t}resetClass(){this._updateClass(!1)}syncFromModifier(t){this._isActive()&&this._updateClass(t.getModifierState("Alt"))}_updateClass(t){t?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}};var $i=class{constructor(t,e){this._renderCallback=t;this._coreBrowserService=e;this._refreshCallbacks=[]}dispose(){this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(t){return this._refreshCallbacks.push(t),this._animationFrame??=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()),this._animationFrame}refresh(t,e,i){this._rowCount=i,t=t??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,t):t,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._animationFrame=void 0,this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0){this._runRefreshCallbacks();return}let t=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(t,e),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(let t of this._refreshCallbacks)t(0);this._refreshCallbacks=[]}};var qi=class{constructor(t){this._tasks=[];this._i=0;this._logService=t}enqueue(t){this._tasks.push(t),this._start()}flush(){for(;this._is){r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),this._start();return}r=s}this.clear()}},hs=class extends qi{_requestCallback(t){return setTimeout(()=>t(this._createDeadline(16)))}_cancelCallback(t){clearTimeout(t)}_createDeadline(t){let e=performance.now()+t;return{timeRemaining:()=>Math.max(0,e-performance.now())}}},ds=class extends qi{_requestCallback(t){return requestIdleCallback(t)}_cancelCallback(t){cancelIdleCallback(t)}},Ct="requestIdleCallback"in globalThis?ds:hs,Xi=class{constructor(t){this._queue=new Ct(t)}set(t){this._queue.clear(),this._queue.enqueue(t)}flush(){this._queue.flush()}dispose(){this._queue.clear()}};var It=class extends g{constructor(e,i,r,s,o,a,l,h,d,c){super();this._rowCount=e;this._optionsService=r;this._logService=s;this._charSizeService=o;this._coreService=a;this._coreBrowserService=d;this._renderer=this._register(new B);this._observerDisposable=this._register(new B);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 b);this.onDimensionsChange=this._onDimensionsChange.event;this._onRenderedViewportChange=this._register(new b);this.onRenderedViewportChange=this._onRenderedViewportChange.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onRefreshRequest=this._register(new b);this.onRefreshRequest=this._onRefreshRequest.event;this._pausedResizeTask=this._register(new Xi(this._logService)),this._renderDebouncer=new $i((u,_)=>this._renderRows(u,_),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new us(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register(E(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(h.onResize(()=>this._fullRefresh())),this._register(h.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(h.buffer.y,h.buffer.y,void 0,!0))),this._register(c.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,i),this._register(this._coreBrowserService.onWindowChange(u=>this._registerIntersectionObserver(u,i)))}get dimensions(){return this._renderer.value.dimensions}_registerIntersectionObserver(e,i){if("IntersectionObserver"in e){let r=new e.IntersectionObserver(s=>this._handleIntersectionChange(s[s.length-1]),{threshold:0});this._observerDisposable.value=E(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=r,r.observe(i)}}_handleIntersectionChange(e){this._isPaused=e.isIntersecting===void 0?e.intersectionRatio===0:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),!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,i,r=!1,s=!1){if(this._isPaused){this._needsFullRefresh=!0;return}if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,i);return}let o=this._syncOutputHandler.flush();o&&(e=Math.min(e,o.start),i=Math.max(i,o.end)),s||(this._isNextRenderRedrawOnly=!1),r?this._renderRows(e,i):this._renderDebouncer.refresh(e,i,this._rowCount)}_renderRows(e,i){if(this._renderer.value){if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,i);return}e=Math.min(e,this._rowCount-1),i=Math.min(i,this._rowCount-1),this._renderer.value.renderRows(e,i),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:i}),this._onRender.fire({start:e,end:i}),this._isNextRenderRedrawOnly=!0}}resize(e,i){this._rowCount=i,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(i=>this.refreshRows(i.start,i.end,i.sync,!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,i){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set(()=>this._renderer.value?.handleResize(e,i)):this._renderer.value.handleResize(e,i),this._fullRefresh())}handleCharSizeChanged(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,i,r){this._selectionState.start=e,this._selectionState.end=i,this._selectionState.columnSelectMode=r,this._renderer.value?.handleSelectionChanged(e,i,r)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};It=y([m(2,R),m(3,_e),m(4,Be),m(5,Y),m(6,ge),m(7,D),m(8,G),m(9,ce)],It);var us=class{constructor(t,e,i){this._coreBrowserService=t;this._coreService=e;this._onTimeout=i;this._start=0;this._end=0;this._isBuffering=!1}bufferRows(t,e){this._isBuffering?(this._start=Math.min(this._start,t),this._end=Math.max(this._end,e)):(this._start=t,this._end=e,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;let t={start:this._start,end:this._end};return this._isBuffering=!1,t}dispose(){this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}};function rn(n,t,e,i){let r=e.buffer.x,s=e.buffer.y;if(!e.buffer.hasScrollback)return oo(r,s,n,t,e,i)+Yi(s,t,e,i)+ao(r,s,n,t,e,i);let o;if(s===t)return o=r>n?"D":"C",Yt(Math.abs(r-n),Xt(o,i));o=s>t?"D":"C";let a=Math.abs(s-t),l=no(s>t?n:r,e)+(a-1)*e.cols+1+so(s>t?r:n,e);return Yt(l,Xt(o,i))}function so(n,t){return n-1}function no(n,t){return t.cols-n}function oo(n,t,e,i,r,s){return Yi(t,i,r,s).length===0?"":Yt(nn(n,t,n,t-qe(t,r),!1,r).length,Xt("D",s))}function Yi(n,t,e,i){let r=n-qe(n,e),s=t-qe(t,e),o=Math.abs(r-s)-lo(n,t,e);return Yt(o,Xt(sn(n,t),i))}function ao(n,t,e,i,r,s){let o;Yi(t,i,r,s).length>0?o=i-qe(i,r):o=t;let a=i,l=co(n,t,e,i,r,s);return Yt(nn(n,o,e,a,l==="C",r).length,Xt(l,s))}function lo(n,t,e){let i=0,r=n-qe(n,e),s=t-qe(t,e);for(let o=0;o=0&&n0?o=i-qe(i,r):o=t,n=e&&ot?"A":"B"}function nn(n,t,e,i,r,s){let o=n,a=t,l="";for(;(o!==e||a!==i)&&a>=0&&as.cols-1?(l+=s.buffer.translateBufferLineToString(a,!1,n,o),o=0,n=0,a++):!r&&o<0&&(l+=s.buffer.translateBufferLineToString(a,!1,0,n+1),o=s.cols-1,n=o,a--);return l+s.buffer.translateBufferLineToString(a,!1,n,o)}function Xt(n,t){let e=t?"O":"[";return"\x1B"+e+n}function Yt(n,t){n=Math.floor(n);let e="";for(let i=0;ithis._bufferService.cols?t%this._bufferService.cols===0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)-1]:[t%this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)]:[t,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){let t=this.selectionStart[0]+this.selectionStartLength;return t>this._bufferService.cols?[t%this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)]:[Math.max(t,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){let t=this.selectionStart,e=this.selectionEnd;return!t||!e?!1:t[1]>e[1]||t[1]===e[1]&&t[0]>e[0]}handleTrim(t){return this.selectionStart&&(this.selectionStart[1]-=t),this.selectionEnd&&(this.selectionEnd[1]-=t),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):this.selectionStart&&this.selectionStart[1]<0?(this.selectionStart=[0,0],!0):!1}};function fs(n,t){if(n.start.y>n.end.y)throw new Error(`Buffer range end (${n.end.x}, ${n.end.y}) cannot be before start (${n.start.x}, ${n.start.y})`);return t*(n.end.y-n.start.y)+(n.end.x-n.start.x+1)}var ho="\xA0",uo=new RegExp(ho,"g");var Et=class extends g{constructor(e,i,r,s,o,a,l,h,d,c){super();this._element=e;this._screenElement=i;this._linkifier=r;this._bufferService=s;this._coreService=o;this._mouseCoordsService=a;this._optionsService=l;this._mouseStateService=h;this._renderService=d;this._coreBrowserService=c;this._dragScrollAmount=0;this._enabled=!0;this._trimListener=this._register(new B);this._workCell=new F;this._mouseDownTimeStamp=0;this._oldHasSelection=!1;this._oldSelectionStart=void 0;this._oldSelectionEnd=void 0;this._onLinuxMouseSelection=this._register(new b);this.onLinuxMouseSelection=this._onLinuxMouseSelection.event;this._onRedrawRequest=this._register(new b);this.onRequestRedraw=this._onRedrawRequest.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._mouseMoveListener=u=>this._handleMouseMove(u),this._mouseUpListener=u=>this._handleMouseUp(u),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(u=>this._handleTrim(u)),this._register(this._bufferService.buffers.onBufferActivate(u=>this._handleBufferActivate(u))),this.enable(),this._model=new ji(this._bufferService),this._activeSelectionMode=0,this._register(E(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(u=>{u.rowsChanged&&this.clearSelection()}))}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(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd;return!e||!i?!1:e[0]!==i[0]||e[1]!==i[1]}get selectionText(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd;if(!e||!i)return"";let r=this._bufferService.buffer,s=[];if(this._activeSelectionMode===3){if(e[0]===i[0])return"";let a=e[0]a.replace(uo," ")).join(Ke?`\r +-WARNING: This link could potentially be dangerous`)){let t=window.open();if(t){try{t.opener=null}catch{}t.location.href=i}else console.warn("Opening link blocked as opener could not be cleared")}}var Pe=H("CharSizeService"),G=H("CoreBrowserService"),Be=H("MouseCoordsService"),Us=H("MouseService"),V=H("RenderService"),vi=H("SelectionService"),Si=H("CharacterJoinerService"),_e=H("ThemeService"),gi=H("LinkProviderService"),Ks=H("KeyboardService");function E(n){return{dispose:n}}function Oe(n){if(!n)return n;if(Array.isArray(n)){for(let i of n)i.dispose();return[]}return n.dispose(),n}var pe=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(i){return this._isDisposed?i.dispose():this._disposables.add(i),i}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let i of this._disposables)i.dispose();this._disposables.clear()}}clear(){for(let i of this._disposables)i.dispose();this._disposables.clear()}},g=class{constructor(){this._store=new pe}dispose(){this._store.dispose()}_register(i){return this._store.add(i)}};g.None=Object.freeze({dispose(){}});var B=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(i){this._isDisposed||i===this._value||(this._value?.dispose(),this._value=i)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};var Ie=class{constructor(){this._token=-1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(i,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,i()},e)}setIfNotSet(i,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,i()},e))}},Ii=class{constructor(){this._isScheduled=!1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(i){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,i())}))}},Ci=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(i,e,t=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();let r=t.setInterval(()=>{i()},e);this._disposable={dispose:()=>{t.clearInterval(r),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}};function se(n){let i=n;if(i?.ownerDocument?.defaultView)return i.ownerDocument.defaultView;let e=n;return e?.view?e.view:window}var Ur=class{constructor(i,e,t,r){this._node=i,this._type=e,this._handler=t,this._options=r,i.addEventListener(e,t,r)}dispose(){!this._node||!this._handler||(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}};function C(n,i,e,t){return new Ur(n,i,e,t)}function Kr(n,i,e,t){return C(n,i,e,t)}var le={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};function Gs(n){let i=n.getBoundingClientRect(),e=se(n);return{left:i.left+e.scrollX,top:i.top+e.scrollY,width:i.width,height:i.height}}var Ei=class{constructor(i,e){this._runner=i;this.priority=e;this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(i){console.error(i)}}static sort(i,e){return e.priority-i.priority}},zs=new Map;function Vs(n){let i=zs.get(n);return i||(i={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},zs.set(n,i)),i}function Fn(n){let i=Vs(n);for(i.animFrameRequested=!1,i.current=i.next,i.next=[],i.inAnimationFrameRunner=!0;i.current.length>0;)i.current.sort(Ei.sort),i.current.shift().execute();i.inAnimationFrameRunner=!1}function tt(n,i,e=0){let t=Vs(n),r=new Ei(i,e);return t.next.push(r),t.animFrameRequested||(t.animFrameRequested=!0,n.requestAnimationFrame(()=>Fn(n))),r}var yi=class extends Ci{constructor(i){super(),this._defaultTarget=i?se(i):void 0}cancelAndSet(i,e,t){super.cancelAndSet(i,e,t??this._defaultTarget??window)}};var we=class{constructor(i){this.domNode=i;this._width="";this._height="";this._top="";this._left="";this._bottom="";this._right="";this._className="";this._position="";this._layerHint=!1;this._contain="none"}setWidth(i){let e=rt(i);this._width!==e&&(this._width=e,this.domNode.style.width=this._width)}setHeight(i){let e=rt(i);this._height!==e&&(this._height=e,this.domNode.style.height=this._height)}setTop(i){let e=rt(i);this._top!==e&&(this._top=e,this.domNode.style.top=this._top)}setLeft(i){let e=rt(i);this._left!==e&&(this._left=e,this.domNode.style.left=this._left)}setBottom(i){let e=rt(i);this._bottom!==e&&(this._bottom=e,this.domNode.style.bottom=this._bottom)}setRight(i){let e=rt(i);this._right!==e&&(this._right=e,this.domNode.style.right=this._right)}setClassName(i){this._className!==i&&(this._className=i,this.domNode.className=this._className)}toggleClassName(i,e){this.domNode.classList.toggle(i,e),this._className=this.domNode.className}setPosition(i){this._position!==i&&(this._position=i,this.domNode.style.position=this._position)}setLayerHinting(i){this._layerHint!==i&&(this._layerHint=i,i?this.domNode.style.transform="translate3d(0px, 0px, 0px)":this.domNode.style.transform="")}setContain(i){this._contain!==i&&(this._contain=i,this.domNode.style.contain=this._contain)}setAttribute(i,e){this.domNode.setAttribute(i,e)}};function rt(n){return typeof n=="number"?`${n}px`:n}var Ke={};An(Ke,{getSafariVersion:()=>Wn,getZoomFactor:()=>Vr,isChrome:()=>Kt,isChromeOS:()=>$r,isFirefox:()=>nt,isLegacyEdge:()=>Hn,isLinux:()=>zt,isMac:()=>ie,isNode:()=>zr,isSafari:()=>xi,isWindows:()=>Ue});var zr=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),st=zr?"node":navigator.userAgent,Gr=zr?"node":navigator.platform,nt=st.includes("Firefox"),Kt=st.includes("Chrome"),Hn=st.includes("Edge"),xi=/^((?!chrome|android).)*safari/i.test(st);function Vr(n){return 1}function Wn(){if(!xi)return 0;let n=st.match(/Version\/(\d+)/);return n===null||n.length<2?0:parseInt(n[1],10)}var ie=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(Gr),Ue=["Windows","Win16","Win32","WinCE"].includes(Gr),zt=Gr.indexOf("Linux")>=0,$r=/\bCrOS\b/.test(st);var $s=new WeakMap;function Un(n){if(!n.parent||n.parent===n)return null;try{let i=n.location,e=n.parent.location;if(i.origin!=="null"&&e.origin!=="null"&&i.origin!==e.origin)return null}catch{return null}return n.parent}var qr=class{static _getSameOriginWindowChain(i){let e=$s.get(i);if(!e){e=[],$s.set(i,e);let t=i,r;do r=Un(t),r?e.push({window:new WeakRef(t),iframeElement:t.frameElement??null}):e.push({window:new WeakRef(t),iframeElement:null}),t=r;while(t)}return e.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(i,e){if(!e||i===e)return{top:0,left:0};let t=0,r=0,s=this._getSameOriginWindowChain(i);for(let o of s){let a=o.window.deref();if(t+=a?.scrollY??0,r+=a?.scrollX??0,a===e||!o.iframeElement)break;let l=o.iframeElement.getBoundingClientRect();t+=l.top,r+=l.left}return{top:t,left:r}}},ot=class{constructor(i,e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=e.button===0,this.middleButton=e.button===1,this.rightButton=e.button===2,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail??1,e.type==="dblclick"&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,typeof e.pageX=="number"?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=e.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);let t=qr.getPositionOfChildWindowRelativeToAncestorWindow(i,e.view);this.posx-=t.left,this.posy-=t.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}},Gt=class{constructor(i,e=0,t=0){this.browserEvent=i??null,this.target=i?i.target??i.targetNode??i.srcElement??null:null,this.deltaY=t,this.deltaX=e;let r=!1;if(Kt){let s=navigator.userAgent.match(/Chrome\/(\d+)/);r=(s?parseInt(s[1],10):123)<=122}if(i){let s=i,o=i,a=i.view?.devicePixelRatio??1;if(typeof s.wheelDeltaY<"u")r?this.deltaY=s.wheelDeltaY/(120*a):this.deltaY=s.wheelDeltaY/120;else if(typeof o.VERTICAL_AXIS<"u"&&o.axis===o.VERTICAL_AXIS)this.deltaY=-o.detail/3;else if(i.type==="wheel"){let l=i;l.deltaMode===l.DOM_DELTA_LINE?nt&&!ie?this.deltaY=-i.deltaY/3:this.deltaY=-i.deltaY:this.deltaY=-i.deltaY/40}if(typeof s.wheelDeltaX<"u")xi&&Ue?this.deltaX=-(s.wheelDeltaX/120):r?this.deltaX=s.wheelDeltaX/(120*a):this.deltaX=s.wheelDeltaX/120;else if(typeof o.HORIZONTAL_AXIS<"u"&&o.axis===o.HORIZONTAL_AXIS)this.deltaX=-i.detail/3;else if(i.type==="wheel"){let l=i;l.deltaMode===l.DOM_DELTA_LINE?nt&&!ie?this.deltaX=-i.deltaX/3:this.deltaX=-i.deltaX:this.deltaX=-i.deltaX/40}this.deltaY===0&&this.deltaX===0&&i.wheelDelta&&(r?this.deltaY=i.wheelDelta/(120*a):this.deltaY=i.wheelDelta/120)}}preventDefault(){this.browserEvent?.preventDefault()}stopPropagation(){this.browserEvent?.stopPropagation()}};var at=class{constructor(){this._hooks=new pe;this._pointerMoveCallback=null;this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(i){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;let e=this._onStopCallback;this._onStopCallback=null,i&&e&&e()}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(i,e,t,r,s){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=r,this._onStopCallback=s;let o=i;try{i.setPointerCapture(e),this._hooks.add(E(()=>{try{i.releasePointerCapture(e)}catch{}}))}catch{o=se(i)}this._hooks.add(C(o,le.POINTER_MOVE,a=>{if(a.buttons!==t){this.stopMonitoring(!0);return}a.preventDefault(),this._pointerMoveCallback(a)})),this._hooks.add(C(o,le.POINTER_UP,a=>this.stopMonitoring(!0)))}};var Ne=class extends g{_onclick(i,e){this._register(C(i,le.CLICK,t=>e(new ot(se(i),t))))}_onmouseover(i,e){this._register(C(i,le.MOUSE_OVER,t=>e(new ot(se(i),t))))}_onmouseleave(i,e){this._register(C(i,le.MOUSE_LEAVE,t=>e(new ot(se(i),t))))}};var wi=class extends Ne{constructor(i){super(),this._handleActivate=i.handleActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="xterm-arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=i.bgWidth+"px",this.bgDomNode.style.height=i.bgHeight+"px",typeof i.top<"u"&&(this.bgDomNode.style.top="0px"),typeof i.left<"u"&&(this.bgDomNode.style.left="0px"),typeof i.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof i.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=i.className,this.domNode.style.position="absolute";let e=Math.min(i.bgWidth,i.bgHeight);this.domNode.style.width=e+"px",this.domNode.style.height=e+"px",typeof i.top<"u"&&(this.domNode.style.top=i.top+"px"),typeof i.left<"u"&&(this.domNode.style.left=i.left+"px"),typeof i.bottom<"u"&&(this.domNode.style.bottom=i.bottom+"px"),typeof i.right<"u"&&(this.domNode.style.right=i.right+"px"),this._pointerMoveMonitor=this._register(new at),this._register(Kr(this.bgDomNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._register(Kr(this.domNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._pointerdownRepeatTimer=this._register(new yi),this._pointerdownScheduleRepeatTimer=this._register(new Ie)}_arrowPointerDown(i){if(!i.target||!(i.target instanceof Element))return;let e=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,se(i))};this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(e,200),this._pointerMoveMonitor.startMonitoring(i.target,i.pointerId,i.buttons,t=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),i.preventDefault()}};var b=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(i,e,t)=>{if(this._disposed)return E(()=>{});let r={fn:i,thisArgs:e};this._listeners=this._listeners.slice(),this._listeners.push(r);let s=E(()=>{let o=this._listeners.indexOf(r);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return t&&(Array.isArray(t)?t.push(s):t.add(s)),s},this._event)}fire(i){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,i);return}let e=this._listeners;for(let t=0,r=e.length;t{function n(s,o){return s(a=>o.fire(a))}r.forward=n;function i(s,o){return(a,l,h)=>s(d=>a.call(l,o(d)),void 0,h)}r.map=i;function e(...s){return(o,a,l)=>{let h=new pe;for(let d of s)h.add(d(c=>o.call(a,c)));return l&&(Array.isArray(l)?l.push(h):l.add(h)),h}}r.any=e;function t(s,o,a){return o(a),s(l=>o(l))}r.runAndSubscribe=t})(j||={});var Yr=class n{constructor(i,e,t,r,s,o,a){this._forceIntegerValues=i;this._scrollStateBrand=void 0;this._forceIntegerValues&&(e=e|0,t=t|0,r=r|0,s=s|0,o=o|0,a=a|0),this.rawScrollLeft=r,this.rawScrollTop=a,e<0&&(e=0),r+e>t&&(r=t-e),r<0&&(r=0),s<0&&(s=0),a+s>o&&(a=o-s),a<0&&(a=0),this.width=e,this.scrollWidth=t,this.scrollLeft=r,this.height=s,this.scrollHeight=o,this.scrollTop=a}equals(i){return this.rawScrollLeft===i.rawScrollLeft&&this.rawScrollTop===i.rawScrollTop&&this.width===i.width&&this.scrollWidth===i.scrollWidth&&this.scrollLeft===i.scrollLeft&&this.height===i.height&&this.scrollHeight===i.scrollHeight&&this.scrollTop===i.scrollTop}withScrollDimensions(i,e){return new n(this._forceIntegerValues,typeof i.width<"u"?i.width:this.width,typeof i.scrollWidth<"u"?i.scrollWidth:this.scrollWidth,e?this.rawScrollLeft:this.scrollLeft,typeof i.height<"u"?i.height:this.height,typeof i.scrollHeight<"u"?i.scrollHeight:this.scrollHeight,e?this.rawScrollTop:this.scrollTop)}withScrollPosition(i){return new n(this._forceIntegerValues,this.width,this.scrollWidth,typeof i.scrollLeft<"u"?i.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof i.scrollTop<"u"?i.scrollTop:this.rawScrollTop)}createScrollEvent(i,e){let t=this.width!==i.width,r=this.scrollWidth!==i.scrollWidth,s=this.scrollLeft!==i.scrollLeft,o=this.height!==i.height,a=this.scrollHeight!==i.scrollHeight,l=this.scrollTop!==i.scrollTop;return{inSmoothScrolling:e,oldWidth:i.width,oldScrollWidth:i.scrollWidth,oldScrollLeft:i.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:i.height,oldScrollHeight:i.scrollHeight,oldScrollTop:i.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:t,scrollWidthChanged:r,scrollLeftChanged:s,heightChanged:o,scrollHeightChanged:a,scrollTopChanged:l}}},lt=class extends g{constructor(e){super();this._scrollableBrand=void 0;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new Yr(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){let r=this._state.withScrollDimensions(e,t);this._setState(r,!!this._smoothScrolling),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){let t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(this._smoothScrollDuration===0){this.setScrollPositionNow(e);return}if(this._smoothScrolling){e={scrollLeft:typeof e.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:typeof e.scrollTop>"u"?this._smoothScrolling.to.scrollTop:e.scrollTop};let r=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===r.scrollLeft&&this._smoothScrolling.to.scrollTop===r.scrollTop)return;let s;t?s=new Vt(this._smoothScrolling.from,r,this._smoothScrolling.startTime,this._smoothScrolling.duration):s=Vt.start(this._state,r,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{let r=this._state.withScrollPosition(e);this._smoothScrolling=Vt.start(this._state,r,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;let e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);if(this._setState(t,!0),!!this._smoothScrolling){if(e.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(e,t){let r=this._state;r.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(r,t)))}},Ti=class{constructor(i,e,t){this.scrollLeft=i,this.scrollTop=e,this.isDone=t}};function Xr(n,i){let e=i-n;return function(t){return n+e*Gn(t)}}function Kn(n,i,e){return function(t){return t2.5*t){let s,o;return i{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(i){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(i?" xterm-fade":"")))}};var Vn=140,ct=class extends Ne{constructor(i){super(),this._lazyRender=i.lazyRender,this._host=i.host,this._scrollable=i.scrollable,this._scrollByPage=i.scrollByPage,this._scrollbarState=i.scrollbarState,this._visibilityController=this._register(new Di(i.visibility,"xterm-visible xterm-scrollbar "+i.extraScrollbarClassName,"xterm-invisible xterm-scrollbar "+i.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new at),this._shouldRender=!0,this.domNode=new we(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(C(this.domNode.domNode,le.POINTER_DOWN,e=>this._domNodePointerDown(e)))}_createArrow(i){let e=this._register(new wi(i));return this.domNode.domNode.appendChild(e.bgDomNode),this.domNode.domNode.appendChild(e.domNode),e}_createSlider(i,e,t,r){this.slider=new we(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(i),this.slider.setLeft(e),typeof t=="number"&&this.slider.setWidth(t),typeof r=="number"&&this.slider.setHeight(r),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(C(this.slider.domNode,le.POINTER_DOWN,s=>{s.button===0&&(s.preventDefault(),this._sliderPointerDown(s))})),this._onclick(this.slider.domNode,s=>{s.leftButton&&s.stopPropagation()})}_handleElementSize(i){return this._scrollbarState.setVisibleSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(i){return this._scrollbarState.setScrollSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(i){return this._scrollbarState.setScrollPosition(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(i){i.target===this.domNode.domNode&&this._handlePointerDown(i)}delegatePointerDown(i){let e=this.domNode.domNode.getClientRects()[0].top,t=e+this._scrollbarState.getSliderPosition(),r=e+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),s=this._sliderPointerPosition(i);t<=s&&s<=r?i.button===0&&(i.preventDefault(),this._sliderPointerDown(i)):this._handlePointerDown(i)}_handlePointerDown(i){let e,t;if(i.target===this.domNode.domNode&&typeof i.offsetX=="number"&&typeof i.offsetY=="number")e=i.offsetX,t=i.offsetY;else{let s=Gs(this.domNode.domNode);e=i.pageX-s.left,t=i.pageY-s.top}let r=this._pointerDownRelativePosition(e,t);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(r):this._scrollbarState.getDesiredScrollPositionFromOffset(r)),i.button===0&&(i.preventDefault(),this._sliderPointerDown(i))}_sliderPointerDown(i){if(!i.target||!(i.target instanceof Element))return;let e=this._sliderPointerPosition(i),t=this._sliderOrthogonalPointerPosition(i),r=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(i.target,i.pointerId,i.buttons,s=>{let o=this._sliderOrthogonalPointerPosition(s),a=Math.abs(o-t);if(Ue&&a>Vn){this._setDesiredScrollPositionNow(r.getScrollPosition());return}let h=this._sliderPointerPosition(s)-e;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(i){let e={};this.writeScrollPosition(e,i),this._scrollable.setScrollPositionNow(e)}updateScrollbarSize(i){this._updateScrollbarSize(i),this._scrollbarState.setScrollbarSize(i),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}};var ht=class n{constructor(i,e,t,r,s,o){this._scrollbarSize=Math.round(e),this._oppositeScrollbarSize=Math.round(t),this._arrowSize=Math.round(i),this._visibleSize=r,this._scrollSize=s,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new n(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(i){let e=Math.round(i);return this._visibleSize!==e?(this._visibleSize=e,this._refreshComputedValues(),!0):!1}setScrollSize(i){let e=Math.round(i);return this._scrollSize!==e?(this._scrollSize=e,this._refreshComputedValues(),!0):!1}setScrollPosition(i){let e=Math.round(i);return this._scrollPosition!==e?(this._scrollPosition=e,this._refreshComputedValues(),!0):!1}setScrollbarSize(i){this._scrollbarSize=Math.round(i)}setArrowSize(i){let e=Math.round(i);this._arrowSize!==e&&(this._arrowSize=e,this._refreshComputedValues())}setOppositeScrollbarSize(i){this._oppositeScrollbarSize=Math.round(i)}static _computeValues(i,e,t,r,s){let o=Math.max(0,t-i),a=Math.max(0,o-2*e),l=r>0&&r>t;if(!l)return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};let h=Math.round(Math.max(20,Math.floor(t*a/r))),d=(a-h)/(r-t),c=s*d;return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(h),computedSliderRatio:d,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){let i=n._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=i.computedAvailableSize,this._computedIsNeeded=i.computedIsNeeded,this._computedSliderSize=i.computedSliderSize,this._computedSliderRatio=i.computedSliderRatio,this._computedSliderPosition=i.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(i){if(!this._computedIsNeeded)return 0;let e=i-this._arrowSize-this._computedSliderSize/2;return Math.round(e/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(i){if(!this._computedIsNeeded)return 0;let e=i-this._arrowSize,t=this._scrollPosition;return ethis._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:0,left:0,bgWidth:t,bgHeight:t,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})),this._updateArrowSize(this._arrowUp,t),this._updateArrowSize(this._arrowDown,t),!this._arrowUp||!this._arrowDown)return;let r=e?"":"none";this._arrowUp.bgDomNode.style.display=r,this._arrowUp.domNode.style.display=r,this._arrowDown.bgDomNode.style.display=r,this._arrowDown.domNode.style.display=r}_updateArrowSize(e,t){e&&(e.bgDomNode.style.width=`${t}px`,e.bgDomNode.style.height=`${t}px`,e.domNode.style.width=`${t}px`,e.domNode.style.height=`${t}px`)}updateOptions(e){let t=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(t),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}};var jr=class{constructor(i,e,t){this.timestamp=i,this.deltaX=e,this.deltaY=t,this.score=0}},Mi=class Mi{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let i=1,e=0,t=1,r=this._rear;for(;r!==-1;){let s=r===this._front?i:Math.pow(2,-t);if(i-=s,e+=this._memory[r].score*s,r===this._front)break;r=(this._capacity+r-1)%this._capacity,t++}return e<=.5}acceptStandardWheelEvent(i){if(Kt){let e=se(i.browserEvent),t=Vr(e);this.accept(Date.now(),i.deltaX*t,i.deltaY*t)}else this.accept(Date.now(),i.deltaX,i.deltaY)}accept(i,e,t){let r=null,s=new jr(i,e,t);this._front===-1&&this._rear===-1?(this._memory[0]=s,this._front=0,this._rear=0):(r=this._memory[this._rear],this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=s),s.score=this._computeScore(s,r)}_computeScore(i,e){if(Math.abs(i.deltaX)>0&&Math.abs(i.deltaY)>0)return 1;let t=.5;if((!this._isAlmostInt(i.deltaX)||!this._isAlmostInt(i.deltaY))&&(t+=.25),e){let r=Math.abs(i.deltaX),s=Math.abs(i.deltaY),o=Math.abs(e.deltaX),a=Math.abs(e.deltaY),l=Math.max(Math.min(r,o),1),h=Math.max(Math.min(s,a),1),d=Math.max(r,o),c=Math.max(s,a);d%l===0&&c%h===0&&(t-=.5)}return Math.min(Math.max(t,0),1)}_isAlmostInt(i){return Math.abs(Math.round(i)-i)<.01}};Mi.INSTANCE=new Mi;var Zr=Mi,ki=class extends Ne{constructor(e,t,r){super();this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;t=t??{};let s,o=!r;r?s=r:(t.mouseWheelSmoothScroll=!1,s=new lt({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:l=>tt(se(e),l)})),this._options=$n(t),this._scrollable=s,this._register(this._scrollable.onScroll(l=>{this._handleScroll(l),this._onScroll.fire(l)})),o&&this._register(this._scrollable);let a={handleMouseWheel:l=>this._handleMouseWheel(l),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new Ai(this._scrollable,this._options,a)),this._horizontalScrollbar=this._register(new Li(this._scrollable,this._options,a)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new we(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new we(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new we(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,l=>this._handleMouseOver(l)),this._onmouseleave(this._listenOnDomNode,l=>this._handleMouseLeave(l)),this._hideTimeout=this._register(new Ie),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}get options(){return this._options}dispose(){this._mouseWheelToDispose=Oe(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,ie&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){typeof e.handleMouseWheel<"u"&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof e.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),typeof e.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),typeof e.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),typeof e.horizontal<"u"&&(this._options.horizontal=e.horizontal),typeof e.vertical<"u"&&(this._options.vertical=e.vertical),typeof e.horizontalHasArrows<"u"&&(this._options.horizontalHasArrows=e.horizontalHasArrows),typeof e.verticalHasArrows<"u"&&(this._options.verticalHasArrows=e.verticalHasArrows),typeof e.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),typeof e.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),typeof e.scrollByPage<"u"&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new Gt(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=Oe(this._mouseWheelToDispose),e)){let r=s=>{this._handleMouseWheel(new Gt(s))};this._mouseWheelToDispose.push(C(this._listenOnDomNode,le.MOUSE_WHEEL,r,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;let t=Zr.INSTANCE;t.acceptStandardWheelEvent(e);let r=!1;if(e.deltaY||e.deltaX){let o=e.deltaY*this._options.mouseWheelScrollSensitivity,a=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&a+o===0?a=o=0:Math.abs(o)>=Math.abs(a)?a=0:o=0),this._options.flipAxes&&([o,a]=[a,o]);let l=!ie&&e.browserEvent&&e.browserEvent.shiftKey;(this._options.scrollYToX||l)&&!a&&(a=o,o=0),e.browserEvent&&e.browserEvent.altKey&&(a=a*this._options.fastScrollSensitivity,o=o*this._options.fastScrollSensitivity);let h=this._scrollable.getFutureScrollPosition(),d={};if(o){let c=50*o,u=h.scrollTop-(c<0?Math.floor(c):Math.ceil(c));this._verticalScrollbar.writeScrollPosition(d,u)}if(a){let c=50*a,u=h.scrollLeft-(c<0?Math.floor(c):Math.ceil(c));this._horizontalScrollbar.writeScrollPosition(d,u)}d=this._scrollable.validateScrollPosition(d),(h.scrollLeft!==d.scrollLeft||h.scrollTop!==d.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(d):this._scrollable.setScrollPositionNow(d),r=!0)}let s=r;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){let e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,r=e.scrollLeft>0,s=r?" xterm-shadow-left":"",o=t?" xterm-shadow-top":"",a=r||t?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${o}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${a}${o}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),500)}};function $n(n){let i={lazyRender:typeof n.lazyRender<"u"?n.lazyRender:!1,className:typeof n.className<"u"?n.className:"",useShadows:typeof n.useShadows<"u"?n.useShadows:!0,handleMouseWheel:typeof n.handleMouseWheel<"u"?n.handleMouseWheel:!0,flipAxes:typeof n.flipAxes<"u"?n.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof n.consumeMouseWheelIfScrollbarIsNeeded<"u"?n.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof n.alwaysConsumeMouseWheel<"u"?n.alwaysConsumeMouseWheel:!1,scrollYToX:typeof n.scrollYToX<"u"?n.scrollYToX:!1,mouseWheelScrollSensitivity:typeof n.mouseWheelScrollSensitivity<"u"?n.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof n.fastScrollSensitivity<"u"?n.fastScrollSensitivity:5,scrollPredominantAxis:typeof n.scrollPredominantAxis<"u"?n.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof n.mouseWheelSmoothScroll<"u"?n.mouseWheelSmoothScroll:!0,listenOnDomNode:typeof n.listenOnDomNode<"u"?n.listenOnDomNode:null,horizontal:typeof n.horizontal<"u"?n.horizontal:1,horizontalScrollbarSize:typeof n.horizontalScrollbarSize<"u"?n.horizontalScrollbarSize:10,horizontalSliderSize:typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:0,horizontalHasArrows:typeof n.horizontalHasArrows<"u"?n.horizontalHasArrows:!1,vertical:typeof n.vertical<"u"?n.vertical:1,verticalScrollbarSize:typeof n.verticalScrollbarSize<"u"?n.verticalScrollbarSize:10,verticalHasArrows:typeof n.verticalHasArrows<"u"?n.verticalHasArrows:!1,verticalSliderSize:typeof n.verticalSliderSize<"u"?n.verticalSliderSize:0,scrollByPage:typeof n.scrollByPage<"u"?n.scrollByPage:!1};return i.horizontalSliderSize=typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:i.horizontalScrollbarSize,i.verticalSliderSize=typeof n.verticalSliderSize<"u"?n.verticalSliderSize:i.verticalScrollbarSize,ie&&(i.className+=" xterm-mac"),i}var dt=class extends g{constructor(e,t,r,s,o,a,l,h,d){super();this._bufferService=r;this._coreService=o;this._optionsService=h;this._renderService=d;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._isSyncing=!1;this._isHandlingScroll=!1;this._suppressOnScrollHandler=!1;this._needsSyncOnRender=!1;let c=this._register(new lt({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:u=>tt(s.window,u)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{c.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new ki(t,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},c)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(a.onProtocolChange(u=>{this._scrollableElement.updateOptions({handleMouseWheel:!(u&16)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(j.runAndSubscribe(l.onChangeColors,()=>{e.style.backgroundColor=l.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=l.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register(E(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),t.appendChild(this._styleElement),this._register(E(()=>this._styleElement.remove())),this._register(j.runAndSubscribe(l.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${l.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${l.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${l.colors.scrollbarSliderActiveBackground.css};`,"}"].join(` +-`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(u=>this._handleScroll(u)))}scrollLines(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:t.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,t){t&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!t,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){let e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,t=this._optionsService.rawOptions.scrollbar?.showArrows??!1,r=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:r,verticalHasArrows:t}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){if(!(!this._renderService||this._isSyncing)){if(this._coreService.decPrivateModes.synchronizedOutput){this._needsSyncOnRender=!0;return}this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1}}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let t=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),r=t-this._bufferService.buffer.ydisp;r!==0&&(this._latestYDisp=t,this._onRequestScrollLines.fire(r)),this._isHandlingScroll=!1}handleTouchScroll(e){let t=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:t.scrollTop-e})}};dt=y([m(2,D),m(3,G),m(4,Y),m(5,Me),m(6,_e),m(7,R),m(8,V)],dt);var ut=class extends g{constructor(e,t,r,s,o){super();this._screenElement=e;this._bufferService=t;this._coreBrowserService=r;this._decorationService=s;this._renderService=o;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(a=>this._removeDecoration(a))),this._register(E(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){let t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer",e?.options?.layer==="top"),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`;let r=e.options.x??0;return r&&r>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){let 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 r=this._decorationElements.get(e);r||(r=this._createElement(e),e.element=r,this._decorationElements.set(e,r),this._container.appendChild(r),e.onDispose(()=>{this._decorationElements.delete(e),r.remove()})),r.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(r.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,r.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,r.style.top=`${t*this._renderService.dimensions.css.cell.height}px`,r.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),e.onRenderEmitter.fire(r)}}_refreshXPosition(e,t=e.element){if(!t)return;let r=e.options.x??0;(e.options.anchor||"left")==="right"?t.style.right=r?`${r*this._renderService.dimensions.css.cell.width}px`:"":t.style.left=r?`${r*this._renderService.dimensions.css.cell.width}px`:""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};ut=y([m(1,D),m(2,G),m(3,ge),m(4,V)],ut);var Pi=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(i){if(i.options.overviewRulerOptions){for(let e of this._zones)if(e.color===i.options.overviewRulerOptions.color&&e.position===i.options.overviewRulerOptions.position){if(this._lineIntersectsZone(e,i.marker.line))return;if(this._lineAdjacentToZone(e,i.marker.line,i.options.overviewRulerOptions.position)){this._addLineToZone(e,i.marker.line);return}}if(this._zonePoolIndex=i.startBufferLine&&e<=i.endBufferLine}_lineAdjacentToZone(i,e,t){return e>=i.startBufferLine-this._linePadding[t||"full"]&&e<=i.endBufferLine+this._linePadding[t||"full"]}_addLineToZone(i,e){i.startBufferLine=Math.min(i.startBufferLine,e),i.endBufferLine=Math.max(i.endBufferLine,e)}};var Ce={full:0,left:0,center:0,right:0},Fe={full:0,left:0,center:0,right:0},$t={full:0,left:0,center:0,right:0},ze=class extends g{constructor(e,t,r,s,o,a,l,h){super();this._viewportElement=e;this._screenElement=t;this._bufferService=r;this._decorationService=s;this._renderService=o;this._optionsService=a;this._themeService=l;this._coreBrowserService=h;this._colorZoneStore=new Pi;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),this._register(E(()=>this._canvas?.remove()));let d=this._canvas.getContext("2d");if(d)this._ctx=d;else throw new Error("Ctx cannot be null");this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register(E(()=>{this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}get _width(){let e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??!0?e?.width??0:0}_refreshDrawConstants(){let e=Math.floor((this._canvas.width-1)/3),t=Math.ceil((this._canvas.width-1)/3);Fe.full=this._canvas.width,Fe.left=e,Fe.center=t,Fe.right=e,this._refreshDrawHeightConstants(),$t.full=1,$t.left=1,$t.center=1+Fe.left,$t.right=1+Fe.left+Fe.center}_refreshDrawHeightConstants(){Ce.full=Math.round(2*this._coreBrowserService.dpr);let e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);Ce.left=t,Ce.center=t,Ce.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ce.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;let e=this._renderService.dimensions.css.canvas.height,t=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=t,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(let t of this._decorationService.decorations)this._colorZoneStore.addDecoration(t);this._ctx.lineWidth=1,this._renderRulerOutline();let e=this._colorZoneStore.zones;for(let t of e)t.position!=="full"&&this._renderColorZone(t);for(let t of e)t.position==="full"&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect($t[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-Ce[e.position||"full"]/2),Fe[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+Ce[e.position||"full"]))}_queueRefresh(e,t){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};ze=y([m(2,D),m(3,ge),m(4,V),m(5,R),m(6,_e),m(7,G)],ze);var ft=class{constructor(i,e,t,r,s,o){this._textarea=i;this._compositionView=e;this._bufferService=t;this._optionsService=r;this._coreService=s;this._renderService=o;this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._compositionSuffix="",this._dataAlreadySent=""}get isComposing(){return this._isComposing}compositionstart(){this._isComposing=!0;let i=this._textarea.selectionStart??this._textarea.value.length,e=this._textarea.selectionEnd??i;this._compositionPosition.start=Math.min(i,e),this._compositionPosition.end=Math.max(i,e),this._compositionSuffix=this._textarea.value.substring(this._compositionPosition.end),this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(i){this._compositionView.textContent=`\u200E${i.data}\u200E`,this.updateCompositionElements(),setTimeout(()=>{let e=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,e)},0)}compositionend(){this._finalizeComposition(!0)}keydown(i){if(this._isComposing||this._isSendingComposition){if(i.keyCode===20||i.keyCode===229||i.keyCode===16||i.keyCode===17||i.keyCode===18)return!1;this._finalizeComposition(!1)}return i.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}_finalizeComposition(i){if(this._compositionView.classList.remove("active"),this._isComposing=!1,i){let e={start:this._compositionPosition.start,end:this._compositionPosition.end},t=this._compositionSuffix;this._isSendingComposition=!0,setTimeout(()=>{if(this._isSendingComposition){this._isSendingComposition=!1;let r;if(e.start+=this._dataAlreadySent.length,this._isComposing)r=this._textarea.value.substring(e.start,this._compositionPosition.start);else{let s=this._textarea.value,o=t.length>0&&s.endsWith(t)?s.length-t.length:s.length;r=s.substring(e.start,Math.max(e.start,o))}r.length>0&&this._coreService.triggerDataEvent(r,!0)}},0)}else{this._isSendingComposition=!1;let e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;let i=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){let e=this._textarea.value,t=e.replace(i,"");this._dataAlreadySent=t,e.length>i.length?this._coreService.triggerDataEvent(t,!0):e.lengththis.updateCompositionElements(!0),0)}}};ft=y([m(2,D),m(3,R),m(4,Y),m(5,V)],ft);var J=0,Q=0,ee=0,W=0,Jr={css:"#00000000",rgba:0},O;(t=>{function n(r,s,o,a){return a!==void 0?`#${Ve(r)}${Ve(s)}${Ve(o)}${Ve(a)}`:`#${Ve(r)}${Ve(s)}${Ve(o)}`}t.toCss=n;function i(r,s,o,a=255){return(r<<24|s<<16|o<<8|a)>>>0}t.toRgba=i;function e(r,s,o,a){return{css:t.toCss(r,s,o,a),rgba:t.toRgba(r,s,o,a)}}t.toColor=e})(O||={});var k;(a=>{function n(l,h){if(W=(h.rgba&255)/255,W===1)return{css:h.css,rgba:h.rgba};let d=h.rgba>>24&255,c=h.rgba>>16&255,u=h.rgba>>8&255,_=l.rgba>>24&255,p=l.rgba>>16&255,v=l.rgba>>8&255;J=_+Math.round((d-_)*W),Q=p+Math.round((c-p)*W),ee=v+Math.round((u-v)*W);let f=O.toCss(J,Q,ee),S=O.toRgba(J,Q,ee);return{css:f,rgba:S}}a.blend=n;function i(l){return(l.rgba&255)===255}a.isOpaque=i;function e(l,h,d){let c=Bi.ensureContrastRatio(l.rgba,h.rgba,d);if(c)return O.toColor(c>>24&255,c>>16&255,c>>8&255)}a.ensureContrastRatio=e;function t(l){let h=(l.rgba|255)>>>0;return[J,Q,ee]=Bi.toChannels(h),{css:O.toCss(J,Q,ee),rgba:h}}a.opaque=t;function r(l,h){return W=Math.round(h*255),[J,Q,ee]=Bi.toChannels(l.rgba),{css:O.toCss(J,Q,ee,W),rgba:O.toRgba(J,Q,ee,W)}}a.opacity=r;function s(l,h){return W=l.rgba&255,r(l,W*h/255)}a.multiplyOpacity=s;function o(l){return[l.rgba>>24&255,l.rgba>>16&255,l.rgba>>8&255]}a.toColorRGB=o})(k||={});var P;(t=>{let n,i;try{let r=document.createElement("canvas");r.width=1,r.height=1;let s=r.getContext("2d",{willReadFrequently:!0});s&&(n=s,n.globalCompositeOperation="copy",i=n.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),O.toColor(J,Q,ee);case 5:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),W=parseInt(r.slice(4,5).repeat(2),16),O.toColor(J,Q,ee,W);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let s=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return J=parseInt(s[1],10),Q=parseInt(s[2],10),ee=parseInt(s[3],10),W=Math.round((s[5]===void 0?1:parseFloat(s[5]))*255),O.toColor(J,Q,ee,W);if(r==="transparent")return{css:"transparent",rgba:0};if(!n||!i)throw new Error("css.toColor: Unsupported css format");if(n.fillStyle=i,n.fillStyle=r,typeof n.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(n.fillRect(0,0,1,1),[J,Q,ee,W]=n.getImageData(0,0,1,1).data,W!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:O.toRgba(J,Q,ee,W),css:r}}t.toColor=e})(P||={});var Z;(e=>{function n(t){return i(t>>16&255,t>>8&255,t&255)}e.relativeLuminance=n;function i(t,r,s){let o=t/255,a=r/255,l=s/255,h=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),d=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),c=l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4);return h*.2126+d*.7152+c*.0722}e.relativeLuminance2=i})(Z||={});var Bi;(s=>{function n(o,a){if(W=(a&255)/255,W===1)return a;let l=a>>24&255,h=a>>16&255,d=a>>8&255,c=o>>24&255,u=o>>16&255,_=o>>8&255;return J=c+Math.round((l-c)*W),Q=u+Math.round((h-u)*W),ee=_+Math.round((d-_)*W),O.toRgba(J,Q,ee)}s.blend=n;function i(o,a,l){let h=Z.relativeLuminance(o>>8),d=Z.relativeLuminance(a>>8);if(Te(h,d)>8));if(v>8));return v>S?p:f}return p}let u=t(o,a,l),_=Te(h,Z.relativeLuminance(u>>8));if(_>8));return _>v?u:p}return u}}s.ensureContrastRatio=i;function e(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v0||_>0||p>0);)u-=Math.max(0,Math.ceil(u*.1)),_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));return(u<<24|_<<16|p<<8|255)>>>0}s.reduceLuminance=e;function t(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=Te(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v>>0}s.increaseLuminance=t;function r(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}s.toChannels=r})(Bi||={});function Ve(n){let i=n.toString(16);return i.length<2?"0"+i:i}function Te(n,i){return n1){let u=this._getJoinedRanges(r,l,a,e,o);for(let _=0;_1){let c=this._getJoinedRanges(r,l,a,e,o);for(let u=0;u=As,Tr=ae,x=this._workCell;if(v.length>0&&ae===v[0][0]&&je){let A=v.shift(),kr=this._isCellInSelection(A[0],e);for(T=A[0]+1;T=A[1],je?(ui=!0,x=new Oi(this._workCell,i.translateToString(!0,A[0],A[1]),A[1]-A[0]),Tr=A[1]-1,wr=x.getWidth()):As=A[1]}let Nt=this._isCellInSelection(ae,e),Dr=t&&ae===o,Rr=Rn&&ae>=c&&ae<=u;_&&x.isBlink()&&(_.hasBlinkingCells=!0),!l&&x.isBlink()&&N.push("xterm-blink-hidden");let Lr=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,A=>{Lr=!0});let fi=x.getChars()||" ";if(fi===" "&&(x.isUnderline()||x.isOverline())&&(fi="\xA0"),Ot=wr*h-d.get(fi,x.isBold(),x.isItalic()),!I)I=this._document.createElement("span");else if(w&&(Nt&&di||!Nt&&!di&&x.bg===te)&&(Nt&&di&&f.selectionForeground||x.fg===Ts)&&x.extended.ext===Ds&&Rr===Rs&&Ot===Ls&&!Dr&&!ui&&!Lr&&je){x.isInvisible()?L+=" ":L+=fi,w++;continue}else w&&(I.textContent=L),I=this._document.createElement("span"),w=0,L="";if(te=x.bg,Ts=x.fg,Ds=x.extended.ext,Rs=Rr,Ls=Ot,di=Nt,ui&&o>=ae&&o<=Tr&&(o=ae),!this._coreService.isCursorHidden&&Dr&&this._coreService.isCursorInitialized){if(N.push("xterm-cursor"),this._coreBrowserService.isFocused)a&&N.push("xterm-cursor-blink"),N.push(r==="bar"?"xterm-cursor-bar":r==="underline"?"xterm-cursor-underline":"xterm-cursor-block");else if(s)switch(s){case"outline":N.push("xterm-cursor-outline");break;case"block":N.push("xterm-cursor-block");break;case"bar":N.push("xterm-cursor-bar");break;case"underline":N.push("xterm-cursor-underline");break;default:break}}if(x.isBold()&&N.push("xterm-bold"),x.isItalic()&&N.push("xterm-italic"),x.isDim()&&N.push("xterm-dim"),x.isInvisible()?L=" ":L=x.getChars()||" ",x.isUnderline()&&(N.push(`xterm-underline-${x.extended.underlineStyle}`),L===" "&&(L="\xA0"),!x.isUnderlineColorDefault()))if(x.isUnderlineColorRGB())I.style.textDecorationColor=`rgb(${ue.toColorRGB(x.getUnderlineColor()).join(",")})`;else{let A=x.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&x.isBold()&&A<8&&(A+=8),I.style.textDecorationColor=f.ansi[A].css}x.isOverline()&&(N.push("xterm-overline"),L===" "&&(L="\xA0")),x.isStrikethrough()&&N.push("xterm-strikethrough"),Rr&&(I.style.textDecoration="underline");let de=x.getFgColor(),Ft=x.getFgColorMode(),Se=x.getBgColor(),Ht=x.getBgColorMode(),Ar=!!x.isInverse();if(Ar){let A=de;de=Se,Se=A;let kr=Ft;Ft=Ht,Ht=kr}let Le,_i,Wt=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,A=>{A.options.layer!=="top"&&Wt||(A.backgroundColorRGB&&(Ht=50331648,Se=A.backgroundColorRGB.rgba>>8&16777215,Le=A.backgroundColorRGB),A.foregroundColorRGB&&(Ft=50331648,de=A.foregroundColorRGB.rgba>>8&16777215,_i=A.foregroundColorRGB),Wt=A.options.layer==="top")}),!Wt&&Nt&&(Le=this._coreBrowserService.isFocused?f.selectionBackgroundOpaque:f.selectionInactiveBackgroundOpaque,Se=Le.rgba>>8&16777215,Ht=50331648,Wt=!0,f.selectionForeground&&(Ft=50331648,de=f.selectionForeground.rgba>>8&16777215,_i=f.selectionForeground)),Wt&&N.push("xterm-decoration-top");let Ae;switch(Ht){case 16777216:case 33554432:Ae=f.ansi[Se],N.push(`xterm-bg-${Se}`);break;case 50331648:Ae=O.toColor(Se>>16,Se>>8&255,Se&255),this._addStyle(I,`background-color:#${(Se>>>0).toString(16).padStart(6,"0")}`);break;case 0:default:Ar?(Ae=f.foreground,N.push(`xterm-bg-${257}`)):Ae=f.background}switch(Le||x.isDim()&&(Le=k.multiplyOpacity(Ae,.5)),Ft){case 16777216:case 33554432:x.isBold()&&de<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(de+=8),this._applyMinimumContrast(I,Ae,f.ansi[de],x,Le,void 0)||N.push(`xterm-fg-${de}`);break;case 50331648:let A=O.toColor(de>>16&255,de>>8&255,de&255);this._applyMinimumContrast(I,Ae,A,x,Le,_i)||this._addStyle(I,`color:#${de.toString(16).padStart(6,"0")}`);break;case 0:default:this._applyMinimumContrast(I,Ae,f.foreground,x,Le,_i)||Ar&&N.push(`xterm-fg-${257}`)}N.length&&(I.className=N.join(" "),N.length=0),!Dr&&!ui&&!Lr&&je?w++:I.textContent=L,Ot!==this.defaultSpacing&&(I.style.letterSpacing=`${Ot}px`),p.push(I),ae=Tr}return I&&w&&(I.textContent=L),p}_applyMinimumContrast(i,e,t,r,s,o){if(this._optionsService.rawOptions.minimumContrastRatio===1||Xs(r.getCode()))return!1;let a=this._getContrastCache(r),l;if(!s&&!o&&(l=a.getColor(e.rgba,t.rgba)),l===void 0){let h=this._optionsService.rawOptions.minimumContrastRatio/(r.isDim()?2:1);l=k.ensureContrastRatio(s??e,o??t,h),a.setColor((s??e).rgba,(o??t).rgba,l??null)}return l?(this._addStyle(i,`color:${l.css}`),!0):!1}_getContrastCache(i){return i.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(i,e){i.setAttribute("style",`${i.getAttribute("style")||""}${e};`)}_isCellInSelection(i,e){let t=this._selectionStart,r=this._selectionEnd;return!t||!r?!1:this._columnSelectMode?t[0]<=r[0]?i>=t[0]&&e>=t[1]&&i=t[1]&&i>=r[0]&&e<=r[1]:e>t[1]&&e=t[0]&&i=t[0]}};_t=y([m(1,Si),m(2,R),m(3,G),m(4,Y),m(5,ge),m(6,_e)],_t);var Fi=class{constructor(i=()=>new es){this._flat=new Float32Array(256);this._font="";this._fontSize=0;this._weight="normal";this._weightBold="bold";this._canvasElements=[];this._canvasElements=[i(),i(),i(),i()],this.clear()}dispose(){this._canvasElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(i,e,t,r){i===this._font&&e===this._fontSize&&t===this._weight&&r===this._weightBold||(this._font=i,this._fontSize=e,this._weight=t,this._weightBold=r,this._canvasElements[0].setFont(i,e,t,!1),this._canvasElements[1].setFont(i,e,r,!1),this._canvasElements[2].setFont(i,e,t,!0),this._canvasElements[3].setFont(i,e,r,!0),this.clear())}get(i,e,t){let r;if(!e&&!t&&i.length===1&&(r=i.charCodeAt(0))<256){if(this._flat[r]!==-9999)return this._flat[r];let a=this._measure(i,0);return a>0&&(this._flat[r]=a),a}let s=i;e&&(s+="B"),t&&(s+="I");let o=this._holey.get(s);if(o===void 0){let a=0;e&&(a|=1),t&&(a|=2),o=this._measure(i,a),o>0&&this._holey.set(s,o)}return o}_measure(i,e){return this._canvasElements[e].measure(i)}},es=class{constructor(){typeof OffscreenCanvas<"u"?(this._canvas=new OffscreenCanvas(1,1),this._ctx=Qr(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=Qr(this._canvas.getContext("2d")))}setFont(i,e,t,r){let s=r?"italic":"";this._ctx.font=`${s} ${t} ${e}px ${i}`.trim()}measure(i){return this._ctx.measureText(i).width}};var ts=class{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(i,e,t,r=!1){if(this.selectionStart=e,this.selectionEnd=t,!e||!t||e[0]===t[0]&&e[1]===t[1]){this.clear();return}let s=i.buffers.active.ydisp,o=e[1]-s,a=t[1]-s,l=Math.max(o,0),h=Math.min(a,i.rows-1);if(l>=i.rows||h<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=r,this.viewportStartRow=o,this.viewportEndRow=a,this.viewportCappedStartRow=l,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=t[0]}isCellSelected(i,e,t){return this.hasSelection?(t-=i.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&t>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&t<=this.viewportCappedEndRow:t>this.viewportStartRow&&t=this.startCol&&e=this.startCol):!1}};function js(){return new ts}var Hi=class extends g{constructor(e,t,r){super();this._renderCallback=e;this._coreBrowserService=t;this._optionsService=r;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",s=>{this.setIntervalDuration(s)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(E(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let t=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),t||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var Yn=1,mt=class extends g{constructor(e,t,r,s,o,a,l,h,d,c,u,_,p,v){super();this._terminal=e;this._document=t;this._element=r;this._screenElement=s;this._viewportElement=o;this._helperContainer=a;this._linkifier2=l;this._charSizeService=d;this._optionsService=c;this._bufferService=u;this._coreService=_;this._coreBrowserService=p;this._themeService=v;this._terminalClass=Yn++;this._rowElements=[];this._selectionRenderModel=js();this._lastSelectionColumnMode=!1;this._rowHasBlinkingCells=[];this._rowHasBlinkingCellsCount=0;this._onRequestRedraw=this._register(new b);this.onRequestRedraw=this._onRequestRedraw.event;this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=Ys(),this._updateDimensions(),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._themeService.onChangeColors(f=>this._injectCss(f))),this._injectCss(this._themeService.colors),this._rowFactory=h.createInstance(_t,document),this._element.classList.add("xterm-dom-renderer-owner-"+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this._register(this._linkifier2.onShowLinkUnderline(f=>this._handleLinkHover(f))),this._register(this._linkifier2.onHideLinkUnderline(f=>this._handleLinkLeave(f))),this._cursorBlinkStateManager=new is(this._rowContainer,this._coreBrowserService),this._register(C(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register(E(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new Hi(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register(E(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new Fi,this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){let 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(let r of this._rowElements)r.style.width=`${this.dimensions.css.canvas.width}px`,r.style.height=`${this.dimensions.css.cell.height}px`,r.style.lineHeight=`${this.dimensions.css.cell.height}px`,r.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));let t=`${this._terminalSelector} .xterm-rows 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} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;t+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,t+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${k.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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;let r=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,o=`blink_block_${this._terminalClass}`;t+=`@keyframes ${r} { 50% { border-bottom-style: hidden; }}`,t+=`@keyframes ${s} { 50% { box-shadow: none; }}`,t+=`@keyframes ${o} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${o} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(let[a,l]of e.ansi.entries())t+=`${this._terminalSelector} .xterm-fg-${a} { color: ${l.css}; }${this._terminalSelector} .xterm-fg-${a}.xterm-dim { color: ${k.multiplyOpacity(l,.5).css}; }${this._terminalSelector} .xterm-bg-${a} { background-color: ${l.css}; }`;t+=`${this._terminalSelector} .xterm-fg-${257} { color: ${k.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${257}.xterm-dim { color: ${k.multiplyOpacity(k.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${257} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){let 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 r=this._rowElements.length;r<=t;r++){let s=this._document.createElement("div");this._rowContainer.appendChild(s),this._rowElements.push(s),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,t,r){let s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,r);let o=0,a=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(o=this._selectionRenderModel.viewportCappedStartRow,a=this._selectionRenderModel.viewportCappedEndRow));let l=0,h=-1;if(!e||!t)return;if(this._selectionRenderModel.update(this._terminal,e,t,r),this._selectionRenderModel.hasSelection){let u=this._selectionRenderModel.viewportStartRow,_=this._selectionRenderModel.viewportEndRow,p=this._selectionRenderModel.viewportCappedStartRow,v=this._selectionRenderModel.viewportCappedEndRow;l=p,h=v;let f=this._document.createDocumentFragment();if(r){let S=e[0]>t[0];f.appendChild(this._createSelectionElement(p,S?t[0]:e[0],S?e[0]:t[0],v-p+1))}else{let S=u===p?e[0]:0,I=p===_?t[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(p,S,I));let w=v-p-1;if(f.appendChild(this._createSelectionElement(p+1,0,this._bufferService.cols,w)),p!==v){let L=_===v?t[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(v,0,L))}}this._selectionContainer.appendChild(f)}let d=Math.min(o,l),c=Math.max(a,h);if(c>=0){d=Math.max(d,0),c=Math.min(c,s-1);let _=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&_>=0&&_this.dimensions.css.canvas.width&&(l=this.dimensions.css.canvas.width-a),o.style.height=`${s*this.dimensions.css.cell.height}px`,o.style.top=`${e*this.dimensions.css.cell.height}px`,o.style.left=`${a}px`,o.style.width=`${l}px`,o}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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(let e of this._rowElements)e.replaceChildren();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,t){let r=this._bufferService.buffer,s=r.ybase+r.y,o=Math.min(r.x,this._bufferService.cols-1),a=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,l=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,h=this._optionsService.rawOptions.cursorInactiveStyle,d={hasBlinkingCells:!1};for(let c=e;c<=t;c++){let u=c+r.ydisp,_=this._rowElements[c];if(!_)continue;let p=r.lines.get(u);if(!p){_.replaceChildren(),this._setRowBlinkState(c,!1);continue}_.replaceChildren(...this._rowFactory.createRow(p,u,u===s,l,h,o,a,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,d)),this._setRowBlinkState(c,d.hasBlinkingCells)}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,r,s,o,a){r<0&&(e=0),s<0&&(t=0);let l=this._bufferService.rows-1;r=Math.max(Math.min(r,l),0),s=Math.max(Math.min(s,l),0),o=Math.min(o,this._bufferService.cols);let h=this._bufferService.buffer,d=h.ybase+h.y,c=Math.min(h.x,o-1),u=this._optionsService.rawOptions.cursorBlink,_=this._optionsService.rawOptions.cursorStyle,p=this._optionsService.rawOptions.cursorInactiveStyle,v={hasBlinkingCells:!1};for(let f=r;f<=s;++f){let S=f+h.ydisp,I=this._rowElements[f];if(!I)continue;let w=h.lines.get(S);if(!w){I.replaceChildren(),this._setRowBlinkState(f,!1);continue}I.replaceChildren(...this._rowFactory.createRow(w,S,S===d,_,p,c,u,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,a?f===r?e:0:-1,a?(f===s?t:o)-1:-1,v)),this._setRowBlinkState(f,v.hasBlinkingCells)}this._updateTextBlinkState()}_setRowBlinkState(e,t){this._rowHasBlinkingCells[e]!==t&&(this._rowHasBlinkingCells[e]=t,this._rowHasBlinkingCellsCount+=t?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};mt=y([m(7,Qe),m(8,Pe),m(9,R),m(10,D),m(11,Y),m(12,G),m(13,_e)],mt);var is=class{constructor(i,e){this._rowContainer=i;this._coreBrowserService=e;this._isIdlePaused=!1;this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){this._idleTimeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}};var bt=class extends g{constructor(e,t,r){super();this._optionsService=r;this.width=0;this.height=0;this._onCharSizeChange=this._register(new b);this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new ss(this._optionsService))}catch{this._measureStrategy=this._register(new rs(e,t,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}get hasValidSize(){return this.width>0&&this.height>0}measure(){let e=this._measureStrategy.measure();(e.width!==this.width||e.height!==this.height)&&(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};bt=y([m(2,R)],bt);var Wi=class extends g{constructor(){super(...arguments);this._result={width:0,height:0}}_validateAndSet(e,t){e!==void 0&&e>0&&t!==void 0&&t>0&&(this._result.width=e,this._result.height=t)}},rs=class extends Wi{constructor(e,t,r){super();this._document=e;this._parentElement=t;this._optionsService=r;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}},ss=class extends Wi{constructor(e){super();this._optionsService=e;this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");let 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}`;let e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}};var Ui=class extends g{constructor(e,t,r){super();this._textarea=e;this._window=t;this.mainDocument=r;this._isFocused=!1;this._cachedIsFocused=void 0;this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._onWindowChange=this._register(new b);this.onWindowChange=this._onWindowChange.event;this._screenDprMonitor=this._register(new ns(this._window)),this._register(this.onWindowChange(s=>this._screenDprMonitor.setWindow(s))),this._register(j.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register(C(this._textarea,"focus",()=>this._isFocused=!0)),this._register(C(this._textarea,"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 this._cachedIsFocused===void 0&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask(()=>this._cachedIsFocused=void 0)),this._cachedIsFocused}},ns=class extends g{constructor(e){super();this._parentWindow=e;this._windowResizeListener=this._register(new B);this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register(E(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=C(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)}};var Ki=class extends g{constructor(){super();this.linkProviders=[];this._register(E(()=>this.linkProviders.length=0))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{let t=this.linkProviders.indexOf(e);t!==-1&&this.linkProviders.splice(t,1)}}}};function qt(n,i,e){let t=e.getBoundingClientRect(),r=n.getComputedStyle(e),s=parseInt(r.getPropertyValue("padding-left"),10),o=parseInt(r.getPropertyValue("padding-top"),10);return[i.clientX-t.left-s,i.clientY-t.top-o]}function Zs(n,i,e,t,r,s,o,a,l){if(!s)return;let h=qt(n,i,e);return h[0]=Math.ceil((h[0]+(l?o/2:0))/o),h[1]=Math.ceil(h[1]/a),h[0]=Math.min(Math.max(h[0],1),t+(l?1:0)),h[1]=Math.min(Math.max(h[1],1),r),h}var vt=class{constructor(i,e){this._charSizeService=i;this._renderService=e}getCoords(i,e,t,r,s){return Zs(se(e),i,e,t,r,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,s)}getMouseReportCoords(i,e){let t=qt(se(e),i,e);if(this._charSizeService.hasValidSize)return t[0]=Math.min(Math.max(t[0],0),this._renderService.dimensions.css.canvas.width-1),t[1]=Math.min(Math.max(t[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(t[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(t[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(t[0]),y:Math.floor(t[1])}}};vt=y([m(0,Pe),m(1,V)],vt);var Js=typeof window=="object"?window:globalThis;function ce(n,i=0){return n[n.length-(1+i)]}function jn(n,i,e){let t=null,r=null;if(typeof e.value=="function"?(t="value",r=e.value,r.length!==0&&console.warn("Memoize should only be used in functions with zero parameters")):typeof e.get=="function"&&(t="get",r=e.get),!r||!t)throw new Error("not supported");let s=`$memoize$${i}`,o=e;o[t]=function(...a){return this.hasOwnProperty(s)||Object.defineProperty(this,s,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,a)}),this[s]}}var St=class St{constructor(i){this.element=i,this.next=St.Undefined,this.prev=St.Undefined}};St.Undefined=new St(void 0);var re=St,zi=class{constructor(){this._first=re.Undefined;this._last=re.Undefined}push(i){return this._insert(i,!0)}_insert(i,e){let t=new re(i);if(this._first===re.Undefined)this._first=t,this._last=t;else if(e){let s=this._last;this._last=t,t.prev=s,s.next=t}else{let s=this._first;this._first=t,t.next=s,s.prev=t}let r=!1;return()=>{r||(r=!0,this._remove(t))}}_remove(i){if(i.prev!==re.Undefined&&i.next!==re.Undefined){let e=i.prev;e.next=i.next,i.next.prev=e}else i.prev===re.Undefined&&i.next===re.Undefined?(this._first=re.Undefined,this._last=re.Undefined):i.next===re.Undefined?(this._last=this._last.prev,this._last.next=re.Undefined):i.prev===re.Undefined&&(this._first=this._first.next,this._first.prev=re.Undefined)}*[Symbol.iterator](){let i=this._first;for(;i!==re.Undefined;)yield i.element,i=i.next}},he;(s=>(s.TAP="-xterm-gesturetap",s.CHANGE="-xterm-gesturechange",s.START="-xterm-gesturestart",s.END="-xterm-gesturesend",s.CONTEXT_MENU="-xterm-gesturecontextmenu"))(he||={});var K=class K extends g{constructor(){super();this._dispatched=!1;this._targets=new zi;this._ignoreTargets=new zi;this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;let e=Js;this._register(C(e.document,"touchstart",t=>this._handleTouchStart(t),{passive:!1})),this._register(C(e.document,"touchend",t=>this._handleTouchEnd(e,t))),this._register(C(e.document,"touchmove",t=>this._handleTouchMove(t),{passive:!1}))}static addTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let t=K._instance._targets.push(e);return E(t)}static ignoreTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let t=K._instance._ignoreTargets.push(e);return E(t)}static isTouchDevice(){return"ontouchstart"in Js||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){let t=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let r=0,s=e.targetTouches.length;r=K._holdDelay&&Math.abs(h.initialPageX-ce(h.rollingPageX))<30&&Math.abs(h.initialPageY-ce(h.rollingPageY))<30){let c=this._newGestureEvent(he.CONTEXT_MENU,h.initialTarget);c.pageX=ce(h.rollingPageX),c.pageY=ce(h.rollingPageY),this._dispatchEvent(c)}else if(s===1){let c=ce(h.rollingPageX),u=ce(h.rollingPageY),_=ce(h.rollingTimestamps)-h.rollingTimestamps[0],p=c-h.rollingPageX[0],v=u-h.rollingPageY[0],f=[...this._targets].filter(S=>h.initialTarget instanceof Node&&S.contains(h.initialTarget));this._inertia(e,f,r,Math.abs(p)/_,p>0?1:-1,c,Math.abs(v)/_,v>0?1:-1,u)}this._dispatchEvent(this._newGestureEvent(he.END,h.initialTarget)),delete this._activeTouches[l.identifier]}this._dispatched&&(t.preventDefault(),t.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,t){let r=document.createEvent("CustomEvent");return r.initEvent(e,!1,!0),r.initialTarget=t,r.tapCount=0,r}_dispatchEvent(e){if(e.type===he.TAP){let t=new Date().getTime(),r;t-this._lastSetTapCountTime>K._clearTapCountTime?r=1:r=2,this._lastSetTapCountTime=t,e.tapCount=r}else(e.type===he.CHANGE||e.type===he.CONTEXT_MENU)&&(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(let r of this._ignoreTargets)if(r.contains(e.initialTarget))return;let t=[];for(let r of this._targets)if(r.contains(e.initialTarget)){let s=0,o=e.initialTarget;for(;o&&o!==r;)s++,o=o.parentElement;t.push([s,r])}t.sort((r,s)=>r[0]-s[0]);for(let[,r]of t)r.dispatchEvent(e),this._dispatched=!0}}_inertia(e,t,r,s,o,a,l,h,d){this._handle=tt(e,()=>{let c=Date.now(),u=c-r,_=0,p=0,v=!0;s+=K._scrollFriction*u,l+=K._scrollFriction*u,s>0&&(v=!1,_=o*s*u),l>0&&(v=!1,p=h*l*u);let f=this._newGestureEvent(he.CHANGE);f.translationX=_,f.translationY=p,t.forEach(S=>S.dispatchEvent(f)),v||this._inertia(e,t,c,s,o,a+_,l,h,d+p)})}_handleTouchMove(e){let t=Date.now();for(let r=0,s=e.changedTouches.length;r3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(o.pageX),a.rollingPageY.push(o.pageY),a.rollingTimestamps.push(t)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}};K._scrollFriction=-.005,K._holdDelay=700,K._clearTapCountTime=400,y([jn],K,"isTouchDevice",1);var Gi=K;var gt=class{constructor(i,e,t,r,s,o,a,l,h){this._renderService=i;this._mouseCoordsService=e;this._mouseStateService=t;this._coreService=r;this._bufferService=s;this._optionsService=o;this._selectionService=a;this._logService=l;this._coreBrowserService=h;this._lastEvent=null;this._wheelPartialScroll=0;this._touchScrollAccumulator=0}bindMouse(i,e,t){let{element:r,document:s}=i,o={mouseup:null,wheel:null,mousedrag:null,mousemove:null},a=new B,l=new B;e(a),e(l);let h={target:i,focus:t,requestedEvents:o,mouseupListener:a,mousedragListener:l},d={mouseup:c=>this._handleMouseUp(h,c),wheel:c=>this._handleWheel(h,c),mousedrag:c=>this._handleMouseDrag(h,c),mousemove:c=>this._handleMouseMove(h,c)};this._altMouseCursor=new os(r,s,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),e(this._altMouseCursor),e(this._mouseStateService.onProtocolChange(c=>{this._handleProtocolChange(h,d,c)})),e(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(r),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,e(C(r,"mousedown",c=>this._handleMouseDown(h,c))),e(C(r,"wheel",c=>this._handlePassiveWheel(h,c),{passive:!1})),e(Gi.addTarget(i.screenElement)),e(C(i.screenElement,he.START,()=>this._handleTouchStart())),e(C(i.screenElement,he.CHANGE,c=>this._handleTouchChange(h,c)))}_sendEvent(i,e){let t=this._mouseCoordsService.getMouseReportCoords(e,i.target.screenElement);if(!t)return!1;let r,s;switch(e.overrideType||e.type){case"mousemove":s=32,e.buttons===void 0?(r=3,e.button!==void 0&&(r=e.button<3?e.button:3)):r=e.buttons&1?0:e.buttons&4?1:e.buttons&2?2:3;break;case"mouseup":s=0,r=e.button<3?e.button:3;break;case"mousedown":s=1,r=e.button<3?e.button:3;break;case"wheel":if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;let a=e.deltaY;if(a===0||this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return!1;s=a<0?0:1,r=4;break;default:return!1}if(s===void 0||r===void 0||r>4||r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!e.altKey)return!1;let o=r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:t.col,row:t.row,x:t.x,y:t.y,button:r,action:s,ctrl:e.ctrlKey,alt:o?!1:e.altKey,shift:e.shiftKey})}_handleMouseUp(i,e){this._sendEvent(i,e),e.buttons||(i.mouseupListener.clear(),i.mousedragListener.clear())}_handleWheel(i,e){return this._sendEvent(i,e),e.preventDefault(),e.stopPropagation(),!1}_handleMouseDrag(i,e){e.buttons&&this._sendEvent(i,e)}_handleMouseMove(i,e){e.buttons||this._sendEvent(i,e)}_handleMouseDown(i,e){if(e.preventDefault(),i.focus(),!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(e))return;this._sendEvent(i,e);let{element:t,document:r}=i.target,s=t.ownerDocument??r;i.requestedEvents.mouseup&&(i.mouseupListener.value=C(s,"mouseup",i.requestedEvents.mouseup)),i.requestedEvents.mousedrag&&(i.mousedragListener.value=C(s,"mousemove",i.requestedEvents.mousedrag))}_handlePassiveWheel(i,e){if(!i.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;if(!this._bufferService.buffer.hasScrollback){if(e.deltaY===0)return!1;if(this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return e.preventDefault(),e.stopPropagation(),!1;let s="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(s,!0),e.preventDefault(),e.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(i,e){if(e.preventDefault(),e.stopPropagation(),i.requestedEvents.wheel){this._handleTouchScrollAsWheel(i,e);return}if(!this._bufferService.buffer.hasScrollback){this._handleTouchScrollAsKeys(e);return}i.target.handleTouchScroll?.(e.translationY)}_handleTouchScrollAsKeys(i){let e=this._renderService?.dimensions.css.cell.height;if(!e)return;this._touchScrollAccumulator-=i.translationY;let t=Math.trunc(this._touchScrollAccumulator/e);if(t===0)return;this._touchScrollAccumulator-=t*e;let r="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(t<0?"A":"B");for(let s=0;s0?1:-1),this._wheelPartialScroll%=1):i.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(s*=this._bufferService.rows),s}_triggerMouseEvent(i){if(i.col<0||i.col>=this._bufferService.cols||i.row<0||i.row>=this._bufferService.rows||i.button===4&&i.action===32||i.button===3&&i.action!==32||i.button!==4&&(i.action===2||i.action===3)||(i.col++,i.row++,i.action===32&&this._lastEvent&&this._equalEvents(this._lastEvent,i,this._mouseStateService.isPixelEncoding))||!this._mouseStateService.restrictMouseEvent(i))return!1;let e=this._mouseStateService.encodeMouseEvent(i);return e&&(this._mouseStateService.isDefaultEncoding?this._coreService.triggerBinaryEvent(e):this._coreService.triggerDataEvent(e,!0)),this._lastEvent=i,!0}_explainEvents(i){return{down:!!(i&1),up:!!(i&2),drag:!!(i&4),move:!!(i&8),wheel:!!(i&16)}}_equalEvents(i,e,t){if(t){if(i.x!==e.x||i.y!==e.y)return!1}else if(i.col!==e.col||i.row!==e.row)return!1;return!(i.button!==e.button||i.action!==e.action||i.ctrl!==e.ctrl||i.alt!==e.alt||i.shift!==e.shift)}};gt=y([m(0,V),m(1,Be),m(2,Me),m(3,Y),m(4,D),m(5,R),m(6,vi),m(7,fe),m(8,G)],gt);var os=class{constructor(i,e,t){this._element=i;this._document=e;this._isActive=t;this._listeners=new B}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;let i=new pe,e=r=>this.syncFromModifier(r);i.add(C(this._document,"keydown",e)),i.add(C(this._document,"keyup",e)),i.add(C(this._element,"mousemove",e));let t=this._element.ownerDocument?.defaultView;t&&i.add(C(t,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=i}resetClass(){this._updateClass(!1)}syncFromModifier(i){this._isActive()&&this._updateClass(i.getModifierState("Alt"))}_updateClass(i){i?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}};var Vi=class{constructor(i,e){this._renderCallback=i;this._coreBrowserService=e;this._refreshCallbacks=[]}dispose(){this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(i){return this._refreshCallbacks.push(i),this._animationFrame??=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()),this._animationFrame}refresh(i,e,t){this._rowCount=t,i=i??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,i):i,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._animationFrame=void 0,this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0){this._runRefreshCallbacks();return}let i=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(i,e),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(let i of this._refreshCallbacks)i(0);this._refreshCallbacks=[]}};var $i=class{constructor(i){this._tasks=[];this._i=0;this._logService=i}enqueue(i){this._tasks.push(i),this._start()}flush(){for(;this._is){r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),this._start();return}r=s}this.clear()}},as=class extends $i{_requestCallback(i){return setTimeout(()=>i(this._createDeadline(16)))}_cancelCallback(i){clearTimeout(i)}_createDeadline(i){let e=performance.now()+i;return{timeRemaining:()=>Math.max(0,e-performance.now())}}},ls=class extends $i{_requestCallback(i){return requestIdleCallback(i)}_cancelCallback(i){cancelIdleCallback(i)}},It="requestIdleCallback"in globalThis?ls:as,qi=class{constructor(i){this._queue=new It(i)}set(i){this._queue.clear(),this._queue.enqueue(i)}flush(){this._queue.flush()}dispose(){this._queue.clear()}};var Ct=class extends g{constructor(e,t,r,s,o,a,l,h,d,c){super();this._rowCount=e;this._optionsService=r;this._logService=s;this._charSizeService=o;this._coreService=a;this._coreBrowserService=d;this._renderer=this._register(new B);this._observerDisposable=this._register(new B);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 b);this.onDimensionsChange=this._onDimensionsChange.event;this._onRenderedViewportChange=this._register(new b);this.onRenderedViewportChange=this._onRenderedViewportChange.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onRefreshRequest=this._register(new b);this.onRefreshRequest=this._onRefreshRequest.event;this._pausedResizeTask=this._register(new qi(this._logService)),this._renderDebouncer=new Vi((u,_)=>this._renderRows(u,_),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new cs(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register(E(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(h.onResize(()=>this._fullRefresh())),this._register(h.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(h.buffer.y,h.buffer.y,void 0,!0))),this._register(c.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,t),this._register(this._coreBrowserService.onWindowChange(u=>this._registerIntersectionObserver(u,t)))}get dimensions(){return this._renderer.value.dimensions}_registerIntersectionObserver(e,t){if("IntersectionObserver"in e){let r=new e.IntersectionObserver(s=>this._handleIntersectionChange(s[s.length-1]),{threshold:0});this._observerDisposable.value=E(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=r,r.observe(t)}}_handleIntersectionChange(e){this._isPaused=e.isIntersecting===void 0?e.intersectionRatio===0:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),!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,r=!1,s=!1){if(this._isPaused){this._needsFullRefresh=!0;return}if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,t);return}let o=this._syncOutputHandler.flush();o&&(e=Math.min(e,o.start),t=Math.max(t,o.end)),s||(this._isNextRenderRedrawOnly=!1),r?this._renderRows(e,t):this._renderDebouncer.refresh(e,t,this._rowCount)}_renderRows(e,t){if(this._renderer.value){if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,t);return}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(t=>this.refreshRows(t.start,t.end,t.sync,!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,r){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=r,this._renderer.value?.handleSelectionChanged(e,t,r)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};Ct=y([m(2,R),m(3,fe),m(4,Pe),m(5,Y),m(6,ge),m(7,D),m(8,G),m(9,_e)],Ct);var cs=class{constructor(i,e,t){this._coreBrowserService=i;this._coreService=e;this._onTimeout=t;this._start=0;this._end=0;this._isBuffering=!1}bufferRows(i,e){this._isBuffering?(this._start=Math.min(this._start,i),this._end=Math.max(this._end,e)):(this._start=i,this._end=e,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;let i={start:this._start,end:this._end};return this._isBuffering=!1,i}dispose(){this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}};function Qs(n,i,e,t){let r=e.buffer.x,s=e.buffer.y;if(!e.buffer.hasScrollback)return to(r,s,n,i,e,t)+Xi(s,i,e,t)+io(r,s,n,i,e,t);let o;if(s===i)return o=r>n?"D":"C",Yt(Math.abs(r-n),Xt(o,t));o=s>i?"D":"C";let a=Math.abs(s-i),l=eo(s>i?n:r,e)+(a-1)*e.cols+1+Qn(s>i?r:n,e);return Yt(l,Xt(o,t))}function Qn(n,i){return n-1}function eo(n,i){return i.cols-n}function to(n,i,e,t,r,s){return Xi(i,t,r,s).length===0?"":Yt(tn(n,i,n,i-$e(i,r),!1,r).length,Xt("D",s))}function Xi(n,i,e,t){let r=n-$e(n,e),s=i-$e(i,e),o=Math.abs(r-s)-ro(n,i,e);return Yt(o,Xt(en(n,i),t))}function io(n,i,e,t,r,s){let o;Xi(i,t,r,s).length>0?o=t-$e(t,r):o=i;let a=t,l=so(n,i,e,t,r,s);return Yt(tn(n,o,e,a,l==="C",r).length,Xt(l,s))}function ro(n,i,e){let t=0,r=n-$e(n,e),s=i-$e(i,e);for(let o=0;o=0&&n0?o=t-$e(t,r):o=i,n=e&&oi?"A":"B"}function tn(n,i,e,t,r,s){let o=n,a=i,l="";for(;(o!==e||a!==t)&&a>=0&&as.cols-1?(l+=s.buffer.translateBufferLineToString(a,!1,n,o),o=0,n=0,a++):!r&&o<0&&(l+=s.buffer.translateBufferLineToString(a,!1,0,n+1),o=s.cols-1,n=o,a--);return l+s.buffer.translateBufferLineToString(a,!1,n,o)}function Xt(n,i){let e=i?"O":"[";return"\x1B"+e+n}function Yt(n,i){n=Math.floor(n);let e="";for(let t=0;tthis._bufferService.cols?i%this._bufferService.cols===0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)-1]:[i%this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)]:[i,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){let i=this.selectionStart[0]+this.selectionStartLength;return i>this._bufferService.cols?[i%this._bufferService.cols,this.selectionStart[1]+Math.floor(i/this._bufferService.cols)]:[Math.max(i,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){let i=this.selectionStart,e=this.selectionEnd;return!i||!e?!1:i[1]>e[1]||i[1]===e[1]&&i[0]>e[0]}handleTrim(i){return this.selectionStart&&(this.selectionStart[1]-=i),this.selectionEnd&&(this.selectionEnd[1]-=i),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):this.selectionStart&&this.selectionStart[1]<0?(this.selectionStart=[0,0],!0):!1}};function hs(n,i){if(n.start.y>n.end.y)throw new Error(`Buffer range end (${n.end.x}, ${n.end.y}) cannot be before start (${n.start.x}, ${n.start.y})`);return i*(n.end.y-n.start.y)+(n.end.x-n.start.x+1)}var no="\xA0",oo=new RegExp(no,"g");var Et=class extends g{constructor(e,t,r,s,o,a,l,h,d,c){super();this._element=e;this._screenElement=t;this._linkifier=r;this._bufferService=s;this._coreService=o;this._mouseCoordsService=a;this._optionsService=l;this._mouseStateService=h;this._renderService=d;this._coreBrowserService=c;this._dragScrollAmount=0;this._enabled=!0;this._trimListener=this._register(new B);this._workCell=new F;this._mouseDownTimeStamp=0;this._oldHasSelection=!1;this._oldSelectionStart=void 0;this._oldSelectionEnd=void 0;this._onLinuxMouseSelection=this._register(new b);this.onLinuxMouseSelection=this._onLinuxMouseSelection.event;this._onRedrawRequest=this._register(new b);this.onRequestRedraw=this._onRedrawRequest.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._mouseMoveListener=u=>this._handleMouseMove(u),this._mouseUpListener=u=>this._handleMouseUp(u),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(u=>this._handleTrim(u)),this._register(this._bufferService.buffers.onBufferActivate(u=>this._handleBufferActivate(u))),this.enable(),this._model=new Yi(this._bufferService),this._activeSelectionMode=0,this._register(E(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(u=>{u.rowsChanged&&this.clearSelection()}))}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(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!e||!t?!1:e[0]!==t[0]||e[1]!==t[1]}get selectionText(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";let r=this._bufferService.buffer,s=[];if(this._activeSelectionMode===3){if(e[0]===t[0])return"";let a=e[0]a.replace(oo," ")).join(Ue?`\r ++WARNING: This link could potentially be dangerous`)){let i=window.open();if(i){try{i.opener=null}catch{}i.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}var Be=H("CharSizeService"),G=H("CoreBrowserService"),Oe=H("MouseCoordsService"),Us=H("MouseService"),V=H("RenderService"),vi=H("SelectionService"),Si=H("CharacterJoinerService"),ce=H("ThemeService"),gi=H("LinkProviderService"),Ks=H("KeyboardService");function E(n){return{dispose:n}}function Ne(n){if(!n)return n;if(Array.isArray(n)){for(let t of n)t.dispose();return[]}return n.dispose(),n}var pe=class{constructor(){this._disposables=new Set;this._isDisposed=!1}get isDisposed(){return this._isDisposed}add(t){return this._isDisposed?t.dispose():this._disposables.add(t),t}dispose(){if(!this._isDisposed){this._isDisposed=!0;for(let t of this._disposables)t.dispose();this._disposables.clear()}}clear(){for(let t of this._disposables)t.dispose();this._disposables.clear()}},g=class{constructor(){this._store=new pe}dispose(){this._store.dispose()}_register(t){return this._store.add(t)}};g.None=Object.freeze({dispose(){}});var B=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(t){this._isDisposed||t===this._value||(this._value?.dispose(),this._value=t)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}};var Ce=class{constructor(){this._token=-1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(t,e){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed TimeoutTimer");this.cancel(),this._token=setTimeout(()=>{this._token=-1,t()},e)}setIfNotSet(t,e){if(this._isDisposed)throw new Error("Calling setIfNotSet on a disposed TimeoutTimer");this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,t()},e))}},Ci=class{constructor(){this._isScheduled=!1;this._isDisposed=!1}dispose(){this.cancel(),this._isDisposed=!0}cancel(){this._isScheduled=!1}set(t){if(this._isDisposed)throw new Error("Calling set on a disposed MicrotaskTimer");this._isScheduled||(this._isScheduled=!0,queueMicrotask(()=>{this._isScheduled&&(this._isScheduled=!1,t())}))}},Ii=class{constructor(){this._isDisposed=!1}cancel(){this._disposable?.dispose(),this._disposable=void 0}cancelAndSet(t,e,i=globalThis){if(this._isDisposed)throw new Error("Calling cancelAndSet on a disposed IntervalTimer");this.cancel();let r=i.setInterval(()=>{t()},e);this._disposable={dispose:()=>{i.clearInterval(r),this._disposable=void 0}}}dispose(){this.cancel(),this._isDisposed=!0}};function se(n){let t=n;if(t?.ownerDocument?.defaultView)return t.ownerDocument.defaultView;let e=n;return e?.view?e.view:window}var Ur=class{constructor(t,e,i,r){this._node=t,this._type=e,this._handler=i,this._options=r,t.addEventListener(e,i,r)}dispose(){!this._node||!this._handler||(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}};function I(n,t,e,i){return new Ur(n,t,e,i)}function Kr(n,t,e,i){return I(n,t,e,i)}var le={CLICK:"click",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_LEAVE:"mouseleave",KEY_DOWN:"keydown",KEY_UP:"keyup",INPUT:"input",BLUR:"blur",FOCUS:"focus",CHANGE:"change",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_UP:"pointerup",MOUSE_WHEEL:"wheel",WHEEL:"wheel"};function Gs(n){let t=n.getBoundingClientRect(),e=se(n);return{left:t.left+e.scrollX,top:t.top+e.scrollY,width:t.width,height:t.height}}var Ei=class{constructor(t,e){this._runner=t;this.priority=e;this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(t){console.error(t)}}static sort(t,e){return e.priority-t.priority}},zs=new Map;function Vs(n){let t=zs.get(n);return t||(t={next:[],current:[],animFrameRequested:!1,inAnimationFrameRunner:!1},zs.set(n,t)),t}function Hn(n){let t=Vs(n);for(t.animFrameRequested=!1,t.current=t.next,t.next=[],t.inAnimationFrameRunner=!0;t.current.length>0;)t.current.sort(Ei.sort),t.current.shift().execute();t.inAnimationFrameRunner=!1}function it(n,t,e=0){let i=Vs(n),r=new Ei(t,e);return i.next.push(r),i.animFrameRequested||(i.animFrameRequested=!0,n.requestAnimationFrame(()=>Hn(n))),r}var yi=class extends Ii{constructor(t){super(),this._defaultTarget=t?se(t):void 0}cancelAndSet(t,e,i){super.cancelAndSet(t,e,i??this._defaultTarget??window)}};var Te=class{constructor(t){this.domNode=t;this._width="";this._height="";this._top="";this._left="";this._bottom="";this._right="";this._className="";this._position="";this._layerHint=!1;this._contain="none"}setWidth(t){let e=st(t);this._width!==e&&(this._width=e,this.domNode.style.width=this._width)}setHeight(t){let e=st(t);this._height!==e&&(this._height=e,this.domNode.style.height=this._height)}setTop(t){let e=st(t);this._top!==e&&(this._top=e,this.domNode.style.top=this._top)}setLeft(t){let e=st(t);this._left!==e&&(this._left=e,this.domNode.style.left=this._left)}setBottom(t){let e=st(t);this._bottom!==e&&(this._bottom=e,this.domNode.style.bottom=this._bottom)}setRight(t){let e=st(t);this._right!==e&&(this._right=e,this.domNode.style.right=this._right)}setClassName(t){this._className!==t&&(this._className=t,this.domNode.className=this._className)}toggleClassName(t,e){this.domNode.classList.toggle(t,e),this._className=this.domNode.className}setPosition(t){this._position!==t&&(this._position=t,this.domNode.style.position=this._position)}setLayerHinting(t){this._layerHint!==t&&(this._layerHint=t,t?this.domNode.style.transform="translate3d(0px, 0px, 0px)":this.domNode.style.transform="")}setContain(t){this._contain!==t&&(this._contain=t,this.domNode.style.contain=this._contain)}setAttribute(t,e){this.domNode.setAttribute(t,e)}};function st(n){return typeof n=="number"?`${n}px`:n}var ze={};kn(ze,{getSafariVersion:()=>Un,getZoomFactor:()=>Vr,isChrome:()=>Kt,isChromeOS:()=>$r,isFirefox:()=>ot,isLegacyEdge:()=>Wn,isLinux:()=>zt,isMac:()=>ie,isNode:()=>zr,isSafari:()=>xi,isWindows:()=>Ke});var zr=!!(typeof process<"u"&&"title"in process&&(typeof navigator>"u"||navigator.userAgent.startsWith("Node.js/"))),nt=zr?"node":navigator.userAgent,Gr=zr?"node":navigator.platform,ot=nt.includes("Firefox"),Kt=nt.includes("Chrome"),Wn=nt.includes("Edge"),xi=/^((?!chrome|android).)*safari/i.test(nt);function Vr(n){return 1}function Un(){if(!xi)return 0;let n=nt.match(/Version\/(\d+)/);return n===null||n.length<2?0:parseInt(n[1],10)}var ie=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(Gr),Ke=["Windows","Win16","Win32","WinCE"].includes(Gr),zt=Gr.indexOf("Linux")>=0,$r=/\bCrOS\b/.test(nt);var $s=new WeakMap;function Kn(n){if(!n.parent||n.parent===n)return null;try{let t=n.location,e=n.parent.location;if(t.origin!=="null"&&e.origin!=="null"&&t.origin!==e.origin)return null}catch{return null}return n.parent}var qr=class{static _getSameOriginWindowChain(t){let e=$s.get(t);if(!e){e=[],$s.set(t,e);let i=t,r;do r=Kn(i),r?e.push({window:new WeakRef(i),iframeElement:i.frameElement??null}):e.push({window:new WeakRef(i),iframeElement:null}),i=r;while(i)}return e.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(t,e){if(!e||t===e)return{top:0,left:0};let i=0,r=0,s=this._getSameOriginWindowChain(t);for(let o of s){let a=o.window.deref();if(i+=a?.scrollY??0,r+=a?.scrollX??0,a===e||!o.iframeElement)break;let l=o.iframeElement.getBoundingClientRect();i+=l.top,r+=l.left}return{top:i,left:r}}},at=class{constructor(t,e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=e.button===0,this.middleButton=e.button===1,this.rightButton=e.button===2,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail??1,e.type==="dblclick"&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,typeof e.pageX=="number"?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=e.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);let i=qr.getPositionOfChildWindowRelativeToAncestorWindow(t,e.view);this.posx-=i.left,this.posy-=i.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}},Gt=class{constructor(t,e=0,i=0){this.browserEvent=t??null,this.target=t?t.target??t.targetNode??t.srcElement??null:null,this.deltaY=i,this.deltaX=e;let r=!1;if(Kt){let s=navigator.userAgent.match(/Chrome\/(\d+)/);r=(s?parseInt(s[1],10):123)<=122}if(t){let s=t,o=t,a=t.view?.devicePixelRatio??1;if(typeof s.wheelDeltaY<"u")r?this.deltaY=s.wheelDeltaY/(120*a):this.deltaY=s.wheelDeltaY/120;else if(typeof o.VERTICAL_AXIS<"u"&&o.axis===o.VERTICAL_AXIS)this.deltaY=-o.detail/3;else if(t.type==="wheel"){let l=t;l.deltaMode===l.DOM_DELTA_LINE?ot&&!ie?this.deltaY=-t.deltaY/3:this.deltaY=-t.deltaY:this.deltaY=-t.deltaY/40}if(typeof s.wheelDeltaX<"u")xi&&Ke?this.deltaX=-(s.wheelDeltaX/120):r?this.deltaX=s.wheelDeltaX/(120*a):this.deltaX=s.wheelDeltaX/120;else if(typeof o.HORIZONTAL_AXIS<"u"&&o.axis===o.HORIZONTAL_AXIS)this.deltaX=-t.detail/3;else if(t.type==="wheel"){let l=t;l.deltaMode===l.DOM_DELTA_LINE?ot&&!ie?this.deltaX=-t.deltaX/3:this.deltaX=-t.deltaX:this.deltaX=-t.deltaX/40}this.deltaY===0&&this.deltaX===0&&t.wheelDelta&&(r?this.deltaY=t.wheelDelta/(120*a):this.deltaY=t.wheelDelta/120)}}preventDefault(){this.browserEvent?.preventDefault()}stopPropagation(){this.browserEvent?.stopPropagation()}};var lt=class{constructor(){this._hooks=new pe;this._pointerMoveCallback=null;this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(t){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;let e=this._onStopCallback;this._onStopCallback=null,t&&e&&e()}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(t,e,i,r,s){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=r,this._onStopCallback=s;let o=t;try{t.setPointerCapture(e),this._hooks.add(E(()=>{try{t.releasePointerCapture(e)}catch{}}))}catch{o=se(t)}this._hooks.add(I(o,le.POINTER_MOVE,a=>{if(a.buttons!==i){this.stopMonitoring(!0);return}a.preventDefault(),this._pointerMoveCallback(a)})),this._hooks.add(I(o,le.POINTER_UP,a=>this.stopMonitoring(!0)))}};var Fe=class extends g{_onclick(t,e){this._register(I(t,le.CLICK,i=>e(new at(se(t),i))))}_onmouseover(t,e){this._register(I(t,le.MOUSE_OVER,i=>e(new at(se(t),i))))}_onmouseleave(t,e){this._register(I(t,le.MOUSE_LEAVE,i=>e(new at(se(t),i))))}};var wi=class extends Fe{constructor(t){super(),this._handleActivate=t.handleActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="xterm-arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=t.bgWidth+"px",this.bgDomNode.style.height=t.bgHeight+"px",typeof t.top<"u"&&(this.bgDomNode.style.top="0px"),typeof t.left<"u"&&(this.bgDomNode.style.left="0px"),typeof t.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof t.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=t.className,this.domNode.style.position="absolute";let e=Math.min(t.bgWidth,t.bgHeight);this.domNode.style.width=e+"px",this.domNode.style.height=e+"px",typeof t.top<"u"&&(this.domNode.style.top=t.top+"px"),typeof t.left<"u"&&(this.domNode.style.left=t.left+"px"),typeof t.bottom<"u"&&(this.domNode.style.bottom=t.bottom+"px"),typeof t.right<"u"&&(this.domNode.style.right=t.right+"px"),this._pointerMoveMonitor=this._register(new lt),this._register(Kr(this.bgDomNode,le.POINTER_DOWN,i=>this._arrowPointerDown(i))),this._register(Kr(this.domNode,le.POINTER_DOWN,i=>this._arrowPointerDown(i))),this._pointerdownRepeatTimer=this._register(new yi),this._pointerdownScheduleRepeatTimer=this._register(new Ce)}_arrowPointerDown(t){if(!t.target||!(t.target instanceof Element))return;let e=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._handleActivate(),1e3/24,se(t))};this._handleActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(e,200),this._pointerMoveMonitor.startMonitoring(t.target,t.pointerId,t.buttons,i=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),t.preventDefault()}};var b=class{constructor(){this._listeners=[];this._disposed=!1}get event(){return this._event?this._event:(this._event=(t,e,i)=>{if(this._disposed)return E(()=>{});let r={fn:t,thisArgs:e};this._listeners=this._listeners.slice(),this._listeners.push(r);let s=E(()=>{let o=this._listeners.indexOf(r);o!==-1&&(this._listeners=this._listeners.slice(),this._listeners.splice(o,1))});return i&&(Array.isArray(i)?i.push(s):i.add(s)),s},this._event)}fire(t){if(this._disposed||!this._listeners.length)return;if(this._listeners.length===1){this._listeners[0].fn.call(this._listeners[0].thisArgs,t);return}let e=this._listeners;for(let i=0,r=e.length;i{function n(s,o){return s(a=>o.fire(a))}r.forward=n;function t(s,o){return(a,l,h)=>s(d=>a.call(l,o(d)),void 0,h)}r.map=t;function e(...s){return(o,a,l)=>{let h=new pe;for(let d of s)h.add(d(c=>o.call(a,c)));return l&&(Array.isArray(l)?l.push(h):l.add(h)),h}}r.any=e;function i(s,o,a){return o(a),s(l=>o(l))}r.runAndSubscribe=i})(j||={});var Yr=class n{constructor(t,e,i,r,s,o,a){this._forceIntegerValues=t;this._scrollStateBrand=void 0;this._forceIntegerValues&&(e=e|0,i=i|0,r=r|0,s=s|0,o=o|0,a=a|0),this.rawScrollLeft=r,this.rawScrollTop=a,e<0&&(e=0),r+e>i&&(r=i-e),r<0&&(r=0),s<0&&(s=0),a+s>o&&(a=o-s),a<0&&(a=0),this.width=e,this.scrollWidth=i,this.scrollLeft=r,this.height=s,this.scrollHeight=o,this.scrollTop=a}equals(t){return this.rawScrollLeft===t.rawScrollLeft&&this.rawScrollTop===t.rawScrollTop&&this.width===t.width&&this.scrollWidth===t.scrollWidth&&this.scrollLeft===t.scrollLeft&&this.height===t.height&&this.scrollHeight===t.scrollHeight&&this.scrollTop===t.scrollTop}withScrollDimensions(t,e){return new n(this._forceIntegerValues,typeof t.width<"u"?t.width:this.width,typeof t.scrollWidth<"u"?t.scrollWidth:this.scrollWidth,e?this.rawScrollLeft:this.scrollLeft,typeof t.height<"u"?t.height:this.height,typeof t.scrollHeight<"u"?t.scrollHeight:this.scrollHeight,e?this.rawScrollTop:this.scrollTop)}withScrollPosition(t){return new n(this._forceIntegerValues,this.width,this.scrollWidth,typeof t.scrollLeft<"u"?t.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof t.scrollTop<"u"?t.scrollTop:this.rawScrollTop)}createScrollEvent(t,e){let i=this.width!==t.width,r=this.scrollWidth!==t.scrollWidth,s=this.scrollLeft!==t.scrollLeft,o=this.height!==t.height,a=this.scrollHeight!==t.scrollHeight,l=this.scrollTop!==t.scrollTop;return{inSmoothScrolling:e,oldWidth:t.width,oldScrollWidth:t.scrollWidth,oldScrollLeft:t.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:t.height,oldScrollHeight:t.scrollHeight,oldScrollTop:t.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:r,scrollLeftChanged:s,heightChanged:o,scrollHeightChanged:a,scrollTopChanged:l}}},ct=class extends g{constructor(e){super();this._scrollableBrand=void 0;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new Yr(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,i){let r=this._state.withScrollDimensions(e,i);this._setState(r,!!this._smoothScrolling),this._smoothScrolling?.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){let i=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(i,!1)}setScrollPositionSmooth(e,i){if(this._smoothScrollDuration===0){this.setScrollPositionNow(e);return}if(this._smoothScrolling){e={scrollLeft:typeof e.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:typeof e.scrollTop>"u"?this._smoothScrolling.to.scrollTop:e.scrollTop};let r=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===r.scrollLeft&&this._smoothScrolling.to.scrollTop===r.scrollTop)return;let s;i?s=new Vt(this._smoothScrolling.from,r,this._smoothScrolling.startTime,this._smoothScrolling.duration):s=Vt.start(this._state,r,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=s}else{let r=this._state.withScrollPosition(e);this._smoothScrolling=Vt.start(this._state,r,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;let e=this._smoothScrolling.tick(),i=this._state.withScrollPosition(e);if(this._setState(i,!0),!!this._smoothScrolling){if(e.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(e,i){let r=this._state;r.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(r,i)))}},Ti=class{constructor(t,e,i){this.scrollLeft=t,this.scrollTop=e,this.isDone=i}};function Xr(n,t){let e=t-n;return function(i){return n+e*Vn(i)}}function zn(n,t,e){return function(i){return i2.5*i){let s,o;return t{this._domNode?.setClassName(this._visibleClassName)},0))}_hide(t){this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,this._domNode?.setClassName(this._invisibleClassName+(t?" xterm-fade":"")))}};var $n=140,ht=class extends Fe{constructor(t){super(),this._lazyRender=t.lazyRender,this._host=t.host,this._scrollable=t.scrollable,this._scrollByPage=t.scrollByPage,this._scrollbarState=t.scrollbarState,this._visibilityController=this._register(new Di(t.visibility,"xterm-visible xterm-scrollbar "+t.extraScrollbarClassName,"xterm-invisible xterm-scrollbar "+t.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new lt),this._shouldRender=!0,this.domNode=new Te(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(I(this.domNode.domNode,le.POINTER_DOWN,e=>this._domNodePointerDown(e)))}_createArrow(t){let e=this._register(new wi(t));return this.domNode.domNode.appendChild(e.bgDomNode),this.domNode.domNode.appendChild(e.domNode),e}_createSlider(t,e,i,r){this.slider=new Te(document.createElement("div")),this.slider.setClassName("xterm-slider"),this.slider.setPosition("absolute"),this.slider.setTop(t),this.slider.setLeft(e),typeof i=="number"&&this.slider.setWidth(i),typeof r=="number"&&this.slider.setHeight(r),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(I(this.slider.domNode,le.POINTER_DOWN,s=>{s.button===0&&(s.preventDefault(),this._sliderPointerDown(s))})),this._onclick(this.slider.domNode,s=>{s.leftButton&&s.stopPropagation()})}_handleElementSize(t){return this._scrollbarState.setVisibleSize(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollSize(t){return this._scrollbarState.setScrollSize(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_handleElementScrollPosition(t){return this._scrollbarState.setScrollPosition(t)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(t){t.target===this.domNode.domNode&&this._handlePointerDown(t)}delegatePointerDown(t){let e=this.domNode.domNode.getClientRects()[0].top,i=e+this._scrollbarState.getSliderPosition(),r=e+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),s=this._sliderPointerPosition(t);i<=s&&s<=r?t.button===0&&(t.preventDefault(),this._sliderPointerDown(t)):this._handlePointerDown(t)}_handlePointerDown(t){let e,i;if(t.target===this.domNode.domNode&&typeof t.offsetX=="number"&&typeof t.offsetY=="number")e=t.offsetX,i=t.offsetY;else{let s=Gs(this.domNode.domNode);e=t.pageX-s.left,i=t.pageY-s.top}let r=this._pointerDownRelativePosition(e,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(r):this._scrollbarState.getDesiredScrollPositionFromOffset(r)),t.button===0&&(t.preventDefault(),this._sliderPointerDown(t))}_sliderPointerDown(t){if(!t.target||!(t.target instanceof Element))return;let e=this._sliderPointerPosition(t),i=this._sliderOrthogonalPointerPosition(t),r=this._scrollbarState.clone();this.slider.toggleClassName("xterm-active",!0),this._pointerMoveMonitor.startMonitoring(t.target,t.pointerId,t.buttons,s=>{let o=this._sliderOrthogonalPointerPosition(s),a=Math.abs(o-i);if(Ke&&a>$n){this._setDesiredScrollPositionNow(r.getScrollPosition());return}let h=this._sliderPointerPosition(s)-e;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("xterm-active",!1),this._host.handleDragEnd()}),this._host.handleDragStart()}_setDesiredScrollPositionNow(t){let e={};this.writeScrollPosition(e,t),this._scrollable.setScrollPositionNow(e)}updateScrollbarSize(t){this._updateScrollbarSize(t),this._scrollbarState.setScrollbarSize(t),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}};var dt=class n{constructor(t,e,i,r,s,o){this._scrollbarSize=Math.round(e),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(t),this._visibleSize=r,this._scrollSize=s,this._scrollPosition=o,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new n(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(t){let e=Math.round(t);return this._visibleSize!==e?(this._visibleSize=e,this._refreshComputedValues(),!0):!1}setScrollSize(t){let e=Math.round(t);return this._scrollSize!==e?(this._scrollSize=e,this._refreshComputedValues(),!0):!1}setScrollPosition(t){let e=Math.round(t);return this._scrollPosition!==e?(this._scrollPosition=e,this._refreshComputedValues(),!0):!1}setScrollbarSize(t){this._scrollbarSize=Math.round(t)}setArrowSize(t){let e=Math.round(t);this._arrowSize!==e&&(this._arrowSize=e,this._refreshComputedValues())}setOppositeScrollbarSize(t){this._oppositeScrollbarSize=Math.round(t)}static _computeValues(t,e,i,r,s){let o=Math.max(0,i-t),a=Math.max(0,o-2*e),l=r>0&&r>i;if(!l)return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};let h=Math.round(Math.max(20,Math.floor(i*a/r))),d=(a-h)/(r-i),c=s*d;return{computedAvailableSize:Math.round(o),computedIsNeeded:l,computedSliderSize:Math.round(h),computedSliderRatio:d,computedSliderPosition:Math.round(c)}}_refreshComputedValues(){let t=n._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=t.computedAvailableSize,this._computedIsNeeded=t.computedIsNeeded,this._computedSliderSize=t.computedSliderSize,this._computedSliderRatio=t.computedSliderRatio,this._computedSliderPosition=t.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(t){if(!this._computedIsNeeded)return 0;let e=t-this._arrowSize-this._computedSliderSize/2;return Math.round(e/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(t){if(!this._computedIsNeeded)return 0;let e=t-this._arrowSize,i=this._scrollPosition;return ethis._arrowScroll(-this._arrowScrollDelta)}),this._arrowDown=this._createArrow({className:"xterm-scra xterm-arrow-down",bottom:0,left:0,bgWidth:i,bgHeight:i,handleActivate:()=>this._arrowScroll(this._arrowScrollDelta)})),this._updateArrowSize(this._arrowUp,i),this._updateArrowSize(this._arrowDown,i),!this._arrowUp||!this._arrowDown)return;let r=e?"":"none";this._arrowUp.bgDomNode.style.display=r,this._arrowUp.domNode.style.display=r,this._arrowDown.bgDomNode.style.display=r,this._arrowDown.domNode.style.display=r}_updateArrowSize(e,i){e&&(e.bgDomNode.style.width=`${i}px`,e.bgDomNode.style.height=`${i}px`,e.domNode.style.width=`${i}px`,e.domNode.style.height=`${i}px`)}updateOptions(e){let i=e.verticalHasArrows?e.verticalScrollbarSize:0;this._scrollbarState.setArrowSize(i),this._setArrows(e.verticalHasArrows,e.verticalScrollbarSize),this.updateScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}};var jr=class{constructor(t,e,i){this.timestamp=t,this.deltaX=e,this.deltaY=i,this.score=0}},Pi=class Pi{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let t=1,e=0,i=1,r=this._rear;for(;r!==-1;){let s=r===this._front?t:Math.pow(2,-i);if(t-=s,e+=this._memory[r].score*s,r===this._front)break;r=(this._capacity+r-1)%this._capacity,i++}return e<=.5}acceptStandardWheelEvent(t){if(Kt){let e=se(t.browserEvent),i=Vr(e);this.accept(Date.now(),t.deltaX*i,t.deltaY*i)}else this.accept(Date.now(),t.deltaX,t.deltaY)}accept(t,e,i){let r=null,s=new jr(t,e,i);this._front===-1&&this._rear===-1?(this._memory[0]=s,this._front=0,this._rear=0):(r=this._memory[this._rear],this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=s),s.score=this._computeScore(s,r)}_computeScore(t,e){if(Math.abs(t.deltaX)>0&&Math.abs(t.deltaY)>0)return 1;let i=.5;if((!this._isAlmostInt(t.deltaX)||!this._isAlmostInt(t.deltaY))&&(i+=.25),e){let r=Math.abs(t.deltaX),s=Math.abs(t.deltaY),o=Math.abs(e.deltaX),a=Math.abs(e.deltaY),l=Math.max(Math.min(r,o),1),h=Math.max(Math.min(s,a),1),d=Math.max(r,o),c=Math.max(s,a);d%l===0&&c%h===0&&(i-=.5)}return Math.min(Math.max(i,0),1)}_isAlmostInt(t){return Math.abs(Math.round(t)-t)<.01}};Pi.INSTANCE=new Pi;var Zr=Pi,ki=class extends Fe{constructor(e,i,r){super();this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;i=i??{};let s,o=!r;r?s=r:(i.mouseWheelSmoothScroll=!1,s=new ct({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:l=>it(se(e),l)})),this._options=qn(i),this._scrollable=s,this._register(this._scrollable.onScroll(l=>{this._handleScroll(l),this._onScroll.fire(l)})),o&&this._register(this._scrollable);let a={handleMouseWheel:l=>this._handleMouseWheel(l),handleDragStart:()=>this._handleDragStart(),handleDragEnd:()=>this._handleDragEnd()};this._verticalScrollbar=this._register(new Ai(this._scrollable,this._options,a)),this._horizontalScrollbar=this._register(new Li(this._scrollable,this._options,a)),this._domNode=document.createElement("div"),this._domNode.className="xterm-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=new Te(document.createElement("div")),this._leftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=new Te(document.createElement("div")),this._topShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=new Te(document.createElement("div")),this._topLeftShadowDomNode.setClassName("xterm-shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode??this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this._onmouseover(this._listenOnDomNode,l=>this._handleMouseOver(l)),this._onmouseleave(this._listenOnDomNode,l=>this._handleMouseLeave(l)),this._hideTimeout=this._register(new Ce),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}get options(){return this._options}dispose(){this._mouseWheelToDispose=Ne(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}updateClassName(e){this._options.className=e,ie&&(this._options.className+=" xterm-mac"),this._domNode.className="xterm-scrollable-element "+this._options.className}updateOptions(e){typeof e.handleMouseWheel<"u"&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof e.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),typeof e.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),typeof e.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),typeof e.horizontal<"u"&&(this._options.horizontal=e.horizontal),typeof e.vertical<"u"&&(this._options.vertical=e.vertical),typeof e.horizontalHasArrows<"u"&&(this._options.horizontalHasArrows=e.horizontalHasArrows),typeof e.verticalHasArrows<"u"&&(this._options.verticalHasArrows=e.verticalHasArrows),typeof e.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),typeof e.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),typeof e.scrollByPage<"u"&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(e){this._handleMouseWheel(new Gt(e))}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=Ne(this._mouseWheelToDispose),e)){let r=s=>{this._handleMouseWheel(new Gt(s))};this._mouseWheelToDispose.push(I(this._listenOnDomNode,le.MOUSE_WHEEL,r,{passive:!1}))}}_handleMouseWheel(e){if(e.browserEvent?.defaultPrevented)return;let i=Zr.INSTANCE;i.acceptStandardWheelEvent(e);let r=!1;if(e.deltaY||e.deltaX){let o=e.deltaY*this._options.mouseWheelScrollSensitivity,a=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&a+o===0?a=o=0:Math.abs(o)>=Math.abs(a)?a=0:o=0),this._options.flipAxes&&([o,a]=[a,o]);let l=!ie&&e.browserEvent&&e.browserEvent.shiftKey;(this._options.scrollYToX||l)&&!a&&(a=o,o=0),e.browserEvent&&e.browserEvent.altKey&&(a=a*this._options.fastScrollSensitivity,o=o*this._options.fastScrollSensitivity);let h=this._scrollable.getFutureScrollPosition(),d={};if(o){let c=50*o,u=h.scrollTop-(c<0?Math.floor(c):Math.ceil(c));this._verticalScrollbar.writeScrollPosition(d,u)}if(a){let c=50*a,u=h.scrollLeft-(c<0?Math.floor(c):Math.ceil(c));this._horizontalScrollbar.writeScrollPosition(d,u)}d=this._scrollable.validateScrollPosition(d),(h.scrollLeft!==d.scrollLeft||h.scrollTop!==d.scrollTop)&&(this._options.mouseWheelSmoothScroll&&i.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(d):this._scrollable.setScrollPositionNow(d),r=!0)}let s=r;!s&&this._options.alwaysConsumeMouseWheel&&(s=!0),!s&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(s=!0),s&&(e.preventDefault(),e.stopPropagation())}_handleScroll(e){this._shouldRender=this._horizontalScrollbar.handleScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.handleScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){let e=this._scrollable.getCurrentScrollPosition(),i=e.scrollTop>0,r=e.scrollLeft>0,s=r?" xterm-shadow-left":"",o=i?" xterm-shadow-top":"",a=r||i?" xterm-shadow-top-left-corner":"";this._leftShadowDomNode.setClassName(`xterm-shadow${s}`),this._topShadowDomNode.setClassName(`xterm-shadow${o}`),this._topLeftShadowDomNode.setClassName(`xterm-shadow${a}${o}${s}`)}}_handleDragStart(){this._isDragging=!0,this._reveal()}_handleDragEnd(){this._isDragging=!1,this._hide()}_handleMouseLeave(e){this._mouseIsOver=!1,this._hide()}_handleMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),500)}};function qn(n){let t={lazyRender:typeof n.lazyRender<"u"?n.lazyRender:!1,className:typeof n.className<"u"?n.className:"",useShadows:typeof n.useShadows<"u"?n.useShadows:!0,handleMouseWheel:typeof n.handleMouseWheel<"u"?n.handleMouseWheel:!0,flipAxes:typeof n.flipAxes<"u"?n.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof n.consumeMouseWheelIfScrollbarIsNeeded<"u"?n.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof n.alwaysConsumeMouseWheel<"u"?n.alwaysConsumeMouseWheel:!1,scrollYToX:typeof n.scrollYToX<"u"?n.scrollYToX:!1,mouseWheelScrollSensitivity:typeof n.mouseWheelScrollSensitivity<"u"?n.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof n.fastScrollSensitivity<"u"?n.fastScrollSensitivity:5,scrollPredominantAxis:typeof n.scrollPredominantAxis<"u"?n.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof n.mouseWheelSmoothScroll<"u"?n.mouseWheelSmoothScroll:!0,listenOnDomNode:typeof n.listenOnDomNode<"u"?n.listenOnDomNode:null,horizontal:typeof n.horizontal<"u"?n.horizontal:1,horizontalScrollbarSize:typeof n.horizontalScrollbarSize<"u"?n.horizontalScrollbarSize:10,horizontalSliderSize:typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:0,horizontalHasArrows:typeof n.horizontalHasArrows<"u"?n.horizontalHasArrows:!1,vertical:typeof n.vertical<"u"?n.vertical:1,verticalScrollbarSize:typeof n.verticalScrollbarSize<"u"?n.verticalScrollbarSize:10,verticalHasArrows:typeof n.verticalHasArrows<"u"?n.verticalHasArrows:!1,verticalSliderSize:typeof n.verticalSliderSize<"u"?n.verticalSliderSize:0,scrollByPage:typeof n.scrollByPage<"u"?n.scrollByPage:!1};return t.horizontalSliderSize=typeof n.horizontalSliderSize<"u"?n.horizontalSliderSize:t.horizontalScrollbarSize,t.verticalSliderSize=typeof n.verticalSliderSize<"u"?n.verticalSliderSize:t.verticalScrollbarSize,ie&&(t.className+=" xterm-mac"),t}var ut=class extends g{constructor(e,i,r,s,o,a,l,h,d){super();this._bufferService=r;this._coreService=o;this._optionsService=h;this._renderService=d;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._isSyncing=!1;this._isHandlingScroll=!1;this._suppressOnScrollHandler=!1;this._needsSyncOnRender=!1;let c=this._register(new ct({forceIntegerValues:!1,smoothScrollDuration:this._optionsService.rawOptions.smoothScrollDuration,scheduleAtNextAnimationFrame:u=>it(s.window,u)}));this._register(this._optionsService.onSpecificOptionChange("smoothScrollDuration",()=>{c.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration)})),this._scrollableElement=this._register(new ki(i,{vertical:1,horizontal:2,useShadows:!1,mouseWheelSmoothScroll:!0,verticalHasArrows:this._optionsService.rawOptions.scrollbar?.showArrows??!1,...this._getChangeOptions()},c)),this._register(this._optionsService.onMultipleOptionChange(["scrollSensitivity","fastScrollSensitivity","scrollbar"],()=>this._scrollableElement.updateOptions(this._getChangeOptions()))),this._register(a.onProtocolChange(u=>{this._scrollableElement.updateOptions({handleMouseWheel:!(u&16)})})),this._scrollableElement.setScrollDimensions({height:0,scrollHeight:0}),this._register(j.runAndSubscribe(l.onChangeColors,()=>{e.style.backgroundColor=l.colors.background.css,this._scrollableElement.getDomNode().style.backgroundColor=l.colors.background.css})),e.appendChild(this._scrollableElement.getDomNode()),this._register(E(()=>this._scrollableElement.getDomNode().remove())),this._styleElement=s.mainDocument.createElement("style"),i.appendChild(this._styleElement),this._register(E(()=>this._styleElement.remove())),this._register(j.runAndSubscribe(l.onChangeColors,()=>{this._styleElement.textContent=[".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {",` background: ${l.colors.scrollbarSliderBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {",` background: ${l.colors.scrollbarSliderHoverBackground.css};`,"}",".xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {",` background: ${l.colors.scrollbarSliderActiveBackground.css};`,"}"].join(` ++`)})),this._register(this._bufferService.onResize(()=>this.queueSync())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._latestYDisp=void 0,this.queueSync()})),this._register(this._bufferService.onScroll(()=>this._sync())),this._register(this._renderService.onRender(()=>{this._needsSyncOnRender&&(this._needsSyncOnRender=!1,this._sync())})),this._register(this._scrollableElement.onScroll(u=>this._handleScroll(u)))}scrollLines(e){let i=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({reuseAnimation:!0,scrollTop:i.scrollTop+e*this._renderService.dimensions.css.cell.height})}scrollToLine(e,i){i&&(this._latestYDisp=e),this._scrollableElement.setScrollPosition({reuseAnimation:!i,scrollTop:e*this._renderService.dimensions.css.cell.height})}_getChangeOptions(){let e=this._optionsService.rawOptions.scrollbar?.showScrollbar??!0,i=this._optionsService.rawOptions.scrollbar?.showArrows??!1,r=e?this._optionsService.rawOptions.scrollbar?.width??14:0;return{mouseWheelScrollSensitivity:this._optionsService.rawOptions.scrollSensitivity,fastScrollSensitivity:this._optionsService.rawOptions.fastScrollSensitivity,vertical:e?1:2,verticalScrollbarSize:r,verticalHasArrows:i}}queueSync(e){e!==void 0&&(this._latestYDisp=e),this._queuedAnimationFrame===void 0&&(this._queuedAnimationFrame=this._renderService.addRefreshCallback(()=>{this._queuedAnimationFrame=void 0,this._sync(this._latestYDisp)}))}_sync(e=this._bufferService.buffer.ydisp){if(!(!this._renderService||this._isSyncing)){if(this._coreService.decPrivateModes.synchronizedOutput){this._needsSyncOnRender=!0;return}this._isSyncing=!0,this._suppressOnScrollHandler=!0,this._scrollableElement.setScrollDimensions({height:this._renderService.dimensions.css.canvas.height,scrollHeight:this._renderService.dimensions.css.cell.height*this._bufferService.buffer.lines.length}),this._suppressOnScrollHandler=!1,e!==this._latestYDisp&&this._scrollableElement.setScrollPosition({scrollTop:e*this._renderService.dimensions.css.cell.height}),this._isSyncing=!1}}_handleScroll(e){if(!this._renderService||this._isHandlingScroll||this._suppressOnScrollHandler)return;this._isHandlingScroll=!0;let i=Math.round(e.scrollTop/this._renderService.dimensions.css.cell.height),r=i-this._bufferService.buffer.ydisp;r!==0&&(this._latestYDisp=i,this._onRequestScrollLines.fire(r)),this._isHandlingScroll=!1}handleTouchScroll(e){let i=this._scrollableElement.getScrollPosition();this._scrollableElement.setScrollPosition({scrollTop:i.scrollTop-e})}};ut=y([m(2,D),m(3,G),m(4,Y),m(5,Me),m(6,ce),m(7,R),m(8,V)],ut);var ft=class extends g{constructor(e,i,r,s,o){super();this._screenElement=e;this._bufferService=i;this._coreBrowserService=r;this._decorationService=s;this._renderService=o;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(a=>this._removeDecoration(a))),this._register(E(()=>{this._container.remove(),this._decorationElements.clear()}))}_queueRefresh(){this._animationFrame===void 0&&(this._animationFrame=this._renderService.addRefreshCallback(()=>{this._doRefreshDecorations(),this._animationFrame=void 0}))}_doRefreshDecorations(){for(let e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){let i=this._coreBrowserService.mainDocument.createElement("div");i.classList.add("xterm-decoration"),i.classList.toggle("xterm-decoration-top-layer",e?.options?.layer==="top"),i.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,i.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,i.style.top=`${(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height}px`,i.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;let r=e.options.x??0;return r&&r>this._bufferService.cols&&(i.style.display="none"),this._refreshXPosition(e,i),i}_refreshStyle(e){let i=e.marker.line-this._bufferService.buffers.active.ydisp;if(i<0||i>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let r=this._decorationElements.get(e);r||(r=this._createElement(e),e.element=r,this._decorationElements.set(e,r),this._container.appendChild(r),e.onDispose(()=>{this._decorationElements.delete(e),r.remove()})),r.style.display=this._altBufferIsActive?"none":"block",this._altBufferIsActive||(r.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,r.style.height=`${(e.options.height||1)*this._renderService.dimensions.css.cell.height}px`,r.style.top=`${i*this._renderService.dimensions.css.cell.height}px`,r.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`),e.onRenderEmitter.fire(r)}}_refreshXPosition(e,i=e.element){if(!i)return;let r=e.options.x??0;(e.options.anchor||"left")==="right"?i.style.right=r?`${r*this._renderService.dimensions.css.cell.width}px`:"":i.style.left=r?`${r*this._renderService.dimensions.css.cell.width}px`:""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};ft=y([m(1,D),m(2,G),m(3,ge),m(4,V)],ft);var Mi=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(t){if(t.options.overviewRulerOptions){for(let e of this._zones)if(e.color===t.options.overviewRulerOptions.color&&e.position===t.options.overviewRulerOptions.position){if(this._lineIntersectsZone(e,t.marker.line))return;if(this._lineAdjacentToZone(e,t.marker.line,t.options.overviewRulerOptions.position)){this._addLineToZone(e,t.marker.line);return}}if(this._zonePoolIndex=t.startBufferLine&&e<=t.endBufferLine}_lineAdjacentToZone(t,e,i){return e>=t.startBufferLine-this._linePadding[i||"full"]&&e<=t.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(t,e){t.startBufferLine=Math.min(t.startBufferLine,e),t.endBufferLine=Math.max(t.endBufferLine,e)}};var Ie={full:0,left:0,center:0,right:0},He={full:0,left:0,center:0,right:0},$t={full:0,left:0,center:0,right:0},Ge=class extends g{constructor(e,i,r,s,o,a,l,h){super();this._viewportElement=e;this._screenElement=i;this._bufferService=r;this._decorationService=s;this._renderService=o;this._optionsService=a;this._themeService=l;this._coreBrowserService=h;this._colorZoneStore=new Mi;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),this._register(E(()=>this._canvas?.remove()));let d=this._canvas.getContext("2d");if(d)this._ctx=d;else throw new Error("Ctx cannot be null");this._register(this._decorationService.onDecorationRegistered(()=>this._queueRefresh(void 0,!0))),this._register(this._decorationService.onDecorationRemoved(()=>this._queueRefresh(void 0,!0))),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())})),this._register(this._renderService.onDimensionsChange(()=>this._queueRefresh(!0))),this._register(this._coreBrowserService.onDprChange(()=>this._queueRefresh(!0))),this._register(this._optionsService.onSpecificOptionChange("scrollbar",()=>this._queueRefresh(!0))),this._register(this._themeService.onChangeColors(()=>this._queueRefresh())),this._register(E(()=>{this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)})),this._queueRefresh(!0)}get _width(){let e=this._optionsService.rawOptions.scrollbar;return e?.showScrollbar??!0?e?.width??0:0}_refreshDrawConstants(){let e=Math.floor((this._canvas.width-1)/3),i=Math.ceil((this._canvas.width-1)/3);He.full=this._canvas.width,He.left=e,He.center=i,He.right=e,this._refreshDrawHeightConstants(),$t.full=1,$t.left=1,$t.center=1+He.left,$t.right=1+He.left+He.center}_refreshDrawHeightConstants(){Ie.full=Math.round(2*this._coreBrowserService.dpr);let e=this._canvas.height/this._bufferService.buffer.lines.length,i=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);Ie.left=i,Ie.center=i,Ie.right=i}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*Ie.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;let e=this._renderService.dimensions.css.canvas.height,i=this._renderService.dimensions.device.canvas.height;this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${e}px`,this._canvas.height=i,this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){if(this._store.isDisposed||!this._renderService.hasRenderer())return;this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(let i of this._decorationService.decorations)this._colorZoneStore.addDecoration(i);this._ctx.lineWidth=1,this._renderRulerOutline();let e=this._colorZoneStore.zones;for(let i of e)i.position!=="full"&&this._renderColorZone(i);for(let i of e)i.position==="full"&&this._renderColorZone(i);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderRulerOutline(){this._ctx.fillStyle=this._themeService.colors.overviewRulerBorder.css,this._ctx.fillRect(0,0,1,this._canvas.height),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder&&this._ctx.fillRect(1,0,this._canvas.width-1,1),this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder&&this._ctx.fillRect(1,this._canvas.height-1,this._canvas.width-1,this._canvas.height)}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect($t[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-Ie[e.position||"full"]/2),He[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+Ie[e.position||"full"]))}_queueRefresh(e,i){this._store.isDisposed||(this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=i||this._shouldUpdateAnchor,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>{this._store.isDisposed||this._refreshDecorations(),this._animationFrame=void 0})))}};Ge=y([m(2,D),m(3,ge),m(4,V),m(5,R),m(6,ce),m(7,G)],Ge);var J=0,Q=0,ee=0,W=0,Jr={css:"#00000000",rgba:0},O;(i=>{function n(r,s,o,a){return a!==void 0?`#${Ve(r)}${Ve(s)}${Ve(o)}${Ve(a)}`:`#${Ve(r)}${Ve(s)}${Ve(o)}`}i.toCss=n;function t(r,s,o,a=255){return(r<<24|s<<16|o<<8|a)>>>0}i.toRgba=t;function e(r,s,o,a){return{css:i.toCss(r,s,o,a),rgba:i.toRgba(r,s,o,a)}}i.toColor=e})(O||={});var L;(a=>{function n(l,h){if(W=(h.rgba&255)/255,W===1)return{css:h.css,rgba:h.rgba};let d=h.rgba>>24&255,c=h.rgba>>16&255,u=h.rgba>>8&255,_=l.rgba>>24&255,p=l.rgba>>16&255,v=l.rgba>>8&255;J=_+Math.round((d-_)*W),Q=p+Math.round((c-p)*W),ee=v+Math.round((u-v)*W);let f=O.toCss(J,Q,ee),S=O.toRgba(J,Q,ee);return{css:f,rgba:S}}a.blend=n;function t(l){return(l.rgba&255)===255}a.isOpaque=t;function e(l,h,d){let c=Bi.ensureContrastRatio(l.rgba,h.rgba,d);if(c)return O.toColor(c>>24&255,c>>16&255,c>>8&255)}a.ensureContrastRatio=e;function i(l){let h=(l.rgba|255)>>>0;return[J,Q,ee]=Bi.toChannels(h),{css:O.toCss(J,Q,ee),rgba:h}}a.opaque=i;function r(l,h){return W=Math.round(h*255),[J,Q,ee]=Bi.toChannels(l.rgba),{css:O.toCss(J,Q,ee,W),rgba:O.toRgba(J,Q,ee,W)}}a.opacity=r;function s(l,h){return W=l.rgba&255,r(l,W*h/255)}a.multiplyOpacity=s;function o(l){return[l.rgba>>24&255,l.rgba>>16&255,l.rgba>>8&255]}a.toColorRGB=o})(L||={});var M;(i=>{let n,t;try{let r=document.createElement("canvas");r.width=1,r.height=1;let s=r.getContext("2d",{willReadFrequently:!0});s&&(n=s,n.globalCompositeOperation="copy",t=n.createLinearGradient(0,0,1,1))}catch{}function e(r){if(r.match(/#[\da-f]{3,8}/i))switch(r.length){case 4:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),O.toColor(J,Q,ee);case 5:return J=parseInt(r.slice(1,2).repeat(2),16),Q=parseInt(r.slice(2,3).repeat(2),16),ee=parseInt(r.slice(3,4).repeat(2),16),W=parseInt(r.slice(4,5).repeat(2),16),O.toColor(J,Q,ee,W);case 7:return{css:r,rgba:(parseInt(r.slice(1),16)<<8|255)>>>0};case 9:return{css:r,rgba:parseInt(r.slice(1),16)>>>0}}let s=r.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return J=parseInt(s[1],10),Q=parseInt(s[2],10),ee=parseInt(s[3],10),W=Math.round((s[5]===void 0?1:parseFloat(s[5]))*255),O.toColor(J,Q,ee,W);if(r==="transparent")return{css:"transparent",rgba:0};if(!n||!t)throw new Error("css.toColor: Unsupported css format");if(n.fillStyle=t,n.fillStyle=r,typeof n.fillStyle!="string")throw new Error("css.toColor: Unsupported css format");if(n.fillRect(0,0,1,1),[J,Q,ee,W]=n.getImageData(0,0,1,1).data,W!==255)throw new Error("css.toColor: Unsupported css format");return{rgba:O.toRgba(J,Q,ee,W),css:r}}i.toColor=e})(M||={});var Z;(e=>{function n(i){return t(i>>16&255,i>>8&255,i&255)}e.relativeLuminance=n;function t(i,r,s){let o=i/255,a=r/255,l=s/255,h=o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4),d=a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4),c=l<=.03928?l/12.92:Math.pow((l+.055)/1.055,2.4);return h*.2126+d*.7152+c*.0722}e.relativeLuminance2=t})(Z||={});var Bi;(s=>{function n(o,a){if(W=(a&255)/255,W===1)return a;let l=a>>24&255,h=a>>16&255,d=a>>8&255,c=o>>24&255,u=o>>16&255,_=o>>8&255;return J=c+Math.round((l-c)*W),Q=u+Math.round((h-u)*W),ee=_+Math.round((d-_)*W),O.toRgba(J,Q,ee)}s.blend=n;function t(o,a,l){let h=Z.relativeLuminance(o>>8),d=Z.relativeLuminance(a>>8);if(De(h,d)>8));if(v>8));return v>S?p:f}return p}let u=i(o,a,l),_=De(h,Z.relativeLuminance(u>>8));if(_>8));return _>v?u:p}return u}}s.ensureContrastRatio=t;function e(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v0||_>0||p>0);)u-=Math.max(0,Math.ceil(u*.1)),_-=Math.max(0,Math.ceil(_*.1)),p-=Math.max(0,Math.ceil(p*.1)),v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));return(u<<24|_<<16|p<<8|255)>>>0}s.reduceLuminance=e;function i(o,a,l){let h=o>>24&255,d=o>>16&255,c=o>>8&255,u=a>>24&255,_=a>>16&255,p=a>>8&255,v=De(Z.relativeLuminance2(u,_,p),Z.relativeLuminance2(h,d,c));for(;v>>0}s.increaseLuminance=i;function r(o){return[o>>24&255,o>>16&255,o>>8&255,o&255]}s.toChannels=r})(Bi||={});function Ve(n){let t=n.toString(16);return t.length<2?"0"+t:t}function De(n,t){return n0&&(this._lastCompositionData=t.data),this._renderCompositionView(t.data??""),this._compositionView.classList.toggle("active",!!t.data),this.updateCompositionElements();let e=this._compositionTransactionId;this._cancelDeferredTimer(this._compositionPositionTimer),this._compositionPositionTimer=this._defer(()=>{if(this._isComposing&&this._compositionTransactionId===e){this._compositionHasObservedProgress||=this._hasCompositionProgress();let i=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,i)}})}compositionend(t){if(!this._isAwaitingCompositionEnd)return!1;if(!this._isComposing){let i=this._pendingComposition;return i?.transactionId===this._compositionTransactionId&&(i.endData=t?.data??"",this._updatePostCompositionInputExpectation(i)),!1}let e=t?.data??"";if(this._compositionHasObservedProgress||=this._hasCompositionProgress(),!this._compositionEndBelongsToCurrentTransaction(e)){let i=this._pendingComposition;return i&&i.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(i),this._deferCompositionEnd(e),!1}return this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._finalizeComposition(!0,e),!0}blur(){if(this._cancelDeferredTimer(this._compositionEndTimer),this._compositionEndTimer=void 0,this._isComposing){let t=this._textarea.selectionEnd??this._textarea.value.length;this._compositionPosition.end=Math.max(this._compositionPosition.start,t)}(this._isComposing||this.hasPendingCompositionFinalization)&&this._finalizeComposition(!1)}dispose(){this._textareaChangeTimer!==void 0&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0);for(let t of this._compositionTimers)clearTimeout(t);this._compositionTimers.clear(),this._compositionPositionTimer=void 0,this._compositionViewTimer=void 0,this._compositionEndTimer=void 0,this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionTransactionId++,this._compositionView.classList.remove("active"),this._resetCompositionView()}keydown(t){if(this._canceledKey?.code===t.code&&this._canceledKey.timeStamp===t.timeStamp)return this._canceledKey=void 0,!1;if(t.key==="Escape"&&(this._isComposing||this.hasPendingCompositionFinalization))return this._canceledKey={code:t.code,timeStamp:t.timeStamp},this._cancelComposition(),!1;if(this._isComposing||this.hasPendingCompositionFinalization){if(this._deferPreeditResync(this._composedRegionLength()>0),t.keyCode===20||t.keyCode===229||t.keyCode===16||t.keyCode===17||t.keyCode===18)return!1;this._finalizeComposition(!1)}return this._imeKeydownAwaitingCommit=t.keyCode===229,t.keyCode===229?(this._handleAnyTextareaChanges(),!1):!0}keypress(t){let e=this._pendingComposition;return e?e.keypressMayOverlapComposition?(e.keypressData+=t,!0):e.expectsPostCompositionInput&&e.keypressData.length===0?(e.keypressData=t,!0):(this._sendPendingComposition(e),!1):!1}input(t){if(this._isComposing)return this._compositionHasObservedProgress||=this._hasCompositionProgress(),this._compositionInputData+=t,!0;let e=this._pendingComposition;if(!e)return this._claimImeKeydownCommit(t);if(e.expectsPostCompositionInput)return e.inputData+=t,e.expectsPostCompositionInput=!1,this._sendPendingComposition(e),!0;let i=t.length>0&&this._getPendingTextareaInput(e)===t&&this._getPendingTextareaInput(e,!0)===t;return this._sendPendingComposition(e),i||this._coreService.triggerDataEvent(t,!0),!0}_claimImeKeydownCommit(t){return this._imeKeydownAwaitingCommit?(this._imeKeydownAwaitingCommit=!1,this._textareaChangeTimer!==void 0&&(clearTimeout(this._textareaChangeTimer),this._textareaChangeTimer=void 0),this._coreService.triggerDataEvent(t,!0),!0):!1}_finalizeComposition(t,e=""){let i=this._isComposing;if(this._compositionView.classList.remove("active"),this._resetCompositionView(),this._isComposing=!1,!(t&&!i)){if(t){this._pendingComposition&&this._sendPendingComposition(this._pendingComposition);let r={transactionId:this._compositionTransactionId,lifecycleSettled:!1,sessionEnded:!1,position:{start:this._compositionPosition.start,end:this._compositionPosition.end},suffix:this._compositionSuffix,dataAlreadySent:this._dataAlreadySent,compositionData:this._lastCompositionData,endData:e,inputData:this._compositionInputData,keypressData:"",keypressMayOverlapComposition:this._lastCompositionData.length===0&&e.length===0,expectsPostCompositionInput:!1};this._updatePostCompositionInputExpectation(r),this._pendingComposition=r,r.finalizerTimer=this._defer(()=>{r.finalizerTimer=void 0,this._compositionTransactionId===r.transactionId&&(this._isAwaitingCompositionEnd=!1),this._pendingComposition===r&&this._sendPendingComposition(r,!0)})}else if(this._pendingComposition&&this._sendPendingComposition(this._pendingComposition,!0),i){let r=this._getCompositionInput(this._compositionPosition.start+this._dataAlreadySent.length,this._compositionSuffix);this._sendCompositionInput(this._compositionTransactionId,r)}}}_sendPendingComposition(t,e=!1){this._cancelPendingFinalizer(t),this._pendingComposition===t&&(this._pendingComposition=void 0);let i=this._getPendingTextareaInput(t,e),r=this._removeAlreadySentData(t.inputData||t.keypressData,t.dataAlreadySent),s=this._mergeTextObservations(i||t.endData||(r?t.compositionData:""),r,t.keypressMayOverlapComposition);this._sendCompositionInput(t.transactionId,s,!t.sessionEnded),this._settlePendingComposition(t)}_cancelPendingFinalizer(t){t.finalizerTimer!==void 0&&(clearTimeout(t.finalizerTimer),this._compositionTimers.delete(t.finalizerTimer),t.finalizerTimer=void 0)}_settlePendingComposition(t){t.lifecycleSettled||(t.lifecycleSettled=!0,this._dispatchCompositionTransactionSettled())}_mergeTextObservations(t,e,i){if(!e||t.includes(e))return t;if(!t||e.includes(t))return e;if(i){let s=Math.min(t.length,e.length);for(;s>0&&!t.endsWith(e.substring(0,s));)s--;let o=Math.min(t.length,e.length);for(;o>0&&!e.endsWith(t.substring(0,o));)o--;return s>o?t+e.substring(s):e+t.substring(o)}let r=Math.min(t.length,e.length);for(;r>0&&!t.endsWith(e.substring(0,r));)r--;return t+e.substring(r)}_updatePostCompositionInputExpectation(t){t.expectsPostCompositionInput=(t.endData.length>0||t.compositionData.length>0)&&t.inputData.length===0&&this._getPendingTextareaInput(t).length===0}_getPendingTextareaInput(t,e=!1){let i=this._textarea.value,r=t.position.start+t.dataAlreadySent.length;if(t.nextCompositionStart!==void 0)return i.substring(r,Math.max(r,t.nextCompositionStart));let s=t.suffix.length>0&&i.endsWith(t.suffix)?i.length-t.suffix.length:i.length,o=(t.endData||t.compositionData).length,a=e?s:Math.max(t.position.end,r+o);return i.substring(r,Math.max(r,Math.min(s,a)))}_getCompositionInput(t,e){let i=this._textarea.value,r=e.length>0&&i.endsWith(e)?i.length-e.length:i.length;return i.substring(t,Math.max(t,r))}_removeAlreadySentData(t,e){return e.length===0?t:t.startsWith(e)?t.substring(e.length):e.includes(t)?"":t}_cancelComposition(){let t=this._pendingComposition;t&&this._isComposing&&t.transactionId!==this._compositionTransactionId&&this._sendPendingComposition(t);let e=this._isComposing?this._compositionTransactionId:this._pendingComposition?.transactionId??0,i=t!==void 0&&this._pendingComposition===t;this._pendingComposition=void 0,this._isAwaitingCompositionEnd=!1,this._isComposing=!1,this._compositionView.classList.remove("active"),this._resetCompositionView(),this._textarea.value=this._textarea.value.substring(0,this._compositionPosition.start)+this._compositionSuffix,this._sendCompositionInput(e,""),i&&t&&this._settlePendingComposition(t)}_sendCompositionInput(t,e,i=!0){let r=!1;if(i){let s=new CustomEvent(Xs,{bubbles:!0,cancelable:!0,detail:{id:t,data:e}});this._dispatchCompositionSessionEvent(s),r=s.defaultPrevented}e.length>0&&!r&&this._coreService.triggerDataEvent(e,!0)}_endPendingCompositionSession(t){if(t.sessionEnded)return;t.sessionEnded=!0;let e=this._getPendingTextareaInput(t)||t.endData||t.compositionData;this._dispatchCompositionSessionEvent(new CustomEvent(Xs,{bubbles:!0,cancelable:!0,detail:{id:t.transactionId,data:e,dataPendingReconciliation:!0}}))}_dispatchCompositionSessionEvent(t){typeof this._textarea.dispatchEvent=="function"&&this._textarea.dispatchEvent(t)}_dispatchCompositionTransactionSettled(){this._dispatchCompositionSessionEvent(new CustomEvent("xterm-composition-transaction-settled",{bubbles:!0}))}_deferCompositionEnd(t){this._cancelDeferredTimer(this._compositionEndTimer);let e=this._compositionTransactionId,i=this._defer(()=>{if(this._compositionEndTimer!==i||!this._isComposing||this._compositionTransactionId!==e)return;if(this._compositionEndTimer=void 0,!this._compositionEndBelongsToCurrentTransaction(t)){t.length===0&&!this._hasCompositionProgress()&&this._cancelComposition();return}this._finalizeComposition(!0,t),this._dispatchCompositionSessionEvent(new CustomEvent(Yn,{bubbles:!0}));let r=this._pendingComposition;r?.transactionId===e&&this._sendPendingComposition(r,!0)});this._compositionEndTimer=i}_composedRegionLength(){let t=this._textarea.value.length-this._compositionSuffix.length;return Math.max(0,t-this._compositionPosition.start)}_deferPreeditResync(t){if(!t||!this._isComposing)return;let e=this._compositionTransactionId;this._defer(()=>{this._isComposing&&this._compositionTransactionId===e&&this._composedRegionLength()===0&&this._cancelComposition()})}_hasCompositionProgress(){let t=this._textarea.selectionStart??this._textarea.value.length,e=this._textarea.selectionEnd??t;return this._compositionHasObservedProgress||this._textarea.value!==this._compositionStartValue||t!==this._compositionStartSelection.start||e!==this._compositionStartSelection.end}_compositionEndBelongsToCurrentTransaction(t){return this._hasCompositionProgress()||t.length>0&&t===this._lastCompositionData}_defer(t){let e=setTimeout(()=>{this._compositionTimers.delete(e),t()},0);return this._compositionTimers.add(e),e}_cancelDeferredTimer(t){t!==void 0&&(clearTimeout(t),this._compositionTimers.delete(t))}_handleAnyTextareaChanges(){if(this._textareaChangeTimer)return;let t=this._textarea.value;this._textareaChangeTimer=window.setTimeout(()=>{if(this._textareaChangeTimer=void 0,!this._isComposing){let e=this._textarea.value,i=e.replace(t,"");e!==t&&(this._imeKeydownAwaitingCommit=!1),this._dataAlreadySent=i,e.length>t.length?this._coreService.triggerDataEvent(i,!0):e.lengththis.updateCompositionElements(!0)))}};Ee=y([m(2,D),m(3,R),m(4,Y),m(5,V),m(6,ce)],Ee);var Oi=class extends fe{constructor(e,i,r){super();this.content=0;this.combinedData="";this.fg=e.fg,this.bg=e.bg,this.combinedData=i,this._width=r}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()]}},We=class{constructor(t){this._bufferService=t;this._characterJoiners=[];this._nextCharacterJoinerId=0;this._workCell=new F}register(t){let e={id:this._nextCharacterJoinerId++,handler:t};return this._characterJoiners.push(e),e.id}deregister(t){for(let e=0;e1){let u=this._getJoinedRanges(r,l,a,e,o);for(let _=0;_1){let c=this._getJoinedRanges(r,l,a,e,o);for(let u=0;u=As,Tr=ae,x=this._workCell;if(v.length>0&&ae===v[0][0]&&Ze){let k=v.shift(),kr=this._isCellInSelection(k[0],e);for(T=k[0]+1;T=k[1],Ze?(ui=!0,x=new Oi(this._workCell,t.translateToString(!0,k[0],k[1]),k[1]-k[0]),Tr=k[1]-1,wr=x.getWidth()):As=k[1]}let Nt=this._isCellInSelection(ae,e),Dr=i&&ae===o,Rr=Ln&&ae>=c&&ae<=u;_&&x.isBlink()&&(_.hasBlinkingCells=!0),!l&&x.isBlink()&&N.push("xterm-blink-hidden");let Lr=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,k=>{Lr=!0});let fi=x.getChars()||" ";if(fi===" "&&(x.isUnderline()||x.isOverline())&&(fi="\xA0"),Ot=wr*h-d.get(fi,x.isBold(),x.isItalic()),!C)C=this._document.createElement("span");else if(w&&(Nt&&di||!Nt&&!di&&x.bg===te)&&(Nt&&di&&f.selectionForeground||x.fg===Ts)&&x.extended.ext===Ds&&Rr===Rs&&Ot===Ls&&!Dr&&!ui&&!Lr&&Ze){x.isInvisible()?A+=" ":A+=fi,w++;continue}else w&&(C.textContent=A),C=this._document.createElement("span"),w=0,A="";if(te=x.bg,Ts=x.fg,Ds=x.extended.ext,Rs=Rr,Ls=Ot,di=Nt,ui&&o>=ae&&o<=Tr&&(o=ae),!this._coreService.isCursorHidden&&Dr&&this._coreService.isCursorInitialized){if(N.push("xterm-cursor"),this._coreBrowserService.isFocused)a&&N.push("xterm-cursor-blink"),N.push(r==="bar"?"xterm-cursor-bar":r==="underline"?"xterm-cursor-underline":"xterm-cursor-block");else if(s)switch(s){case"outline":N.push("xterm-cursor-outline");break;case"block":N.push("xterm-cursor-block");break;case"bar":N.push("xterm-cursor-bar");break;case"underline":N.push("xterm-cursor-underline");break;default:break}}if(x.isBold()&&N.push("xterm-bold"),x.isItalic()&&N.push("xterm-italic"),x.isDim()&&N.push("xterm-dim"),x.isInvisible()?A=" ":A=x.getChars()||" ",x.isUnderline()&&(N.push(`xterm-underline-${x.extended.underlineStyle}`),A===" "&&(A="\xA0"),!x.isUnderlineColorDefault()))if(x.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${fe.toColorRGB(x.getUnderlineColor()).join(",")})`;else{let k=x.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&x.isBold()&&k<8&&(k+=8),C.style.textDecorationColor=f.ansi[k].css}x.isOverline()&&(N.push("xterm-overline"),A===" "&&(A="\xA0")),x.isStrikethrough()&&N.push("xterm-strikethrough"),Rr&&(C.style.textDecoration="underline");let ue=x.getFgColor(),Ft=x.getFgColorMode(),Se=x.getBgColor(),Ht=x.getBgColorMode(),Ar=!!x.isInverse();if(Ar){let k=ue;ue=Se,Se=k;let kr=Ft;Ft=Ht,Ht=kr}let Ae,_i,Wt=!1;this._decorationService.forEachDecorationAtCell(ae,e,void 0,k=>{k.options.layer!=="top"&&Wt||(k.backgroundColorRGB&&(Ht=50331648,Se=k.backgroundColorRGB.rgba>>8&16777215,Ae=k.backgroundColorRGB),k.foregroundColorRGB&&(Ft=50331648,ue=k.foregroundColorRGB.rgba>>8&16777215,_i=k.foregroundColorRGB),Wt=k.options.layer==="top")}),!Wt&&Nt&&(Ae=this._coreBrowserService.isFocused?f.selectionBackgroundOpaque:f.selectionInactiveBackgroundOpaque,Se=Ae.rgba>>8&16777215,Ht=50331648,Wt=!0,f.selectionForeground&&(Ft=50331648,ue=f.selectionForeground.rgba>>8&16777215,_i=f.selectionForeground)),Wt&&N.push("xterm-decoration-top");let ke;switch(Ht){case 16777216:case 33554432:ke=f.ansi[Se],N.push(`xterm-bg-${Se}`);break;case 50331648:ke=O.toColor(Se>>16,Se>>8&255,Se&255),this._addStyle(C,`background-color:#${(Se>>>0).toString(16).padStart(6,"0")}`);break;case 0:default:Ar?(ke=f.foreground,N.push(`xterm-bg-${257}`)):ke=f.background}switch(Ae||x.isDim()&&(Ae=L.multiplyOpacity(ke,.5)),Ft){case 16777216:case 33554432:x.isBold()&&ue<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(ue+=8),this._applyMinimumContrast(C,ke,f.ansi[ue],x,Ae,void 0)||N.push(`xterm-fg-${ue}`);break;case 50331648:let k=O.toColor(ue>>16&255,ue>>8&255,ue&255);this._applyMinimumContrast(C,ke,k,x,Ae,_i)||this._addStyle(C,`color:#${ue.toString(16).padStart(6,"0")}`);break;case 0:default:this._applyMinimumContrast(C,ke,f.foreground,x,Ae,_i)||Ar&&N.push(`xterm-fg-${257}`)}N.length&&(C.className=N.join(" "),N.length=0),!Dr&&!ui&&!Lr&&Ze?w++:C.textContent=A,Ot!==this.defaultSpacing&&(C.style.letterSpacing=`${Ot}px`),p.push(C),ae=Tr}return C&&w&&(C.textContent=A),p}_applyMinimumContrast(t,e,i,r,s,o){if(this._optionsService.rawOptions.minimumContrastRatio===1||Ys(r.getCode()))return!1;let a=this._getContrastCache(r),l;if(!s&&!o&&(l=a.getColor(e.rgba,i.rgba)),l===void 0){let h=this._optionsService.rawOptions.minimumContrastRatio/(r.isDim()?2:1);l=L.ensureContrastRatio(s??e,o??i,h),a.setColor((s??e).rgba,(o??i).rgba,l??null)}return l?(this._addStyle(t,`color:${l.css}`),!0):!1}_getContrastCache(t){return t.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(t,e){t.setAttribute("style",`${t.getAttribute("style")||""}${e};`)}_isCellInSelection(t,e){let i=this._selectionStart,r=this._selectionEnd;return!i||!r?!1:this._columnSelectMode?i[0]<=r[0]?t>=i[0]&&e>=i[1]&&t=i[1]&&t>=r[0]&&e<=r[1]:e>i[1]&&e=i[0]&&t=i[0]}};_t=y([m(1,Si),m(2,R),m(3,G),m(4,Y),m(5,ge),m(6,ce)],_t);var Fi=class{constructor(t=()=>new es){this._flat=new Float32Array(256);this._font="";this._fontSize=0;this._weight="normal";this._weightBold="bold";this._canvasElements=[];this._canvasElements=[t(),t(),t(),t()],this.clear()}dispose(){this._canvasElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(t,e,i,r){t===this._font&&e===this._fontSize&&i===this._weight&&r===this._weightBold||(this._font=t,this._fontSize=e,this._weight=i,this._weightBold=r,this._canvasElements[0].setFont(t,e,i,!1),this._canvasElements[1].setFont(t,e,r,!1),this._canvasElements[2].setFont(t,e,i,!0),this._canvasElements[3].setFont(t,e,r,!0),this.clear())}get(t,e,i){let r;if(!e&&!i&&t.length===1&&(r=t.charCodeAt(0))<256){if(this._flat[r]!==-9999)return this._flat[r];let a=this._measure(t,0);return a>0&&(this._flat[r]=a),a}let s=t;e&&(s+="B"),i&&(s+="I");let o=this._holey.get(s);if(o===void 0){let a=0;e&&(a|=1),i&&(a|=2),o=this._measure(t,a),o>0&&this._holey.set(s,o)}return o}_measure(t,e){return this._canvasElements[e].measure(t)}},es=class{constructor(){typeof OffscreenCanvas<"u"?(this._canvas=new OffscreenCanvas(1,1),this._ctx=Qr(this._canvas.getContext("2d"))):(this._canvas=document.createElement("canvas"),this._canvas.width=1,this._canvas.height=1,this._ctx=Qr(this._canvas.getContext("2d")))}setFont(t,e,i,r){let s=r?"italic":"";this._ctx.font=`${s} ${i} ${e}px ${t}`.trim()}measure(t){return this._ctx.measureText(t).width}};var ts=class{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(t,e,i,r=!1){if(this.selectionStart=e,this.selectionEnd=i,!e||!i||e[0]===i[0]&&e[1]===i[1]){this.clear();return}let s=t.buffers.active.ydisp,o=e[1]-s,a=i[1]-s,l=Math.max(o,0),h=Math.min(a,t.rows-1);if(l>=t.rows||h<0){this.clear();return}this.hasSelection=!0,this.columnSelectMode=r,this.viewportStartRow=o,this.viewportEndRow=a,this.viewportCappedStartRow=l,this.viewportCappedEndRow=h,this.startCol=e[0],this.endCol=i[0]}isCellSelected(t,e,i){return this.hasSelection?(i-=t.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?e>=this.startCol&&i>=this.viewportCappedStartRow&&e=this.viewportCappedStartRow&&e>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&e=this.startCol):!1}};function Zs(){return new ts}var Hi=class extends g{constructor(e,i,r){super();this._renderCallback=e;this._coreBrowserService=i;this._optionsService=r;this._intervalDuration=0;this._blinkOn=!0;this._needsBlinkInViewport=!1;this._isViewportVisible=!0;this._register(this._optionsService.onSpecificOptionChange("blinkIntervalDuration",s=>{this.setIntervalDuration(s)})),this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration),this._register(E(()=>this._clearInterval()))}get isBlinkOn(){return this._blinkOn}get isEnabled(){return this._intervalDuration>0}setNeedsBlinkInViewport(e){this._needsBlinkInViewport!==e&&(this._needsBlinkInViewport=e,this._updateIntervalState())}setViewportVisible(e){this._isViewportVisible!==e&&(this._isViewportVisible=e,this._updateIntervalState())}setIntervalDuration(e){e!==this._intervalDuration&&(this._intervalDuration=e,this._clearInterval(),this._updateIntervalState())}_updateIntervalState(){if(this._intervalDuration>0&&this._needsBlinkInViewport&&this._isViewportVisible){if(this._interval!==void 0)return;let i=this._blinkOn;this._blinkOn=!0,this._interval=this._coreBrowserService.window.setInterval(()=>{this._blinkOn=!this._blinkOn,this._renderCallback()},this._intervalDuration),i||this._renderCallback();return}this._clearInterval(),this._blinkOn||(this._blinkOn=!0,this._renderCallback())}_clearInterval(){this._interval!==void 0&&(this._coreBrowserService.window.clearInterval(this._interval),this._interval=void 0)}};var Jn=1,mt=class extends g{constructor(e,i,r,s,o,a,l,h,d,c,u,_,p,v){super();this._terminal=e;this._document=i;this._element=r;this._screenElement=s;this._viewportElement=o;this._helperContainer=a;this._linkifier2=l;this._charSizeService=d;this._optionsService=c;this._bufferService=u;this._coreService=_;this._coreBrowserService=p;this._themeService=v;this._terminalClass=Jn++;this._rowElements=[];this._selectionRenderModel=Zs();this._lastSelectionColumnMode=!1;this._rowHasBlinkingCells=[];this._rowHasBlinkingCellsCount=0;this._onRequestRedraw=this._register(new b);this.onRequestRedraw=this._onRequestRedraw.event;this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add("xterm-rows"),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("xterm-selection"),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=js(),this._updateDimensions(),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._themeService.onChangeColors(f=>this._injectCss(f))),this._injectCss(this._themeService.colors),this._rowFactory=h.createInstance(_t,document),this._element.classList.add("xterm-dom-renderer-owner-"+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this._register(this._linkifier2.onShowLinkUnderline(f=>this._handleLinkHover(f))),this._register(this._linkifier2.onHideLinkUnderline(f=>this._handleLinkLeave(f))),this._cursorBlinkStateManager=new is(this._rowContainer,this._coreBrowserService),this._register(I(this._document,"mousedown",()=>this._cursorBlinkStateManager.restartBlinkAnimation())),this._register(E(()=>this._cursorBlinkStateManager.dispose())),this._textBlinkStateManager=this._register(new Hi(()=>this._onRequestRedraw.fire({start:0,end:this._bufferService.rows-1}),this._coreBrowserService,this._optionsService)),this._register(E(()=>{this._element.classList.remove("xterm-dom-renderer-owner-"+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()})),this._widthCache=new Fi,this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){let 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(let r of this._rowElements)r.style.width=`${this.dimensions.css.canvas.width}px`,r.style.height=`${this.dimensions.css.cell.height}px`,r.style.lineHeight=`${this.dimensions.css.cell.height}px`,r.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));let i=`${this._terminalSelector} .xterm-rows span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=i,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 i=`${this._terminalSelector} .xterm-rows { pointer-events: none; color: ${e.foreground.css};}`;i+=`${this._terminalSelector} .xterm-rows, ${this._terminalSelector} .xterm-rows span { font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`,i+=`${this._terminalSelector} .xterm-rows .xterm-dim { color: ${L.multiplyOpacity(e.foreground,.5).css};}`,i+=`${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;}${this._terminalSelector} span.xterm-blink-hidden { visibility: hidden;}`;let r=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,o=`blink_block_${this._terminalClass}`;i+=`@keyframes ${r} { 50% { border-bottom-style: hidden; }}`,i+=`@keyframes ${s} { 50% { box-shadow: none; }}`,i+=`@keyframes ${o} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,i+=`${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-focus .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${o} 1s step-end infinite;}${this._terminalSelector} .xterm-rows.xterm-cursor-blink-idle .xterm-cursor.xterm-cursor-blink { animation: none !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .xterm-rows .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,i+=`${this._terminalSelector} .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .xterm-selection div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .xterm-selection div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(let[a,l]of e.ansi.entries())i+=`${this._terminalSelector} .xterm-fg-${a} { color: ${l.css}; }${this._terminalSelector} .xterm-fg-${a}.xterm-dim { color: ${L.multiplyOpacity(l,.5).css}; }${this._terminalSelector} .xterm-bg-${a} { background-color: ${l.css}; }`;i+=`${this._terminalSelector} .xterm-fg-${257} { color: ${L.opaque(e.background).css}; }${this._terminalSelector} .xterm-fg-${257}.xterm-dim { color: ${L.multiplyOpacity(L.opaque(e.background),.5).css}; }${this._terminalSelector} .xterm-bg-${257} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=i}_setDefaultSpacing(){let 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,i){for(let r=this._rowElements.length;r<=i;r++){let s=this._document.createElement("div");this._rowContainer.appendChild(s),this._rowElements.push(s),this._rowHasBlinkingCells.push(!1)}for(;this._rowElements.length>i;)this._rowContainer.removeChild(this._rowElements.pop()),this._rowHasBlinkingCells.pop()&&this._rowHasBlinkingCellsCount--}handleResize(e,i){this._refreshRowElements(e,i),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("xterm-focus"),this._cursorBlinkStateManager.pause(),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add("xterm-focus"),this._cursorBlinkStateManager.resume(),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleViewportVisibilityChange(e){this._textBlinkStateManager.setViewportVisible(e)}handleSelectionChanged(e,i,r){let s=this._bufferService.rows;this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,i,r);let o=0,a=-1;this._lastSelectionStart&&this._lastSelectionEnd&&(this._selectionRenderModel.update(this._terminal,this._lastSelectionStart,this._lastSelectionEnd,this._lastSelectionColumnMode),this._selectionRenderModel.hasSelection&&(o=this._selectionRenderModel.viewportCappedStartRow,a=this._selectionRenderModel.viewportCappedEndRow));let l=0,h=-1;if(!e||!i)return;if(this._selectionRenderModel.update(this._terminal,e,i,r),this._selectionRenderModel.hasSelection){let u=this._selectionRenderModel.viewportStartRow,_=this._selectionRenderModel.viewportEndRow,p=this._selectionRenderModel.viewportCappedStartRow,v=this._selectionRenderModel.viewportCappedEndRow;l=p,h=v;let f=this._document.createDocumentFragment();if(r){let S=e[0]>i[0];f.appendChild(this._createSelectionElement(p,S?i[0]:e[0],S?e[0]:i[0],v-p+1))}else{let S=u===p?e[0]:0,C=p===_?i[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(p,S,C));let w=v-p-1;if(f.appendChild(this._createSelectionElement(p+1,0,this._bufferService.cols,w)),p!==v){let A=_===v?i[0]:this._bufferService.cols;f.appendChild(this._createSelectionElement(v,0,A))}}this._selectionContainer.appendChild(f)}let d=Math.min(o,l),c=Math.max(a,h);if(c>=0){d=Math.max(d,0),c=Math.min(c,s-1);let _=this._bufferService.buffer.y;this._selectionRenderModel.hasSelection&&_>=0&&_this.dimensions.css.canvas.width&&(l=this.dimensions.css.canvas.width-a),o.style.height=`${s*this.dimensions.css.cell.height}px`,o.style.top=`${e*this.dimensions.css.cell.height}px`,o.style.left=`${a}px`,o.style.width=`${l}px`,o}handleCursorMove(){this._cursorBlinkStateManager.restartBlinkAnimation()}_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(let e of this._rowElements)e.replaceChildren();this._rowHasBlinkingCellsCount>0&&(this._rowHasBlinkingCells.fill(!1),this._rowHasBlinkingCellsCount=0,this._textBlinkStateManager.setNeedsBlinkInViewport(!1))}renderRows(e,i){let r=this._bufferService.buffer,s=r.ybase+r.y,o=Math.min(r.x,this._bufferService.cols-1),a=this._coreService.decPrivateModes.cursorBlink??this._optionsService.rawOptions.cursorBlink,l=this._coreService.decPrivateModes.cursorStyle??this._optionsService.rawOptions.cursorStyle,h=this._optionsService.rawOptions.cursorInactiveStyle,d={hasBlinkingCells:!1};for(let c=e;c<=i;c++){let u=c+r.ydisp,_=this._rowElements[c];if(!_)continue;let p=r.lines.get(u);if(!p){_.replaceChildren(),this._setRowBlinkState(c,!1);continue}_.replaceChildren(...this._rowFactory.createRow(p,u,u===s,l,h,o,a,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,-1,-1,d)),this._setRowBlinkState(c,d.hasBlinkingCells)}this._updateTextBlinkState()}get _terminalSelector(){return`.xterm-dom-renderer-owner-${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,i,r,s,o,a){r<0&&(e=0),s<0&&(i=0);let l=this._bufferService.rows-1;r=Math.max(Math.min(r,l),0),s=Math.max(Math.min(s,l),0),o=Math.min(o,this._bufferService.cols);let h=this._bufferService.buffer,d=h.ybase+h.y,c=Math.min(h.x,o-1),u=this._optionsService.rawOptions.cursorBlink,_=this._optionsService.rawOptions.cursorStyle,p=this._optionsService.rawOptions.cursorInactiveStyle,v={hasBlinkingCells:!1};for(let f=r;f<=s;++f){let S=f+h.ydisp,C=this._rowElements[f];if(!C)continue;let w=h.lines.get(S);if(!w){C.replaceChildren(),this._setRowBlinkState(f,!1);continue}C.replaceChildren(...this._rowFactory.createRow(w,S,S===d,_,p,c,u,this._textBlinkStateManager.isBlinkOn,this.dimensions.css.cell.width,this._widthCache,a?f===r?e:0:-1,a?(f===s?i:o)-1:-1,v)),this._setRowBlinkState(f,v.hasBlinkingCells)}this._updateTextBlinkState()}_setRowBlinkState(e,i){this._rowHasBlinkingCells[e]!==i&&(this._rowHasBlinkingCells[e]=i,this._rowHasBlinkingCellsCount+=i?1:-1)}_updateTextBlinkState(){this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount>0)}};mt=y([m(7,et),m(8,Be),m(9,R),m(10,D),m(11,Y),m(12,G),m(13,ce)],mt);var is=class{constructor(t,e){this._rowContainer=t;this._coreBrowserService=e;this._isIdlePaused=!1;this._coreBrowserService.isFocused&&this._resetIdleTimer()}dispose(){this._clearIdleTimer()}restartBlinkAnimation(){this._isIdlePaused&&this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}pause(){this._isIdlePaused=!1,this._clearIdleTimer()}resume(){this._isIdlePaused=!1,this._rowContainer.classList.remove("xterm-cursor-blink-idle"),this._resetIdleTimer()}_resetIdleTimer(){this._isIdlePaused=!1,this._clearIdleTimer(),this._idleTimeout=this._coreBrowserService.window.setTimeout(()=>{this._stopBlinkingDueToIdle()},3e5)}_clearIdleTimer(){this._idleTimeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._idleTimeout),this._idleTimeout=void 0)}_stopBlinkingDueToIdle(){this._rowContainer.classList.add("xterm-cursor-blink-idle"),this._isIdlePaused=!0,this._idleTimeout=void 0}};var bt=class extends g{constructor(e,i,r){super();this._optionsService=r;this.width=0;this.height=0;this._onCharSizeChange=this._register(new b);this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this._register(new ss(this._optionsService))}catch{this._measureStrategy=this._register(new rs(e,i,this._optionsService))}this._register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],()=>this.measure()))}get hasValidSize(){return this.width>0&&this.height>0}measure(){let e=this._measureStrategy.measure();(e.width!==this.width||e.height!==this.height)&&(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};bt=y([m(2,R)],bt);var Wi=class extends g{constructor(){super(...arguments);this._result={width:0,height:0}}_validateAndSet(e,i){e!==void 0&&e>0&&i!==void 0&&i>0&&(this._result.width=e,this._result.height=i)}},rs=class extends Wi{constructor(e,i,r){super();this._document=e;this._parentElement=i;this._optionsService=r;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}},ss=class extends Wi{constructor(e){super();this._optionsService=e;this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");let i=this._ctx.measureText("W");if(!("width"in i&&"fontBoundingBoxAscent"in i&&"fontBoundingBoxDescent"in i))throw new Error("Required font metrics not supported")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;let e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}};var Ui=class extends g{constructor(e,i,r){super();this._textarea=e;this._window=i;this.mainDocument=r;this._isFocused=!1;this._cachedIsFocused=void 0;this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._onWindowChange=this._register(new b);this.onWindowChange=this._onWindowChange.event;this._screenDprMonitor=this._register(new ns(this._window)),this._register(this.onWindowChange(s=>this._screenDprMonitor.setWindow(s))),this._register(j.forward(this._screenDprMonitor.onDprChange,this._onDprChange)),this._register(I(this._textarea,"focus",()=>this._isFocused=!0)),this._register(I(this._textarea,"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 this._cachedIsFocused===void 0&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask(()=>this._cachedIsFocused=void 0)),this._cachedIsFocused}},ns=class extends g{constructor(e){super();this._parentWindow=e;this._windowResizeListener=this._register(new B);this._onDprChange=this._register(new b);this.onDprChange=this._onDprChange.event;this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this._register(E(()=>this.clearListener()))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=I(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)}};var Ki=class extends g{constructor(){super();this.linkProviders=[];this._register(E(()=>this.linkProviders.length=0))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{let i=this.linkProviders.indexOf(e);i!==-1&&this.linkProviders.splice(i,1)}}}};function qt(n,t,e){let i=e.getBoundingClientRect(),r=n.getComputedStyle(e),s=parseInt(r.getPropertyValue("padding-left"),10),o=parseInt(r.getPropertyValue("padding-top"),10);return[t.clientX-i.left-s,t.clientY-i.top-o]}function Js(n,t,e,i,r,s,o,a,l){if(!s)return;let h=qt(n,t,e);return h[0]=Math.ceil((h[0]+(l?o/2:0))/o),h[1]=Math.ceil(h[1]/a),h[0]=Math.min(Math.max(h[0],1),i+(l?1:0)),h[1]=Math.min(Math.max(h[1],1),r),h}var vt=class{constructor(t,e){this._charSizeService=t;this._renderService=e}getCoords(t,e,i,r,s){return Js(se(e),t,e,i,r,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,s)}getMouseReportCoords(t,e){let i=qt(se(e),t,e);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])}}};vt=y([m(0,Be),m(1,V)],vt);var Qs=typeof window=="object"?window:globalThis;function he(n,t=0){return n[n.length-(1+t)]}function Qn(n,t,e){let i=null,r=null;if(typeof e.value=="function"?(i="value",r=e.value,r.length!==0&&console.warn("Memoize should only be used in functions with zero parameters")):typeof e.get=="function"&&(i="get",r=e.get),!r||!i)throw new Error("not supported");let s=`$memoize$${t}`,o=e;o[i]=function(...a){return this.hasOwnProperty(s)||Object.defineProperty(this,s,{configurable:!1,enumerable:!1,writable:!1,value:r.apply(this,a)}),this[s]}}var St=class St{constructor(t){this.element=t,this.next=St.Undefined,this.prev=St.Undefined}};St.Undefined=new St(void 0);var re=St,zi=class{constructor(){this._first=re.Undefined;this._last=re.Undefined}push(t){return this._insert(t,!0)}_insert(t,e){let i=new re(t);if(this._first===re.Undefined)this._first=i,this._last=i;else if(e){let s=this._last;this._last=i,i.prev=s,s.next=i}else{let s=this._first;this._first=i,i.next=s,s.prev=i}let r=!1;return()=>{r||(r=!0,this._remove(i))}}_remove(t){if(t.prev!==re.Undefined&&t.next!==re.Undefined){let e=t.prev;e.next=t.next,t.next.prev=e}else t.prev===re.Undefined&&t.next===re.Undefined?(this._first=re.Undefined,this._last=re.Undefined):t.next===re.Undefined?(this._last=this._last.prev,this._last.next=re.Undefined):t.prev===re.Undefined&&(this._first=this._first.next,this._first.prev=re.Undefined)}*[Symbol.iterator](){let t=this._first;for(;t!==re.Undefined;)yield t.element,t=t.next}},de;(s=>(s.TAP="-xterm-gesturetap",s.CHANGE="-xterm-gesturechange",s.START="-xterm-gesturestart",s.END="-xterm-gesturesend",s.CONTEXT_MENU="-xterm-gesturecontextmenu"))(de||={});var K=class K extends g{constructor(){super();this._dispatched=!1;this._targets=new zi;this._ignoreTargets=new zi;this._activeTouches={},this._handle=null,this._lastSetTapCountTime=0;let e=Qs;this._register(I(e.document,"touchstart",i=>this._handleTouchStart(i),{passive:!1})),this._register(I(e.document,"touchend",i=>this._handleTouchEnd(e,i))),this._register(I(e.document,"touchmove",i=>this._handleTouchMove(i),{passive:!1}))}static addTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let i=K._instance._targets.push(e);return E(i)}static ignoreTarget(e){if(!K.isTouchDevice())return g.None;K._instance||(K._instance=new K);let i=K._instance._ignoreTargets.push(e);return E(i)}static isTouchDevice(){return"ontouchstart"in Qs||navigator.maxTouchPoints>0}dispose(){this._handle&&(this._handle.dispose(),this._handle=null),super.dispose()}_handleTouchStart(e){let i=Date.now();this._handle&&(this._handle.dispose(),this._handle=null);for(let r=0,s=e.targetTouches.length;r=K._holdDelay&&Math.abs(h.initialPageX-he(h.rollingPageX))<30&&Math.abs(h.initialPageY-he(h.rollingPageY))<30){let c=this._newGestureEvent(de.CONTEXT_MENU,h.initialTarget);c.pageX=he(h.rollingPageX),c.pageY=he(h.rollingPageY),this._dispatchEvent(c)}else if(s===1){let c=he(h.rollingPageX),u=he(h.rollingPageY),_=he(h.rollingTimestamps)-h.rollingTimestamps[0],p=c-h.rollingPageX[0],v=u-h.rollingPageY[0],f=[...this._targets].filter(S=>h.initialTarget instanceof Node&&S.contains(h.initialTarget));this._inertia(e,f,r,Math.abs(p)/_,p>0?1:-1,c,Math.abs(v)/_,v>0?1:-1,u)}this._dispatchEvent(this._newGestureEvent(de.END,h.initialTarget)),delete this._activeTouches[l.identifier]}this._dispatched&&(i.preventDefault(),i.stopPropagation(),this._dispatched=!1)}_newGestureEvent(e,i){let r=document.createEvent("CustomEvent");return r.initEvent(e,!1,!0),r.initialTarget=i,r.tapCount=0,r}_dispatchEvent(e){if(e.type===de.TAP){let i=new Date().getTime(),r;i-this._lastSetTapCountTime>K._clearTapCountTime?r=1:r=2,this._lastSetTapCountTime=i,e.tapCount=r}else(e.type===de.CHANGE||e.type===de.CONTEXT_MENU)&&(this._lastSetTapCountTime=0);if(e.initialTarget instanceof Node){for(let r of this._ignoreTargets)if(r.contains(e.initialTarget))return;let i=[];for(let r of this._targets)if(r.contains(e.initialTarget)){let s=0,o=e.initialTarget;for(;o&&o!==r;)s++,o=o.parentElement;i.push([s,r])}i.sort((r,s)=>r[0]-s[0]);for(let[,r]of i)r.dispatchEvent(e),this._dispatched=!0}}_inertia(e,i,r,s,o,a,l,h,d){this._handle=it(e,()=>{let c=Date.now(),u=c-r,_=0,p=0,v=!0;s+=K._scrollFriction*u,l+=K._scrollFriction*u,s>0&&(v=!1,_=o*s*u),l>0&&(v=!1,p=h*l*u);let f=this._newGestureEvent(de.CHANGE);f.translationX=_,f.translationY=p,i.forEach(S=>S.dispatchEvent(f)),v||this._inertia(e,i,c,s,o,a+_,l,h,d+p)})}_handleTouchMove(e){let i=Date.now();for(let r=0,s=e.changedTouches.length;r3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(o.pageX),a.rollingPageY.push(o.pageY),a.rollingTimestamps.push(i)}this._dispatched&&(e.preventDefault(),e.stopPropagation(),this._dispatched=!1)}};K._scrollFriction=-.005,K._holdDelay=700,K._clearTapCountTime=400,y([Qn],K,"isTouchDevice",1);var Gi=K;var gt=class{constructor(t,e,i,r,s,o,a,l,h){this._renderService=t;this._mouseCoordsService=e;this._mouseStateService=i;this._coreService=r;this._bufferService=s;this._optionsService=o;this._selectionService=a;this._logService=l;this._coreBrowserService=h;this._lastEvent=null;this._wheelPartialScroll=0;this._touchScrollAccumulator=0}bindMouse(t,e,i){let{element:r,document:s}=t,o={mouseup:null,wheel:null,mousedrag:null,mousemove:null},a=new B,l=new B;e(a),e(l);let h={target:t,focus:i,requestedEvents:o,mouseupListener:a,mousedragListener:l},d={mouseup:c=>this._handleMouseUp(h,c),wheel:c=>this._handleWheel(h,c),mousedrag:c=>this._handleMouseDrag(h,c),mousemove:c=>this._handleMouseMove(h,c)};this._altMouseCursor=new os(r,s,()=>this._mouseStateService.areMouseEventsActive&&!!this._optionsService.rawOptions.mouseEventsRequireAlt),e(this._altMouseCursor),e(this._mouseStateService.onProtocolChange(c=>{this._handleProtocolChange(h,d,c)})),e(this._optionsService.onSpecificOptionChange("mouseEventsRequireAlt",()=>{this._syncMouseModeState(r),this._altMouseCursor?.sync()})),this._mouseStateService.activeProtocol=this._mouseStateService.activeProtocol,e(I(r,"mousedown",c=>this._handleMouseDown(h,c))),e(I(r,"wheel",c=>this._handlePassiveWheel(h,c),{passive:!1})),e(Gi.addTarget(t.screenElement)),e(I(t.screenElement,de.START,()=>this._handleTouchStart())),e(I(t.screenElement,de.CHANGE,c=>this._handleTouchChange(h,c)))}_sendEvent(t,e){let i=this._mouseCoordsService.getMouseReportCoords(e,t.target.screenElement);if(!i)return!1;let r,s;switch(e.overrideType||e.type){case"mousemove":s=32,e.buttons===void 0?(r=3,e.button!==void 0&&(r=e.button<3?e.button:3)):r=e.buttons&1?0:e.buttons&4?1:e.buttons&2?2:3;break;case"mouseup":s=0,r=e.button<3?e.button:3;break;case"mousedown":s=1,r=e.button<3?e.button:3;break;case"wheel":if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;let a=e.deltaY;if(a===0||this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return!1;s=a<0?0:1,r=4;break;default:return!1}if(s===void 0||r===void 0||r>4||r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&!e.altKey)return!1;let o=r!==4&&this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive;return this._triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:r,action:s,ctrl:e.ctrlKey,alt:o?!1:e.altKey,shift:e.shiftKey})}_handleMouseUp(t,e){this._sendEvent(t,e),e.buttons||(t.mouseupListener.clear(),t.mousedragListener.clear())}_handleWheel(t,e){return this._sendEvent(t,e),e.preventDefault(),e.stopPropagation(),!1}_handleMouseDrag(t,e){e.buttons&&this._sendEvent(t,e)}_handleMouseMove(t,e){e.buttons||this._sendEvent(t,e)}_handleMouseDown(t,e){if(e.preventDefault(),t.focus(),!this._mouseStateService.areMouseEventsActive||this._selectionService.shouldForceSelection(e))return;this._sendEvent(t,e);let{element:i,document:r}=t.target,s=i.ownerDocument??r;t.requestedEvents.mouseup&&(t.mouseupListener.value=I(s,"mouseup",t.requestedEvents.mouseup)),t.requestedEvents.mousedrag&&(t.mousedragListener.value=I(s,"mousemove",t.requestedEvents.mousedrag))}_handlePassiveWheel(t,e){if(!t.requestedEvents.wheel){if(!this._mouseStateService.allowCustomWheelEvent(e))return!1;if(!this._bufferService.buffer.hasScrollback){if(e.deltaY===0)return!1;if(this._consumeWheelEvent(e,this._renderService?.dimensions?.device?.cell?.height,this._coreBrowserService?.dpr)===0)return e.preventDefault(),e.stopPropagation(),!1;let s="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");return this._coreService.triggerDataEvent(s,!0),e.preventDefault(),e.stopPropagation(),!1}}}_handleTouchStart(){this._touchScrollAccumulator=0}_handleTouchChange(t,e){if(e.preventDefault(),e.stopPropagation(),t.requestedEvents.wheel){this._handleTouchScrollAsWheel(t,e);return}if(!this._bufferService.buffer.hasScrollback){this._handleTouchScrollAsKeys(e);return}t.target.handleTouchScroll?.(e.translationY)}_handleTouchScrollAsKeys(t){let e=this._renderService?.dimensions.css.cell.height;if(!e)return;this._touchScrollAccumulator-=t.translationY;let i=Math.trunc(this._touchScrollAccumulator/e);if(i===0)return;this._touchScrollAccumulator-=i*e;let r="\x1B"+(this._coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(i<0?"A":"B");for(let s=0;s0?1:-1),this._wheelPartialScroll%=1):t.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(s*=this._bufferService.rows),s}_triggerMouseEvent(t){if(t.col<0||t.col>=this._bufferService.cols||t.row<0||t.row>=this._bufferService.rows||t.button===4&&t.action===32||t.button===3&&t.action!==32||t.button!==4&&(t.action===2||t.action===3)||(t.col++,t.row++,t.action===32&&this._lastEvent&&this._equalEvents(this._lastEvent,t,this._mouseStateService.isPixelEncoding))||!this._mouseStateService.restrictMouseEvent(t))return!1;let e=this._mouseStateService.encodeMouseEvent(t);return e&&(this._mouseStateService.isDefaultEncoding?this._coreService.triggerBinaryEvent(e):this._coreService.triggerDataEvent(e,!0)),this._lastEvent=t,!0}_explainEvents(t){return{down:!!(t&1),up:!!(t&2),drag:!!(t&4),move:!!(t&8),wheel:!!(t&16)}}_equalEvents(t,e,i){if(i){if(t.x!==e.x||t.y!==e.y)return!1}else if(t.col!==e.col||t.row!==e.row)return!1;return!(t.button!==e.button||t.action!==e.action||t.ctrl!==e.ctrl||t.alt!==e.alt||t.shift!==e.shift)}};gt=y([m(0,V),m(1,Oe),m(2,Me),m(3,Y),m(4,D),m(5,R),m(6,vi),m(7,_e),m(8,G)],gt);var os=class{constructor(t,e,i){this._element=t;this._document=e;this._isActive=i;this._listeners=new B}dispose(){this._listeners.dispose()}sync(){if(this._listeners.clear(),!this._isActive())return;let t=new pe,e=r=>this.syncFromModifier(r);t.add(I(this._document,"keydown",e)),t.add(I(this._document,"keyup",e)),t.add(I(this._element,"mousemove",e));let i=this._element.ownerDocument?.defaultView;i&&t.add(I(i,"blur",()=>{this._isActive()&&this.resetClass()})),this._listeners.value=t}resetClass(){this._updateClass(!1)}syncFromModifier(t){this._isActive()&&this._updateClass(t.getModifierState("Alt"))}_updateClass(t){t?this._element.classList.add("enable-mouse-events"):this._element.classList.remove("enable-mouse-events")}};var Vi=class{constructor(t,e){this._renderCallback=t;this._coreBrowserService=e;this._refreshCallbacks=[]}dispose(){this._animationFrame!==void 0&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(t){return this._refreshCallbacks.push(t),this._animationFrame??=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()),this._animationFrame}refresh(t,e,i){this._rowCount=i,t=t??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,t):t,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e,this._animationFrame===void 0&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._innerRefresh()))}_innerRefresh(){if(this._animationFrame=void 0,this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0){this._runRefreshCallbacks();return}let t=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(t,e),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(let t of this._refreshCallbacks)t(0);this._refreshCallbacks=[]}};var $i=class{constructor(t){this._tasks=[];this._i=0;this._logService=t}enqueue(t){this._tasks.push(t),this._start()}flush(){for(;this._is){r-e<-20&&this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(r-e))}ms`),this._start();return}r=s}this.clear()}},as=class extends $i{_requestCallback(t){return setTimeout(()=>t(this._createDeadline(16)))}_cancelCallback(t){clearTimeout(t)}_createDeadline(t){let e=performance.now()+t;return{timeRemaining:()=>Math.max(0,e-performance.now())}}},ls=class extends $i{_requestCallback(t){return requestIdleCallback(t)}_cancelCallback(t){cancelIdleCallback(t)}},Ct="requestIdleCallback"in globalThis?ls:as,qi=class{constructor(t){this._queue=new Ct(t)}set(t){this._queue.clear(),this._queue.enqueue(t)}flush(){this._queue.flush()}dispose(){this._queue.clear()}};var It=class extends g{constructor(e,i,r,s,o,a,l,h,d,c){super();this._rowCount=e;this._optionsService=r;this._logService=s;this._charSizeService=o;this._coreService=a;this._coreBrowserService=d;this._renderer=this._register(new B);this._observerDisposable=this._register(new B);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 b);this.onDimensionsChange=this._onDimensionsChange.event;this._onRenderedViewportChange=this._register(new b);this.onRenderedViewportChange=this._onRenderedViewportChange.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onRefreshRequest=this._register(new b);this.onRefreshRequest=this._onRefreshRequest.event;this._pausedResizeTask=this._register(new qi(this._logService)),this._renderDebouncer=new Vi((u,_)=>this._renderRows(u,_),this._coreBrowserService),this._register(this._renderDebouncer),this._syncOutputHandler=new cs(this._coreBrowserService,this._coreService,()=>this._fullRefresh()),this._register(E(()=>this._syncOutputHandler.dispose())),this._register(this._coreBrowserService.onDprChange(()=>this.handleDevicePixelRatioChange())),this._register(h.onResize(()=>this._fullRefresh())),this._register(h.buffers.onBufferActivate(()=>this._renderer.value?.clear())),this._register(this._optionsService.onOptionChange(()=>this._handleOptionsChanged())),this._register(this._charSizeService.onCharSizeChange(()=>this.handleCharSizeChanged())),this._register(l.onDecorationRegistered(()=>this._fullRefresh())),this._register(l.onDecorationRemoved(()=>this._fullRefresh())),this._register(this._optionsService.onMultipleOptionChange(["drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()})),this._register(this._optionsService.onMultipleOptionChange(["cursorBlink","cursorStyle"],()=>this.refreshRows(h.buffer.y,h.buffer.y,void 0,!0))),this._register(c.onChangeColors(()=>this._fullRefresh())),this._registerIntersectionObserver(this._coreBrowserService.window,i),this._register(this._coreBrowserService.onWindowChange(u=>this._registerIntersectionObserver(u,i)))}get dimensions(){return this._renderer.value.dimensions}_registerIntersectionObserver(e,i){if("IntersectionObserver"in e){let r=new e.IntersectionObserver(s=>this._handleIntersectionChange(s[s.length-1]),{threshold:0});this._observerDisposable.value=E(()=>{this._intersectionObserver?.disconnect(),this._intersectionObserver=void 0}),this._intersectionObserver=r,r.observe(i)}}_handleIntersectionChange(e){this._isPaused=e.isIntersecting===void 0?e.intersectionRatio===0:!e.isIntersecting,this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused),!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,i,r=!1,s=!1){if(this._isPaused){this._needsFullRefresh=!0;return}if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,i);return}let o=this._syncOutputHandler.flush();o&&(e=Math.min(e,o.start),i=Math.max(i,o.end)),s||(this._isNextRenderRedrawOnly=!1),r?this._renderRows(e,i):this._renderDebouncer.refresh(e,i,this._rowCount)}_renderRows(e,i){if(this._renderer.value){if(this._coreService.decPrivateModes.synchronizedOutput){this._syncOutputHandler.bufferRows(e,i);return}e=Math.min(e,this._rowCount-1),i=Math.min(i,this._rowCount-1),this._renderer.value.renderRows(e,i),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:i}),this._onRender.fire({start:e,end:i}),this._isNextRenderRedrawOnly=!0}}resize(e,i){this._rowCount=i,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(i=>this.refreshRows(i.start,i.end,i.sync,!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,i){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set(()=>this._renderer.value?.handleResize(e,i)):this._renderer.value.handleResize(e,i),this._fullRefresh())}handleCharSizeChanged(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,i,r){this._selectionState.start=e,this._selectionState.end=i,this._selectionState.columnSelectMode=r,this._renderer.value?.handleSelectionChanged(e,i,r)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};It=y([m(2,R),m(3,_e),m(4,Be),m(5,Y),m(6,ge),m(7,D),m(8,G),m(9,ce)],It);var cs=class{constructor(t,e,i){this._coreBrowserService=t;this._coreService=e;this._onTimeout=i;this._start=0;this._end=0;this._isBuffering=!1}bufferRows(t,e){this._isBuffering?(this._start=Math.min(this._start,t),this._end=Math.max(this._end,e)):(this._start=t,this._end=e,this._isBuffering=!0),this._timeout??=this._coreBrowserService.window.setTimeout(()=>{this._timeout=void 0,this._coreService.decPrivateModes.synchronizedOutput=!1,this._onTimeout()},1e3)}flush(){if(this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0),!this._isBuffering)return;let t={start:this._start,end:this._end};return this._isBuffering=!1,t}dispose(){this._timeout!==void 0&&(this._coreBrowserService.window.clearTimeout(this._timeout),this._timeout=void 0)}};function en(n,t,e,i){let r=e.buffer.x,s=e.buffer.y;if(!e.buffer.hasScrollback)return so(r,s,n,t,e,i)+Xi(s,t,e,i)+no(r,s,n,t,e,i);let o;if(s===t)return o=r>n?"D":"C",Yt(Math.abs(r-n),Xt(o,i));o=s>t?"D":"C";let a=Math.abs(s-t),l=ro(s>t?n:r,e)+(a-1)*e.cols+1+io(s>t?r:n,e);return Yt(l,Xt(o,i))}function io(n,t){return n-1}function ro(n,t){return t.cols-n}function so(n,t,e,i,r,s){return Xi(t,i,r,s).length===0?"":Yt(rn(n,t,n,t-qe(t,r),!1,r).length,Xt("D",s))}function Xi(n,t,e,i){let r=n-qe(n,e),s=t-qe(t,e),o=Math.abs(r-s)-oo(n,t,e);return Yt(o,Xt(tn(n,t),i))}function no(n,t,e,i,r,s){let o;Xi(t,i,r,s).length>0?o=i-qe(i,r):o=t;let a=i,l=ao(n,t,e,i,r,s);return Yt(rn(n,o,e,a,l==="C",r).length,Xt(l,s))}function oo(n,t,e){let i=0,r=n-qe(n,e),s=t-qe(t,e);for(let o=0;o=0&&n0?o=i-qe(i,r):o=t,n=e&&ot?"A":"B"}function rn(n,t,e,i,r,s){let o=n,a=t,l="";for(;(o!==e||a!==i)&&a>=0&&as.cols-1?(l+=s.buffer.translateBufferLineToString(a,!1,n,o),o=0,n=0,a++):!r&&o<0&&(l+=s.buffer.translateBufferLineToString(a,!1,0,n+1),o=s.cols-1,n=o,a--);return l+s.buffer.translateBufferLineToString(a,!1,n,o)}function Xt(n,t){let e=t?"O":"[";return"\x1B"+e+n}function Yt(n,t){n=Math.floor(n);let e="";for(let i=0;ithis._bufferService.cols?t%this._bufferService.cols===0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)-1]:[t%this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)]:[t,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){let t=this.selectionStart[0]+this.selectionStartLength;return t>this._bufferService.cols?[t%this._bufferService.cols,this.selectionStart[1]+Math.floor(t/this._bufferService.cols)]:[Math.max(t,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){let t=this.selectionStart,e=this.selectionEnd;return!t||!e?!1:t[1]>e[1]||t[1]===e[1]&&t[0]>e[0]}handleTrim(t){return this.selectionStart&&(this.selectionStart[1]-=t),this.selectionEnd&&(this.selectionEnd[1]-=t),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):this.selectionStart&&this.selectionStart[1]<0?(this.selectionStart=[0,0],!0):!1}};function hs(n,t){if(n.start.y>n.end.y)throw new Error(`Buffer range end (${n.end.x}, ${n.end.y}) cannot be before start (${n.start.x}, ${n.start.y})`);return t*(n.end.y-n.start.y)+(n.end.x-n.start.x+1)}var lo="\xA0",co=new RegExp(lo,"g");var Et=class extends g{constructor(e,i,r,s,o,a,l,h,d,c){super();this._element=e;this._screenElement=i;this._linkifier=r;this._bufferService=s;this._coreService=o;this._mouseCoordsService=a;this._optionsService=l;this._mouseStateService=h;this._renderService=d;this._coreBrowserService=c;this._dragScrollAmount=0;this._enabled=!0;this._trimListener=this._register(new B);this._workCell=new F;this._mouseDownTimeStamp=0;this._oldHasSelection=!1;this._oldSelectionStart=void 0;this._oldSelectionEnd=void 0;this._onLinuxMouseSelection=this._register(new b);this.onLinuxMouseSelection=this._onLinuxMouseSelection.event;this._onRedrawRequest=this._register(new b);this.onRequestRedraw=this._onRedrawRequest.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onRequestScrollLines=this._register(new b);this.onRequestScrollLines=this._onRequestScrollLines.event;this._mouseMoveListener=u=>this._handleMouseMove(u),this._mouseUpListener=u=>this._handleMouseUp(u),this._coreService.onUserInput(()=>{this.hasSelection&&this.clearSelection()}),this._trimListener.value=this._bufferService.buffer.lines.onTrim(u=>this._handleTrim(u)),this._register(this._bufferService.buffers.onBufferActivate(u=>this._handleBufferActivate(u))),this.enable(),this._model=new Yi(this._bufferService),this._activeSelectionMode=0,this._register(E(()=>{this._removeMouseDownListeners()})),this._register(this._bufferService.onResize(u=>{u.rowsChanged&&this.clearSelection()}))}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(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd;return!e||!i?!1:e[0]!==i[0]||e[1]!==i[1]}get selectionText(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd;if(!e||!i)return"";let r=this._bufferService.buffer,s=[];if(this._activeSelectionMode===3){if(e[0]===i[0])return"";let a=e[0]a.replace(co," ")).join(Ke?`\r `:` --`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),zt&&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:this._activeSelectionMode===3})}_isClickInSelection(e){let t=this._getMouseBufferCoords(e),r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s||!t?!1:this._areCoordsInSelection(t,r,s)}isCellInSelection(e,t){let r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s?!1:this._areCoordsInSelection([e,t],r,s)}_areCoordsInSelection(e,t,r){return e[1]>t[1]&&e[1]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){let r=this._linkifier.currentLink?.link?.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=fs(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let s=this._getMouseBufferCoords(e);return s?(this._selectWordAt(s,t),this._model.selectionEnd=void 0,!0):!1}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){let t=this._mouseCoordsService.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=qt(this._coreBrowserService.window,e,this._screenElement)[1],r=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=r?0:(t>r&&(t-=r),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(t*14))}shouldForceSelection(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:ie?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0&&!(this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&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){let t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);let r=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);r&&r.length!==this._model.selectionStart[0]&&r.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!1:e.altKey&&!(ie&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));let r=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows-1,e.lines.length-1)):(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){let 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){let r=this._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(r&&r[0]!==void 0&&r[1]!==void 0){let s=tn(r[0]-1,r[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(s,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,r=!!e&&!!t&&(e[0]!==t[0]||e[1]!==t[1]);if(!r){this._oldHasSelection&&this._fireOnSelectionChange(e,t,r);return}!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,r)}_fireOnSelectionChange(e,t,r){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=r,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.value=e.activeBuffer.lines.onTrim(t=>this._handleTrim(t))}_convertViewportColToCharacterIndex(e,t){let r=t;for(let s=0;t>=s;s++){let o=e.loadCell(s,this._workCell).getChars().length;this._workCell.getWidth()===0?r--:o>1&&t!==s&&(r+=o-1)}return r}setSelection(e,t,r){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=r,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,r=!0,s=!0){if(e[0]>=this._bufferService.cols)return;let o=this._bufferService.buffer,a=o.lines.get(e[1]);if(!a)return;let l=o.translateBufferLineToString(e[1],!1),h=this._convertViewportColToCharacterIndex(a,e[0]),d=h,c=e[0]-h,u=0,_=0,p=0,v=0;if(l.charAt(h)===" "){for(;h>0&&l.charAt(h-1)===" ";)h--;for(;d1&&(v+=L-1,d+=L-1);I>0&&h>0&&!this._isCharWordSeparator(a.loadCell(I-1,this._workCell));){a.loadCell(I-1,this._workCell);let T=this._workCell.getChars().length;this._workCell.getWidth()===0?(u++,I--):T>1&&(p+=T-1,h-=T-1),h--,I--}for(;w1&&(v+=T-1,d+=T-1),d++,w++}}d++;let f=h+c-u+p,S=Math.min(this._bufferService.cols,d-h+u+_-p-v);if(!(!t&&l.slice(h,d).trim()==="")){if(r&&f===0&&a.getCodePoint(0)!==32){let I=o.lines.get(e[1]-1);if(I&&a.isWrapped&&I.getCodePoint(this._bufferService.cols-1)!==32){let w=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(w){let L=this._bufferService.cols-w.start;f-=L,S+=L}}}if(s&&f+S===this._bufferService.cols&&a.getCodePoint(this._bufferService.cols-1)!==32){let I=o.lines.get(e[1]+1);if(I?.isWrapped&&I.getCodePoint(0)!==32){let w=this._getWordAt([0,e[1]+1],!1,!1,!0);w&&(S+=w.length)}}return{start:f,length:S}}}_selectWordAt(e,t){let r=this._getWordAt(e,t);if(r){for(;r.start<0;)r.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[r.start,e[1]],this._model.selectionStartLength=r.length}}_selectToWordAt(e){let t=this._getWordAt(e,!0);if(t){let r=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,r--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,r++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,r]}}_isCharWordSeparator(e){return e.getWidth()===0?!1:this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){let t=this._bufferService.buffer.getWrappedRangeForLine(e),r={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=fs(r,this._bufferService.cols)}};Et=y([m(3,D),m(4,Y),m(5,Pe),m(6,R),m(7,Me),m(8,V),m(9,G)],Et);var jt=class{constructor(){this._data={}}set(i,e,t){this._data[i]||(this._data[i]={}),this._data[i][e]=t}get(i,e){return this._data[i]?this._data[i][e]:void 0}clear(){this._data={}}};var Zt=class{constructor(){this._color=new jt;this._css=new jt}setCss(i,e,t){this._css.set(i,e,t)}getCss(i,e){return this._css.get(i,e)}setColor(i,e,t){this._color.set(i,e,t)}getColor(i,e){return this._color.get(i,e)}clear(){this._color.clear(),this._css.clear()}};var $=Object.freeze((()=>{let n=[B.toColor("#2e3436"),B.toColor("#cc0000"),B.toColor("#4e9a06"),B.toColor("#c4a000"),B.toColor("#3465a4"),B.toColor("#75507b"),B.toColor("#06989a"),B.toColor("#d3d7cf"),B.toColor("#555753"),B.toColor("#ef2929"),B.toColor("#8ae234"),B.toColor("#fce94f"),B.toColor("#729fcf"),B.toColor("#ad7fa8"),B.toColor("#34e2e2"),B.toColor("#eeeeec")],i=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=i[e/36%6|0],r=i[e/6%6|0],s=i[e%6];n.push({css:O.toCss(t,r,s),rgba:O.toRgba(t,r,s)})}for(let e=0;e<24;e++){let t=8+e*10;n.push({css:O.toCss(t,t,t),rgba:O.toRgba(t,t,t)})}return n})());var qe=B.toColor("#ffffff"),Qt=B.toColor("#000000"),nn=B.toColor("#ffffff"),on=Qt,Jt={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},co=qe,yt=class extends g{constructor(e){super();this._optionsService=e;this._contrastCache=new Zt;this._halfContrastCache=new Zt;this._onChangeColors=this._register(new b);this.onChangeColors=this._onChangeColors.event;this._colors={foreground:qe,background:Qt,cursor:nn,cursorAccent:on,selectionForeground:void 0,selectionBackgroundTransparent:Jt,selectionBackgroundOpaque:k.blend(Qt,Jt),selectionInactiveBackgroundTransparent:Jt,selectionInactiveBackgroundOpaque:k.blend(Qt,Jt),scrollbarSliderBackground:k.opacity(qe,.2),scrollbarSliderHoverBackground:k.opacity(qe,.4),scrollbarSliderActiveBackground:k.opacity(qe,.5),overviewRulerBorder:qe,ansi:$.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)))}get colors(){return this._colors}_setTheme(e={}){let t=this._colors;if(t.foreground=M(e.foreground,qe),t.background=M(e.background,Qt),t.cursor=k.blend(t.background,M(e.cursor,nn)),t.cursorAccent=k.blend(t.background,M(e.cursorAccent,on)),t.selectionBackgroundTransparent=M(e.selectionBackground,Jt),t.selectionBackgroundOpaque=k.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=M(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=k.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?M(e.selectionForeground,ts):void 0,t.selectionForeground===ts&&(t.selectionForeground=void 0),k.isOpaque(t.selectionBackgroundTransparent)&&(t.selectionBackgroundTransparent=k.opacity(t.selectionBackgroundTransparent,.3)),k.isOpaque(t.selectionInactiveBackgroundTransparent)&&(t.selectionInactiveBackgroundTransparent=k.opacity(t.selectionInactiveBackgroundTransparent,.3)),t.scrollbarSliderBackground=M(e.scrollbarSliderBackground,k.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=M(e.scrollbarSliderHoverBackground,k.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=M(e.scrollbarSliderActiveBackground,k.opacity(t.foreground,.5)),t.overviewRulerBorder=M(e.overviewRulerBorder,co),t.ansi=$.slice(),t.ansi[0]=M(e.black,$[0]),t.ansi[1]=M(e.red,$[1]),t.ansi[2]=M(e.green,$[2]),t.ansi[3]=M(e.yellow,$[3]),t.ansi[4]=M(e.blue,$[4]),t.ansi[5]=M(e.magenta,$[5]),t.ansi[6]=M(e.cyan,$[6]),t.ansi[7]=M(e.white,$[7]),t.ansi[8]=M(e.brightBlack,$[8]),t.ansi[9]=M(e.brightRed,$[9]),t.ansi[10]=M(e.brightGreen,$[10]),t.ansi[11]=M(e.brightYellow,$[11]),t.ansi[12]=M(e.brightBlue,$[12]),t.ansi[13]=M(e.brightMagenta,$[13]),t.ansi[14]=M(e.brightCyan,$[14]),t.ansi[15]=M(e.brightWhite,$[15]),e.extendedAnsi){let r=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;s"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};function ln(n,i,e,t){let r={type:0,cancel:!1,key:void 0},s=(n.shiftKey?1:0)|(n.altKey?2:0)|(n.ctrlKey?4:0)|(n.metaKey?8:0);switch(n.keyCode){case 0:n.key==="UIKeyInputUpArrow"?i?r.key="\x1BOA":r.key="\x1B[A":n.key==="UIKeyInputLeftArrow"?i?r.key="\x1BOD":r.key="\x1B[D":n.key==="UIKeyInputRightArrow"?i?r.key="\x1BOC":r.key="\x1B[C":n.key==="UIKeyInputDownArrow"&&(i?r.key="\x1BOB":r.key="\x1B[B");break;case 8:r.key=n.ctrlKey?"\b":"\x7F",n.altKey&&(r.key="\x1B"+r.key);break;case 9:if(n.shiftKey){r.key="\x1B[Z";break}r.key=" ",r.cancel=!0;break;case 13:n.key==="c"&&n.ctrlKey?r.key="":r.key=n.altKey?"\x1B\r":"\r",r.cancel=!0;break;case 27:r.key="\x1B",n.altKey&&(r.key="\x1B\x1B"),r.cancel=!0;break;case 37:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"D":i?r.key="\x1BOD":r.key="\x1B[D";break;case 39:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"C":i?r.key="\x1BOC":r.key="\x1B[C";break;case 38:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"A":i?r.key="\x1BOA":r.key="\x1B[A";break;case 40:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"B":i?r.key="\x1BOB":r.key="\x1B[B";break;case 45:!n.shiftKey&&!n.ctrlKey&&(r.key="\x1B[2~");break;case 46:s?r.key="\x1B[3;"+(s+1)+"~":r.key="\x1B[3~";break;case 36:s?r.key="\x1B[1;"+(s+1)+"H":i?r.key="\x1BOH":r.key="\x1B[H";break;case 35:s?r.key="\x1B[1;"+(s+1)+"F":i?r.key="\x1BOF":r.key="\x1B[F";break;case 33:n.shiftKey?r.type=2:n.ctrlKey?r.key="\x1B[5;"+(s+1)+"~":r.key="\x1B[5~";break;case 34:n.shiftKey?r.type=3:n.ctrlKey?r.key="\x1B[6;"+(s+1)+"~":r.key="\x1B[6~";break;case 112:s?r.key="\x1B[1;"+(s+1)+"P":r.key="\x1BOP";break;case 113:s?r.key="\x1B[1;"+(s+1)+"Q":r.key="\x1BOQ";break;case 114:s?r.key="\x1B[1;"+(s+1)+"R":r.key="\x1BOR";break;case 115:s?r.key="\x1B[1;"+(s+1)+"S":r.key="\x1BOS";break;case 116:s?r.key="\x1B[15;"+(s+1)+"~":r.key="\x1B[15~";break;case 117:s?r.key="\x1B[17;"+(s+1)+"~":r.key="\x1B[17~";break;case 118:s?r.key="\x1B[18;"+(s+1)+"~":r.key="\x1B[18~";break;case 119:s?r.key="\x1B[19;"+(s+1)+"~":r.key="\x1B[19~";break;case 120:s?r.key="\x1B[20;"+(s+1)+"~":r.key="\x1B[20~";break;case 121:s?r.key="\x1B[21;"+(s+1)+"~":r.key="\x1B[21~";break;case 122:s?r.key="\x1B[23;"+(s+1)+"~":r.key="\x1B[23~";break;case 123:s?r.key="\x1B[24;"+(s+1)+"~":r.key="\x1B[24~";break;default:if(n.ctrlKey&&!n.shiftKey&&!n.altKey&&!n.metaKey)n.keyCode>=65&&n.keyCode<=90?r.key=String.fromCharCode(n.keyCode-64):n.keyCode===32?r.key="\0":n.keyCode>=51&&n.keyCode<=55?r.key=String.fromCharCode(n.keyCode-51+27):n.keyCode===56?r.key="\x7F":n.key==="/"?r.key="":n.keyCode===219?r.key="\x1B":n.keyCode===220?r.key="":n.keyCode===221&&(r.key="");else if((!e||t)&&n.altKey&&!n.metaKey){let a=ho[n.keyCode]?.[n.shiftKey?1:0];if(a)r.key="\x1B"+a;else if(n.keyCode>=65&&n.keyCode<=90){let l=n.ctrlKey?n.keyCode-64:n.keyCode+32,h=String.fromCharCode(l);n.shiftKey&&(h=h.toUpperCase()),r.key="\x1B"+h}else if(n.keyCode===32)r.key="\x1B"+(n.ctrlKey?"\0":" ");else if(n.key==="Dead"&&n.code.startsWith("Key")){let l=n.code.slice(3,4);n.shiftKey||(l=l.toLowerCase()),r.key="\x1B"+l,r.cancel=!0}}else if(e&&!n.altKey&&!n.ctrlKey&&!n.shiftKey&&n.metaKey)n.keyCode===65&&(r.type=1);else if(n.key&&!n.ctrlKey&&!n.altKey&&!n.metaKey&&n.keyCode>=48&&n.key.length===1)r.key=n.key;else if(n.key&&n.ctrlKey&&n.shiftKey)switch(n.code){case"Minus":r.key="";break;case"Digit2":r.key="\0";break;case"Digit6":r.key="";break}break}return r}var ei=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440};this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24};this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"};this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(i){if(i.code.startsWith("Numpad")){let e=i.code.slice(6);if(e>="0"&&e<="9")return 57399+parseInt(e,10);switch(e){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(i){switch(i.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(i){let e=0;return i.shiftKey&&(e|=1),i.altKey&&(e|=2),i.ctrlKey&&(e|=4),i.metaKey&&(e|=8),e>0?e+1:0}_getKeyCode(i,e){let t=this._getNumpadKeyCode(i);if(t!==void 0)return t;let r=this._getModifierKeyCode(i);if(r!==void 0)return r;let s=this._functionalKeyCodes[i.key];if(s!==void 0)return s;if((i.shiftKey||e&&i.altKey)&&i.code){if(i.code.startsWith("Digit")&&i.code.length===6){let o=i.code.charAt(5);if(o>="0"&&o<="9")return o.charCodeAt(0)}if(i.code.startsWith("Key")&&i.code.length===4)return i.code.charAt(3).toLowerCase().charCodeAt(0)}if(i.key.length===1){let o=i.key.codePointAt(0);return o>=65&&o<=90?o+32:o}}_isModifierKey(i){return i.key==="Shift"||i.key==="Control"||i.key==="Alt"||i.key==="Meta"}_isLockKey(i){return i.key==="CapsLock"||i.key==="NumLock"||i.key==="ScrollLock"}_buildCsiLetterSequence(i,e,t,r){let s=r&&t!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+t),o+=i,o}return"\x1B["+i}_buildSs3Sequence(i,e,t,r){let s=r&&t!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+t),o+=i,o}return"\x1BO"+i}_buildCsiTildeSequence(i,e,t,r){let s=r&&t!==1,o="\x1B["+i;return(e>0||s)&&(o+=";"+(e>0?e:"1"),s&&(o+=":"+t)),o+="~",o}_buildCsiUSequence(i,e,t,r,s,o,a){let l=!!(s&2),h=!!(s&4),d="\x1B["+e,c;h&&i.shiftKey&&i.key.length===1&&!o&&!a&&(c=i.key.codePointAt(0),d+=":"+c);let _=!!(s&16)&&r!==3&&i.key.length===1&&!o&&!a&&!i.ctrlKey?i.key.codePointAt(0):void 0,p=l&&r!==1&&(r===3||_===void 0);return(t>0||p||_!==void 0)&&(d+=";",t>0?d+=t:p&&(d+="1"),p&&(d+=":"+r)),_!==void 0&&(d+=";"+_),d+="u",d}evaluate(i,e,t=1,r=!1){let s={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(i),a=this._isModifierKey(i),l=!!(e&2);if(!l&&t===3||a&&!(e&8)||this._isLockKey(i)&&!(e&8))return s;let h=this._csiLetterKeys[i.key];if(h)return s.key=this._buildCsiLetterSequence(h,o,t,l),s.cancel=!0,s;let d=this._ss3FunctionKeys[i.key];if(d)return s.key=this._buildSs3Sequence(d,o,t,l),s.cancel=!0,s;let c=this._csiTildeKeys[i.key];if(c!==void 0)return s.key=this._buildCsiTildeSequence(c,o,t,l),s.cancel=!0,s;let u=this._getKeyCode(i,r);if(u===void 0)return s;let _=u===13||u===9||u===127;if(_&&t===3&&!(e&8))return s;let p=this._functionalKeyCodes[i.key]!==void 0||this._getNumpadKeyCode(i)!==void 0;if(!!(e&8||l&&t===3||(e&1||l)&&(p&&!_||o>0&&i.key.length!==1||o-1>1)))s.key=this._buildCsiUSequence(i,u,o,t,e,p,a),s.cancel=!0;else{let f=u===13?"\r":u===9?" ":u===127?"\x7F":void 0;f?s.key=f:i.key.length===1&&!i.ctrlKey&&!i.altKey&&!i.metaKey&&(s.key=i.key)}return s}static shouldUseProtocol(i){return i>0}};var Zi=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226};this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40};this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]);this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(i){let e=this._codeToVk[i.code];return e!==void 0?e:i.keyCode||0}_getScanCode(i){return this._codeToScancode[i.code]||0}_getUnicodeChar(i){if(i.ctrlKey&&!i.altKey&&!i.metaKey){if(i.key==="Enter")return 10;if(i.key==="Backspace")return 127}let e=this._keyToControlChar[i.key];if(e!==void 0)return e;if(i.key.length===1){let t=i.key.codePointAt(0)||0;if(i.ctrlKey&&!i.altKey&&!i.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(i){let e=0;return i.shiftKey&&(e|=16),i.ctrlKey&&(i.code==="ControlRight"?e|=4:e|=8),i.altKey&&(i.code==="AltRight"?e|=1:e|=2),this._enhancedKeyCodes.has(i.code)&&(e|=256),e}evaluateKeyboardEvent(i,e){let t=this._getVirtualKeyCode(i),r=this._getScanCode(i),s=this._getUnicodeChar(i),o=e?1:0,a=this._getControlKeyState(i);return{type:0,cancel:!0,key:`\x1B[${t};${r};${s};${o};${a};1_`}}};var xt=class{constructor(i,e){this._coreService=i;this._optionsService=e}_getWin32InputMode(){return this._win32InputMode??=new Zi,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new ei,this._kittyKeyboard}evaluateKeyDown(i){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(i,!0);let e=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(i,e,i.repeat?2:1,ie&&this._optionsService.rawOptions.macOptionIsMeta):ln(i,this._coreService.decPrivateModes.applicationCursorKeys,ie,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(i){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(i,!1);let e=this._coreService.kittyKeyboard.flags;if(this.useKitty&&e&2)return this._getKittyKeyboard().evaluate(i,e,3,ie&&this._optionsService.rawOptions.macOptionIsMeta)}get useKitty(){let i=this._coreService.kittyKeyboard.flags;return!!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard&&ei.shouldUseProtocol(i))}get useWin32InputMode(){return!!(this._optionsService.rawOptions.vtExtensions?.win32InputMode&&this._coreService.decPrivateModes.win32InputMode)}};xt=y([m(0,Y),m(1,R)],xt);var ps=class{constructor(...i){this._entries=new Map;for(let[e,t]of i)this.set(e,t)}set(i,e){let t=this._entries.get(i);return this._entries.set(i,e),t}forEach(i){for(let[e,t]of this._entries.entries())i(e,t)}has(i){return this._entries.has(i)}get(i){return this._entries.get(i)}},Ji=class{constructor(){this._services=new ps;this._services.set(Qe,this)}setService(i,e){this._services.set(i,e)}getService(i){return this._services.get(i)}createInstance(i,...e){let t=Hs(i).sort((o,a)=>o.index-a.index),r=[];for(let o of t){let a=this._services.get(o.id);if(!a)throw new Error(`[createInstance] ${i.name} depends on UNKNOWN service ${o.id._id}.`);r.push(a)}let s=t.length>0?t[0].index:e.length;if(e.length!==s)throw new Error(`[createInstance] First service dependency of ${i.name} at position ${s+1} conflicts with ${e.length} static arguments`);return new i(...e,...r)}};var uo={trace:0,debug:1,info:2,warn:3,error:4,off:5},fo="xterm.js: ",wt=class extends g{constructor(e){super();this._optionsService=e;this._logLevel=5;this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}get logLevel(){return this._logLevel}_updateLogLevel(){this._logLevel=uo[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;tthis._length)for(let t=this._length;t=e;s--)this._array[this._getCyclicIndex(s+r.length)]=this._array[this._getCyclicIndex(s)];for(let s=0;sthis._maxLength){let s=this._length+r.length-this._maxLength;this._startIndex+=s,this._length=this._maxLength,this.onTrimEmitter.fire(s)}else this._length+=r.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,r){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+r<0)throw new Error("Cannot shift elements in list beyond index 0");if(r>0){for(let o=t-1;o>=0;o--)this.set(e+o+r,this.get(e+o));let s=e+t+r-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;sthis._limit?(this._builder.reset(),!0):!1}toString(){return this._builder.toString()}};var U=Object.freeze(new ue),Qi=0,hn=new F,er=new ii,De=class n{constructor(i,e,t,r=!1){this._stringCache=i;this.isWrapped=r;this._combined={};this._extendedAttrs={};this._data=new Uint32Array(e*3);let s=t??F.fromCharData([0,"",1,0]);for(let o=0;o>22,e&2097152?this._combined[i].charCodeAt(this._combined[i].length-1):t]}set(i,e){this._invalidateStringCache(),this._data[i*3+1]=e[0],e[1].length>1?(this._combined[i]=e[1],this._data[i*3+0]=i|2097152|e[2]<<22):this._data[i*3+0]=e[1].charCodeAt(0)|e[2]<<22}getWidth(i){return this._data[i*3+0]>>22}hasWidth(i){return this._data[i*3+0]&12582912}getFg(i){return this._data[i*3+1]}getBg(i){return this._data[i*3+2]}hasContent(i){return this._data[i*3+0]&4194303}getCodePoint(i){let e=this._data[i*3+0];return e&2097152?this._combined[i].charCodeAt(this._combined[i].length-1):e&2097151}isCombined(i){return this._data[i*3+0]&2097152}getString(i){let e=this._data[i*3+0];return e&2097152?this._combined[i]:e&2097151?be(e&2097151):""}isProtected(i){return this._data[i*3+2]&536870912}loadCell(i,e){return Qi=i*3,e.content=this._data[Qi+0],e.fg=this._data[Qi+1],e.bg=this._data[Qi+2],e.content&2097152?e.combinedData=this._combined[i]:e.combinedData="",e.bg&268435456?e.extended=this._extendedAttrs[i]:e.extended=U.extended.clone(),e}setCell(i,e){this._invalidateStringCache(),e.content&2097152&&(this._combined[i]=e.combinedData),e.bg&268435456&&(this._extendedAttrs[i]=e.extended),this._data[i*3+0]=e.content,this._data[i*3+1]=e.fg,this._data[i*3+2]=e.bg}setCellFromCodepoint(i,e,t,r){this._invalidateStringCache(),r.bg&268435456&&(this._extendedAttrs[i]=r.extended),this._data[i*3+0]=e|t<<22,this._data[i*3+1]=r.fg,this._data[i*3+2]=r.bg}addCodepointToCell(i,e,t){this._invalidateStringCache();let r=this._data[i*3+0];r&2097152?this._combined[i]+=be(e):r&2097151?(this._combined[i]=be(r&2097151)+be(e),r&=-2097152,r|=2097152):r=e|1<<22,t&&(r&=-12582913,r|=t<<22),this._data[i*3+0]=r}insertCells(i,e,t){if(this._invalidateStringCache(),i%=this.length,i&&this.getWidth(i-1)===2&&this.setCellFromCodepoint(i-1,0,1,t),e=0;--r)this.setCell(i+e+r,this.loadCell(i+r,hn));for(let r=0;rthis.length){if(this._data.buffer.byteLength>=t*4)this._data=new Uint32Array(this._data.buffer,0,t);else{let r=new Uint32Array(t);r.set(this._data),this._data=r}for(let r=this.length;r=i&&delete this._combined[a]}let s=Object.keys(this._extendedAttrs);for(let o=0;o=i&&delete this._extendedAttrs[a]}}return this.length=i,t*4*2=0;--i)if(this._data[i*3+0]&4194303)return i+(this._data[i*3+0]>>22);return 0}getNoBgTrimmedLength(){for(let i=this.length-1;i>=0;--i)if(this._data[i*3+0]&4194303||this._data[i*3+2]&50331648)return i+(this._data[i*3+0]>>22);return 0}copyCellsFrom(i,e,t,r,s){this._invalidateStringCache();let o=i._data;if(s)for(let a=r-1;a>=0;a--){for(let l=0;l<3;l++)this._data[(t+a)*3+l]=o[(e+a)*3+l];this._copyCellMapsFrom(i,e+a,t+a)}else for(let a=0;a>22||1}r&&r.push(e);let a=er.toString();if(er.reset(),s){let l=this._getStringCacheEntry(!0);l.value=a,l.isTrimmed=!!i}return a}_getStringCacheEntry(i){let e=this._stringCacheEntryRef?.deref();if(e&&e.generation===this._stringCache.generation)return e;if(!i)return;let t=this._stringCache.allocateEntry();return this._stringCacheEntryRef=new WeakRef(t),t}_invalidateStringCache(){let i=this._getStringCacheEntry(!1);i&&(i.value=void 0,i.isTrimmed=!1)}_copyCellMapsFrom(i,e,t){let r=e*3;i._data[r+0]&2097152&&(this._combined[t]=i._combined[e]),i._data[r+2]&268435456&&(this._extendedAttrs[t]=i._extendedAttrs[e])}_copySparseMapsFrom(i){this._combined={},this._extendedAttrs={};for(let e=0;ethis.entries.clear()))}touch(){this._scheduleClear()}allocateEntry(){let e={value:void 0,isTrimmed:!1,generation:this.generation};return this.entries.add(e),this._scheduleClear(),e}clear(){this._clearTimeout.clear(),this._lastAccessTimestamp=0,this.generation++;for(let e of this.entries)e.value=void 0,e.isTrimmed=!1;this.entries.clear()}_scheduleClear(){this._lastAccessTimestamp=Date.now(),!this._clearTimeout.value&&this._scheduleClearTimeout(15e3)}_scheduleClearTimeout(e){this._clearTimeout.value=Gs(()=>{let t=Date.now()-this._lastAccessTimestamp;if(t>=15e3){this.clear();return}this._scheduleClearTimeout(15e3-t)},e)}};function dn(n,i,e,t,r,s){let o=[];for(let a=0;a=a&&t0&&(f>c||d[f].getTrimmedLength()===0);f--)v++;v>0&&(o.push(a+d.length-v),o.push(v)),a+=d.length-1}return o}function un(n,i){let e=[],t=0,r=i[t],s=0;for(let o=0;ol&&(s-=l,o++);let h=n[o].getWidth(s-1)===2;h&&s--;let d=h?e-1:e;t.push(d),a+=d}return t}function Tt(n,i,e){if(i===n.length-1)return n[i].getTrimmedLength();let t=!n[i].hasContent(e-1)&&n[i].getWidth(e-1)===1,r=n[i+1].getWidth(0)===2;return t&&r?e-1:e}var rr=class rr{constructor(i){this.line=i;this.isDisposed=!1;this._disposables=[];this._id=rr._nextId++;this._onDispose=this.register(new b);this.onDispose=this._onDispose.event}get id(){return this._id}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),Oe(this._disposables),this._disposables.length=0)}register(i){return this._disposables.push(i),i}};rr._nextId=1;var ir=rr;var q={},Re=q.B;q[0]={"`":"\u25C6",a:"\u2592",b:"\u2409",c:"\u240C",d:"\u240D",e:"\u240A",f:"\xB0",g:"\xB1",h:"\u2424",i:"\u240B",j:"\u2518",k:"\u2510",l:"\u250C",m:"\u2514",n:"\u253C",o:"\u23BA",p:"\u23BB",q:"\u2500",r:"\u23BC",s:"\u23BD",t:"\u251C",u:"\u2524",v:"\u2534",w:"\u252C",x:"\u2502",y:"\u2264",z:"\u2265","{":"\u03C0","|":"\u2260","}":"\xA3","~":"\xB7"};q.A={"#":"\xA3"};q.B=void 0;q[4]={"#":"\xA3","@":"\xBE","[":"ij","\\":"\xBD","]":"|","{":"\xA8","|":"f","}":"\xBC","~":"\xB4"};q.C=q[5]={"[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q.R={"#":"\xA3","@":"\xE0","[":"\xB0","\\":"\xE7","]":"\xA7","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xA8"};q.Q={"@":"\xE0","[":"\xE2","\\":"\xE7","]":"\xEA","^":"\xEE","`":"\xF4","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xFB"};q.K={"@":"\xA7","[":"\xC4","\\":"\xD6","]":"\xDC","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xDF"};q.Y={"#":"\xA3","@":"\xA7","[":"\xB0","\\":"\xE7","]":"\xE9","`":"\xF9","{":"\xE0","|":"\xF2","}":"\xE8","~":"\xEC"};q.E=q[6]={"@":"\xC4","[":"\xC6","\\":"\xD8","]":"\xC5","^":"\xDC","`":"\xE4","{":"\xE6","|":"\xF8","}":"\xE5","~":"\xFC"};q.Z={"#":"\xA3","@":"\xA7","[":"\xA1","\\":"\xD1","]":"\xBF","{":"\xB0","|":"\xF1","}":"\xE7"};q.H=q[7]={"@":"\xC9","[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q["="]={"#":"\xF9","@":"\xE0","[":"\xE9","\\":"\xE7","]":"\xEA","^":"\xEE",_:"\xE8","`":"\xF4","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xFB"};var pn=4294967295,si=class extends g{constructor(e,t,r,s){super();this._hasScrollback=e;this._optionsService=t;this._bufferService=r;this._logService=s;this.ydisp=0;this.ybase=0;this.y=0;this.x=0;this.tabs={};this.savedY=0;this.savedX=0;this.savedCurAttrData=U.clone();this.savedCharset=Re;this.savedCharsets=[];this.savedGlevel=0;this.savedOriginMode=!1;this.savedWraparoundMode=!0;this.markers=[];this._nullCell=F.fromCharData([0,"",1,0]);this._whitespaceCell=F.fromCharData([0," ",1,32]);this._isClearing=!1;this._memoryCleanupPosition=0;this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops(),this._memoryCleanupQueue=new It(this._logService),this._register(E(()=>this._memoryCleanupQueue.clear())),this._register(E(()=>this.clearAllMarkers())),this._stringCache=this._register(new tr)}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 ke),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 ke),this._whitespaceCell}getBlankLine(e,t){return new De(this._stringCache,this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){let t=this.ybase+this.y-this.ydisp;return t>=0&&tpn?pn:t}fillViewportRows(e){if(this.lines.length===0){e??=U;let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this._stringCache.clear(),this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){let r=this.getNullCell(U);this._stringCache.clear();let s=0,o=this._getCorrectBufferLength(t);if(o>this.lines.maxLength&&(this.lines.maxLength=o),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+a+1?(this.ybase--,a++,this.ydisp>0&&this.ydisp--):this.lines.push(new De(this._stringCache,e,r,!1)));else for(let l=this._rows;l>t;l--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(o0&&(this.lines.trimStart(l),this.ybase=Math.max(this.ybase-l,0),this.ydisp=Math.max(this.ydisp-l,0),this.savedY=Math.max(this.savedY-l,0)),this.lines.maxLength=o}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),a&&(this.y+=a),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 a=0;a0){let a=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,a)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){let e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&e.backend==="conpty"&&e.buildNumber>=21376:this._hasScrollback}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){let r=this._optionsService.rawOptions.reflowCursorLine,s=dn(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(U),r);if(s.length>0){let o=un(this.lines,s);fn(this.lines,o.layout),this._reflowLargerAdjustViewport(e,t,o.countRemoved)}}_reflowLargerAdjustViewport(e,t,r){let s=this.getNullCell(U),o=r;for(;o-- >0;)this.ybase===0?(this.y>0&&this.y--,this.lines.length=0;l--){let h=this.lines.get(l);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;let d=[h];for(;h.isWrapped&&l>0;)h=this.lines.get(--l),d.unshift(h);if(!r){let T=this.ybase+this.y;if(T>=l&&T0&&(o.push({start:l+d.length+a,newLines:v}),a+=v.length),d.push(...v);let f=u.length-1,S=u[f];S===0&&(f--,S=u[f]);let I=d.length-_-1,w=c;for(;I>=0;){let T=Math.min(w,S);if(d[f]===void 0)break;if(d[f].copyCellsFrom(d[I],w-T,S-T,T,!0),S-=T,S===0&&(f--,S=u[f]),w-=T,w===0){I--;let te=Math.max(I,0);w=Tt(d,te,this._cols)}}for(let T=0;T0;)this.ybase===0?this.y0){let l=[],h=[];for(let S=0;S=0;S--)if(_&&_.start>c+p){for(let I=_.newLines.length-1;I>=0;I--)this.lines.set(S--,_.newLines[I]);S++,l.push({index:c+1,amount:_.newLines.length}),p+=_.newLines.length,_=o[++u]}else this.lines.set(S,h[c--]);let v=0;for(let S=l.length-1;S>=0;S--)l[S].index+=v,this.lines.onInsertEmitter.fire(l[S]),v+=l[S].amount;let f=Math.max(0,d+a-this.lines.maxLength);f>0&&this.lines.onTrimEmitter.fire(f)}}translateBufferLineToString(e,t,r=0,s){let o=this.lines.get(e);return o?o.translateToString(t,r,s):""}getWrappedRangeForLine(e){let t=e,r=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;r+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(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-=r,t.line<0&&t.dispose()})),t.register(this.lines.onInsert(r=>{t.line>=r.index&&(t.line+=r.amount)})),t.register(this.lines.onDelete(r=>{t.line>=r.index&&t.liner.index&&(t.line-=r.amount)})),t.register(t.onDispose(()=>this._removeMarker(t))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}};var sr=class extends g{constructor(e,t,r){super();this._optionsService=e;this._bufferService=t;this._logService=r;this._normalBuffer=this._register(new P);this._altBuffer=this._register(new P);this._onBufferActivate=this._register(new b);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 si(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new si(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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)}};var Dt=class extends g{constructor(e,t){super();this.isUserScrolling=!1;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new sr(e,this,t)),this._register(this.buffers.onBufferActivate(r=>{this._onScroll.fire(r.activeBuffer.ydisp)}))}get buffer(){return this.buffers.active}resize(e,t){let r=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:r,rowsChanged:s})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){let r=this.buffer,s;s=this._cachedBlankLine,(!s||s.length!==this.cols||s.getFg(0)!==e.fg||s.getBg(0)!==e.bg)&&(s=r.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;let o=r.ybase+r.scrollTop,a=r.ybase+r.scrollBottom;if(r.scrollTop===0){let l=r.lines.isFull;a===r.lines.length-1?l?r.lines.recycle().copyFrom(s):r.lines.push(s.clone()):r.lines.splice(a+1,0,s.clone()),l?this.isUserScrolling&&(r.ydisp=Math.max(r.ydisp-1,0)):(r.ybase++,this.isUserScrolling||r.ydisp++)}else{let l=a-o+1;r.lines.shiftElements(o+1,l-1,-1),r.lines.set(a,s.clone())}this.isUserScrolling||(r.ydisp=r.ybase),this._onScroll.fire(r.ydisp)}scrollLines(e,t){let r=this.buffer;if(e<0){if(r.ydisp===0)return;this.isUserScrolling=!0}else e+r.ydisp>=r.ybase&&(this.isUserScrolling=!1);let s=r.ydisp;r.ydisp=Math.max(Math.min(r.ydisp+e,r.ybase),0),s!==r.ydisp&&(t||this._onScroll.fire(r.ydisp))}};Dt=y([m(0,R),m(1,fe)],Dt);var Rt={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:ie,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}},po=["normal","bold","100","200","300","400","500","600","700","800","900"],nr=class extends g{constructor(e){super();this._onOptionChange=this._register(new b);this.onOptionChange=this._onOptionChange.event;let t={...Rt};for(let r in e)if(r in t)try{let s=e[r];t[r]=this._sanitizeAndValidateOption(r,s)}catch(s){console.error(s)}this.rawOptions=t,this.options={...t},this._setupOptions(),this._register(E(()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null}))}onSpecificOptionChange(e,t){return this.onOptionChange(r=>{r===e&&t(this.rawOptions[e])})}onMultipleOptionChange(e,t){return this.onOptionChange(r=>{e.indexOf(r)!==-1&&t()})}_setupOptions(){let e=r=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);return this.rawOptions[r]},t=(r,s)=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);s=this._sanitizeAndValidateOption(r,s),this.rawOptions[r]!==s&&(this.rawOptions[r]=s,this._onOptionChange.fire(r))};for(let r in this.rawOptions){let s={get:e.bind(this,r),set:t.bind(this,r)};Object.defineProperty(this.options,r,s)}}_sanitizeAndValidateOption(e,t){switch(e){case"cursorStyle":if(t||(t=Rt[e]),!mo(t))throw new Error(`"${t}" is not a valid value for ${e}`);break;case"wordSeparator":t||(t=Rt[e]);break;case"fontWeight":case"fontWeightBold":if(typeof t=="number"&&1<=t&&t<=1e3)break;t=po.includes(t)?t:Rt[e];break;case"blinkIntervalDuration":if(t=Math.floor(t),t<0)throw new Error(`${e} cannot be less than 0, value: ${t}`);break;case"cursorWidth":t=Math.floor(t);case"lineHeight":case"tabStopWidth":if(t<1)throw new Error(`${e} cannot be less than 1, value: ${t}`);break;case"minimumContrastRatio":t=Math.max(1,Math.min(21,Math.round(t*10)/10));break;case"scrollback":if(t=Math.min(t,4294967295),t<0)throw new Error(`${e} cannot be less than 0, value: ${t}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(t<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${t}`);break;case"rows":case"cols":if(!t&&t!==0)throw new Error(`${e} must be numeric, value: ${t}`);break;case"windowsPty":t=t??{};break}return t}};function mo(n){return n==="block"||n==="underline"||n==="bar"}var mn=Object.freeze({insertMode:!1}),bn=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0}),vn=()=>({flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}),Lt=class extends g{constructor(e,t,r){super();this._bufferService=e;this._logService=t;this._optionsService=r;this.isCursorHidden=!1;this._onData=this._register(new b);this.onData=this._onData.event;this._onUserInput=this._register(new b);this.onUserInput=this._onUserInput.event;this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onRequestScrollToBottom=this._register(new b);this.onRequestScrollToBottom=this._onRequestScrollToBottom.event;this.isCursorInitialized=r.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(mn),this.decPrivateModes=structuredClone(bn),this.kittyKeyboard=vn()}reset(){this.modes=structuredClone(mn),this.decPrivateModes=structuredClone(bn),this.kittyKeyboard=vn()}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;let r=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&r.ybase!==r.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(s=>s.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(t=>t.charCodeAt(0))),this._onBinary.fire(e))}};Lt=y([m(0,D),m(1,fe),m(2,R)],Lt);var Sn={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:n=>n.button===4||n.action!==1?!1:(n.ctrl=!1,n.alt=!1,n.shift=!1,!0)},VT200:{events:19,restrict:n=>n.action!==32},DRAG:{events:23,restrict:n=>!(n.action===32&&n.button===3)},ANY:{events:31,restrict:n=>!0}};function vs(n,i){let e=(n.ctrl?16:0)|(n.shift?4:0)|(n.alt?8:0);return n.button===4?(e|=64,e|=n.action):(e|=n.button&3,n.button&4&&(e|=64),n.button&8&&(e|=128),n.action===32?e|=32:n.action===0&&!i&&(e|=3)),e}var Ss=String.fromCharCode,gn={DEFAULT:n=>{let i=[vs(n,!1)+32,n.col+32,n.row+32];return i[0]>255||i[1]>255||i[2]>255?"":`\x1B[M${Ss(i[0])}${Ss(i[1])}${Ss(i[2])}`},SGR:n=>{let i=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${vs(n,!0)};${n.col};${n.row}${i}`},SGR_PIXELS:n=>{let i=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${vs(n,!0)};${n.x};${n.y}${i}`}},or=class extends g{constructor(){super();this._protocols={};this._encodings={};this._activeProtocol="";this._activeEncoding="";this._onProtocolChange=this._register(new b);this.onProtocolChange=this._onProtocolChange.event;for(let e of Object.keys(Sn))this.addProtocol(e,Sn[e]);for(let e of Object.keys(gn))this.addEncoding(e,gn[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 this._protocols[this._activeProtocol].events!==0}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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return this._customWheelEventHandler?this._customWheelEventHandler(e)!==!1:!0}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return this._activeEncoding==="DEFAULT"}get isPixelEncoding(){return this._activeEncoding==="SGR_PIXELS"}};var me=class n{constructor(){this._providers=Object.create(null);this._active="";this._onChange=new b;this.onChange=this._onChange.event}static extractShouldJoin(i){return(i&1)!==0}static extractWidth(i){return i>>1&3}static extractCharKind(i){return i>>3}static createPropertyValue(i,e,t=!1){return(i&16777215)<<3|(e&3)<<1|(t?1:0)}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(i){if(!this._providers[i])throw new Error(`unknown Unicode version "${i}"`);this._active=i,this._activeProvider=this._providers[i],this._onChange.fire(i)}register(i){this._providers[i.version]=i,this._active||(this.activeVersion=i.version)}wcwidth(i){return this._activeProvider.wcwidth(i)}getStringCellWidth(i){let e=0,t=0,r=i.length;for(let s=0;s=r)return e+this.wcwidth(o);let h=i.charCodeAt(s);56320<=h&&h<=57343?o=(o-55296)*1024+h-56320+65536:e+=this.wcwidth(h)}let a=this.charProperties(o,t),l=n.extractWidth(a);n.extractShouldJoin(a)&&(l-=n.extractWidth(t)),e+=l,t=a}return e}charProperties(i,e){return this._activeProvider.charProperties(i,e)}};var gs=[[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]],bo=[[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]],X;function vo(n,i){let e=0,t=i.length-1,r;if(ni[t][1])return!1;for(;t>=e;)if(r=e+t>>1,n>i[r][1])e=r+1;else if(n=131072&&i<=196605||i>=196608&&i<=262141?2:1}charProperties(i,e){let t=this.wcwidth(i),r=t===0&&e!==0;if(r){let s=me.extractWidth(e);s===0?r=!1:s>t&&(t=s)}return me.createPropertyValue(0,t,r)}};var lr=class{constructor(){this.glevel=0;this._charsets=[]}get charsets(){return this._charsets}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(i){this.glevel=i,this.charset=this._charsets[i]}setgCharset(i,e){this._charsets[i]=e,this.glevel===i&&(this.charset=e)}};function Is(n){let e=n.buffer.lines.get(n.buffer.ybase+n.buffer.y-1)?.get(n.cols-1),t=n.buffer.lines.get(n.buffer.ybase+n.buffer.y);t&&e&&(t.isWrapped=e[3]!==0&&e[3]!==32)}var At=class n{constructor(i=32,e=32){this.maxLength=i;this.maxSubParamsLength=e;if(e>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(i),this.length=0,this._subParams=new Int32Array(e),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(i),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}static fromArray(i){let e=new n;if(!i.length)return e;for(let t=Array.isArray(i[0])?1:0;t>8,r=this._subParamsIdx[e]&255;r-t>0&&i.push(Array.prototype.slice.call(this._subParams,t,r))}return i}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(i){if(this._digitIsSub=!1,this.length>=this.maxLength){this._rejectDigits=!0;return}if(i<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=i>2147483647?2147483647:i}addSubParam(i){if(this._digitIsSub=!0,!!this.length){if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength){this._rejectSubDigits=!0;return}if(i<-1)throw new Error("values less than -1 are not allowed");this._subParams[this._subParamsLength++]=i>2147483647?2147483647:i,this._subParamsIdx[this.length-1]++}}hasSubParams(i){return(this._subParamsIdx[i]&255)-(this._subParamsIdx[i]>>8)>0}getSubParams(i){let e=this._subParamsIdx[i]>>8,t=this._subParamsIdx[i]&255;return t-e>0?this._subParams.subarray(e,t):null}getSubParamsAll(){let i={};for(let e=0;e>8,r=this._subParamsIdx[e]&255;r-t>0&&(i[e]=this._subParams.slice(t,r))}return i}addDigit(i){let e;if(this._rejectDigits||!(e=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;let t=this._digitIsSub?this._subParams:this.params,r=t[e-1];t[e-1]=~r?Math.min(r*10+i,2147483647):i}};var ni=[],cr=class{constructor(){this._state=0;this._active=ni;this._id=-1;this._handlers=Object.create(null);this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ni}reset(){if(this._state===2)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].end(!1);this._stack.paused=!1,this._active=ni,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||ni,!this._active.length)this._handlerFb(this._id,"START");else for(let i=this._active.length-1;i>=0;i--)this._active[i].start()}_put(i,e,t){if(!this._active.length)this._handlerFb(this._id,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}start(){this.reset(),this._state=1}put(i,e,t){if(this._state!==3){if(this._state===1)for(;e0&&this._put(i,e,t)}}end(i,e=!0){if(this._state!==0){if(this._state!==3)if(this._state===1&&this._start(),!this._active.length)this._handlerFb(this._id,"END",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].end(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].end(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=ni,this._id=-1,this._state=0}}},hr=class hr{constructor(i){this._handler=i;this._data=new We(hr._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}end(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(t=>(this._data.reset(),this._hitLimit=!1,t));return this._data.reset(),this._hitLimit=!1,e}};hr._payloadLimit=1e7;var ne=hr;var oi=[],dr=class{constructor(){this._handlers=Object.create(null);this._active=oi;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=oi}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}reset(){if(this._active.length)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].unhook(!1);this._stack.paused=!1,this._active=oi,this._ident=0}hook(i,e){if(this.reset(),this._ident=i,this._active=this._handlers[i]||oi,!this._active.length)this._handlerFb(this._ident,"HOOK",e);else for(let t=this._active.length-1;t>=0;t--)this._active[t].hook(e)}put(i,e,t){if(!this._active.length)this._handlerFb(this._ident,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}unhook(i,e=!0){if(!this._active.length)this._handlerFb(this._ident,"UNHOOK",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].unhook(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].unhook(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=oi,this._ident=0}},ai=new At;ai.addParam(0);var ur=class ur{constructor(i){this._handler=i;this._data=new We(ur._payloadLimit);this._params=ai;this._hitLimit=!1}hook(i){this._params=i.length>1||i.params[0]?i.clone():ai,this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}unhook(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString(),this._params),e instanceof Promise))return e.then(t=>(this._params=ai,this._data.reset(),this._hitLimit=!1,t));return this._params=ai,this._data.reset(),this._hitLimit=!1,e}};ur._payloadLimit=1e7;var li=ur;var ci=[],fr=class{constructor(){this._handlers=Object.create(null);this._active=ci;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ci}reset(){if(this._active.length)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].end(!1);this._stack.paused=!1,this._active=ci,this._ident=0}start(i){if(this.reset(),this._ident=i,this._active=this._handlers[i]||ci,!this._active.length)this._handlerFb(this._ident,"START");else for(let e=this._active.length-1;e>=0;e--)this._active[e].start()}put(i,e,t){if(!this._active.length)this._handlerFb(this._ident,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}end(i,e=!0){if(!this._active.length)this._handlerFb(this._ident,"END",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].end(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].end(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=ci,this._ident=0}},pr=class pr{constructor(i){this._handler=i;this._data=new We(pr._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}end(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(t=>(this._data.reset(),this._hitLimit=!1,t));return this._data.reset(),this._hitLimit=!1,e}};pr._payloadLimit=1e7;var _r=pr;var Cs=class{constructor(i){this.table=new Uint16Array(i)}setDefault(i,e){this.table.fill(i<<8|e)}add(i,e,t,r){this.table[e<<8|i]=t<<8|r}addMany(i,e,t,r){for(let s=0;sl),t=(a,l)=>e.slice(a,l),r=t(32,127),s=t(0,24);s.push(25),s.push.apply(s,t(28,32));let o=t(0,17);n.setDefault(1,0),n.addMany(r,0,2,0);for(let a of o)n.addMany([24,26,153,154],a,3,0),n.addMany(t(128,144),a,3,0),n.addMany(t(144,152),a,3,0),n.add(156,a,0,0),n.add(27,a,11,1),n.add(157,a,4,8),n.addMany([152,158],a,0,7),n.add(159,a,11,14),n.add(155,a,11,3),n.add(144,a,11,9);return n.addMany(s,0,3,0),n.addMany(s,1,3,1),n.add(127,1,0,1),n.addMany(s,8,0,8),n.addMany(s,3,3,3),n.add(127,3,0,3),n.addMany(s,4,3,4),n.add(127,4,0,4),n.addMany(s,6,3,6),n.addMany(s,5,3,5),n.add(127,5,0,5),n.addMany(s,2,3,2),n.add(127,2,0,2),n.add(93,1,4,8),n.addMany(r,8,5,8),n.add(127,8,5,8),n.addMany([156,27,24,26,7],8,6,0),n.addMany(t(28,32),8,0,8),n.addMany([88,94],1,0,7),n.addMany(r,7,0,7),n.addMany(s,7,0,7),n.add(156,7,0,0),n.add(127,7,0,7),n.add(95,1,11,14),n.addMany(s,14,0,14),n.add(127,14,0,14),n.addMany(t(32,48),14,9,15),n.addMany(t(48,127),14,15,16),n.addMany(t(48,127),15,15,16),n.addMany(s,15,0,15),n.addMany(t(32,48),15,9,15),n.add(127,15,0,15),n.addMany(r,16,16,16),n.addMany(s,16,0,16),n.addMany(t(8,14),16,16,16),n.add(127,16,0,16),n.addMany([27,156,24,26],16,17,0),n.add(91,1,11,3),n.addMany(t(64,127),3,7,0),n.addMany(t(48,60),3,8,4),n.addMany([60,61,62,63],3,9,4),n.addMany(t(48,60),4,8,4),n.addMany(t(64,127),4,7,0),n.addMany([60,61,62,63],4,0,6),n.addMany(t(32,64),6,0,6),n.add(127,6,0,6),n.addMany(t(64,127),6,0,0),n.addMany(t(32,48),3,9,5),n.addMany(t(32,48),5,9,5),n.addMany(t(48,64),5,0,6),n.addMany(t(64,127),5,7,0),n.addMany(t(32,48),4,9,5),n.addMany(t(32,48),1,9,2),n.addMany(t(32,48),2,9,2),n.addMany(t(48,127),2,10,0),n.addMany(t(48,80),1,10,0),n.addMany(t(81,88),1,10,0),n.addMany([89,90,92],1,10,0),n.addMany(t(96,127),1,10,0),n.add(80,1,11,9),n.addMany(s,9,0,9),n.add(127,9,0,9),n.addMany(t(32,48),9,9,12),n.addMany(t(48,60),9,8,10),n.addMany([60,61,62,63],9,9,10),n.addMany(s,11,0,11),n.addMany(t(32,128),11,0,11),n.addMany(s,10,0,10),n.add(127,10,0,10),n.addMany(t(48,60),10,8,10),n.addMany([60,61,62,63],10,0,11),n.addMany(t(32,48),10,9,12),n.addMany(s,12,0,12),n.add(127,12,0,12),n.addMany(t(32,48),12,9,12),n.addMany(t(48,64),12,0,11),n.addMany(t(64,127),12,12,13),n.addMany(t(64,127),10,12,13),n.addMany(t(64,127),9,12,13),n.addMany(s,13,13,13),n.addMany(r,13,13,13),n.add(127,13,0,13),n.addMany([27,156,24,26],13,14,0),n.add(oe,0,2,0),n.add(oe,8,5,8),n.add(oe,6,0,6),n.add(oe,11,0,11),n.add(oe,13,13,13),n.add(oe,16,16,16),n})(),mr=class extends g{constructor(e=So){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 At,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(t,r,s)=>{},this._executeHandlerFb=t=>{},this._csiHandlerFb=(t,r)=>{},this._escHandlerFb=t=>{},this._errorHandlerFb=t=>t,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this._register(E(()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new cr),this._dcsParser=this._register(new dr),this._apcParser=this._register(new fr),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},()=>!0)}_identifier(e,t=[64,126]){let r=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(r=e.prefix.charCodeAt(0),r<60||r>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 o=0;oa||a>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");r<<=8,r|=a}}if(e.final.length!==1)throw new Error("final must be a single byte");let 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 r<<=8,r|=s,r}identToString(e){let t=[];for(;e;)t.push(String.fromCharCode(e&255)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){let r=this._identifier(e,[48,126]);this._escHandlers[r]??=[];let s=this._escHandlers[r];return s.push(t),{dispose:()=>{let o=s.indexOf(t);o!==-1&&s.splice(o,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){let r=e.charCodeAt(0);this._executeHandlers[r]=t,r<24&&(this._executeHandlersArr[r]=t)}clearExecuteHandler(e){let t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){let r=this._identifier(e);this._csiHandlers[r]??=[];let s=this._csiHandlers[r];return s.push(t),{dispose:()=>{let o=s.indexOf(t);o!==-1&&s.splice(o,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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0,this._parseStack.state!==0&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,r,s,o){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=r,this._parseStack.transition=s,this._parseStack.chunkPos=o}parse(e,t,r){let s,o,a=0,l;if(this._parseStack.state)if(this._parseStack.state===2)this._parseStack.state=0,a=this._parseStack.chunkPos+1;else{if(r===void 0||this._parseStack.state===1)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");let h=this._parseStack.handlers,d=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](this._params),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 4:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],l=this._dcsParser.unhook(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],l=this._oscParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],l=this._apcParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break}this._parseStack.state=0,a=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=this._parseStack.transition&255}for(let h=a;h=60&&c<=63&&(this._collect=c,d++);let u=!1;for(;d=48&&c<=57)this._params.addDigit(c-48);else if(c===59)this._params.addParam(0);else if(c===58)this._params.addSubParam(-1);else if(c>=64&&c<=126){let _=this._csiHandlers[this._collect<<8|c],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return o=1792,this._preserveStack(3,_,p,o,d),l;p<0&&this._csiHandlerFb(this._collect<<8|c,this._params),this.precedingJoinState=0,h=d,this.currentState=0,u=!0;break}else break;u||(h=d-1,this.currentState=4);continue}switch(o=this._transitions.table[this.currentState<<8|(s>8){case 2:let d=h,c=t-4;for(;d=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe););if(d>=c)for(;d=32&&(e[d]<=126||e[d]>=oe);)d++;this._printHandler(e,h,d),h=d-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:h,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:let _=this._csiHandlers[this._collect<<8|s],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return this._preserveStack(3,_,p,o,h),l;p<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}while(++h47&&s<60);h--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:let v=this._escHandlers[this._collect<<8|s],f=v?v.length-1:-1;for(;f>=0&&(l=v[f](),l!==!0);f--)if(l instanceof Promise)return this._preserveStack(4,v,f,o,h),l;f<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let S=h+1;;++S)if(S>=t||(s=e[S])===24||s===26||s===27||s>127&&s=t||(s=e[S])<32||s>127&&s=32&&e[S]<127||e[S]>=8&&e[S]<14||e[S]>=oe))){this._apcParser.put(e,h,S),h=S-1;break}break;case 17:if(l=this._apcParser.end(s!==24&&s!==26),l)return this._preserveStack(7,[],0,o,h),l;s===27&&(o|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0;break}this.currentState=o&255}}};var go=/^([\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})$/,Io=/^[\da-f]+$/;function ys(n){if(!n)return;let i=n.toLowerCase();if(i.startsWith("rgb:")){i=i.slice(4);let e=go.exec(i);if(e){let 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(i.startsWith("#")&&(i=i.slice(1),Io.exec(i)&&[3,6,9,12].includes(i.length))){let e=i.length/3,t=[0,0,0];for(let r=0;r<3;++r){let s=parseInt(i.slice(e*r,e*r+e),16);t[r]=e===1?s<<4:e===2?s:e===3?s>>4:s>>8}return t}}function Es(n,i){let e=n.toString(16),t=e.length<2?"0"+e:e;switch(i){case 4:return e[0];case 8:return t;case 12:return(t+t).slice(0,3);default:return t+t}}function En(n,i=16){let[e,t,r]=n;return`rgb:${Es(e,i)}/${Es(t,i)}/${Es(r,i)}`}var yn="6.1.0-beta.287";var Eo={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function xn(n,i){if(n>24)return i.setWinLines||!1;switch(n){case 1:return!!i.restoreWin;case 2:return!!i.minimizeWin;case 3:return!!i.setWinPosition;case 4:return!!i.setWinSizePixels;case 5:return!!i.raiseWin;case 6:return!!i.lowerWin;case 7:return!!i.refreshWin;case 8:return!!i.setWinSizeChars;case 9:return!!i.maximizeWin;case 10:return!!i.fullscreenWin;case 11:return!!i.getWinState;case 13:return!!i.getWinPosition;case 14:return!!i.getWinSizePixels;case 15:return!!i.getScreenSizePixels;case 16:return!!i.getCellSizePixels;case 18:return!!i.getWinSizeChars;case 19:return!!i.getScreenSizeChars;case 20:return!!i.getIconTitle;case 21:return!!i.getWinTitle;case 22:return!!i.pushTitle;case 23:return!!i.popTitle;case 24:return!!i.setWinLines}return!1}var wn=0,br=class extends g{constructor(e,t,r,s,o,a,l,h,d=new mr){super();this._bufferService=e;this._charsetService=t;this._coreService=r;this._logService=s;this._optionsService=o;this._oscLinkService=a;this._mouseStateService=l;this._unicodeService=h;this._parser=d;this._parseBuffer=new Uint32Array(4096);this._stringDecoder=new mi;this._utf8Decoder=new bi;this._windowTitle="";this._iconName="";this._windowTitleStack=[];this._iconNameStack=[];this._curAttrData=U.clone();this._eraseAttrDataInternal=U.clone();this._onRequestBell=this._register(new b);this.onRequestBell=this._onRequestBell.event;this._onRequestRefreshRows=this._register(new b);this.onRequestRefreshRows=this._onRequestRefreshRows.event;this._onRequestReset=this._register(new b);this.onRequestReset=this._onRequestReset.event;this._onRequestSendFocus=this._register(new b);this.onRequestSendFocus=this._onRequestSendFocus.event;this._onRequestSyncScrollBar=this._register(new b);this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event;this._onRequestWindowsOptionsReport=this._register(new b);this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event;this._onA11yChar=this._register(new b);this.onA11yChar=this._onA11yChar.event;this._onA11yTab=this._register(new b);this.onA11yTab=this._onA11yTab.event;this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onColor=this._register(new b);this.onColor=this._onColor.event;this._onRequestColorSchemeQuery=this._register(new b);this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 hi(this._bufferService),this._activeBuffer=this._bufferService.buffer,this._register(this._bufferService.buffers.onBufferActivate(c=>this._activeBuffer=c.activeBuffer)),this._parser.setCsiHandlerFallback((c,u)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(c),params:u.toArray()})}),this._parser.setEscHandlerFallback(c=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(c)})}),this._parser.setExecuteHandlerFallback(c=>{this._logService.debug("Unknown EXECUTE code: ",{code:c})}),this._parser.setOscHandlerFallback((c,u,_)=>{this._logService.debug("Unknown OSC code: ",{identifier:c,action:u,data:_})}),this._parser.setDcsHandlerFallback((c,u,_)=>{u==="HOOK"&&(_=_.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setApcHandlerFallback((c,u,_)=>{this._logService.debug("Unknown APC code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setPrintHandler((c,u,_)=>this.print(c,u,_)),this._parser.registerCsiHandler({final:"@"},c=>this.insertChars(c)),this._parser.registerCsiHandler({intermediates:" ",final:"@"},c=>this.scrollLeft(c)),this._parser.registerCsiHandler({final:"A"},c=>this.cursorUp(c)),this._parser.registerCsiHandler({intermediates:" ",final:"A"},c=>this.scrollRight(c)),this._parser.registerCsiHandler({final:"B"},c=>this.cursorDown(c)),this._parser.registerCsiHandler({final:"C"},c=>this.cursorForward(c)),this._parser.registerCsiHandler({final:"D"},c=>this.cursorBackward(c)),this._parser.registerCsiHandler({final:"E"},c=>this.cursorNextLine(c)),this._parser.registerCsiHandler({final:"F"},c=>this.cursorPrecedingLine(c)),this._parser.registerCsiHandler({final:"G"},c=>this.cursorCharAbsolute(c)),this._parser.registerCsiHandler({final:"H"},c=>this.cursorPosition(c)),this._parser.registerCsiHandler({final:"I"},c=>this.cursorForwardTab(c)),this._parser.registerCsiHandler({final:"J"},c=>this.eraseInDisplay(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"J"},c=>this.eraseInDisplay(c,!0)),this._parser.registerCsiHandler({final:"K"},c=>this.eraseInLine(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"K"},c=>this.eraseInLine(c,!0)),this._parser.registerCsiHandler({final:"L"},c=>this.insertLines(c)),this._parser.registerCsiHandler({final:"M"},c=>this.deleteLines(c)),this._parser.registerCsiHandler({final:"P"},c=>this.deleteChars(c)),this._parser.registerCsiHandler({final:"S"},c=>this.scrollUp(c)),this._parser.registerCsiHandler({final:"T"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"X"},c=>this.eraseChars(c)),this._parser.registerCsiHandler({final:"Z"},c=>this.cursorBackwardTab(c)),this._parser.registerCsiHandler({final:"^"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"`"},c=>this.charPosAbsolute(c)),this._parser.registerCsiHandler({final:"a"},c=>this.hPositionRelative(c)),this._parser.registerCsiHandler({final:"b"},c=>this.repeatPrecedingCharacter(c)),this._parser.registerCsiHandler({final:"c"},c=>this.sendDeviceAttributesPrimary(c)),this._parser.registerCsiHandler({prefix:">",final:"c"},c=>this.sendDeviceAttributesSecondary(c)),this._parser.registerCsiHandler({final:"d"},c=>this.linePosAbsolute(c)),this._parser.registerCsiHandler({final:"e"},c=>this.vPositionRelative(c)),this._parser.registerCsiHandler({final:"f"},c=>this.hVPosition(c)),this._parser.registerCsiHandler({final:"g"},c=>this.tabClear(c)),this._parser.registerCsiHandler({final:"h"},c=>this.setMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"h"},c=>this.setModePrivate(c)),this._parser.registerCsiHandler({final:"l"},c=>this.resetMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"l"},c=>this.resetModePrivate(c)),this._parser.registerCsiHandler({final:"m"},c=>this.charAttributes(c)),this._parser.registerCsiHandler({final:"n"},c=>this.deviceStatus(c)),this._parser.registerCsiHandler({prefix:"?",final:"n"},c=>this.deviceStatusPrivate(c)),this._parser.registerCsiHandler({intermediates:"!",final:"p"},c=>this.softReset(c)),this._parser.registerCsiHandler({prefix:">",final:"q"},c=>this.sendXtVersion(c)),this._parser.registerCsiHandler({intermediates:" ",final:"q"},c=>this.setCursorStyle(c)),this._parser.registerCsiHandler({final:"r"},c=>this.setScrollRegion(c)),this._parser.registerCsiHandler({final:"s"},c=>this.saveCursor(c)),this._parser.registerCsiHandler({final:"t"},c=>this.windowOptions(c)),this._parser.registerCsiHandler({final:"u"},c=>this.restoreCursor(c)),this._parser.registerCsiHandler({intermediates:"'",final:"}"},c=>this.insertColumns(c)),this._parser.registerCsiHandler({intermediates:"'",final:"~"},c=>this.deleteColumns(c)),this._parser.registerCsiHandler({intermediates:'"',final:"q"},c=>this.selectProtected(c)),this._parser.registerCsiHandler({intermediates:"$",final:"p"},c=>this.requestMode(c,!0)),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},c=>this.requestMode(c,!1)),this._parser.registerCsiHandler({prefix:"=",final:"u"},c=>this.kittyKeyboardSet(c)),this._parser.registerCsiHandler({prefix:"?",final:"u"},c=>this.kittyKeyboardQuery(c)),this._parser.registerCsiHandler({prefix:">",final:"u"},c=>this.kittyKeyboardPush(c)),this._parser.registerCsiHandler({prefix:"<",final:"u"},c=>this.kittyKeyboardPop(c)),this._parser.setExecuteHandler("\x07",()=>this.bell()),this._parser.setExecuteHandler(` --`,()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler(" ",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("\x84",()=>this.index()),this._parser.setExecuteHandler("\x85",()=>this.nextLine()),this._parser.setExecuteHandler("\x88",()=>this.tabSet()),this._parser.registerOscHandler(0,new ne(c=>(this.setTitle(c),this.setIconName(c),!0))),this._parser.registerOscHandler(1,new ne(c=>this.setIconName(c))),this._parser.registerOscHandler(2,new ne(c=>this.setTitle(c))),this._parser.registerOscHandler(4,new ne(c=>this.setOrReportIndexedColor(c))),this._parser.registerOscHandler(8,new ne(c=>this.setHyperlink(c))),this._parser.registerOscHandler(10,new ne(c=>this.setOrReportFgColor(c))),this._parser.registerOscHandler(11,new ne(c=>this.setOrReportBgColor(c))),this._parser.registerOscHandler(12,new ne(c=>this.setOrReportCursorColor(c))),this._parser.registerOscHandler(104,new ne(c=>this.restoreIndexedColor(c))),this._parser.registerOscHandler(110,new ne(c=>this.restoreFgColor(c))),this._parser.registerOscHandler(111,new ne(c=>this.restoreBgColor(c))),this._parser.registerOscHandler(112,new ne(c=>this.restoreCursorColor(c))),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(let c in q)this._parser.registerEscHandler({intermediates:"(",final:c},()=>this.selectCharset("("+c)),this._parser.registerEscHandler({intermediates:")",final:c},()=>this.selectCharset(")"+c)),this._parser.registerEscHandler({intermediates:"*",final:c},()=>this.selectCharset("*"+c)),this._parser.registerEscHandler({intermediates:"+",final:c},()=>this.selectCharset("+"+c)),this._parser.registerEscHandler({intermediates:"-",final:c},()=>this.selectCharset("-"+c)),this._parser.registerEscHandler({intermediates:".",final:c},()=>this.selectCharset("."+c)),this._parser.registerEscHandler({intermediates:"/",final:c},()=>this.selectCharset("/"+c));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(c=>(this._logService.error("Parsing error: ",c),c)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new li((c,u)=>this.requestStatusString(c,u)))}getAttrData(){return this._curAttrData}_preserveStack(e,t,r,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=r,this._parseStack.position=s}_logSlowResolvingAsync(e){if(this._logService.logLevel<=3){let t,r=new Promise((s,o)=>{t=setTimeout(()=>o("#SLOW_TIMEOUT"),5e3)});Promise.race([e,r]).then(()=>{t!==void 0&&clearTimeout(t)},s=>{if(t!==void 0&&clearTimeout(t),s!=="#SLOW_TIMEOUT")throw s;console.warn("async parser handler taking longer than 5000 ms")})}}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let r,s=this._activeBuffer.x,o=this._activeBuffer.y,a=0,l=this._parseStack.paused;if(l){if(r=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(r),r;s=this._parseStack.cursorStartX,o=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>131072&&(a=this._parseStack.position+131072)}if(this._logService.logLevel<=1&&this._logService.debug(`parsing data ${typeof e=="string"?` "${e}"`:` "${Array.prototype.map.call(e,c=>String.fromCharCode(c)).join("")}"`}`),this._logService.logLevel===0&&this._logService.trace("parsing data (codes)",typeof e=="string"?e.split("").map(c=>c.charCodeAt(0)):e),this._parseBuffer.length131072)for(let c=a;c0&&_.getWidth(this._activeBuffer.x-1)===2&&_.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let p=this._parser.precedingJoinState;for(let v=t;vh){if(d){let L=_,T=this._activeBuffer.x-I;if(this._activeBuffer.x=I,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),_=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!_)return;for(I>0&&_ instanceof De&&_.copyCellsFrom(L,T,0,I,!1);T=0;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(c&&(_.insertCells(this._activeBuffer.x,o-I,this._activeBuffer.getNullCell(u)),_.getWidth(h-1)===2&&_.setCellFromCodepoint(h-1,0,1,u)),_.setCellFromCodepoint(this._activeBuffer.x++,s,o,u),o>0)for(;--o;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=p,this._activeBuffer.x0&&_.getWidth(this._activeBuffer.x)===0&&!_.hasContent(this._activeBuffer.x)&&_.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return e.final==="t"&&!e.prefix&&!e.intermediates?this._parser.registerCsiHandler(e,r=>xn(r.params[0],this._optionsService.rawOptions.windowOptions)?t(r):!0):this._parser.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new li(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new ne(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new _r(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(this._activeBuffer.x===0&&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;let 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;let 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){let 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){let 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){let t=e.params[0];return t===0?delete this._activeBuffer.tabs[this._activeBuffer.x]:t===3&&(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){let t=e.params[0];return t===1&&(this._curAttrData.bg|=536870912),(t===2||t===0)&&(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,r,s=!1,o=!1){let a=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);a&&(a.replaceCells(t,r,this._activeBuffer.getNullCell(this._eraseAttrData()),o),s&&(a.isWrapped=!1))}_resetBufferLine(e,t=!1){let r=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);r&&(r.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),r.isWrapped=!1)}eraseInDisplay(e,t=!1){this._restrictCursor(this._bufferService.cols);let r;switch(e.params[0]){case 0:for(r=this._activeBuffer.y,this._dirtyRowTracker.markDirty(r),this._eraseInBufferLine(r++,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,t);r=this._bufferService.cols){let o=this._activeBuffer.lines.get(r+1);o&&(o.isWrapped=!1)}for(;r--;)this._resetBufferLine(r,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(r=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,r-1);r--&&!this._activeBuffer.lines.get(this._activeBuffer.ybase+r)?.getTrimmedLength(););for(;r>=0;r--)this._bufferService.scroll(this._eraseAttrData())}else{for(r=this._bufferService.rows,this._dirtyRowTracker.markDirty(r-1);r--;)this._resetBufferLine(r,t);this._dirtyRowTracker.markDirty(0)}break;case 3:let s=this._activeBuffer.lines.length-this._bufferService.rows;s>0&&(this._activeBuffer.lines.trimStart(s),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-s,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-s,0),this._onScroll.fire(0));break}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,this._activeBuffer.x===0,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);break}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 c=d;for(let u=1;u0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent("\x1B[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("\x1B[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("\x1B[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("\x1B[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("\x1B[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`\x1BP>|xterm.js(${yn})\x1B\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(te[te.NOT_RECOGNIZED=0]="NOT_RECOGNIZED",te[te.SET=1]="SET",te[te.RESET=2]="RESET",te[te.PERMANENTLY_SET=3]="PERMANENTLY_SET",te[te.PERMANENTLY_RESET=4]="PERMANENTLY_RESET"))(r||={});let s=this._coreService.decPrivateModes,{activeProtocol:o,activeEncoding:a}=this._mouseStateService,l=this._coreService,{buffers:h,cols:d}=this._bufferService,{active:c,alt:u}=h,_=this._optionsService.rawOptions,p=(S,I)=>(l.triggerDataEvent(`\x1B[${t?"":"?"}${S};${I}$y`),!0),v=S=>S?1:2,f=e.params[0];return t?f===2?p(f,4):f===4?p(f,v(l.modes.insertMode)):f===12?p(f,3):f===20?p(f,v(_.convertEol)):p(f,0):f===1?p(f,v(s.applicationCursorKeys)):f===3?p(f,_.windowOptions.setWinLines?d===80?2:d===132?1:0:0):f===6?p(f,v(s.origin)):f===7?p(f,v(s.wraparound)):f===8?p(f,3):f===9?p(f,v(o==="X10")):f===12?p(f,v(_.cursorBlink)):f===25?p(f,v(!l.isCursorHidden)):f===45?p(f,v(s.reverseWraparound)):f===66?p(f,v(s.applicationKeypad)):f===67?p(f,4):f===1e3?p(f,v(o==="VT200")):f===1002?p(f,v(o==="DRAG")):f===1003?p(f,v(o==="ANY")):f===1004?p(f,v(s.sendFocus)):f===1005?p(f,4):f===1006?p(f,v(a==="SGR")):f===1015?p(f,4):f===1016?p(f,v(a==="SGR_PIXELS")):f===1048?p(f,1):f===47||f===1047||f===1049?p(f,v(c===u)):f===2004?p(f,v(s.bracketedPasteMode)):f===2026?p(f,v(s.synchronizedOutput)):f===9001&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?p(f,v(s.win32InputMode)):p(f,0)}_updateAttrColor(e,t,r,s,o){return t===2?(e|=50331648,e&=-16777216,e|=ue.fromColorRGB([r,s,o])):t===5&&(e&=-67108864,e|=33554432|r&255),e}_extractColor(e,t,r){let s=[0,0,-1,0,0,0],o=0,a=0;do{if(s[a+o]=e.params[t+a],e.hasSubParams(t+a)){let l=e.getSubParams(t+a),h=0;do s[1]===5&&(o=1),s[a+h+1+o]=l[h];while(++h=2||s[1]===2&&a+o>=5)break;s[1]&&(o=1)}while(++a+t5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,e===0&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=U.fg,e.bg=U.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(e.length===1&&e.params[0]===0)return this._processSGR0(this._curAttrData),!0;let t=e.length,r,s=this._curAttrData;for(let o=0;o=30&&r<=37?(s.fg&=-67108864,s.fg|=16777216|r-30):r>=40&&r<=47?(s.bg&=-67108864,s.bg|=16777216|r-40):r>=90&&r<=97?(s.fg&=-67108864,s.fg|=16777216|r-90|8):r>=100&&r<=107?(s.bg&=-67108864,s.bg|=16777216|r-100|8):r===0?this._processSGR0(s):r===1?s.fg|=134217728:r===3?s.bg|=67108864:r===4?(s.fg|=268435456,this._processUnderline(e.hasSubParams(o)?e.getSubParams(o)[0]:1,s)):r===5?s.fg|=536870912:r===7?s.fg|=67108864:r===8?s.fg|=1073741824:r===9?s.fg|=2147483648:r===2?s.bg|=134217728:r===21?this._processUnderline(2,s):r===22?(s.fg&=-134217729,s.bg&=-134217729):r===23?s.bg&=-67108865:r===24?(s.fg&=-268435457,this._processUnderline(0,s)):r===25?s.fg&=-536870913:r===27?s.fg&=-67108865:r===28?s.fg&=-1073741825:r===29?s.fg&=2147483647:r===39?(s.fg&=-67108864,s.fg|=U.fg&16777215):r===49?(s.bg&=-67108864,s.bg|=U.bg&16777215):r===38||r===48||r===58?o+=this._extractColor(e,o,s):r===53?s.bg|=1073741824:r===55?s.bg&=-1073741825:r===221&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.fg&=-134217729:r===222&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.bg&=-134217729:r===59?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",r);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("\x1B[0n");break;case 6:let t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[${t};${r}R`);break}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:let t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[?${t};${r}R`);break;case 15:break;case 25:break;case 26:break;case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??!0)&&this._onRequestColorSchemeQuery.fire();break}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=U.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){let t=e.length===0?1:e.params[0];if(t===0)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar";break}let r=t%2===1;this._coreService.decPrivateModes.cursorBlink=r}return!0}setScrollRegion(e){let t=e.params[0]||1,r;return(e.length<2||(r=e.params[1])>this._bufferService.rows||r===0)&&(r=this._bufferService.rows),r>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=r-1,this._setCursor(0,0)),!0}windowOptions(e){if(!xn(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;let t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:t!==2&&this._onRequestWindowsOptionsReport.fire(0);break;case 16:this._onRequestWindowsOptionsReport.fire(1);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`\x1B[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:(t===0||t===2)&&(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),(t===0||t===1)&&(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:(t===0||t===2)&&this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),(t===0||t===1)&&this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop());break}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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let t=0;t1;){let s=r.shift(),o=r.shift();if(/^\d+$/.exec(s)){let a=parseInt(s,10);if(Tn(a))if(o==="?")t.push({type:0,index:a});else{let l=ys(o);l&&t.push({type:1,index:a,color:l})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){let t=e.indexOf(";");if(t===-1)return!0;let r=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(r,s):r.trim()?!1:this._finishHyperlink()}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();let r=e.split(":"),s,o=r.findIndex(a=>a.startsWith("id="));return o!==-1&&(s=r[o].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){let r=e.split(";");for(let s=0;s=this._specialColors.length);++s,++t)if(r[s]==="?")this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{let o=ys(r[s]);o&&this._onColor.fire([{type:1,index:this._specialColors[t],color:o}])}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;let t=[],r=e.split(";");for(let s=0;s=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){let 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=U.clone(),this._eraseAttrDataInternal=U.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=this._curAttrData.bg&67108863,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){let e=new F;e.content=1<<22|69,e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t(this._coreService.triggerDataEvent(`\x1B${l}\x1B\\`),!0),s=this._bufferService.buffer,o=this._optionsService.rawOptions,a={block:2,underline:4,bar:6};return r(e==='"q'?`P1$r${this._curAttrData.isProtected()?1:0}"q`:e==='"p'?'P1$r61;1"p':e==="r"?`P1$r${s.scrollTop+1};${s.scrollBottom+1}r`:e==="m"?"P1$r0m":e===" q"?`P1$r${a[o.cursorStyle]-(o.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=e.params[0]||0,r=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(r){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t;break}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`\x1B[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=e.params[0]||0,r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;return o.length>=16&&o.shift(),o.push(r.flags),r.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=Math.max(1,e.params[0]||1),r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;for(let a=0;a0;a++)r.flags=o.pop();return o.length===0&&t>0&&(r.flags=0),!0}},hi=class{constructor(i){this._bufferService=i;this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(i){ithis.end&&(this.end=i)}markRangeDirty(i,e){i>e&&(wn=i,i=e,e=wn),ithis.end&&(this.end=e)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};hi=y([m(0,D)],hi);function Tn(n){return 0<=n&&n<256}var vr=class extends g{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._innerWriteTimer=this._register(new Ie);this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._register(E(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed||this._isSyncWriting)return;this._isSyncWriting=!0;let e,t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);let r=this._callbacks.shift();r&&r()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;if(t!==void 0&&this._syncCalls>t){this._syncCalls=0;return}if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;this._isSyncWriting=!0;let r;for(;r=this._writeBuffer.shift();){this._action(r);let s=this._callbacks.shift();s&&s()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(!this._store.isDisposed){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){this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),this._innerWrite();return}this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;let r=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){let s=this._writeBuffer[this._bufferOffset],o=this._action(s,t);if(o){let l=h=>{this._store.isDisposed||(performance.now()-r>=12?this._scheduleInnerWrite(0,h):this._innerWrite(r,h))};o.catch(h=>(queueMicrotask(()=>{throw h}),Promise.resolve(!1))).then(l);return}let a=this._callbacks[this._bufferOffset];if(a&&a(),this._bufferOffset++,this._pendingData-=s.length,performance.now()-r>=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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}};var kt=class{constructor(i){this._bufferService=i;this._nextId=1;this._entriesWithId=new Map;this._dataByLinkId=new Map}registerLink(i){let e=this._bufferService.buffer;if(i.id===void 0){let l=e.addMarker(e.ybase+e.y),h={data:i,id:this._nextId++,lines:[l]};return l.onDispose(()=>this._removeMarkerFromLink(h,l)),this._dataByLinkId.set(h.id,h),h.id}let t=i,r=this._getEntryIdKey(t),s=this._entriesWithId.get(r);if(s)return this.addLineToLink(s.id,e.ybase+e.y),s.id;let o=e.addMarker(e.ybase+e.y),a={id:this._nextId++,key:this._getEntryIdKey(t),data:t,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(a,o)),this._entriesWithId.set(a.key,a),this._dataByLinkId.set(a.id,a),a.id}addLineToLink(i,e){let t=this._dataByLinkId.get(i);if(t&&t.lines.every(r=>r.line!==e)){let r=this._bufferService.buffer.addMarker(e);t.lines.push(r),r.onDispose(()=>this._removeMarkerFromLink(t,r))}}getLinkData(i){return this._dataByLinkId.get(i)?.data}_getEntryIdKey(i){return`${i.id};;${i.uri}`}_removeMarkerFromLink(i,e){let t=i.lines.indexOf(e);t!==-1&&(i.lines.splice(t,1),i.lines.length===0&&(i.data.id!==void 0&&this._entriesWithId.delete(i.key),this._dataByLinkId.delete(i.id)))}};kt=y([m(0,D)],kt);var Dn=!1,Sr=class extends g{constructor(e){super();this._windowsWrappingHeuristics=this._register(new P);this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onData=this._register(new b);this.onData=this._onData.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._onScroll=this._register(new b);this._instantiationService=new Ji,this.optionsService=this._register(new nr(e)),this._instantiationService.setService(R,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(wt)),this._instantiationService.setService(fe,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(Dt)),this._instantiationService.setService(D,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(Lt)),this._instantiationService.setService(Y,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(or)),this._instantiationService.setService(Me,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(me)),this.unicodeService.register(new ar),this._instantiationService.setService(Us,this.unicodeService),this._charsetService=this._instantiationService.createInstance(lr),this._instantiationService.setService(Ws,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(kt),this._instantiationService.setService(vi,this._oscLinkService),this._inputHandler=this._register(new br(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(j.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(j.forward(this._bufferService.onResize,this._onResize)),this._register(j.forward(this.coreService.onData,this._onData)),this._register(j.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this._writeBuffer=this._register(new vr((t,r)=>this._inputHandler.parse(t,r))),this._register(j.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new b),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(let t in e)this.optionsService.options[t]=e[t]}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=3&&!Dn&&(this._logService.warn("writeSync is unreliable and will be removed soon."),Dn=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let t=e-this._bufferService.buffer.ydisp;t!==0&&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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1,t=this.optionsService.rawOptions.windowsPty;t&&t.backend!==void 0&&t.buildNumber!==void 0&&(e=t.backend==="conpty"&&t.buildNumber<21376),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){let e=[];e.push(this.onLineFeed(Is.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>(Is(this._bufferService),!1))),this._windowsWrappingHeuristics.value=E(()=>{for(let t of e)t.dispose()})}}};var z=0,gr=class{constructor(i,e){this._getKey=i;this._array=[];this._insertedValues=[];this._isFlushingInserted=!1;this._deletedIndices=[];this._isFlushingDeleted=!1;this._flushInsertedTask=new It(e),this._flushDeletedTask=new It(e)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(i){this._flushCleanupDeleted(),this._insertedValues.length===0&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(i)}_flushInserted(){let i=this._insertedValues.sort((s,o)=>this._getKey(s)-this._getKey(o)),e=0,t=0,r=new Array(this._array.length+this._insertedValues.length);for(let s=0;s=this._array.length||this._getKey(i[e])<=this._getKey(this._array[t])?(r[s]=i[e],e++):r[s]=this._array[t++];this._array=r,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(i){if(this._flushCleanupInserted(),this._array.length===0)return!1;let e=this._getKey(i);if(e===void 0||(z=this._search(e),z===-1)||this._getKey(this._array[z])!==e)return!1;do if(this._array[z]===i)return this._deletedIndices.length===0&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(z),!0;while(++zs-o),e=0,t=new Array(this._array.length-i.length),r=0;for(let s=0;s0&&this._flushDeletedTask.flush()}*getKeyIterator(i){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),this._array.length!==0&&(z=this._search(i),!(z<0||z>=this._array.length)&&this._getKey(this._array[z])===i))do yield this._array[z];while(++z=this._array.length)&&this._getKey(this._array[z])===i))do e(this._array[z]);while(++z=e;){let r=e+t>>1,s=this._getKey(this._array[r]);if(s>i)t=r-1;else if(s0&&this._getKey(this._array[r-1])===i;)r--;return r}}return e}};var Mt=0,Ir=0,Bt=class extends g{constructor(e,t){super();this._logService=e;this._bufferService=t;this._lineCache=this._register(new xs);this._onDecorationRegistered=this._register(new b);this.onDecorationRegistered=this._onDecorationRegistered.event;this._onDecorationRemoved=this._register(new b);this.onDecorationRemoved=this._onDecorationRemoved.event;this._decorations=new gr(r=>r?.marker.line,this._logService),this._register(E(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}get decorations(){return this._decorations.values()}registerDecoration(e){if(e.marker.isDisposed)return;let t=new ws(e);if(t){let r=t.marker.onDispose(()=>t.dispose()),s=t.onDispose(()=>{s.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),r.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(let e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,r){let s=this._lineCache.getDecorationsOnLine(t);if(s)for(let o of s)Mt=o.options.x??0,Ir=Mt+(o.options.width??1),e>=Mt&&e=Mt&&ethis._handleBufferLinesTrim(r))),t.add(e.onInsert(r=>this._handleBufferLinesInsert(r))),t.add(e.onDelete(r=>this._handleBufferLinesDelete(r)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){let t=e.marker.line;if(t<0)return;e._indexedStartLine=t;let r=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{let t=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(let r of t)r()})}_handleBufferLinesTrim(e){if(e<=0)return;let t=new Map;for(let[r,s]of this._decorationsByLine){let o=r-e;o<0||this._mergeLineBucket(t,o,s)}this._decorationsByLine.clear();for(let[r,s]of t)this._decorationsByLine.set(r,s);for(let r of this._decorations)r.marker.isDisposed||(r._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,r){let s=e.get(t);if(s)for(let o=0,a=r.length;ot&&(s.push(a),this._removeFromLineBuckets(a))}let o=new Map;for(let[a,l]of this._decorationsByLine){let h=a>=t?a+r:a;this._mergeLineBucket(o,h,l)}this._decorationsByLine.clear();for(let[a,l]of o)this._decorationsByLine.set(a,l);for(let a of this._decorations)a.marker.isDisposed||a._indexedStartLine>=t&&(a._indexedStartLine=a.marker.line);for(let a of s)this._addToLineBuckets(a)}_applyBufferLinesDelete(e){let t=e.index+e.amount,r=new Map;for(let[o,a]of this._decorationsByLine){if(o>=e.index&&o=t?o-e.amount:o;this._mergeLineBucket(r,l,a)}this._decorationsByLine.clear();for(let[o,a]of r)this._decorationsByLine.set(o,a);let s=[];for(let o of this._decorations){if(o.marker.isDisposed)continue;let a=o._indexedStartLine,l=this._getDecorationHeight(o);a>=t?o._indexedStartLine=o.marker.line:at&&s.push(o)}for(let o of s)this._reindexDecoration(o)}},ws=class extends pe{constructor(e){super();this.options=e;this.onRenderEmitter=this.add(new b);this.onRender=this.onRenderEmitter.event;this._onDispose=this.add(new b);this.onDispose=this._onDispose.event;this._cachedBg=null;this._cachedFg=null;this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}get backgroundColorRGB(){return this._cachedBg===null&&(this.options.backgroundColor?this._cachedBg=B.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return this._cachedFg===null&&(this.options.foregroundColor?this._cachedFg=B.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}dispose(){this._onDispose.fire(),super.dispose()}};var yo=1e3,Cr=class{constructor(i,e=yo){this._renderCallback=i;this._debounceThresholdMS=e;this._lastRefreshMs=0;this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(i,e,t){this._rowCount=t,i=i??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,i):i,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e;let r=performance.now();if(r-this._lastRefreshMs>=this._debounceThresholdMS)this._refreshTimeoutID!==void 0&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),this._lastRefreshMs=r,this._innerRefresh();else if(!this._additionalRefreshRequested){let s=r-this._lastRefreshMs,o=this._debounceThresholdMS-s;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout(()=>{this._lastRefreshMs=performance.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0},o)}}_innerRefresh(){if(this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return;let i=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(i,e)}};var Rn=!1,Ye=class extends g{constructor(e,t,r,s){super();this._terminal=e;this._coreBrowserService=r;this._renderService=s;this._rowColumns=new WeakMap;this._liveRegionLineCount=0;this._charsToConsume=[];this._charsToAnnounce="";let o=this._coreBrowserService.mainDocument;this._accessibilityContainer=o.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=o.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let a=0;athis._handleBoundaryFocus(a,0),this._bottomBoundaryFocusListener=a=>this._handleBoundaryFocus(a,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=o.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new Cr(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");Rn?(this._accessibilityContainer.classList.add("debug"),this._rowContainer.classList.add("debug"),this._debugRootContainer=o.createElement("div"),this._debugRootContainer.classList.add("xterm"),this._debugRootContainer.appendChild(o.createTextNode("------start a11y------")),this._debugRootContainer.appendChild(this._accessibilityContainer),this._debugRootContainer.appendChild(o.createTextNode("------end a11y------")),this._terminal.element.insertAdjacentElement("afterend",this._debugRootContainer)):this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this._register(this._terminal.onResize(a=>this._handleResize(a.rows))),this._register(this._terminal.onRender(a=>this._refreshRows(a.start,a.end))),this._register(this._terminal.onScroll(()=>this._refreshRows())),this._register(this._terminal.onA11yChar(a=>this._handleChar(a))),this._register(this._terminal.onLineFeed(()=>this._handleChar(` --`))),this._register(this._terminal.onA11yTab(a=>this._handleTab(a))),this._register(this._terminal.onKey(a=>this._handleKey(a.key))),this._register(this._terminal.onBlur(()=>this._clearLiveRegion())),this._register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._register(C(o,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register(E(()=>{Rn?this._debugRootContainer.remove():this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,e===` --`&&(this._liveRegionLineCount++,this._liveRegionLineCount===21&&(this._liveRegion.textContent=Ze.get())))}_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){let r=this._terminal.buffer,s=r.lines.length.toString();for(let o=e;o<=t;o++){let a=r.lines.get(r.ydisp+o),l=[],h=a?.translateToString(!0,void 0,void 0,l)||"",d=(r.ydisp+o+1).toString(),c=this._rowElements[o];c&&(h.length===0?(c.textContent="\xA0",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,l)),c.setAttribute("aria-posinset",d),c.setAttribute("aria-setsize",s),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent===Ze.get()&&this._clearLiveRegion(),this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){let r=e.target,s=this._rowElements[t===0?1:this._rowElements.length-2],o=r.getAttribute("aria-posinset"),a=t===0?"1":`${this._terminal.buffer.lines.length}`;if(o===a||e.relatedTarget!==s)return;let l,h;if(t===0?(l=r,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(l=this._rowElements.shift(),h=r,this._rowContainer.removeChild(l)),l.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),t===0){let d=this._createAccessibilityTreeNode();this._rowElements.unshift(d),this._rowContainer.insertAdjacentElement("afterbegin",d)}else{let d=this._createAccessibilityTreeNode();this._rowElements.push(d),this._rowContainer.appendChild(d)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(t===0?-1:1),this._rowElements[t===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let t={node:e.anchorNode,offset:e.anchorOffset},r={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(r.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===r.node&&t.offset>r.offset)&&([t,r]=[r,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;let s=this._rowElements.slice(-1)[0];if(r.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(r={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(r.node))return;let o=({node:h,offset:d})=>{let c=h instanceof Text?h.parentNode:h,u=parseInt(c?.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let _=this._rowColumns.get(c);if(!_)return console.warn("columns is null. Race condition?"),null;let p=d<_.length?_[d]:_.slice(-1)[0]+1;return p>=this._terminal.cols&&(++u,p=0),{row:u,column:p}},a=o(t),l=o(r);if(!(!a||!l)){if(a.row>l.row||a.row===l.row&&a.column>=l.column)throw new Error("invalid range");this._terminal.select(a.column,a.row,(l.row-a.row)*this._terminal.cols-a.column+l.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let t=this._rowContainer.children.length;te;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let 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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{Oe(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register(C(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register(C(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register(C(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register(C(this._element,"mouseup",this._handleMouseUp.bind(this)))}get currentLink(){return this._currentLink}_handleMouseMove(e){this._lastMouseEvent=e;let t=this._positionFromMouseEvent(e,this._element);if(!t)return;this._isMouseOut=!1;let r=e.composedPath();for(let s=0;s{s?.forEach(o=>{o.link.dispose&&o.link.dispose()})}),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(let[s,o]of this._linkProviderService.linkProviders.entries())t?this._activeProviderReplies?.get(s)&&(r=this._checkLinkProviderResult(s,e,r)):o.provideLinks(e.y,a=>{if(this._isMouseOut)return;let l=a?.map(h=>({link:h}));this._activeProviderReplies?.set(s,l),r=this._checkLinkProviderResult(s,e,r),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)})}_removeIntersectingLinks(e,t){let r=new Set;for(let s=0;se?this._bufferService.cols:l.link.range.end.x;for(let c=h;c<=d;c++){if(r.has(c)){o.splice(a--,1);break}r.add(c)}}}}_checkLinkProviderResult(e,t,r){if(!this._activeProviderReplies)return r;let s=this._activeProviderReplies.get(e),o=!1;for(let a=0;athis._linkAtPosition(l.link,t));a&&(r=!0,this._handleNewLink(a))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!r)for(let a=0;athis._linkAtPosition(h.link,t));if(l){r=!0,this._handleNewLink(l);break}}return r}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;let t=this._positionFromMouseEvent(e,this._element);t&&this._mouseDownLink&&xo(this._mouseDownLink.link,this._currentLink.link)&&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,Oe(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;let t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:e.link.decorations===void 0?!0:e.link.decorations.underline,pointerCursor:e.link.decorations===void 0?!0: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:r=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==r&&(this._currentLink.state.decorations.pointerCursor=r,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",r))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:r=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==r&&(this._currentLink.state.decorations.underline=r,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,r))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(r=>{if(!this._currentLink)return;let s=r.start===0?0:r.start+1+this._bufferService.buffer.ydisp,o=this._bufferService.buffer.ydisp+1+r.end;if(this._currentLink.link.range.start.y>=s&&this._currentLink.link.range.end.y<=o&&(this._clearCurrentLink(s,o),this._lastMouseEvent)){let a=this._positionFromMouseEvent(this._lastMouseEvent,this._element);a&&this._askForLink(a,!1)}})))}_linkHover(e,t,r){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(r,t.text)}_fireUnderlineEvent(e,t){let r=e.range,s=this._bufferService.buffer.ydisp,o=this._createLinkUnderlineEvent(r.start.x-1,r.start.y-s-1,r.end.x,r.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(o)}_linkLeave(e,t,r){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(r,t.text)}_linkAtPosition(e,t){let r=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,o=t.y*this._bufferService.cols+t.x;return r<=o&&o<=s}_positionFromMouseEvent(e,t){let r=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(r)return{x:r[0],y:r[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,r,s,o){return{x1:e,y1:t,x2:r,y2:s,cols:this._bufferService.cols,fg:o}}};Pt=y([m(1,Pe),m(2,V),m(3,D),m(4,Ii)],Pt);function xo(n,i){return n.text===i.text&&n.range.start.x===i.range.start.x&&n.range.start.y===i.range.start.y&&n.range.end.x===i.range.end.x&&n.range.end.y===i.range.end.y}var Er=class extends Sr{constructor(e={}){super(e);this._linkifier=this._register(new P);this.browser=Ke;this._keyDownHandled=!1;this._keyDownSeen=!1;this._keyPressHandled=!1;this._unprocessedDeadKey=!1;this._accessibilityManager=this._register(new P);this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onKey=this._register(new b);this.onKey=this._onKey.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onBell=this._register(new b);this.onBell=this._onBell.event;this._onFocus=this._register(new b);this._onBlur=this._register(new b);this._onA11yCharEmitter=this._register(new b);this._onA11yTabEmitter=this._register(new b);this._onWillOpen=this._register(new b);this._onDimensionsChange=this._register(new b);this.onDimensionsChange=this._onDimensionsChange.event;this._setup(),this._decorationService=this._instantiationService.createInstance(Bt),this._instantiationService.setService(ge,this._decorationService),this._keyboardService=this._instantiationService.createInstance(xt),this._instantiationService.setService(zs,this._keyboardService),this._linkProviderService=this._instantiationService.createInstance(zi),this._instantiationService.setService(Ii,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(et)),this._register(this._inputHandler.onRequestBell(()=>this._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(t=>this.refresh(t?.start??0,t?.end??this.rows-1))),this._register(this._inputHandler.onRequestSendFocus(()=>this._reportFocus())),this._register(this._inputHandler.onRequestReset(()=>this.reset())),this._register(this._inputHandler.onRequestWindowsOptionsReport(t=>this._reportWindowsOptions(t))),this._register(this._inputHandler.onColor(t=>this._handleColorEvent(t))),this._register(j.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(j.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(j.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(j.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(t=>this._afterResize(t.cols,t.rows))),this._register(E(()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)}))}get linkifier(){return this._linkifier.value}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}get dimensions(){if(!this._renderService)return;let e=this._renderService.dimensions;return{css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}}_handleColorEvent(e){if(this._themeService)for(let t of e){let r,s;switch(t.index){case 256:r="foreground",s="10";break;case 257:r="background",s="11";break;case 258:r="cursor",s="12";break;default:r="ansi",s="4;"+t.index}switch(t.type){case 0:let o=k.toColorRGB(r==="ansi"?this._themeService.colors.ansi[t.index]:this._themeService.colors[r]);this.coreService.triggerDataEvent(`\x1B]${s};${En(o)}\x1B\\`);break;case 1:if(r==="ansi")this._themeService.modifyColors(a=>a.ansi[t.index]=O.toColor(...t.color));else{let a=r;this._themeService.modifyColors(l=>l[a]=O.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index);break}}}_reportColorScheme(){if(!this._themeService)return;let e=Z.relativeLuminance(this._themeService.colors.background.rgba>>8),t=Z.relativeLuminance(this._themeService.colors.foreground.rgba>>8),r=e{this.hasSelection()&&Os(t,this._selectionService)}));let e=t=>Ns(t,this.textarea,this.coreService,this.optionsService);this._register(C(this.textarea,"paste",e)),this._register(C(this.element,"paste",e)),nt?this._register(C(this.element,"mousedown",t=>{t.button===2&&Hr(t,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register(C(this.element,"contextmenu",t=>{Hr(t,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),zt&&this._register(C(this.element,"auxclick",t=>{t.button===1&&Fr(t,this.textarea,this.screenElement)}))}_bindKeys(){this._register(C(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register(C(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register(C(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register(C(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register(C(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register(C(this.textarea,"compositionend",()=>this._compositionHelper.compositionend())),this._register(C(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){this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView);return}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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",l=>this.element.classList.toggle("allow-transparency",l))),e.appendChild(this.element);let t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),t.appendChild(this._viewportElement),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register(C(this.screenElement,"mousemove",l=>this.updateCursorStyle(l))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement);let r=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",Ut.get()),Yr||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._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>r.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(Ki,this.textarea,e.ownerDocument.defaultView??window,this._document??(typeof window<"u"?window.document:null))),this._instantiationService.setService(G,this._coreBrowserService),this._register(C(this.textarea,"focus",l=>this._handleTextAreaFocus(l))),this._register(C(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(bt,this._document,this._helperContainer),this._instantiationService.setService(Be,this._charSizeService),this._themeService=this._instantiationService.createInstance(yt),this._instantiationService.setService(_e,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(He),this._instantiationService.setService(gi,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(Ct,this.rows,this.screenElement)),this._instantiationService.setService(V,this._renderService),this._register(this._renderService.onRenderedViewportChange(l=>this._onRender.fire(l))),this._register(this._renderService.onDimensionsChange(l=>this._onDimensionsChange.fire({css:{canvas:{...l.css.canvas},cell:{...l.css.cell}},device:{canvas:{...l.device.canvas},cell:{...l.device.cell},char:{...l.device.char}}}))),this.onResize(l=>this._renderService.resize(l.cols,l.rows)),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(ft,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(vt),this._instantiationService.setService(Pe,this._mouseCoordsService);let s=this._linkifier.value=this._register(this._instantiationService.createInstance(Pt,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(l){this._logService.error("onWillOpen handler threw an exception",l)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(dt,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(l=>{super.scrollLines(l,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(Et,this.element,this.screenElement,s)),this._instantiationService.setService(Si,this._selectionService),this._mouseService=this._instantiationService.createInstance(gt),this._instantiationService.setService(Ks,this._mouseService),this._register(this._selectionService.onRequestScrollLines(l=>this.scrollLines(l.amount,l.suppressScrollEvent))),this._register(this._selectionService.onSelectionChange(()=>this._onSelectionChange.fire())),this._register(this._selectionService.onRequestRedraw(l=>this._renderService.handleSelectionChanged(l.start,l.end,l.columnSelectMode))),this._register(this._selectionService.onLinuxMouseSelection(l=>{this.textarea.value=l,this.textarea.focus(),this.textarea.select()})),this._register(j.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(ut,this.screenElement)),this._register(C(this.element,"mousedown",l=>this._selectionService.handleMouseDown(l))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(Ye,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",l=>this._handleScreenReaderModeOptionChange(l)));let o=this.options.scrollbar?.showScrollbar??!0,a=this.options.scrollbar?.width;o&&a&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(ze,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",l=>{let h=(l?.showScrollbar??!0)&&!!l?.width;!this._overviewRulerRenderer&&h&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(ze,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:l=>this._viewport?.handleTouchScroll(l)},l=>this._register(l),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(mt,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,r=!1){this._renderService?.refreshRows(e,t,r)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let t=e-this._bufferService.buffer.ydisp;t!==0&&this.scrollLines(t)}paste(e){Nr(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(e)}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");let 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:!1}select(e,t,r){this._selectionService.setSelection(e,t,r)}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&&this._customKeyEventHandler(e)===!1)return!1;let 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(!0),!1;!t&&(e.key==="Dead"||e.key==="AltGraph")&&(this._unprocessedDeadKey=!0);let r=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),r.type===3||r.type===2){let o=this.rows-1;return this.scrollLines(r.type===2?-o:o),e.preventDefault(),e.stopPropagation(),!1}if(r.type===1&&this.selectAll(),this._isThirdLevelShift(this.browser,e)||(r.cancel&&(e.preventDefault(),e.stopPropagation()),!r.key)||!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.key.length===1&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;(r.key===""||r.key==="\r")&&(this.textarea.value="");let s=this._keyboardService.useWin32InputMode&&Ts(e);if(this._onKey.fire({key:r.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(r.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;this._keyDownHandled=!0}_isThirdLevelShift(e,t){let r=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 t.type==="keypress"?r:r&&(!t.keyCode||t.keyCode>47)}_keyUp(e){if(this._keyDownSeen=!1,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return;Ts(e)||this.focus();let t=this._keyboardService.evaluateKeyUp(e);if(t?.key){let r=this._keyboardService.useWin32InputMode&&Ts(e);this.coreService.triggerDataEvent(t.key,!r)}this.updateCursorStyle(e),this._keyPressHandled=!1}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled||this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;if(e.charCode)t=e.charCode;else if(e.which===null||e.which===void 0)t=e.keyCode;else if(e.which!==0&&e.charCode!==0)t=e.which;else return!1;return!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)?!1:(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&&e.inputType==="insertText"&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;let t=e.data;return this.coreService.triggerDataEvent(t,!0),!0}return!1}resize(e,t){if(e===this.cols&&t===this.rows){this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure();return}super.resize(e,t)}_afterResize(e,t){this._charSizeService?.measure()}clear(){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=0;i--)this._addons[i].instance.dispose()}loadAddon(i,e){let t={instance:e,dispose:e.dispose,isDisposed:!1};this._addons.push(t),e.dispose=()=>this._wrappedAddonDispose(t),e.activate(i)}_wrappedAddonDispose(i){if(i.isDisposed)return;let e=-1;for(let t=0;t=this._line.length))return e?(this._line.loadCell(i,e),e):this._line.loadCell(i,new F)}translateToString(i,e,t){return this._line.translateToString(i,e,t)}};var di=class{constructor(i,e){this._buffer=i;this.type=e}init(i){return this._buffer=i,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(i){let e=this._buffer.lines.get(i);if(e)return new xr(e)}getNullCell(){return new F}};var wr=class extends g{constructor(e){super();this._core=e;this._onBufferChange=this._register(new b);this.onBufferChange=this._onBufferChange.event;this._normal=new di(this._core.buffers.normal,"normal"),this._alternate=new di(this._core.buffers.alt,"alternate"),this._register(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)}};var Tr=class{constructor(i){this._core=i}registerCsiHandler(i,e){return this._core.registerCsiHandler(i,t=>e(t.toArray()))}addCsiHandler(i,e){return this.registerCsiHandler(i,e)}registerDcsHandler(i,e){return this._core.registerDcsHandler(i,(t,r)=>e(t,r.toArray()))}addDcsHandler(i,e){return this.registerDcsHandler(i,e)}registerEscHandler(i,e){return this._core.registerEscHandler(i,e)}addEscHandler(i,e){return this.registerEscHandler(i,e)}registerOscHandler(i,e){return this._core.registerOscHandler(i,e)}addOscHandler(i,e){return this.registerOscHandler(i,e)}registerApcHandler(i,e){return this._core.registerApcHandler(i,e)}};var Dr=class{constructor(i){this._core=i}register(i){this._core.unicodeService.register(i)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(i){this._core.unicodeService.activeVersion=i}};var wo=["cols","rows"],Ee=0,Ln=class extends g{constructor(i){super(),this._core=this._register(new Er(i)),this._addonManager=this._register(new yr),this._publicOptions={...this._core.options};let e=r=>this._core.options[r],t=(r,s)=>{this._checkReadonlyOptions(r),this._core.options[r]=s};for(let r in this._core.options){let s={get:e.bind(this,r),set:t.bind(this,r)};Object.defineProperty(this._publicOptions,r,s)}}_checkReadonlyOptions(i){if(wo.includes(i))throw new Error(`Option "${i}" 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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new Tr(this._core)}get unicode(){return this._checkProposedApi(),new Dr(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._register(new wr(this._core))}get markers(){return this._core.markers}get modes(){let i=this._core.coreService.decPrivateModes,e="none";switch(this._core.mouseStateService.activeProtocol){case"X10":e="x10";break;case"VT200":e="vt200";break;case"DRAG":e="drag";break;case"ANY":e="any";break}return{applicationCursorKeysMode:i.applicationCursorKeys,applicationKeypadMode:i.applicationKeypad,bracketedPasteMode:i.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:e,originMode:i.origin,reverseWraparoundMode:i.reverseWraparound,sendFocusMode:i.sendFocus,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:i.synchronizedOutput,win32InputMode:i.win32InputMode,wraparoundMode:i.wraparound}}get dimensions(){return this._core.dimensions}get options(){return this._publicOptions}set options(i){for(let e in i)this._publicOptions[e]=i[e]}blur(){this._core.blur()}focus(){this._core.focus()}input(i,e=!0){this._core.input(i,e)}resize(i,e){this._verifyIntegers(i,e),this._core.resize(i,e)}open(i){this._core.open(i)}attachCustomKeyEventHandler(i){this._core.attachCustomKeyEventHandler(i)}attachCustomWheelEventHandler(i){this._core.attachCustomWheelEventHandler(i)}registerLinkProvider(i){return this._core.registerLinkProvider(i)}registerCharacterJoiner(i){return this._core.registerCharacterJoiner(i)}deregisterCharacterJoiner(i){this._core.deregisterCharacterJoiner(i)}registerMarker(i=0){return this._verifyIntegers(i),this._core.registerMarker(i)}registerDecoration(i){return this._verifyPositiveIntegers(i.x??0,i.width??0,i.height??0),this._core.registerDecoration(i)}hasSelection(){return this._core.hasSelection()}select(i,e,t){this._verifyIntegers(i,e,t),this._core.select(i,e,t)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(i,e){this._verifyIntegers(i,e),this._core.selectLines(i,e)}dispose(){super.dispose()}scrollLines(i){this._verifyIntegers(i),this._core.scrollLines(i)}scrollPages(i){this._verifyIntegers(i),this._core.scrollPages(i)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(i){this._verifyIntegers(i),this._core.scrollToLine(i)}clear(){this._core.clear()}write(i,e){this._core.write(i,e)}writeln(i,e){this._core.write(i),this._core.write(`\r --`,e)}paste(i){this._core.paste(i)}refresh(i,e){this._verifyIntegers(i,e),this._core.refresh(i,e)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(i){this._addonManager.loadAddon(this,i)}static get strings(){return{get promptLabel(){return Ut.get()},set promptLabel(i){Ut.set(i)},get tooMuchOutput(){return Ze.get()},set tooMuchOutput(i){Ze.set(i)}}}_verifyIntegers(...i){for(Ee of i)if(Ee===1/0||isNaN(Ee)||Ee%1!==0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...i){for(Ee of i)if(Ee&&(Ee===1/0||isNaN(Ee)||Ee%1!==0||Ee<0))throw new Error("This API only accepts positive integers")}};export{Ln as Terminal}; -+`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),zt&&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:this._activeSelectionMode===3})}_isClickInSelection(e){let i=this._getMouseBufferCoords(e),r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s||!i?!1:this._areCoordsInSelection(i,r,s)}isCellInSelection(e,i){let r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s?!1:this._areCoordsInSelection([e,i],r,s)}_areCoordsInSelection(e,i,r){return e[1]>i[1]&&e[1]=i[0]&&e[0]=i[0]}_selectWordAtCursor(e,i){let r=this._linkifier.currentLink?.link?.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=fs(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let s=this._getMouseBufferCoords(e);return s?(this._selectWordAt(s,i),this._model.selectionEnd=void 0,!0):!1}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,i){this._model.clearSelection(),e=Math.max(e,0),i=Math.min(i,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,i],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){let i=this._mouseCoordsService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(i)return i[0]--,i[1]--,i[1]+=this._bufferService.buffer.ydisp,i}_getMouseEventScrollAmount(e){let i=qt(this._coreBrowserService.window,e,this._screenElement)[1],r=this._renderService.dimensions.css.canvas.height;return i>=0&&i<=r?0:(i>r&&(i-=r),i=Math.min(Math.max(i,-50),50),i/=50,i/Math.abs(i)+Math.round(i*14))}shouldForceSelection(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:ie?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0&&!(this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&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){let i=this.hasSelection;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,i&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);let r=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);r&&r.length!==this._model.selectionStart[0]&&r.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let i=this._getMouseBufferCoords(e);i&&(this._activeSelectionMode=2,this._selectLineAt(i[1]))}shouldColumnSelect(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!1:e.altKey&&!(ie&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let i=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));let r=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows-1,e.lines.length-1)):(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){let i=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&i<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){let r=this._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(r&&r[0]!==void 0&&r[1]!==void 0){let s=rn(r[0]-1,r[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(s,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd,r=!!e&&!!i&&(e[0]!==i[0]||e[1]!==i[1]);if(!r){this._oldHasSelection&&this._fireOnSelectionChange(e,i,r);return}!e||!i||(!this._oldSelectionStart||!this._oldSelectionEnd||e[0]!==this._oldSelectionStart[0]||e[1]!==this._oldSelectionStart[1]||i[0]!==this._oldSelectionEnd[0]||i[1]!==this._oldSelectionEnd[1])&&this._fireOnSelectionChange(e,i,r)}_fireOnSelectionChange(e,i,r){this._oldSelectionStart=e,this._oldSelectionEnd=i,this._oldHasSelection=r,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.value=e.activeBuffer.lines.onTrim(i=>this._handleTrim(i))}_convertViewportColToCharacterIndex(e,i){let r=i;for(let s=0;i>=s;s++){let o=e.loadCell(s,this._workCell).getChars().length;this._workCell.getWidth()===0?r--:o>1&&i!==s&&(r+=o-1)}return r}setSelection(e,i,r){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,i],this._model.selectionStartLength=r,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,i,r=!0,s=!0){if(e[0]>=this._bufferService.cols)return;let o=this._bufferService.buffer,a=o.lines.get(e[1]);if(!a)return;let l=o.translateBufferLineToString(e[1],!1),h=this._convertViewportColToCharacterIndex(a,e[0]),d=h,c=e[0]-h,u=0,_=0,p=0,v=0;if(l.charAt(h)===" "){for(;h>0&&l.charAt(h-1)===" ";)h--;for(;d1&&(v+=A-1,d+=A-1);C>0&&h>0&&!this._isCharWordSeparator(a.loadCell(C-1,this._workCell));){a.loadCell(C-1,this._workCell);let T=this._workCell.getChars().length;this._workCell.getWidth()===0?(u++,C--):T>1&&(p+=T-1,h-=T-1),h--,C--}for(;w1&&(v+=T-1,d+=T-1),d++,w++}}d++;let f=h+c-u+p,S=Math.min(this._bufferService.cols,d-h+u+_-p-v);if(!(!i&&l.slice(h,d).trim()==="")){if(r&&f===0&&a.getCodePoint(0)!==32){let C=o.lines.get(e[1]-1);if(C&&a.isWrapped&&C.getCodePoint(this._bufferService.cols-1)!==32){let w=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(w){let A=this._bufferService.cols-w.start;f-=A,S+=A}}}if(s&&f+S===this._bufferService.cols&&a.getCodePoint(this._bufferService.cols-1)!==32){let C=o.lines.get(e[1]+1);if(C?.isWrapped&&C.getCodePoint(0)!==32){let w=this._getWordAt([0,e[1]+1],!1,!1,!0);w&&(S+=w.length)}}return{start:f,length:S}}}_selectWordAt(e,i){let r=this._getWordAt(e,i);if(r){for(;r.start<0;)r.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[r.start,e[1]],this._model.selectionStartLength=r.length}}_selectToWordAt(e){let i=this._getWordAt(e,!0);if(i){let r=e[1];for(;i.start<0;)i.start+=this._bufferService.cols,r--;if(!this._model.areSelectionValuesReversed())for(;i.start+i.length>this._bufferService.cols;)i.length-=this._bufferService.cols,r++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?i.start:i.start+i.length,r]}}_isCharWordSeparator(e){return e.getWidth()===0?!1:this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){let i=this._bufferService.buffer.getWrappedRangeForLine(e),r={start:{x:0,y:i.first},end:{x:this._bufferService.cols-1,y:i.last}};this._model.selectionStart=[0,i.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=fs(r,this._bufferService.cols)}};Et=y([m(3,D),m(4,Y),m(5,Oe),m(6,R),m(7,Me),m(8,V),m(9,G)],Et);var jt=class{constructor(){this._data={}}set(t,e,i){this._data[t]||(this._data[t]={}),this._data[t][e]=i}get(t,e){return this._data[t]?this._data[t][e]:void 0}clear(){this._data={}}};var Zt=class{constructor(){this._color=new jt;this._css=new jt}setCss(t,e,i){this._css.set(t,e,i)}getCss(t,e){return this._css.get(t,e)}setColor(t,e,i){this._color.set(t,e,i)}getColor(t,e){return this._color.get(t,e)}clear(){this._color.clear(),this._css.clear()}};var $=Object.freeze((()=>{let n=[M.toColor("#2e3436"),M.toColor("#cc0000"),M.toColor("#4e9a06"),M.toColor("#c4a000"),M.toColor("#3465a4"),M.toColor("#75507b"),M.toColor("#06989a"),M.toColor("#d3d7cf"),M.toColor("#555753"),M.toColor("#ef2929"),M.toColor("#8ae234"),M.toColor("#fce94f"),M.toColor("#729fcf"),M.toColor("#ad7fa8"),M.toColor("#34e2e2"),M.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let e=0;e<216;e++){let i=t[e/36%6|0],r=t[e/6%6|0],s=t[e%6];n.push({css:O.toCss(i,r,s),rgba:O.toRgba(i,r,s)})}for(let e=0;e<24;e++){let i=8+e*10;n.push({css:O.toCss(i,i,i),rgba:O.toRgba(i,i,i)})}return n})());var Xe=M.toColor("#ffffff"),Qt=M.toColor("#000000"),on=M.toColor("#ffffff"),an=Qt,Jt={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},fo=Xe,yt=class extends g{constructor(e){super();this._optionsService=e;this._contrastCache=new Zt;this._halfContrastCache=new Zt;this._onChangeColors=this._register(new b);this.onChangeColors=this._onChangeColors.event;this._colors={foreground:Xe,background:Qt,cursor:on,cursorAccent:an,selectionForeground:void 0,selectionBackgroundTransparent:Jt,selectionBackgroundOpaque:L.blend(Qt,Jt),selectionInactiveBackgroundTransparent:Jt,selectionInactiveBackgroundOpaque:L.blend(Qt,Jt),scrollbarSliderBackground:L.opacity(Xe,.2),scrollbarSliderHoverBackground:L.opacity(Xe,.4),scrollbarSliderActiveBackground:L.opacity(Xe,.5),overviewRulerBorder:Xe,ansi:$.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)))}get colors(){return this._colors}_setTheme(e={}){let i=this._colors;if(i.foreground=P(e.foreground,Xe),i.background=P(e.background,Qt),i.cursor=L.blend(i.background,P(e.cursor,on)),i.cursorAccent=L.blend(i.background,P(e.cursorAccent,an)),i.selectionBackgroundTransparent=P(e.selectionBackground,Jt),i.selectionBackgroundOpaque=L.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=P(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=L.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?P(e.selectionForeground,ts):void 0,i.selectionForeground===ts&&(i.selectionForeground=void 0),L.isOpaque(i.selectionBackgroundTransparent)&&(i.selectionBackgroundTransparent=L.opacity(i.selectionBackgroundTransparent,.3)),L.isOpaque(i.selectionInactiveBackgroundTransparent)&&(i.selectionInactiveBackgroundTransparent=L.opacity(i.selectionInactiveBackgroundTransparent,.3)),i.scrollbarSliderBackground=P(e.scrollbarSliderBackground,L.opacity(i.foreground,.2)),i.scrollbarSliderHoverBackground=P(e.scrollbarSliderHoverBackground,L.opacity(i.foreground,.4)),i.scrollbarSliderActiveBackground=P(e.scrollbarSliderActiveBackground,L.opacity(i.foreground,.5)),i.overviewRulerBorder=P(e.overviewRulerBorder,fo),i.ansi=$.slice(),i.ansi[0]=P(e.black,$[0]),i.ansi[1]=P(e.red,$[1]),i.ansi[2]=P(e.green,$[2]),i.ansi[3]=P(e.yellow,$[3]),i.ansi[4]=P(e.blue,$[4]),i.ansi[5]=P(e.magenta,$[5]),i.ansi[6]=P(e.cyan,$[6]),i.ansi[7]=P(e.white,$[7]),i.ansi[8]=P(e.brightBlack,$[8]),i.ansi[9]=P(e.brightRed,$[9]),i.ansi[10]=P(e.brightGreen,$[10]),i.ansi[11]=P(e.brightYellow,$[11]),i.ansi[12]=P(e.brightBlue,$[12]),i.ansi[13]=P(e.brightMagenta,$[13]),i.ansi[14]=P(e.brightCyan,$[14]),i.ansi[15]=P(e.brightWhite,$[15]),e.extendedAnsi){let r=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let s=0;s"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};function cn(n,t,e,i){let r={type:0,cancel:!1,key:void 0},s=(n.shiftKey?1:0)|(n.altKey?2:0)|(n.ctrlKey?4:0)|(n.metaKey?8:0);switch(n.keyCode){case 0:n.key==="UIKeyInputUpArrow"?t?r.key="\x1BOA":r.key="\x1B[A":n.key==="UIKeyInputLeftArrow"?t?r.key="\x1BOD":r.key="\x1B[D":n.key==="UIKeyInputRightArrow"?t?r.key="\x1BOC":r.key="\x1B[C":n.key==="UIKeyInputDownArrow"&&(t?r.key="\x1BOB":r.key="\x1B[B");break;case 8:r.key=n.ctrlKey?"\b":"\x7F",n.altKey&&(r.key="\x1B"+r.key);break;case 9:if(n.shiftKey){r.key="\x1B[Z";break}r.key=" ",r.cancel=!0;break;case 13:n.key==="c"&&n.ctrlKey?r.key="":r.key=n.altKey?"\x1B\r":"\r",r.cancel=!0;break;case 27:r.key="\x1B",n.altKey&&(r.key="\x1B\x1B"),r.cancel=!0;break;case 37:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"D":t?r.key="\x1BOD":r.key="\x1B[D";break;case 39:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"C":t?r.key="\x1BOC":r.key="\x1B[C";break;case 38:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"A":t?r.key="\x1BOA":r.key="\x1B[A";break;case 40:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"B":t?r.key="\x1BOB":r.key="\x1B[B";break;case 45:!n.shiftKey&&!n.ctrlKey&&(r.key="\x1B[2~");break;case 46:s?r.key="\x1B[3;"+(s+1)+"~":r.key="\x1B[3~";break;case 36:s?r.key="\x1B[1;"+(s+1)+"H":t?r.key="\x1BOH":r.key="\x1B[H";break;case 35:s?r.key="\x1B[1;"+(s+1)+"F":t?r.key="\x1BOF":r.key="\x1B[F";break;case 33:n.shiftKey?r.type=2:n.ctrlKey?r.key="\x1B[5;"+(s+1)+"~":r.key="\x1B[5~";break;case 34:n.shiftKey?r.type=3:n.ctrlKey?r.key="\x1B[6;"+(s+1)+"~":r.key="\x1B[6~";break;case 112:s?r.key="\x1B[1;"+(s+1)+"P":r.key="\x1BOP";break;case 113:s?r.key="\x1B[1;"+(s+1)+"Q":r.key="\x1BOQ";break;case 114:s?r.key="\x1B[1;"+(s+1)+"R":r.key="\x1BOR";break;case 115:s?r.key="\x1B[1;"+(s+1)+"S":r.key="\x1BOS";break;case 116:s?r.key="\x1B[15;"+(s+1)+"~":r.key="\x1B[15~";break;case 117:s?r.key="\x1B[17;"+(s+1)+"~":r.key="\x1B[17~";break;case 118:s?r.key="\x1B[18;"+(s+1)+"~":r.key="\x1B[18~";break;case 119:s?r.key="\x1B[19;"+(s+1)+"~":r.key="\x1B[19~";break;case 120:s?r.key="\x1B[20;"+(s+1)+"~":r.key="\x1B[20~";break;case 121:s?r.key="\x1B[21;"+(s+1)+"~":r.key="\x1B[21~";break;case 122:s?r.key="\x1B[23;"+(s+1)+"~":r.key="\x1B[23~";break;case 123:s?r.key="\x1B[24;"+(s+1)+"~":r.key="\x1B[24~";break;default:if(n.ctrlKey&&!n.shiftKey&&!n.altKey&&!n.metaKey)n.keyCode>=65&&n.keyCode<=90?r.key=String.fromCharCode(n.keyCode-64):n.keyCode===32?r.key="\0":n.keyCode>=51&&n.keyCode<=55?r.key=String.fromCharCode(n.keyCode-51+27):n.keyCode===56?r.key="\x7F":n.key==="/"?r.key="":n.keyCode===219?r.key="\x1B":n.keyCode===220?r.key="":n.keyCode===221&&(r.key="");else if((!e||i)&&n.altKey&&!n.metaKey){let a=_o[n.keyCode]?.[n.shiftKey?1:0];if(a)r.key="\x1B"+a;else if(n.keyCode>=65&&n.keyCode<=90){let l=n.ctrlKey?n.keyCode-64:n.keyCode+32,h=String.fromCharCode(l);n.shiftKey&&(h=h.toUpperCase()),r.key="\x1B"+h}else if(n.keyCode===32)r.key="\x1B"+(n.ctrlKey?"\0":" ");else if(n.key==="Dead"&&n.code.startsWith("Key")){let l=n.code.slice(3,4);n.shiftKey||(l=l.toLowerCase()),r.key="\x1B"+l,r.cancel=!0}}else if(e&&!n.altKey&&!n.ctrlKey&&!n.shiftKey&&n.metaKey)n.keyCode===65&&(r.type=1);else if(n.key&&!n.ctrlKey&&!n.altKey&&!n.metaKey&&n.keyCode>=48&&n.key.length===1)r.key=n.key;else if(n.key&&n.ctrlKey&&n.shiftKey)switch(n.code){case"Minus":r.key="";break;case"Digit2":r.key="\0";break;case"Digit6":r.key="";break}break}return r}var ei=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440};this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24};this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"};this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(t){if(t.code.startsWith("Numpad")){let e=t.code.slice(6);if(e>="0"&&e<="9")return 57399+parseInt(e,10);switch(e){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(t){switch(t.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(t){let e=0;return t.shiftKey&&(e|=1),t.altKey&&(e|=2),t.ctrlKey&&(e|=4),t.metaKey&&(e|=8),e>0?e+1:0}_getKeyCode(t,e){let i=this._getNumpadKeyCode(t);if(i!==void 0)return i;let r=this._getModifierKeyCode(t);if(r!==void 0)return r;let s=this._functionalKeyCodes[t.key];if(s!==void 0)return s;if((t.shiftKey||e&&t.altKey)&&t.code){if(t.code.startsWith("Digit")&&t.code.length===6){let o=t.code.charAt(5);if(o>="0"&&o<="9")return o.charCodeAt(0)}if(t.code.startsWith("Key")&&t.code.length===4)return t.code.charAt(3).toLowerCase().charCodeAt(0)}if(t.key.length===1){let o=t.key.codePointAt(0);return o>=65&&o<=90?o+32:o}}_isModifierKey(t){return t.key==="Shift"||t.key==="Control"||t.key==="Alt"||t.key==="Meta"}_isLockKey(t){return t.key==="CapsLock"||t.key==="NumLock"||t.key==="ScrollLock"}_buildCsiLetterSequence(t,e,i,r){let s=r&&i!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+i),o+=t,o}return"\x1B["+t}_buildSs3Sequence(t,e,i,r){let s=r&&i!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+i),o+=t,o}return"\x1BO"+t}_buildCsiTildeSequence(t,e,i,r){let s=r&&i!==1,o="\x1B["+t;return(e>0||s)&&(o+=";"+(e>0?e:"1"),s&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(t,e,i,r,s,o,a){let l=!!(s&2),h=!!(s&4),d="\x1B["+e,c;h&&t.shiftKey&&t.key.length===1&&!o&&!a&&(c=t.key.codePointAt(0),d+=":"+c);let _=!!(s&16)&&r!==3&&t.key.length===1&&!o&&!a&&!t.ctrlKey?t.key.codePointAt(0):void 0,p=l&&r!==1&&(r===3||_===void 0);return(i>0||p||_!==void 0)&&(d+=";",i>0?d+=i:p&&(d+="1"),p&&(d+=":"+r)),_!==void 0&&(d+=";"+_),d+="u",d}evaluate(t,e,i=1,r=!1){let s={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(t),a=this._isModifierKey(t),l=!!(e&2);if(!l&&i===3||a&&!(e&8)||this._isLockKey(t)&&!(e&8))return s;let h=this._csiLetterKeys[t.key];if(h)return s.key=this._buildCsiLetterSequence(h,o,i,l),s.cancel=!0,s;let d=this._ss3FunctionKeys[t.key];if(d)return s.key=this._buildSs3Sequence(d,o,i,l),s.cancel=!0,s;let c=this._csiTildeKeys[t.key];if(c!==void 0)return s.key=this._buildCsiTildeSequence(c,o,i,l),s.cancel=!0,s;let u=this._getKeyCode(t,r);if(u===void 0)return s;let _=u===13||u===9||u===127;if(_&&i===3&&!(e&8))return s;let p=this._functionalKeyCodes[t.key]!==void 0||this._getNumpadKeyCode(t)!==void 0;if(!!(e&8||l&&i===3||(e&1||l)&&(p&&!_||o>0&&t.key.length!==1||o-1>1)))s.key=this._buildCsiUSequence(t,u,o,i,e,p,a),s.cancel=!0;else{let f=u===13?"\r":u===9?" ":u===127?"\x7F":void 0;f?s.key=f:t.key.length===1&&!t.ctrlKey&&!t.altKey&&!t.metaKey&&(s.key=t.key)}return s}static shouldUseProtocol(t){return t>0}};var Zi=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226};this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40};this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]);this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(t){let e=this._codeToVk[t.code];return e!==void 0?e:t.keyCode||0}_getScanCode(t){return this._codeToScancode[t.code]||0}_getUnicodeChar(t){if(t.ctrlKey&&!t.altKey&&!t.metaKey){if(t.key==="Enter")return 10;if(t.key==="Backspace")return 127}let e=this._keyToControlChar[t.key];if(e!==void 0)return e;if(t.key.length===1){let i=t.key.codePointAt(0)||0;if(t.ctrlKey&&!t.altKey&&!t.metaKey){if(i>=65&&i<=90)return i-64;if(i>=97&&i<=122)return i-96}return i}return 0}_getControlKeyState(t){let e=0;return t.shiftKey&&(e|=16),t.ctrlKey&&(t.code==="ControlRight"?e|=4:e|=8),t.altKey&&(t.code==="AltRight"?e|=1:e|=2),this._enhancedKeyCodes.has(t.code)&&(e|=256),e}evaluateKeyboardEvent(t,e){let i=this._getVirtualKeyCode(t),r=this._getScanCode(t),s=this._getUnicodeChar(t),o=e?1:0,a=this._getControlKeyState(t);return{type:0,cancel:!0,key:`\x1B[${i};${r};${s};${o};${a};1_`}}};var xt=class{constructor(t,e){this._coreService=t;this._optionsService=e}_getWin32InputMode(){return this._win32InputMode??=new Zi,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new ei,this._kittyKeyboard}evaluateKeyDown(t){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(t,!0);let e=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(t,e,t.repeat?2:1,ie&&this._optionsService.rawOptions.macOptionIsMeta):cn(t,this._coreService.decPrivateModes.applicationCursorKeys,ie,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(t){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(t,!1);let e=this._coreService.kittyKeyboard.flags;if(this.useKitty&&e&2)return this._getKittyKeyboard().evaluate(t,e,3,ie&&this._optionsService.rawOptions.macOptionIsMeta)}get useKitty(){let t=this._coreService.kittyKeyboard.flags;return!!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard&&ei.shouldUseProtocol(t))}get useWin32InputMode(){return!!(this._optionsService.rawOptions.vtExtensions?.win32InputMode&&this._coreService.decPrivateModes.win32InputMode)}};xt=y([m(0,Y),m(1,R)],xt);var ps=class{constructor(...t){this._entries=new Map;for(let[e,i]of t)this.set(e,i)}set(t,e){let i=this._entries.get(t);return this._entries.set(t,e),i}forEach(t){for(let[e,i]of this._entries.entries())t(e,i)}has(t){return this._entries.has(t)}get(t){return this._entries.get(t)}},Ji=class{constructor(){this._services=new ps;this._services.set(et,this)}setService(t,e){this._services.set(t,e)}getService(t){return this._services.get(t)}createInstance(t,...e){let i=Hs(t).sort((o,a)=>o.index-a.index),r=[];for(let o of i){let a=this._services.get(o.id);if(!a)throw new Error(`[createInstance] ${t.name} depends on UNKNOWN service ${o.id._id}.`);r.push(a)}let s=i.length>0?i[0].index:e.length;if(e.length!==s)throw new Error(`[createInstance] First service dependency of ${t.name} at position ${s+1} conflicts with ${e.length} static arguments`);return new t(...e,...r)}};var po={trace:0,debug:1,info:2,warn:3,error:4,off:5},mo="xterm.js: ",wt=class extends g{constructor(e){super();this._optionsService=e;this._logLevel=5;this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}get logLevel(){return this._logLevel}_updateLogLevel(){this._logLevel=po[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let i=0;ithis._length)for(let i=this._length;i=e;s--)this._array[this._getCyclicIndex(s+r.length)]=this._array[this._getCyclicIndex(s)];for(let s=0;sthis._maxLength){let s=this._length+r.length-this._maxLength;this._startIndex+=s,this._length=this._maxLength,this.onTrimEmitter.fire(s)}else this._length+=r.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,i,r){if(!(i<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+r<0)throw new Error("Cannot shift elements in list beyond index 0");if(r>0){for(let o=i-1;o>=0;o--)this.set(e+o+r,this.get(e+o));let s=e+i+r-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;sthis._limit?(this._builder.reset(),!0):!1}toString(){return this._builder.toString()}};var U=Object.freeze(new fe),Qi=0,dn=new F,er=new ii,Re=class n{constructor(t,e,i,r=!1){this._stringCache=t;this.isWrapped=r;this._combined={};this._extendedAttrs={};this._data=new Uint32Array(e*3);let s=i??F.fromCharData([0,"",1,0]);for(let o=0;o>22,e&2097152?this._combined[t].charCodeAt(this._combined[t].length-1):i]}set(t,e){this._invalidateStringCache(),this._data[t*3+1]=e[0],e[1].length>1?(this._combined[t]=e[1],this._data[t*3+0]=t|2097152|e[2]<<22):this._data[t*3+0]=e[1].charCodeAt(0)|e[2]<<22}getWidth(t){return this._data[t*3+0]>>22}hasWidth(t){return this._data[t*3+0]&12582912}getFg(t){return this._data[t*3+1]}getBg(t){return this._data[t*3+2]}hasContent(t){return this._data[t*3+0]&4194303}getCodePoint(t){let e=this._data[t*3+0];return e&2097152?this._combined[t].charCodeAt(this._combined[t].length-1):e&2097151}isCombined(t){return this._data[t*3+0]&2097152}getString(t){let e=this._data[t*3+0];return e&2097152?this._combined[t]:e&2097151?be(e&2097151):""}isProtected(t){return this._data[t*3+2]&536870912}loadCell(t,e){return Qi=t*3,e.content=this._data[Qi+0],e.fg=this._data[Qi+1],e.bg=this._data[Qi+2],e.content&2097152?e.combinedData=this._combined[t]:e.combinedData="",e.bg&268435456?e.extended=this._extendedAttrs[t]:e.extended=U.extended.clone(),e}setCell(t,e){this._invalidateStringCache(),e.content&2097152&&(this._combined[t]=e.combinedData),e.bg&268435456&&(this._extendedAttrs[t]=e.extended),this._data[t*3+0]=e.content,this._data[t*3+1]=e.fg,this._data[t*3+2]=e.bg}setCellFromCodepoint(t,e,i,r){this._invalidateStringCache(),r.bg&268435456&&(this._extendedAttrs[t]=r.extended),this._data[t*3+0]=e|i<<22,this._data[t*3+1]=r.fg,this._data[t*3+2]=r.bg}addCodepointToCell(t,e,i){this._invalidateStringCache();let r=this._data[t*3+0];r&2097152?this._combined[t]+=be(e):r&2097151?(this._combined[t]=be(r&2097151)+be(e),r&=-2097152,r|=2097152):r=e|1<<22,i&&(r&=-12582913,r|=i<<22),this._data[t*3+0]=r}insertCells(t,e,i){if(this._invalidateStringCache(),t%=this.length,t&&this.getWidth(t-1)===2&&this.setCellFromCodepoint(t-1,0,1,i),e=0;--r)this.setCell(t+e+r,this.loadCell(t+r,dn));for(let r=0;rthis.length){if(this._data.buffer.byteLength>=i*4)this._data=new Uint32Array(this._data.buffer,0,i);else{let r=new Uint32Array(i);r.set(this._data),this._data=r}for(let r=this.length;r=t&&delete this._combined[a]}let s=Object.keys(this._extendedAttrs);for(let o=0;o=t&&delete this._extendedAttrs[a]}}return this.length=t,i*4*2=0;--t)if(this._data[t*3+0]&4194303)return t+(this._data[t*3+0]>>22);return 0}getNoBgTrimmedLength(){for(let t=this.length-1;t>=0;--t)if(this._data[t*3+0]&4194303||this._data[t*3+2]&50331648)return t+(this._data[t*3+0]>>22);return 0}copyCellsFrom(t,e,i,r,s){this._invalidateStringCache();let o=t._data;if(s)for(let a=r-1;a>=0;a--){for(let l=0;l<3;l++)this._data[(i+a)*3+l]=o[(e+a)*3+l];this._copyCellMapsFrom(t,e+a,i+a)}else for(let a=0;a>22||1}r&&r.push(e);let a=er.toString();if(er.reset(),s){let l=this._getStringCacheEntry(!0);l.value=a,l.isTrimmed=!!t}return a}_getStringCacheEntry(t){let e=this._stringCacheEntryRef?.deref();if(e&&e.generation===this._stringCache.generation)return e;if(!t)return;let i=this._stringCache.allocateEntry();return this._stringCacheEntryRef=new WeakRef(i),i}_invalidateStringCache(){let t=this._getStringCacheEntry(!1);t&&(t.value=void 0,t.isTrimmed=!1)}_copyCellMapsFrom(t,e,i){let r=e*3;t._data[r+0]&2097152&&(this._combined[i]=t._combined[e]),t._data[r+2]&268435456&&(this._extendedAttrs[i]=t._extendedAttrs[e])}_copySparseMapsFrom(t){this._combined={},this._extendedAttrs={};for(let e=0;ethis.entries.clear()))}touch(){this._scheduleClear()}allocateEntry(){let e={value:void 0,isTrimmed:!1,generation:this.generation};return this.entries.add(e),this._scheduleClear(),e}clear(){this._clearTimeout.clear(),this._lastAccessTimestamp=0,this.generation++;for(let e of this.entries)e.value=void 0,e.isTrimmed=!1;this.entries.clear()}_scheduleClear(){this._lastAccessTimestamp=Date.now(),!this._clearTimeout.value&&this._scheduleClearTimeout(15e3)}_scheduleClearTimeout(e){this._clearTimeout.value=Gs(()=>{let i=Date.now()-this._lastAccessTimestamp;if(i>=15e3){this.clear();return}this._scheduleClearTimeout(15e3-i)},e)}};function un(n,t,e,i,r,s){let o=[];for(let a=0;a=a&&i0&&(f>c||d[f].getTrimmedLength()===0);f--)v++;v>0&&(o.push(a+d.length-v),o.push(v)),a+=d.length-1}return o}function fn(n,t){let e=[],i=0,r=t[i],s=0;for(let o=0;ol&&(s-=l,o++);let h=n[o].getWidth(s-1)===2;h&&s--;let d=h?e-1:e;i.push(d),a+=d}return i}function Tt(n,t,e){if(t===n.length-1)return n[t].getTrimmedLength();let i=!n[t].hasContent(e-1)&&n[t].getWidth(e-1)===1,r=n[t+1].getWidth(0)===2;return i&&r?e-1:e}var rr=class rr{constructor(t){this.line=t;this.isDisposed=!1;this._disposables=[];this._id=rr._nextId++;this._onDispose=this.register(new b);this.onDispose=this._onDispose.event}get id(){return this._id}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),Ne(this._disposables),this._disposables.length=0)}register(t){return this._disposables.push(t),t}};rr._nextId=1;var ir=rr;var q={},Le=q.B;q[0]={"`":"\u25C6",a:"\u2592",b:"\u2409",c:"\u240C",d:"\u240D",e:"\u240A",f:"\xB0",g:"\xB1",h:"\u2424",i:"\u240B",j:"\u2518",k:"\u2510",l:"\u250C",m:"\u2514",n:"\u253C",o:"\u23BA",p:"\u23BB",q:"\u2500",r:"\u23BC",s:"\u23BD",t:"\u251C",u:"\u2524",v:"\u2534",w:"\u252C",x:"\u2502",y:"\u2264",z:"\u2265","{":"\u03C0","|":"\u2260","}":"\xA3","~":"\xB7"};q.A={"#":"\xA3"};q.B=void 0;q[4]={"#":"\xA3","@":"\xBE","[":"ij","\\":"\xBD","]":"|","{":"\xA8","|":"f","}":"\xBC","~":"\xB4"};q.C=q[5]={"[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q.R={"#":"\xA3","@":"\xE0","[":"\xB0","\\":"\xE7","]":"\xA7","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xA8"};q.Q={"@":"\xE0","[":"\xE2","\\":"\xE7","]":"\xEA","^":"\xEE","`":"\xF4","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xFB"};q.K={"@":"\xA7","[":"\xC4","\\":"\xD6","]":"\xDC","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xDF"};q.Y={"#":"\xA3","@":"\xA7","[":"\xB0","\\":"\xE7","]":"\xE9","`":"\xF9","{":"\xE0","|":"\xF2","}":"\xE8","~":"\xEC"};q.E=q[6]={"@":"\xC4","[":"\xC6","\\":"\xD8","]":"\xC5","^":"\xDC","`":"\xE4","{":"\xE6","|":"\xF8","}":"\xE5","~":"\xFC"};q.Z={"#":"\xA3","@":"\xA7","[":"\xA1","\\":"\xD1","]":"\xBF","{":"\xB0","|":"\xF1","}":"\xE7"};q.H=q[7]={"@":"\xC9","[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q["="]={"#":"\xF9","@":"\xE0","[":"\xE9","\\":"\xE7","]":"\xEA","^":"\xEE",_:"\xE8","`":"\xF4","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xFB"};var mn=4294967295,si=class extends g{constructor(e,i,r,s){super();this._hasScrollback=e;this._optionsService=i;this._bufferService=r;this._logService=s;this.ydisp=0;this.ybase=0;this.y=0;this.x=0;this.tabs={};this.savedY=0;this.savedX=0;this.savedCurAttrData=U.clone();this.savedCharset=Le;this.savedCharsets=[];this.savedGlevel=0;this.savedOriginMode=!1;this.savedWraparoundMode=!0;this.markers=[];this._nullCell=F.fromCharData([0,"",1,0]);this._whitespaceCell=F.fromCharData([0," ",1,32]);this._isClearing=!1;this._memoryCleanupPosition=0;this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops(),this._memoryCleanupQueue=new Ct(this._logService),this._register(E(()=>this._memoryCleanupQueue.clear())),this._register(E(()=>this.clearAllMarkers())),this._stringCache=this._register(new tr)}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 Pe),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 Pe),this._whitespaceCell}getBlankLine(e,i){return new Re(this._stringCache,this._bufferService.cols,this.getNullCell(e),i)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){let i=this.ybase+this.y-this.ydisp;return i>=0&&imn?mn:i}fillViewportRows(e){if(this.lines.length===0){e??=U;let i=this._rows;for(;i--;)this.lines.push(this.getBlankLine(e))}}clear(){this._stringCache.clear(),this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,i){let r=this.getNullCell(U);this._stringCache.clear();let s=0,o=this._getCorrectBufferLength(i);if(o>this.lines.maxLength&&(this.lines.maxLength=o),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+a+1?(this.ybase--,a++,this.ydisp>0&&this.ydisp--):this.lines.push(new Re(this._stringCache,e,r,!1)));else for(let l=this._rows;l>i;l--)this.lines.length>i+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(o0&&(this.lines.trimStart(l),this.ybase=Math.max(this.ybase-l,0),this.ydisp=Math.max(this.ydisp-l,0),this.savedY=Math.max(this.savedY-l,0)),this.lines.maxLength=o}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,i-1),a&&(this.y+=a),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=i-1,this._isReflowEnabled&&(this._reflow(e,i),this._cols>e))for(let a=0;a0){let a=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,a)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let i=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){let e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&e.backend==="conpty"&&e.buildNumber>=21376:this._hasScrollback}_reflow(e,i){this._cols!==e&&(e>this._cols?this._reflowLarger(e,i):this._reflowSmaller(e,i))}_reflowLarger(e,i){let r=this._optionsService.rawOptions.reflowCursorLine,s=un(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(U),r);if(s.length>0){let o=fn(this.lines,s);_n(this.lines,o.layout),this._reflowLargerAdjustViewport(e,i,o.countRemoved)}}_reflowLargerAdjustViewport(e,i,r){let s=this.getNullCell(U),o=r;for(;o-- >0;)this.ybase===0?(this.y>0&&this.y--,this.lines.length=0;l--){let h=this.lines.get(l);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;let d=[h];for(;h.isWrapped&&l>0;)h=this.lines.get(--l),d.unshift(h);if(!r){let T=this.ybase+this.y;if(T>=l&&T0&&(o.push({start:l+d.length+a,newLines:v}),a+=v.length),d.push(...v);let f=u.length-1,S=u[f];S===0&&(f--,S=u[f]);let C=d.length-_-1,w=c;for(;C>=0;){let T=Math.min(w,S);if(d[f]===void 0)break;if(d[f].copyCellsFrom(d[C],w-T,S-T,T,!0),S-=T,S===0&&(f--,S=u[f]),w-=T,w===0){C--;let te=Math.max(C,0);w=Tt(d,te,this._cols)}}for(let T=0;T0;)this.ybase===0?this.y0){let l=[],h=[];for(let S=0;S=0;S--)if(_&&_.start>c+p){for(let C=_.newLines.length-1;C>=0;C--)this.lines.set(S--,_.newLines[C]);S++,l.push({index:c+1,amount:_.newLines.length}),p+=_.newLines.length,_=o[++u]}else this.lines.set(S,h[c--]);let v=0;for(let S=l.length-1;S>=0;S--)l[S].index+=v,this.lines.onInsertEmitter.fire(l[S]),v+=l[S].amount;let f=Math.max(0,d+a-this.lines.maxLength);f>0&&this.lines.onTrimEmitter.fire(f)}}translateBufferLineToString(e,i,r=0,s){let o=this.lines.get(e);return o?o.translateToString(i,r,s):""}getWrappedRangeForLine(e){let i=e,r=e;for(;i>0&&this.lines.get(i).isWrapped;)i--;for(;r+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(e??=this.x;!this.tabs[++e]&&e=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let i=0;i{i.line-=r,i.line<0&&i.dispose()})),i.register(this.lines.onInsert(r=>{i.line>=r.index&&(i.line+=r.amount)})),i.register(this.lines.onDelete(r=>{i.line>=r.index&&i.liner.index&&(i.line-=r.amount)})),i.register(i.onDispose(()=>this._removeMarker(i))),i}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}};var sr=class extends g{constructor(e,i,r){super();this._optionsService=e;this._bufferService=i;this._logService=r;this._normalBuffer=this._register(new B);this._altBuffer=this._register(new B);this._onBufferActivate=this._register(new b);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 si(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new si(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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,i){this._normal.resize(e,i),this._alt.resize(e,i),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}};var Dt=class extends g{constructor(e,i){super();this.isUserScrolling=!1;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new sr(e,this,i)),this._register(this.buffers.onBufferActivate(r=>{this._onScroll.fire(r.activeBuffer.ydisp)}))}get buffer(){return this.buffers.active}resize(e,i){let r=this.cols!==e,s=this.rows!==i;this.cols=e,this.rows=i,this.buffers.resize(e,i),this._onResize.fire({cols:e,rows:i,colsChanged:r,rowsChanged:s})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,i=!1){let r=this.buffer,s;s=this._cachedBlankLine,(!s||s.length!==this.cols||s.getFg(0)!==e.fg||s.getBg(0)!==e.bg)&&(s=r.getBlankLine(e,i),this._cachedBlankLine=s),s.isWrapped=i;let o=r.ybase+r.scrollTop,a=r.ybase+r.scrollBottom;if(r.scrollTop===0){let l=r.lines.isFull;a===r.lines.length-1?l?r.lines.recycle().copyFrom(s):r.lines.push(s.clone()):r.lines.splice(a+1,0,s.clone()),l?this.isUserScrolling&&(r.ydisp=Math.max(r.ydisp-1,0)):(r.ybase++,this.isUserScrolling||r.ydisp++)}else{let l=a-o+1;r.lines.shiftElements(o+1,l-1,-1),r.lines.set(a,s.clone())}this.isUserScrolling||(r.ydisp=r.ybase),this._onScroll.fire(r.ydisp)}scrollLines(e,i){let r=this.buffer;if(e<0){if(r.ydisp===0)return;this.isUserScrolling=!0}else e+r.ydisp>=r.ybase&&(this.isUserScrolling=!1);let s=r.ydisp;r.ydisp=Math.max(Math.min(r.ydisp+e,r.ybase),0),s!==r.ydisp&&(i||this._onScroll.fire(r.ydisp))}};Dt=y([m(0,R),m(1,_e)],Dt);var Rt={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:ie,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}},vo=["normal","bold","100","200","300","400","500","600","700","800","900"],nr=class extends g{constructor(e){super();this._onOptionChange=this._register(new b);this.onOptionChange=this._onOptionChange.event;let i={...Rt};for(let r in e)if(r in i)try{let s=e[r];i[r]=this._sanitizeAndValidateOption(r,s)}catch(s){console.error(s)}this.rawOptions=i,this.options={...i},this._setupOptions(),this._register(E(()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null}))}onSpecificOptionChange(e,i){return this.onOptionChange(r=>{r===e&&i(this.rawOptions[e])})}onMultipleOptionChange(e,i){return this.onOptionChange(r=>{e.indexOf(r)!==-1&&i()})}_setupOptions(){let e=r=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);return this.rawOptions[r]},i=(r,s)=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);s=this._sanitizeAndValidateOption(r,s),this.rawOptions[r]!==s&&(this.rawOptions[r]=s,this._onOptionChange.fire(r))};for(let r in this.rawOptions){let s={get:e.bind(this,r),set:i.bind(this,r)};Object.defineProperty(this.options,r,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=Rt[e]),!So(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=Rt[e]);break;case"fontWeight":case"fontWeightBold":if(typeof i=="number"&&1<=i&&i<=1e3)break;i=vo.includes(i)?i:Rt[e];break;case"blinkIntervalDuration":if(i=Math.floor(i),i<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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(i*10)/10));break;case"scrollback":if(i=Math.min(i,4294967295),i<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&&i!==0)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=i??{};break}return i}};function So(n){return n==="block"||n==="underline"||n==="bar"}var bn=Object.freeze({insertMode:!1}),vn=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0}),Sn=()=>({flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}),Lt=class extends g{constructor(e,i,r){super();this._bufferService=e;this._logService=i;this._optionsService=r;this.isCursorHidden=!1;this._onData=this._register(new b);this.onData=this._onData.event;this._onUserInput=this._register(new b);this.onUserInput=this._onUserInput.event;this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onRequestScrollToBottom=this._register(new b);this.onRequestScrollToBottom=this._onRequestScrollToBottom.event;this.isCursorInitialized=r.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(bn),this.decPrivateModes=structuredClone(vn),this.kittyKeyboard=Sn()}reset(){this.modes=structuredClone(bn),this.decPrivateModes=structuredClone(vn),this.kittyKeyboard=Sn()}triggerDataEvent(e,i=!1){if(this._optionsService.rawOptions.disableStdin)return;let r=this._bufferService.buffer;i&&this._optionsService.rawOptions.scrollOnUserInput&&r.ybase!==r.ydisp&&this._onRequestScrollToBottom.fire(),i&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(s=>s.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(i=>i.charCodeAt(0))),this._onBinary.fire(e))}};Lt=y([m(0,D),m(1,_e),m(2,R)],Lt);var gn={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:n=>n.button===4||n.action!==1?!1:(n.ctrl=!1,n.alt=!1,n.shift=!1,!0)},VT200:{events:19,restrict:n=>n.action!==32},DRAG:{events:23,restrict:n=>!(n.action===32&&n.button===3)},ANY:{events:31,restrict:n=>!0}};function vs(n,t){let e=(n.ctrl?16:0)|(n.shift?4:0)|(n.alt?8:0);return n.button===4?(e|=64,e|=n.action):(e|=n.button&3,n.button&4&&(e|=64),n.button&8&&(e|=128),n.action===32?e|=32:n.action===0&&!t&&(e|=3)),e}var Ss=String.fromCharCode,Cn={DEFAULT:n=>{let t=[vs(n,!1)+32,n.col+32,n.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`\x1B[M${Ss(t[0])}${Ss(t[1])}${Ss(t[2])}`},SGR:n=>{let t=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${vs(n,!0)};${n.col};${n.row}${t}`},SGR_PIXELS:n=>{let t=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${vs(n,!0)};${n.x};${n.y}${t}`}},or=class extends g{constructor(){super();this._protocols={};this._encodings={};this._activeProtocol="";this._activeEncoding="";this._onProtocolChange=this._register(new b);this.onProtocolChange=this._onProtocolChange.event;for(let e of Object.keys(gn))this.addProtocol(e,gn[e]);for(let e of Object.keys(Cn))this.addEncoding(e,Cn[e]);this.reset()}addProtocol(e,i){this._protocols[e]=i}addEncoding(e,i){this._encodings[e]=i}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return this._protocols[this._activeProtocol].events!==0}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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return this._customWheelEventHandler?this._customWheelEventHandler(e)!==!1:!0}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return this._activeEncoding==="DEFAULT"}get isPixelEncoding(){return this._activeEncoding==="SGR_PIXELS"}};var me=class n{constructor(){this._providers=Object.create(null);this._active="";this._onChange=new b;this.onChange=this._onChange.event}static extractShouldJoin(t){return(t&1)!==0}static extractWidth(t){return t>>1&3}static extractCharKind(t){return t>>3}static createPropertyValue(t,e,i=!1){return(t&16777215)<<3|(e&3)<<1|(i?1:0)}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(t){if(!this._providers[t])throw new Error(`unknown Unicode version "${t}"`);this._active=t,this._activeProvider=this._providers[t],this._onChange.fire(t)}register(t){this._providers[t.version]=t,this._active||(this.activeVersion=t.version)}wcwidth(t){return this._activeProvider.wcwidth(t)}getStringCellWidth(t){let e=0,i=0,r=t.length;for(let s=0;s=r)return e+this.wcwidth(o);let h=t.charCodeAt(s);56320<=h&&h<=57343?o=(o-55296)*1024+h-56320+65536:e+=this.wcwidth(h)}let a=this.charProperties(o,i),l=n.extractWidth(a);n.extractShouldJoin(a)&&(l-=n.extractWidth(i)),e+=l,i=a}return e}charProperties(t,e){return this._activeProvider.charProperties(t,e)}};var gs=[[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]],go=[[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]],X;function Co(n,t){let e=0,i=t.length-1,r;if(nt[i][1])return!1;for(;i>=e;)if(r=e+i>>1,n>t[r][1])e=r+1;else if(n=131072&&t<=196605||t>=196608&&t<=262141?2:1}charProperties(t,e){let i=this.wcwidth(t),r=i===0&&e!==0;if(r){let s=me.extractWidth(e);s===0?r=!1:s>i&&(i=s)}return me.createPropertyValue(0,i,r)}};var lr=class{constructor(){this.glevel=0;this._charsets=[]}get charsets(){return this._charsets}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(t){this.glevel=t,this.charset=this._charsets[t]}setgCharset(t,e){this._charsets[t]=e,this.glevel===t&&(this.charset=e)}};function Cs(n){let e=n.buffer.lines.get(n.buffer.ybase+n.buffer.y-1)?.get(n.cols-1),i=n.buffer.lines.get(n.buffer.ybase+n.buffer.y);i&&e&&(i.isWrapped=e[3]!==0&&e[3]!==32)}var At=class n{constructor(t=32,e=32){this.maxLength=t;this.maxSubParamsLength=e;if(e>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(t),this.length=0,this._subParams=new Int32Array(e),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(t),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}static fromArray(t){let e=new n;if(!t.length)return e;for(let i=Array.isArray(t[0])?1:0;i>8,r=this._subParamsIdx[e]&255;r-i>0&&t.push(Array.prototype.slice.call(this._subParams,i,r))}return t}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(t){if(this._digitIsSub=!1,this.length>=this.maxLength){this._rejectDigits=!0;return}if(t<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=t>2147483647?2147483647:t}addSubParam(t){if(this._digitIsSub=!0,!!this.length){if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength){this._rejectSubDigits=!0;return}if(t<-1)throw new Error("values less than -1 are not allowed");this._subParams[this._subParamsLength++]=t>2147483647?2147483647:t,this._subParamsIdx[this.length-1]++}}hasSubParams(t){return(this._subParamsIdx[t]&255)-(this._subParamsIdx[t]>>8)>0}getSubParams(t){let e=this._subParamsIdx[t]>>8,i=this._subParamsIdx[t]&255;return i-e>0?this._subParams.subarray(e,i):null}getSubParamsAll(){let t={};for(let e=0;e>8,r=this._subParamsIdx[e]&255;r-i>0&&(t[e]=this._subParams.slice(i,r))}return t}addDigit(t){let e;if(this._rejectDigits||!(e=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;let i=this._digitIsSub?this._subParams:this.params,r=i[e-1];i[e-1]=~r?Math.min(r*10+t,2147483647):t}};var ni=[],cr=class{constructor(){this._state=0;this._active=ni;this._id=-1;this._handlers=Object.create(null);this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ni}reset(){if(this._state===2)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].end(!1);this._stack.paused=!1,this._active=ni,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||ni,!this._active.length)this._handlerFb(this._id,"START");else for(let t=this._active.length-1;t>=0;t--)this._active[t].start()}_put(t,e,i){if(!this._active.length)this._handlerFb(this._id,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}start(){this.reset(),this._state=1}put(t,e,i){if(this._state!==3){if(this._state===1)for(;e0&&this._put(t,e,i)}}end(t,e=!0){if(this._state!==0){if(this._state!==3)if(this._state===1&&this._start(),!this._active.length)this._handlerFb(this._id,"END",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].end(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=ni,this._id=-1,this._state=0}}},hr=class hr{constructor(t){this._handler=t;this._data=new Ue(hr._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}end(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(i=>(this._data.reset(),this._hitLimit=!1,i));return this._data.reset(),this._hitLimit=!1,e}};hr._payloadLimit=1e7;var ne=hr;var oi=[],dr=class{constructor(){this._handlers=Object.create(null);this._active=oi;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=oi}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}reset(){if(this._active.length)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].unhook(!1);this._stack.paused=!1,this._active=oi,this._ident=0}hook(t,e){if(this.reset(),this._ident=t,this._active=this._handlers[t]||oi,!this._active.length)this._handlerFb(this._ident,"HOOK",e);else for(let i=this._active.length-1;i>=0;i--)this._active[i].hook(e)}put(t,e,i){if(!this._active.length)this._handlerFb(this._ident,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}unhook(t,e=!0){if(!this._active.length)this._handlerFb(this._ident,"UNHOOK",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].unhook(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=oi,this._ident=0}},ai=new At;ai.addParam(0);var ur=class ur{constructor(t){this._handler=t;this._data=new Ue(ur._payloadLimit);this._params=ai;this._hitLimit=!1}hook(t){this._params=t.length>1||t.params[0]?t.clone():ai,this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}unhook(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString(),this._params),e instanceof Promise))return e.then(i=>(this._params=ai,this._data.reset(),this._hitLimit=!1,i));return this._params=ai,this._data.reset(),this._hitLimit=!1,e}};ur._payloadLimit=1e7;var li=ur;var ci=[],fr=class{constructor(){this._handlers=Object.create(null);this._active=ci;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ci}reset(){if(this._active.length)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].end(!1);this._stack.paused=!1,this._active=ci,this._ident=0}start(t){if(this.reset(),this._ident=t,this._active=this._handlers[t]||ci,!this._active.length)this._handlerFb(this._ident,"START");else for(let e=this._active.length-1;e>=0;e--)this._active[e].start()}put(t,e,i){if(!this._active.length)this._handlerFb(this._ident,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}end(t,e=!0){if(!this._active.length)this._handlerFb(this._ident,"END",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].end(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=ci,this._ident=0}},pr=class pr{constructor(t){this._handler=t;this._data=new Ue(pr._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}end(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(i=>(this._data.reset(),this._hitLimit=!1,i));return this._data.reset(),this._hitLimit=!1,e}};pr._payloadLimit=1e7;var _r=pr;var Is=class{constructor(t){this.table=new Uint16Array(t)}setDefault(t,e){this.table.fill(t<<8|e)}add(t,e,i,r){this.table[e<<8|t]=i<<8|r}addMany(t,e,i,r){for(let s=0;sl),i=(a,l)=>e.slice(a,l),r=i(32,127),s=i(0,24);s.push(25),s.push.apply(s,i(28,32));let o=i(0,17);n.setDefault(1,0),n.addMany(r,0,2,0);for(let a of o)n.addMany([24,26,153,154],a,3,0),n.addMany(i(128,144),a,3,0),n.addMany(i(144,152),a,3,0),n.add(156,a,0,0),n.add(27,a,11,1),n.add(157,a,4,8),n.addMany([152,158],a,0,7),n.add(159,a,11,14),n.add(155,a,11,3),n.add(144,a,11,9);return n.addMany(s,0,3,0),n.addMany(s,1,3,1),n.add(127,1,0,1),n.addMany(s,8,0,8),n.addMany(s,3,3,3),n.add(127,3,0,3),n.addMany(s,4,3,4),n.add(127,4,0,4),n.addMany(s,6,3,6),n.addMany(s,5,3,5),n.add(127,5,0,5),n.addMany(s,2,3,2),n.add(127,2,0,2),n.add(93,1,4,8),n.addMany(r,8,5,8),n.add(127,8,5,8),n.addMany([156,27,24,26,7],8,6,0),n.addMany(i(28,32),8,0,8),n.addMany([88,94],1,0,7),n.addMany(r,7,0,7),n.addMany(s,7,0,7),n.add(156,7,0,0),n.add(127,7,0,7),n.add(95,1,11,14),n.addMany(s,14,0,14),n.add(127,14,0,14),n.addMany(i(32,48),14,9,15),n.addMany(i(48,127),14,15,16),n.addMany(i(48,127),15,15,16),n.addMany(s,15,0,15),n.addMany(i(32,48),15,9,15),n.add(127,15,0,15),n.addMany(r,16,16,16),n.addMany(s,16,0,16),n.addMany(i(8,14),16,16,16),n.add(127,16,0,16),n.addMany([27,156,24,26],16,17,0),n.add(91,1,11,3),n.addMany(i(64,127),3,7,0),n.addMany(i(48,60),3,8,4),n.addMany([60,61,62,63],3,9,4),n.addMany(i(48,60),4,8,4),n.addMany(i(64,127),4,7,0),n.addMany([60,61,62,63],4,0,6),n.addMany(i(32,64),6,0,6),n.add(127,6,0,6),n.addMany(i(64,127),6,0,0),n.addMany(i(32,48),3,9,5),n.addMany(i(32,48),5,9,5),n.addMany(i(48,64),5,0,6),n.addMany(i(64,127),5,7,0),n.addMany(i(32,48),4,9,5),n.addMany(i(32,48),1,9,2),n.addMany(i(32,48),2,9,2),n.addMany(i(48,127),2,10,0),n.addMany(i(48,80),1,10,0),n.addMany(i(81,88),1,10,0),n.addMany([89,90,92],1,10,0),n.addMany(i(96,127),1,10,0),n.add(80,1,11,9),n.addMany(s,9,0,9),n.add(127,9,0,9),n.addMany(i(32,48),9,9,12),n.addMany(i(48,60),9,8,10),n.addMany([60,61,62,63],9,9,10),n.addMany(s,11,0,11),n.addMany(i(32,128),11,0,11),n.addMany(s,10,0,10),n.add(127,10,0,10),n.addMany(i(48,60),10,8,10),n.addMany([60,61,62,63],10,0,11),n.addMany(i(32,48),10,9,12),n.addMany(s,12,0,12),n.add(127,12,0,12),n.addMany(i(32,48),12,9,12),n.addMany(i(48,64),12,0,11),n.addMany(i(64,127),12,12,13),n.addMany(i(64,127),10,12,13),n.addMany(i(64,127),9,12,13),n.addMany(s,13,13,13),n.addMany(r,13,13,13),n.add(127,13,0,13),n.addMany([27,156,24,26],13,14,0),n.add(oe,0,2,0),n.add(oe,8,5,8),n.add(oe,6,0,6),n.add(oe,11,0,11),n.add(oe,13,13,13),n.add(oe,16,16,16),n})(),mr=class extends g{constructor(e=Io){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 At,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(i,r,s)=>{},this._executeHandlerFb=i=>{},this._csiHandlerFb=(i,r)=>{},this._escHandlerFb=i=>{},this._errorHandlerFb=i=>i,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this._register(E(()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new cr),this._dcsParser=this._register(new dr),this._apcParser=this._register(new fr),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},()=>!0)}_identifier(e,i=[64,126]){let r=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(r=e.prefix.charCodeAt(0),r<60||r>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 o=0;oa||a>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");r<<=8,r|=a}}if(e.final.length!==1)throw new Error("final must be a single byte");let s=e.final.charCodeAt(0);if(i[0]>s||s>i[1])throw new Error(`final must be in range ${i[0]} .. ${i[1]}`);return r<<=8,r|=s,r}identToString(e){let i=[];for(;e;)i.push(String.fromCharCode(e&255)),e>>=8;return i.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,i){let r=this._identifier(e,[48,126]);this._escHandlers[r]??=[];let s=this._escHandlers[r];return s.push(i),{dispose:()=>{let o=s.indexOf(i);o!==-1&&s.splice(o,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,i){let r=e.charCodeAt(0);this._executeHandlers[r]=i,r<24&&(this._executeHandlersArr[r]=i)}clearExecuteHandler(e){let i=e.charCodeAt(0);this._executeHandlers[i]&&delete this._executeHandlers[i],i<24&&(this._executeHandlersArr[i]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,i){let r=this._identifier(e);this._csiHandlers[r]??=[];let s=this._csiHandlers[r];return s.push(i),{dispose:()=>{let o=s.indexOf(i);o!==-1&&s.splice(o,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,i){return this._dcsParser.registerHandler(this._identifier(e),i)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,i){return this._oscParser.registerHandler(e,i)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}registerApcHandler(e,i){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),i)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0,this._parseStack.state!==0&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,i,r,s,o){this._parseStack.state=e,this._parseStack.handlers=i,this._parseStack.handlerPos=r,this._parseStack.transition=s,this._parseStack.chunkPos=o}parse(e,i,r){let s,o,a=0,l;if(this._parseStack.state)if(this._parseStack.state===2)this._parseStack.state=0,a=this._parseStack.chunkPos+1;else{if(r===void 0||this._parseStack.state===1)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");let h=this._parseStack.handlers,d=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](this._params),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 4:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],l=this._dcsParser.unhook(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],l=this._oscParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],l=this._apcParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break}this._parseStack.state=0,a=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=this._parseStack.transition&255}for(let h=a;h=60&&c<=63&&(this._collect=c,d++);let u=!1;for(;d=48&&c<=57)this._params.addDigit(c-48);else if(c===59)this._params.addParam(0);else if(c===58)this._params.addSubParam(-1);else if(c>=64&&c<=126){let _=this._csiHandlers[this._collect<<8|c],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return o=1792,this._preserveStack(3,_,p,o,d),l;p<0&&this._csiHandlerFb(this._collect<<8|c,this._params),this.precedingJoinState=0,h=d,this.currentState=0,u=!0;break}else break;u||(h=d-1,this.currentState=4);continue}switch(o=this._transitions.table[this.currentState<<8|(s>8){case 2:let d=h,c=i-4;for(;d=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe););if(d>=c)for(;d=32&&(e[d]<=126||e[d]>=oe);)d++;this._printHandler(e,h,d),h=d-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:h,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:let _=this._csiHandlers[this._collect<<8|s],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return this._preserveStack(3,_,p,o,h),l;p<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}while(++h47&&s<60);h--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:let v=this._escHandlers[this._collect<<8|s],f=v?v.length-1:-1;for(;f>=0&&(l=v[f](),l!==!0);f--)if(l instanceof Promise)return this._preserveStack(4,v,f,o,h),l;f<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let S=h+1;;++S)if(S>=i||(s=e[S])===24||s===26||s===27||s>127&&s=i||(s=e[S])<32||s>127&&s=32&&e[S]<127||e[S]>=8&&e[S]<14||e[S]>=oe))){this._apcParser.put(e,h,S),h=S-1;break}break;case 17:if(l=this._apcParser.end(s!==24&&s!==26),l)return this._preserveStack(7,[],0,o,h),l;s===27&&(o|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0;break}this.currentState=o&255}}};var Eo=/^([\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})$/,yo=/^[\da-f]+$/;function ys(n){if(!n)return;let t=n.toLowerCase();if(t.startsWith("rgb:")){t=t.slice(4);let e=Eo.exec(t);if(e){let i=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/i*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/i*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/i*255)]}}else if(t.startsWith("#")&&(t=t.slice(1),yo.exec(t)&&[3,6,9,12].includes(t.length))){let e=t.length/3,i=[0,0,0];for(let r=0;r<3;++r){let s=parseInt(t.slice(e*r,e*r+e),16);i[r]=e===1?s<<4:e===2?s:e===3?s>>4:s>>8}return i}}function Es(n,t){let e=n.toString(16),i=e.length<2?"0"+e:e;switch(t){case 4:return e[0];case 8:return i;case 12:return(i+i).slice(0,3);default:return i+i}}function yn(n,t=16){let[e,i,r]=n;return`rgb:${Es(e,t)}/${Es(i,t)}/${Es(r,t)}`}var xn="6.1.0-beta.287";var wo={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function wn(n,t){if(n>24)return t.setWinLines||!1;switch(n){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 Tn=0,br=class extends g{constructor(e,i,r,s,o,a,l,h,d=new mr){super();this._bufferService=e;this._charsetService=i;this._coreService=r;this._logService=s;this._optionsService=o;this._oscLinkService=a;this._mouseStateService=l;this._unicodeService=h;this._parser=d;this._parseBuffer=new Uint32Array(4096);this._stringDecoder=new mi;this._utf8Decoder=new bi;this._windowTitle="";this._iconName="";this._windowTitleStack=[];this._iconNameStack=[];this._curAttrData=U.clone();this._eraseAttrDataInternal=U.clone();this._onRequestBell=this._register(new b);this.onRequestBell=this._onRequestBell.event;this._onRequestRefreshRows=this._register(new b);this.onRequestRefreshRows=this._onRequestRefreshRows.event;this._onRequestReset=this._register(new b);this.onRequestReset=this._onRequestReset.event;this._onRequestSendFocus=this._register(new b);this.onRequestSendFocus=this._onRequestSendFocus.event;this._onRequestSyncScrollBar=this._register(new b);this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event;this._onRequestWindowsOptionsReport=this._register(new b);this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event;this._onA11yChar=this._register(new b);this.onA11yChar=this._onA11yChar.event;this._onA11yTab=this._register(new b);this.onA11yTab=this._onA11yTab.event;this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onColor=this._register(new b);this.onColor=this._onColor.event;this._onRequestColorSchemeQuery=this._register(new b);this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 hi(this._bufferService),this._activeBuffer=this._bufferService.buffer,this._register(this._bufferService.buffers.onBufferActivate(c=>this._activeBuffer=c.activeBuffer)),this._parser.setCsiHandlerFallback((c,u)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(c),params:u.toArray()})}),this._parser.setEscHandlerFallback(c=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(c)})}),this._parser.setExecuteHandlerFallback(c=>{this._logService.debug("Unknown EXECUTE code: ",{code:c})}),this._parser.setOscHandlerFallback((c,u,_)=>{this._logService.debug("Unknown OSC code: ",{identifier:c,action:u,data:_})}),this._parser.setDcsHandlerFallback((c,u,_)=>{u==="HOOK"&&(_=_.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setApcHandlerFallback((c,u,_)=>{this._logService.debug("Unknown APC code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setPrintHandler((c,u,_)=>this.print(c,u,_)),this._parser.registerCsiHandler({final:"@"},c=>this.insertChars(c)),this._parser.registerCsiHandler({intermediates:" ",final:"@"},c=>this.scrollLeft(c)),this._parser.registerCsiHandler({final:"A"},c=>this.cursorUp(c)),this._parser.registerCsiHandler({intermediates:" ",final:"A"},c=>this.scrollRight(c)),this._parser.registerCsiHandler({final:"B"},c=>this.cursorDown(c)),this._parser.registerCsiHandler({final:"C"},c=>this.cursorForward(c)),this._parser.registerCsiHandler({final:"D"},c=>this.cursorBackward(c)),this._parser.registerCsiHandler({final:"E"},c=>this.cursorNextLine(c)),this._parser.registerCsiHandler({final:"F"},c=>this.cursorPrecedingLine(c)),this._parser.registerCsiHandler({final:"G"},c=>this.cursorCharAbsolute(c)),this._parser.registerCsiHandler({final:"H"},c=>this.cursorPosition(c)),this._parser.registerCsiHandler({final:"I"},c=>this.cursorForwardTab(c)),this._parser.registerCsiHandler({final:"J"},c=>this.eraseInDisplay(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"J"},c=>this.eraseInDisplay(c,!0)),this._parser.registerCsiHandler({final:"K"},c=>this.eraseInLine(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"K"},c=>this.eraseInLine(c,!0)),this._parser.registerCsiHandler({final:"L"},c=>this.insertLines(c)),this._parser.registerCsiHandler({final:"M"},c=>this.deleteLines(c)),this._parser.registerCsiHandler({final:"P"},c=>this.deleteChars(c)),this._parser.registerCsiHandler({final:"S"},c=>this.scrollUp(c)),this._parser.registerCsiHandler({final:"T"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"X"},c=>this.eraseChars(c)),this._parser.registerCsiHandler({final:"Z"},c=>this.cursorBackwardTab(c)),this._parser.registerCsiHandler({final:"^"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"`"},c=>this.charPosAbsolute(c)),this._parser.registerCsiHandler({final:"a"},c=>this.hPositionRelative(c)),this._parser.registerCsiHandler({final:"b"},c=>this.repeatPrecedingCharacter(c)),this._parser.registerCsiHandler({final:"c"},c=>this.sendDeviceAttributesPrimary(c)),this._parser.registerCsiHandler({prefix:">",final:"c"},c=>this.sendDeviceAttributesSecondary(c)),this._parser.registerCsiHandler({final:"d"},c=>this.linePosAbsolute(c)),this._parser.registerCsiHandler({final:"e"},c=>this.vPositionRelative(c)),this._parser.registerCsiHandler({final:"f"},c=>this.hVPosition(c)),this._parser.registerCsiHandler({final:"g"},c=>this.tabClear(c)),this._parser.registerCsiHandler({final:"h"},c=>this.setMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"h"},c=>this.setModePrivate(c)),this._parser.registerCsiHandler({final:"l"},c=>this.resetMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"l"},c=>this.resetModePrivate(c)),this._parser.registerCsiHandler({final:"m"},c=>this.charAttributes(c)),this._parser.registerCsiHandler({final:"n"},c=>this.deviceStatus(c)),this._parser.registerCsiHandler({prefix:"?",final:"n"},c=>this.deviceStatusPrivate(c)),this._parser.registerCsiHandler({intermediates:"!",final:"p"},c=>this.softReset(c)),this._parser.registerCsiHandler({prefix:">",final:"q"},c=>this.sendXtVersion(c)),this._parser.registerCsiHandler({intermediates:" ",final:"q"},c=>this.setCursorStyle(c)),this._parser.registerCsiHandler({final:"r"},c=>this.setScrollRegion(c)),this._parser.registerCsiHandler({final:"s"},c=>this.saveCursor(c)),this._parser.registerCsiHandler({final:"t"},c=>this.windowOptions(c)),this._parser.registerCsiHandler({final:"u"},c=>this.restoreCursor(c)),this._parser.registerCsiHandler({intermediates:"'",final:"}"},c=>this.insertColumns(c)),this._parser.registerCsiHandler({intermediates:"'",final:"~"},c=>this.deleteColumns(c)),this._parser.registerCsiHandler({intermediates:'"',final:"q"},c=>this.selectProtected(c)),this._parser.registerCsiHandler({intermediates:"$",final:"p"},c=>this.requestMode(c,!0)),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},c=>this.requestMode(c,!1)),this._parser.registerCsiHandler({prefix:"=",final:"u"},c=>this.kittyKeyboardSet(c)),this._parser.registerCsiHandler({prefix:"?",final:"u"},c=>this.kittyKeyboardQuery(c)),this._parser.registerCsiHandler({prefix:">",final:"u"},c=>this.kittyKeyboardPush(c)),this._parser.registerCsiHandler({prefix:"<",final:"u"},c=>this.kittyKeyboardPop(c)),this._parser.setExecuteHandler("\x07",()=>this.bell()),this._parser.setExecuteHandler(` -+`,()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler(" ",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("\x84",()=>this.index()),this._parser.setExecuteHandler("\x85",()=>this.nextLine()),this._parser.setExecuteHandler("\x88",()=>this.tabSet()),this._parser.registerOscHandler(0,new ne(c=>(this.setTitle(c),this.setIconName(c),!0))),this._parser.registerOscHandler(1,new ne(c=>this.setIconName(c))),this._parser.registerOscHandler(2,new ne(c=>this.setTitle(c))),this._parser.registerOscHandler(4,new ne(c=>this.setOrReportIndexedColor(c))),this._parser.registerOscHandler(8,new ne(c=>this.setHyperlink(c))),this._parser.registerOscHandler(10,new ne(c=>this.setOrReportFgColor(c))),this._parser.registerOscHandler(11,new ne(c=>this.setOrReportBgColor(c))),this._parser.registerOscHandler(12,new ne(c=>this.setOrReportCursorColor(c))),this._parser.registerOscHandler(104,new ne(c=>this.restoreIndexedColor(c))),this._parser.registerOscHandler(110,new ne(c=>this.restoreFgColor(c))),this._parser.registerOscHandler(111,new ne(c=>this.restoreBgColor(c))),this._parser.registerOscHandler(112,new ne(c=>this.restoreCursorColor(c))),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(let c in q)this._parser.registerEscHandler({intermediates:"(",final:c},()=>this.selectCharset("("+c)),this._parser.registerEscHandler({intermediates:")",final:c},()=>this.selectCharset(")"+c)),this._parser.registerEscHandler({intermediates:"*",final:c},()=>this.selectCharset("*"+c)),this._parser.registerEscHandler({intermediates:"+",final:c},()=>this.selectCharset("+"+c)),this._parser.registerEscHandler({intermediates:"-",final:c},()=>this.selectCharset("-"+c)),this._parser.registerEscHandler({intermediates:".",final:c},()=>this.selectCharset("."+c)),this._parser.registerEscHandler({intermediates:"/",final:c},()=>this.selectCharset("/"+c));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(c=>(this._logService.error("Parsing error: ",c),c)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new li((c,u)=>this.requestStatusString(c,u)))}getAttrData(){return this._curAttrData}_preserveStack(e,i,r,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=i,this._parseStack.decodedLength=r,this._parseStack.position=s}_logSlowResolvingAsync(e){if(this._logService.logLevel<=3){let i,r=new Promise((s,o)=>{i=setTimeout(()=>o("#SLOW_TIMEOUT"),5e3)});Promise.race([e,r]).then(()=>{i!==void 0&&clearTimeout(i)},s=>{if(i!==void 0&&clearTimeout(i),s!=="#SLOW_TIMEOUT")throw s;console.warn("async parser handler taking longer than 5000 ms")})}}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,i){let r,s=this._activeBuffer.x,o=this._activeBuffer.y,a=0,l=this._parseStack.paused;if(l){if(r=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,i))return this._logSlowResolvingAsync(r),r;s=this._parseStack.cursorStartX,o=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>131072&&(a=this._parseStack.position+131072)}if(this._logService.logLevel<=1&&this._logService.debug(`parsing data ${typeof e=="string"?` "${e}"`:` "${Array.prototype.map.call(e,c=>String.fromCharCode(c)).join("")}"`}`),this._logService.logLevel===0&&this._logService.trace("parsing data (codes)",typeof e=="string"?e.split("").map(c=>c.charCodeAt(0)):e),this._parseBuffer.length131072)for(let c=a;c0&&_.getWidth(this._activeBuffer.x-1)===2&&_.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let p=this._parser.precedingJoinState;for(let v=i;vh){if(d){let A=_,T=this._activeBuffer.x-C;if(this._activeBuffer.x=C,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),_=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!_)return;for(C>0&&_ instanceof Re&&_.copyCellsFrom(A,T,0,C,!1);T=0;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(c&&(_.insertCells(this._activeBuffer.x,o-C,this._activeBuffer.getNullCell(u)),_.getWidth(h-1)===2&&_.setCellFromCodepoint(h-1,0,1,u)),_.setCellFromCodepoint(this._activeBuffer.x++,s,o,u),o>0)for(;--o;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=p,this._activeBuffer.x0&&_.getWidth(this._activeBuffer.x)===0&&!_.hasContent(this._activeBuffer.x)&&_.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,i){return e.final==="t"&&!e.prefix&&!e.intermediates?this._parser.registerCsiHandler(e,r=>wn(r.params[0],this._optionsService.rawOptions.windowOptions)?i(r):!0):this._parser.registerCsiHandler(e,i)}registerDcsHandler(e,i){return this._parser.registerDcsHandler(e,new li(i))}registerEscHandler(e,i){return this._parser.registerEscHandler(e,i)}registerOscHandler(e,i){return this._parser.registerOscHandler(e,new ne(i))}registerApcHandler(e,i){return this._parser.registerApcHandler(e,new _r(i))}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(this._activeBuffer.x===0&&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;let 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;let 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,i){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+i):(this._activeBuffer.x=e,this._activeBuffer.y=i),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,i){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+i)}cursorUp(e){let i=this._activeBuffer.y-this._activeBuffer.scrollTop;return i>=0?this._moveCursor(0,-Math.min(i,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){let i=this._activeBuffer.scrollBottom-this._activeBuffer.y;return i>=0?this._moveCursor(0,Math.min(i,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){let i=e.params[0];return i===0?delete this._activeBuffer.tabs[this._activeBuffer.x]:i===3&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let i=e.params[0]||1;for(;i--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let i=e.params[0]||1;for(;i--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){let i=e.params[0];return i===1&&(this._curAttrData.bg|=536870912),(i===2||i===0)&&(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,i,r,s=!1,o=!1){let a=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);a&&(a.replaceCells(i,r,this._activeBuffer.getNullCell(this._eraseAttrData()),o),s&&(a.isWrapped=!1))}_resetBufferLine(e,i=!1){let r=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);r&&(r.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),i),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),r.isWrapped=!1)}eraseInDisplay(e,i=!1){this._restrictCursor(this._bufferService.cols);let r;switch(e.params[0]){case 0:for(r=this._activeBuffer.y,this._dirtyRowTracker.markDirty(r),this._eraseInBufferLine(r++,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,i);r=this._bufferService.cols){let o=this._activeBuffer.lines.get(r+1);o&&(o.isWrapped=!1)}for(;r--;)this._resetBufferLine(r,i);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(r=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,r-1);r--&&!this._activeBuffer.lines.get(this._activeBuffer.ybase+r)?.getTrimmedLength(););for(;r>=0;r--)this._bufferService.scroll(this._eraseAttrData())}else{for(r=this._bufferService.rows,this._dirtyRowTracker.markDirty(r-1);r--;)this._resetBufferLine(r,i);this._dirtyRowTracker.markDirty(0)}break;case 3:let s=this._activeBuffer.lines.length-this._bufferService.rows;s>0&&(this._activeBuffer.lines.trimStart(s),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-s,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-s,0),this._onScroll.fire(0));break}return!0}eraseInLine(e,i=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,i);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,i);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,i);break}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let i=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 c=d;for(let u=1;u0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent("\x1B[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("\x1B[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("\x1B[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("\x1B[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("\x1B[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`\x1BP>|xterm.js(${xn})\x1B\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let i=0;i(te[te.NOT_RECOGNIZED=0]="NOT_RECOGNIZED",te[te.SET=1]="SET",te[te.RESET=2]="RESET",te[te.PERMANENTLY_SET=3]="PERMANENTLY_SET",te[te.PERMANENTLY_RESET=4]="PERMANENTLY_RESET"))(r||={});let s=this._coreService.decPrivateModes,{activeProtocol:o,activeEncoding:a}=this._mouseStateService,l=this._coreService,{buffers:h,cols:d}=this._bufferService,{active:c,alt:u}=h,_=this._optionsService.rawOptions,p=(S,C)=>(l.triggerDataEvent(`\x1B[${i?"":"?"}${S};${C}$y`),!0),v=S=>S?1:2,f=e.params[0];return i?f===2?p(f,4):f===4?p(f,v(l.modes.insertMode)):f===12?p(f,3):f===20?p(f,v(_.convertEol)):p(f,0):f===1?p(f,v(s.applicationCursorKeys)):f===3?p(f,_.windowOptions.setWinLines?d===80?2:d===132?1:0:0):f===6?p(f,v(s.origin)):f===7?p(f,v(s.wraparound)):f===8?p(f,3):f===9?p(f,v(o==="X10")):f===12?p(f,v(_.cursorBlink)):f===25?p(f,v(!l.isCursorHidden)):f===45?p(f,v(s.reverseWraparound)):f===66?p(f,v(s.applicationKeypad)):f===67?p(f,4):f===1e3?p(f,v(o==="VT200")):f===1002?p(f,v(o==="DRAG")):f===1003?p(f,v(o==="ANY")):f===1004?p(f,v(s.sendFocus)):f===1005?p(f,4):f===1006?p(f,v(a==="SGR")):f===1015?p(f,4):f===1016?p(f,v(a==="SGR_PIXELS")):f===1048?p(f,1):f===47||f===1047||f===1049?p(f,v(c===u)):f===2004?p(f,v(s.bracketedPasteMode)):f===2026?p(f,v(s.synchronizedOutput)):f===9001&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?p(f,v(s.win32InputMode)):p(f,0)}_updateAttrColor(e,i,r,s,o){return i===2?(e|=50331648,e&=-16777216,e|=fe.fromColorRGB([r,s,o])):i===5&&(e&=-67108864,e|=33554432|r&255),e}_extractColor(e,i,r){let s=[0,0,-1,0,0,0],o=0,a=0;do{if(s[a+o]=e.params[i+a],e.hasSubParams(i+a)){let l=e.getSubParams(i+a),h=0;do s[1]===5&&(o=1),s[a+h+1+o]=l[h];while(++h=2||s[1]===2&&a+o>=5)break;s[1]&&(o=1)}while(++a+i5)&&(e=1),i.extended.underlineStyle=e,i.fg|=268435456,e===0&&(i.fg&=-268435457),i.updateExtended()}_processSGR0(e){e.fg=U.fg,e.bg=U.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(e.length===1&&e.params[0]===0)return this._processSGR0(this._curAttrData),!0;let i=e.length,r,s=this._curAttrData;for(let o=0;o=30&&r<=37?(s.fg&=-67108864,s.fg|=16777216|r-30):r>=40&&r<=47?(s.bg&=-67108864,s.bg|=16777216|r-40):r>=90&&r<=97?(s.fg&=-67108864,s.fg|=16777216|r-90|8):r>=100&&r<=107?(s.bg&=-67108864,s.bg|=16777216|r-100|8):r===0?this._processSGR0(s):r===1?s.fg|=134217728:r===3?s.bg|=67108864:r===4?(s.fg|=268435456,this._processUnderline(e.hasSubParams(o)?e.getSubParams(o)[0]:1,s)):r===5?s.fg|=536870912:r===7?s.fg|=67108864:r===8?s.fg|=1073741824:r===9?s.fg|=2147483648:r===2?s.bg|=134217728:r===21?this._processUnderline(2,s):r===22?(s.fg&=-134217729,s.bg&=-134217729):r===23?s.bg&=-67108865:r===24?(s.fg&=-268435457,this._processUnderline(0,s)):r===25?s.fg&=-536870913:r===27?s.fg&=-67108865:r===28?s.fg&=-1073741825:r===29?s.fg&=2147483647:r===39?(s.fg&=-67108864,s.fg|=U.fg&16777215):r===49?(s.bg&=-67108864,s.bg|=U.bg&16777215):r===38||r===48||r===58?o+=this._extractColor(e,o,s):r===53?s.bg|=1073741824:r===55?s.bg&=-1073741825:r===221&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.fg&=-134217729:r===222&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.bg&=-134217729:r===59?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",r);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("\x1B[0n");break;case 6:let i=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[${i};${r}R`);break}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:let i=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[?${i};${r}R`);break;case 15:break;case 25:break;case 26:break;case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??!0)&&this._onRequestColorSchemeQuery.fire();break}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=U.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){let i=e.length===0?1:e.params[0];if(i===0)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(i){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar";break}let r=i%2===1;this._coreService.decPrivateModes.cursorBlink=r}return!0}setScrollRegion(e){let i=e.params[0]||1,r;return(e.length<2||(r=e.params[1])>this._bufferService.rows||r===0)&&(r=this._bufferService.rows),r>i&&(this._activeBuffer.scrollTop=i-1,this._activeBuffer.scrollBottom=r-1,this._setCursor(0,0)),!0}windowOptions(e){if(!wn(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;let i=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:i!==2&&this._onRequestWindowsOptionsReport.fire(0);break;case 16:this._onRequestWindowsOptionsReport.fire(1);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`\x1B[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:(i===0||i===2)&&(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),(i===0||i===1)&&(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:(i===0||i===2)&&this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),(i===0||i===1)&&this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop());break}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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let i=0;i1;){let s=r.shift(),o=r.shift();if(/^\d+$/.exec(s)){let a=parseInt(s,10);if(Dn(a))if(o==="?")i.push({type:0,index:a});else{let l=ys(o);l&&i.push({type:1,index:a,color:l})}}}return i.length&&this._onColor.fire(i),!0}setHyperlink(e){let i=e.indexOf(";");if(i===-1)return!0;let r=e.slice(0,i).trim(),s=e.slice(i+1);return s?this._createHyperlink(r,s):r.trim()?!1:this._finishHyperlink()}_createHyperlink(e,i){this._getCurrentLinkId()&&this._finishHyperlink();let r=e.split(":"),s,o=r.findIndex(a=>a.startsWith("id="));return o!==-1&&(s=r[o].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:i}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,i){let r=e.split(";");for(let s=0;s=this._specialColors.length);++s,++i)if(r[s]==="?")this._onColor.fire([{type:0,index:this._specialColors[i]}]);else{let o=ys(r[s]);o&&this._onColor.fire([{type:1,index:this._specialColors[i],color:o}])}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;let i=[],r=e.split(";");for(let s=0;s=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){let 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=U.clone(),this._eraseAttrDataInternal=U.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=this._curAttrData.bg&67108863,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){let e=new F;e.content=1<<22|69,e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let i=0;i(this._coreService.triggerDataEvent(`\x1B${l}\x1B\\`),!0),s=this._bufferService.buffer,o=this._optionsService.rawOptions,a={block:2,underline:4,bar:6};return r(e==='"q'?`P1$r${this._curAttrData.isProtected()?1:0}"q`:e==='"p'?'P1$r61;1"p':e==="r"?`P1$r${s.scrollTop+1};${s.scrollBottom+1}r`:e==="m"?"P1$r0m":e===" q"?`P1$r${a[o.cursorStyle]-(o.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,i){this._dirtyRowTracker.markRangeDirty(e,i)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=e.params[0]||0,r=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(r){case 1:s.flags=i;break;case 2:s.flags|=i;break;case 3:s.flags&=~i;break}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`\x1B[?${i}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=e.params[0]||0,r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;return o.length>=16&&o.shift(),o.push(r.flags),r.flags=i,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=Math.max(1,e.params[0]||1),r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;for(let a=0;a0;a++)r.flags=o.pop();return o.length===0&&i>0&&(r.flags=0),!0}},hi=class{constructor(t){this._bufferService=t;this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(t){tthis.end&&(this.end=t)}markRangeDirty(t,e){t>e&&(Tn=t,t=e,e=Tn),tthis.end&&(this.end=e)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};hi=y([m(0,D)],hi);function Dn(n){return 0<=n&&n<256}var vr=class extends g{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._innerWriteTimer=this._register(new Ce);this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._register(E(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed||this._isSyncWriting)return;this._isSyncWriting=!0;let e,i=!1;for(;e=this._writeBuffer.shift();){i=!0,this._action(e);let r=this._callbacks.shift();r&&r()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,i&&this._onWriteParsed.fire()}writeSync(e,i){if(this._store.isDisposed)return;if(i!==void 0&&this._syncCalls>i){this._syncCalls=0;return}if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;this._isSyncWriting=!0;let r;for(;r=this._writeBuffer.shift();){this._action(r);let s=this._callbacks.shift();s&&s()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,i){if(!this._store.isDisposed){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){this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(i),this._innerWrite();return}this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(i)}}_scheduleInnerWrite(e=0,i=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,i),0)}_innerWrite(e=0,i=!0){if(this._store.isDisposed)return;let r=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){let s=this._writeBuffer[this._bufferOffset],o=this._action(s,i);if(o){let l=h=>{this._store.isDisposed||(performance.now()-r>=12?this._scheduleInnerWrite(0,h):this._innerWrite(r,h))};o.catch(h=>(queueMicrotask(()=>{throw h}),Promise.resolve(!1))).then(l);return}let a=this._callbacks[this._bufferOffset];if(a&&a(),this._bufferOffset++,this._pendingData-=s.length,performance.now()-r>=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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}};var kt=class{constructor(t){this._bufferService=t;this._nextId=1;this._entriesWithId=new Map;this._dataByLinkId=new Map}registerLink(t){let e=this._bufferService.buffer;if(t.id===void 0){let l=e.addMarker(e.ybase+e.y),h={data:t,id:this._nextId++,lines:[l]};return l.onDispose(()=>this._removeMarkerFromLink(h,l)),this._dataByLinkId.set(h.id,h),h.id}let i=t,r=this._getEntryIdKey(i),s=this._entriesWithId.get(r);if(s)return this.addLineToLink(s.id,e.ybase+e.y),s.id;let o=e.addMarker(e.ybase+e.y),a={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(a,o)),this._entriesWithId.set(a.key,a),this._dataByLinkId.set(a.id,a),a.id}addLineToLink(t,e){let i=this._dataByLinkId.get(t);if(i&&i.lines.every(r=>r.line!==e)){let r=this._bufferService.buffer.addMarker(e);i.lines.push(r),r.onDispose(()=>this._removeMarkerFromLink(i,r))}}getLinkData(t){return this._dataByLinkId.get(t)?.data}_getEntryIdKey(t){return`${t.id};;${t.uri}`}_removeMarkerFromLink(t,e){let i=t.lines.indexOf(e);i!==-1&&(t.lines.splice(i,1),t.lines.length===0&&(t.data.id!==void 0&&this._entriesWithId.delete(t.key),this._dataByLinkId.delete(t.id)))}};kt=y([m(0,D)],kt);var Rn=!1,Sr=class extends g{constructor(e){super();this._windowsWrappingHeuristics=this._register(new B);this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onData=this._register(new b);this.onData=this._onData.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._onScroll=this._register(new b);this._instantiationService=new Ji,this.optionsService=this._register(new nr(e)),this._instantiationService.setService(R,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(wt)),this._instantiationService.setService(_e,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(Dt)),this._instantiationService.setService(D,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(Lt)),this._instantiationService.setService(Y,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(or)),this._instantiationService.setService(Me,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(me)),this.unicodeService.register(new ar),this._instantiationService.setService(Us,this.unicodeService),this._charsetService=this._instantiationService.createInstance(lr),this._instantiationService.setService(Ws,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(kt),this._instantiationService.setService(vi,this._oscLinkService),this._inputHandler=this._register(new br(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(j.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(j.forward(this._bufferService.onResize,this._onResize)),this._register(j.forward(this.coreService.onData,this._onData)),this._register(j.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this._writeBuffer=this._register(new vr((i,r)=>this._inputHandler.parse(i,r))),this._register(j.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new b),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(let i in e)this.optionsService.options[i]=e[i]}write(e,i){this._writeBuffer.write(e,i)}writeSync(e,i){this._logService.logLevel<=3&&!Rn&&(this._logService.warn("writeSync is unreliable and will be removed soon."),Rn=!0),this._writeBuffer.writeSync(e,i)}input(e,i=!0){this.coreService.triggerDataEvent(e,i)}resize(e,i){isNaN(e)||isNaN(i)||(e=Math.max(e,2),i=Math.max(i,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,i))}scroll(e,i=!1){this._bufferService.scroll(e,i)}scrollLines(e,i){this._bufferService.scrollLines(e,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let i=e-this._bufferService.buffer.ydisp;i!==0&&this.scrollLines(i)}registerEscHandler(e,i){return this._inputHandler.registerEscHandler(e,i)}registerDcsHandler(e,i){return this._inputHandler.registerDcsHandler(e,i)}registerCsiHandler(e,i){return this._inputHandler.registerCsiHandler(e,i)}registerOscHandler(e,i){return this._inputHandler.registerOscHandler(e,i)}registerApcHandler(e,i){return this._inputHandler.registerApcHandler(e,i)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1,i=this.optionsService.rawOptions.windowsPty;i&&i.backend!==void 0&&i.buildNumber!==void 0&&(e=i.backend==="conpty"&&i.buildNumber<21376),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){let e=[];e.push(this.onLineFeed(Cs.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>(Cs(this._bufferService),!1))),this._windowsWrappingHeuristics.value=E(()=>{for(let i of e)i.dispose()})}}};var z=0,gr=class{constructor(t,e){this._getKey=t;this._array=[];this._insertedValues=[];this._isFlushingInserted=!1;this._deletedIndices=[];this._isFlushingDeleted=!1;this._flushInsertedTask=new Ct(e),this._flushDeletedTask=new Ct(e)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(t){this._flushCleanupDeleted(),this._insertedValues.length===0&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(t)}_flushInserted(){let t=this._insertedValues.sort((s,o)=>this._getKey(s)-this._getKey(o)),e=0,i=0,r=new Array(this._array.length+this._insertedValues.length);for(let s=0;s=this._array.length||this._getKey(t[e])<=this._getKey(this._array[i])?(r[s]=t[e],e++):r[s]=this._array[i++];this._array=r,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(t){if(this._flushCleanupInserted(),this._array.length===0)return!1;let e=this._getKey(t);return e===void 0?!1:this._deleteAtKey(t,e)?!0:this._deletedIndices.length===0?!1:(this._flushCleanupDeleted(),this._deleteAtKey(t,e))}_deleteAtKey(t,e){if(z=this._search(e),z===-1||this._getKey(this._array[z])!==e)return!1;do if(this._array[z]===t)return this._deletedIndices.length===0&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(z),!0;while(++zs-o),e=0,i=new Array(this._array.length-t.length),r=0;for(let s=0;s0&&this._flushDeletedTask.flush()}*getKeyIterator(t){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),this._array.length!==0&&(z=this._search(t),!(z<0||z>=this._array.length)&&this._getKey(this._array[z])===t))do yield this._array[z];while(++z=this._array.length)&&this._getKey(this._array[z])===t))do e(this._array[z]);while(++z=e;){let r=e+i>>1,s=this._getKey(this._array[r]);if(s>t)i=r-1;else if(s0&&this._getKey(this._array[r-1])===t;)r--;return r}}return e}};var Pt=0,Cr=0,Mt=class extends g{constructor(e,i){super();this._logService=e;this._bufferService=i;this._lineCache=this._register(new xs);this._onDecorationRegistered=this._register(new b);this.onDecorationRegistered=this._onDecorationRegistered.event;this._onDecorationRemoved=this._register(new b);this.onDecorationRemoved=this._onDecorationRemoved.event;this._decorations=new gr(r=>r?.marker.line,this._logService),this._register(E(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}get decorations(){return this._decorations.values()}registerDecoration(e){if(e.marker.isDisposed)return;let i=new ws(e);if(i){let r=i.marker.onDispose(()=>i.dispose()),s=i.onDispose(()=>{s.dispose(),i&&(this._decorations.delete(i)&&(this._lineCache.remove(i),this._onDecorationRemoved.fire(i)),r.dispose())});this._decorations.insert(i),this._lineCache.add(i),this._onDecorationRegistered.fire(i)}return i}reset(){for(let e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,i,r){let s=this._lineCache.getDecorationsOnLine(i);if(s)for(let o of s)Pt=o.options.x??0,Cr=Pt+(o.options.width??1),e>=Pt&&e=Pt&&ethis._handleBufferLinesTrim(r))),i.add(e.onInsert(r=>this._handleBufferLinesInsert(r))),i.add(e.onDelete(r=>this._handleBufferLinesDelete(r)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){let i=e.marker.line;if(i<0)return;e._indexedStartLine=i;let r=this._getDecorationHeight(e);for(let s=i;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{let i=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(let r of i)r()})}_handleBufferLinesTrim(e){if(e<=0)return;let i=new Map;for(let[r,s]of this._decorationsByLine){let o=r-e;o<0||this._mergeLineBucket(i,o,s)}this._decorationsByLine.clear();for(let[r,s]of i)this._decorationsByLine.set(r,s);for(let r of this._decorations)r.marker.isDisposed||(r._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,i,r){let s=e.get(i);if(s)for(let o=0,a=r.length;oi&&(s.push(a),this._removeFromLineBuckets(a))}let o=new Map;for(let[a,l]of this._decorationsByLine){let h=a>=i?a+r:a;this._mergeLineBucket(o,h,l)}this._decorationsByLine.clear();for(let[a,l]of o)this._decorationsByLine.set(a,l);for(let a of this._decorations)a.marker.isDisposed||a._indexedStartLine>=i&&(a._indexedStartLine=a.marker.line);for(let a of s)this._addToLineBuckets(a)}_applyBufferLinesDelete(e){let i=e.index+e.amount,r=new Map;for(let[o,a]of this._decorationsByLine){if(o>=e.index&&o=i?o-e.amount:o;this._mergeLineBucket(r,l,a)}this._decorationsByLine.clear();for(let[o,a]of r)this._decorationsByLine.set(o,a);let s=[];for(let o of this._decorations){if(o.marker.isDisposed)continue;let a=o._indexedStartLine,l=this._getDecorationHeight(o);a>=i?o._indexedStartLine=o.marker.line:ai&&s.push(o)}for(let o of s)this._reindexDecoration(o)}},ws=class extends pe{constructor(e){super();this.options=e;this.onRenderEmitter=this.add(new b);this.onRender=this.onRenderEmitter.event;this._onDispose=this.add(new b);this.onDispose=this._onDispose.event;this._cachedBg=null;this._cachedFg=null;this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}get backgroundColorRGB(){return this._cachedBg===null&&(this.options.backgroundColor?this._cachedBg=M.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return this._cachedFg===null&&(this.options.foregroundColor?this._cachedFg=M.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}dispose(){this._onDispose.fire(),super.dispose()}};var To=1e3,Ir=class{constructor(t,e=To){this._renderCallback=t;this._debounceThresholdMS=e;this._lastRefreshMs=0;this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(t,e,i){this._rowCount=i,t=t??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,t):t,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e;let r=performance.now();if(r-this._lastRefreshMs>=this._debounceThresholdMS)this._refreshTimeoutID!==void 0&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),this._lastRefreshMs=r,this._innerRefresh();else if(!this._additionalRefreshRequested){let s=r-this._lastRefreshMs,o=this._debounceThresholdMS-s;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout(()=>{this._lastRefreshMs=performance.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0},o)}}_innerRefresh(){if(this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return;let t=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(t,e)}};var Ln=!1,je=class extends g{constructor(e,i,r,s){super();this._terminal=e;this._coreBrowserService=r;this._renderService=s;this._rowColumns=new WeakMap;this._liveRegionLineCount=0;this._charsToConsume=[];this._charsToAnnounce="";let o=this._coreBrowserService.mainDocument;this._accessibilityContainer=o.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=o.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let a=0;athis._handleBoundaryFocus(a,0),this._bottomBoundaryFocusListener=a=>this._handleBoundaryFocus(a,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=o.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new Ir(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");Ln?(this._accessibilityContainer.classList.add("debug"),this._rowContainer.classList.add("debug"),this._debugRootContainer=o.createElement("div"),this._debugRootContainer.classList.add("xterm"),this._debugRootContainer.appendChild(o.createTextNode("------start a11y------")),this._debugRootContainer.appendChild(this._accessibilityContainer),this._debugRootContainer.appendChild(o.createTextNode("------end a11y------")),this._terminal.element.insertAdjacentElement("afterend",this._debugRootContainer)):this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this._register(this._terminal.onResize(a=>this._handleResize(a.rows))),this._register(this._terminal.onRender(a=>this._refreshRows(a.start,a.end))),this._register(this._terminal.onScroll(()=>this._refreshRows())),this._register(this._terminal.onA11yChar(a=>this._handleChar(a))),this._register(this._terminal.onLineFeed(()=>this._handleChar(` -+`))),this._register(this._terminal.onA11yTab(a=>this._handleTab(a))),this._register(this._terminal.onKey(a=>this._handleKey(a.key))),this._register(this._terminal.onBlur(()=>this._clearLiveRegion())),this._register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._register(I(o,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register(E(()=>{Ln?this._debugRootContainer.remove():this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(e){for(let i=0;i0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,e===` -+`&&(this._liveRegionLineCount++,this._liveRegionLineCount===21&&(this._liveRegion.textContent=Je.get())))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,i){this._liveRegionDebouncer.refresh(e,i,this._terminal.rows)}_renderRows(e,i){let r=this._terminal.buffer,s=r.lines.length.toString();for(let o=e;o<=i;o++){let a=r.lines.get(r.ydisp+o),l=[],h=a?.translateToString(!0,void 0,void 0,l)||"",d=(r.ydisp+o+1).toString(),c=this._rowElements[o];c&&(h.length===0?(c.textContent="\xA0",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,l)),c.setAttribute("aria-posinset",d),c.setAttribute("aria-setsize",s),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent===Je.get()&&this._clearLiveRegion(),this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,i){let r=e.target,s=this._rowElements[i===0?1:this._rowElements.length-2],o=r.getAttribute("aria-posinset"),a=i===0?"1":`${this._terminal.buffer.lines.length}`;if(o===a||e.relatedTarget!==s)return;let l,h;if(i===0?(l=r,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(l=this._rowElements.shift(),h=r,this._rowContainer.removeChild(l)),l.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),i===0){let d=this._createAccessibilityTreeNode();this._rowElements.unshift(d),this._rowContainer.insertAdjacentElement("afterbegin",d)}else{let d=this._createAccessibilityTreeNode();this._rowElements.push(d),this._rowContainer.appendChild(d)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(i===0?-1:1),this._rowElements[i===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let i={node:e.anchorNode,offset:e.anchorOffset},r={node:e.focusNode,offset:e.focusOffset};if((i.node.compareDocumentPosition(r.node)&Node.DOCUMENT_POSITION_PRECEDING||i.node===r.node&&i.offset>r.offset)&&([i,r]=[r,i]),i.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(i={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(i.node))return;let s=this._rowElements.slice(-1)[0];if(r.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(r={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(r.node))return;let o=({node:h,offset:d})=>{let c=h instanceof Text?h.parentNode:h,u=parseInt(c?.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let _=this._rowColumns.get(c);if(!_)return console.warn("columns is null. Race condition?"),null;let p=d<_.length?_[d]:_.slice(-1)[0]+1;return p>=this._terminal.cols&&(++u,p=0),{row:u,column:p}},a=o(i),l=o(r);if(!(!a||!l)){if(a.row>l.row||a.row===l.row&&a.column>=l.column)throw new Error("invalid range");this._terminal.select(a.column,a.row,(l.row-a.row)*this._terminal.cols-a.column+l.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let i=this._rowContainer.children.length;ie;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let 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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{Ne(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register(I(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register(I(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register(I(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register(I(this._element,"mouseup",this._handleMouseUp.bind(this)))}get currentLink(){return this._currentLink}_handleMouseMove(e){this._lastMouseEvent=e;let i=this._positionFromMouseEvent(e,this._element);if(!i)return;this._isMouseOut=!1;let r=e.composedPath();for(let s=0;s{s?.forEach(o=>{o.link.dispose&&o.link.dispose()})}),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(let[s,o]of this._linkProviderService.linkProviders.entries())i?this._activeProviderReplies?.get(s)&&(r=this._checkLinkProviderResult(s,e,r)):o.provideLinks(e.y,a=>{if(this._isMouseOut)return;let l=a?.map(h=>({link:h}));this._activeProviderReplies?.set(s,l),r=this._checkLinkProviderResult(s,e,r),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)})}_removeIntersectingLinks(e,i){let r=new Set;for(let s=0;se?this._bufferService.cols:l.link.range.end.x;for(let c=h;c<=d;c++){if(r.has(c)){o.splice(a--,1);break}r.add(c)}}}}_checkLinkProviderResult(e,i,r){if(!this._activeProviderReplies)return r;let s=this._activeProviderReplies.get(e),o=!1;for(let a=0;athis._linkAtPosition(l.link,i));a&&(r=!0,this._handleNewLink(a))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!r)for(let a=0;athis._linkAtPosition(h.link,i));if(l){r=!0,this._handleNewLink(l);break}}return r}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;let i=this._positionFromMouseEvent(e,this._element);i&&this._mouseDownLink&&Do(this._mouseDownLink.link,this._currentLink.link)&&this._linkAtPosition(this._currentLink.link,i)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,i){!this._currentLink||!this._lastMouseEvent||(!e||!i||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=i)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,Ne(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;let i=this._positionFromMouseEvent(this._lastMouseEvent,this._element);i&&this._linkAtPosition(e.link,i)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:e.link.decorations===void 0?!0:e.link.decorations.underline,pointerCursor:e.link.decorations===void 0?!0: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:r=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==r&&(this._currentLink.state.decorations.pointerCursor=r,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",r))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:r=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==r&&(this._currentLink.state.decorations.underline=r,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,r))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(r=>{if(!this._currentLink)return;let s=r.start===0?0:r.start+1+this._bufferService.buffer.ydisp,o=this._bufferService.buffer.ydisp+1+r.end;if(this._currentLink.link.range.start.y>=s&&this._currentLink.link.range.end.y<=o&&(this._clearCurrentLink(s,o),this._lastMouseEvent)){let a=this._positionFromMouseEvent(this._lastMouseEvent,this._element);a&&this._askForLink(a,!1)}})))}_linkHover(e,i,r){this._currentLink?.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(i,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),i.hover&&i.hover(r,i.text)}_fireUnderlineEvent(e,i){let r=e.range,s=this._bufferService.buffer.ydisp,o=this._createLinkUnderlineEvent(r.start.x-1,r.start.y-s-1,r.end.x,r.end.y-s-1,void 0);(i?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(o)}_linkLeave(e,i,r){this._currentLink?.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(i,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),i.leave&&i.leave(r,i.text)}_linkAtPosition(e,i){let r=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,o=i.y*this._bufferService.cols+i.x;return r<=o&&o<=s}_positionFromMouseEvent(e,i){let r=this._mouseCoordsService.getCoords(e,i,this._bufferService.cols,this._bufferService.rows);if(r)return{x:r[0],y:r[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,i,r,s,o){return{x1:e,y1:i,x2:r,y2:s,cols:this._bufferService.cols,fg:o}}};Bt=y([m(1,Oe),m(2,V),m(3,D),m(4,Ci)],Bt);function Do(n,t){return n.text===t.text&&n.range.start.x===t.range.start.x&&n.range.start.y===t.range.start.y&&n.range.end.x===t.range.end.x&&n.range.end.y===t.range.end.y}var Er=class extends Sr{constructor(e={}){super(e);this._linkifier=this._register(new B);this.browser=ze;this._keyDownHandled=!1;this._keyDownSeen=!1;this._keyPressHandled=!1;this._unprocessedDeadKey=!1;this._accessibilityManager=this._register(new B);this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onKey=this._register(new b);this.onKey=this._onKey.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onBell=this._register(new b);this.onBell=this._onBell.event;this._onFocus=this._register(new b);this._onBlur=this._register(new b);this._onA11yCharEmitter=this._register(new b);this._onA11yTabEmitter=this._register(new b);this._onWillOpen=this._register(new b);this._onDimensionsChange=this._register(new b);this.onDimensionsChange=this._onDimensionsChange.event;this._setup(),this._decorationService=this._instantiationService.createInstance(Mt),this._instantiationService.setService(ge,this._decorationService),this._keyboardService=this._instantiationService.createInstance(xt),this._instantiationService.setService(zs,this._keyboardService),this._linkProviderService=this._instantiationService.createInstance(zi),this._instantiationService.setService(Ci,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(tt)),this._register(this._inputHandler.onRequestBell(()=>this._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(i=>this.refresh(i?.start??0,i?.end??this.rows-1))),this._register(this._inputHandler.onRequestSendFocus(()=>this._reportFocus())),this._register(this._inputHandler.onRequestReset(()=>this.reset())),this._register(this._inputHandler.onRequestWindowsOptionsReport(i=>this._reportWindowsOptions(i))),this._register(this._inputHandler.onColor(i=>this._handleColorEvent(i))),this._register(j.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(j.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(j.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(j.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(i=>this._afterResize(i.cols,i.rows))),this._register(E(()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)}))}get linkifier(){return this._linkifier.value}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}get dimensions(){if(!this._renderService)return;let e=this._renderService.dimensions;return{css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}}_handleColorEvent(e){if(this._themeService)for(let i of e){let r,s;switch(i.index){case 256:r="foreground",s="10";break;case 257:r="background",s="11";break;case 258:r="cursor",s="12";break;default:r="ansi",s="4;"+i.index}switch(i.type){case 0:let o=L.toColorRGB(r==="ansi"?this._themeService.colors.ansi[i.index]:this._themeService.colors[r]);this.coreService.triggerDataEvent(`\x1B]${s};${yn(o)}\x1B\\`);break;case 1:if(r==="ansi")this._themeService.modifyColors(a=>a.ansi[i.index]=O.toColor(...i.color));else{let a=r;this._themeService.modifyColors(l=>l[a]=O.toColor(...i.color))}break;case 2:this._themeService.restoreColor(i.index);break}}}_reportColorScheme(){if(!this._themeService)return;let e=Z.relativeLuminance(this._themeService.colors.background.rgba>>8),i=Z.relativeLuminance(this._themeService.colors.foreground.rgba>>8),r=e{this.hasSelection()&&Os(i,this._selectionService)}));let e=i=>Ns(i,this.textarea,this.coreService,this.optionsService);this._register(I(this.textarea,"paste",e)),this._register(I(this.element,"paste",e)),ot?this._register(I(this.element,"mousedown",i=>{i.button===2&&Hr(i,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register(I(this.element,"contextmenu",i=>{Hr(i,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),zt&&this._register(I(this.element,"auxclick",i=>{i.button===1&&Fr(i,this.textarea,this.screenElement)}))}_bindKeys(){this._register(I(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register(I(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register(I(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register(I(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register(I(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register(I(this.textarea,"compositionend",e=>{this._compositionHelper instanceof Ee?this._compositionHelper.compositionend(e)&&this.textarea.dispatchEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0})):this._compositionHelper.compositionend()})),this._register(I(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){this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView);return}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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",l=>this.element.classList.toggle("allow-transparency",l))),e.appendChild(this.element);let i=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),i.appendChild(this._viewportElement),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register(I(this.screenElement,"mousemove",l=>this.updateCursorStyle(l))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),i.appendChild(this.screenElement);let r=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",Ut.get()),Yr||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._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>r.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(Ki,this.textarea,e.ownerDocument.defaultView??window,this._document??(typeof window<"u"?window.document:null))),this._instantiationService.setService(G,this._coreBrowserService),this._register(I(this.textarea,"focus",l=>this._handleTextAreaFocus(l))),this._register(I(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(bt,this._document,this._helperContainer),this._instantiationService.setService(Be,this._charSizeService),this._themeService=this._instantiationService.createInstance(yt),this._instantiationService.setService(ce,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(We),this._instantiationService.setService(gi,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(It,this.rows,this.screenElement)),this._instantiationService.setService(V,this._renderService),this._register(this._renderService.onRenderedViewportChange(l=>this._onRender.fire(l))),this._register(this._renderService.onDimensionsChange(l=>this._onDimensionsChange.fire({css:{canvas:{...l.css.canvas},cell:{...l.css.cell}},device:{canvas:{...l.device.canvas},cell:{...l.device.cell},char:{...l.device.char}}}))),this.onResize(l=>this._renderService.resize(l.cols,l.rows)),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(Ee,this.textarea,this._compositionView),this._register(E(()=>{this._compositionHelper instanceof Ee&&this._compositionHelper.dispose()})),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(vt),this._instantiationService.setService(Oe,this._mouseCoordsService);let s=this._linkifier.value=this._register(this._instantiationService.createInstance(Bt,this.screenElement));this.element.appendChild(i);try{this._onWillOpen.fire(this.element)}catch(l){this._logService.error("onWillOpen handler threw an exception",l)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(ut,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(l=>{super.scrollLines(l,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(Et,this.element,this.screenElement,s)),this._instantiationService.setService(Si,this._selectionService),this._mouseService=this._instantiationService.createInstance(gt),this._instantiationService.setService(Ks,this._mouseService),this._register(this._selectionService.onRequestScrollLines(l=>this.scrollLines(l.amount,l.suppressScrollEvent))),this._register(this._selectionService.onSelectionChange(()=>this._onSelectionChange.fire())),this._register(this._selectionService.onRequestRedraw(l=>this._renderService.handleSelectionChanged(l.start,l.end,l.columnSelectMode))),this._register(this._selectionService.onLinuxMouseSelection(l=>{this.textarea.value=l,this.textarea.focus(),this.textarea.select()})),this._register(j.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(ft,this.screenElement)),this._register(I(this.element,"mousedown",l=>this._selectionService.handleMouseDown(l))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(je,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",l=>this._handleScreenReaderModeOptionChange(l)));let o=this.options.scrollbar?.showScrollbar??!0,a=this.options.scrollbar?.width;o&&a&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(Ge,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",l=>{let h=(l?.showScrollbar??!0)&&!!l?.width;!this._overviewRulerRenderer&&h&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(Ge,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:l=>this._viewport?.handleTouchScroll(l)},l=>this._register(l),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(mt,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,i,r=!1){this._renderService?.refreshRows(e,i,r)}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,i){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,i),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let i=e-this._bufferService.buffer.ydisp;i!==0&&this.scrollLines(i)}paste(e){Nr(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(e)}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");let i=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),i}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:!1}select(e,i,r){this._selectionService.setSelection(e,i,r)}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,i){this._selectionService?.selectLines(e,i)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;let i=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!i&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(!0),!1;!i&&(e.key==="Dead"||e.key==="AltGraph")&&(this._unprocessedDeadKey=!0);let r=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),r.type===3||r.type===2){let o=this.rows-1;return this.scrollLines(r.type===2?-o:o),e.preventDefault(),e.stopPropagation(),!1}if(r.type===1&&this.selectAll(),this._isThirdLevelShift(this.browser,e)||(r.cancel&&(e.preventDefault(),e.stopPropagation()),!r.key)||!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.key.length===1&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;(r.key===""||r.key==="\r")&&(this.textarea.value="");let s=this._keyboardService.useWin32InputMode&&Ts(e);if(this._onKey.fire({key:r.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(r.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;this._keyDownHandled=!0}_isThirdLevelShift(e,i){let r=e.isMac&&!this.options.macOptionIsMeta&&i.altKey&&!i.ctrlKey&&!i.metaKey||e.isWindows&&i.altKey&&i.ctrlKey&&!i.metaKey||e.isWindows&&i.getModifierState("AltGraph");return i.type==="keypress"?r:r&&(!i.keyCode||i.keyCode>47)}_keyUp(e){if(this._keyDownSeen=!1,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return;Ts(e)||this.focus();let i=this._keyboardService.evaluateKeyUp(e);if(i?.key){let r=this._keyboardService.useWin32InputMode&&Ts(e);this.coreService.triggerDataEvent(i.key,!r)}this.updateCursorStyle(e),this._keyPressHandled=!1}_keyPress(e){let i;if(this._keyPressHandled=!1,this._keyDownHandled||this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;if(e.charCode)i=e.charCode;else if(e.which===null||e.which===void 0)i=e.keyCode;else if(e.which!==0&&e.charCode!==0)i=e.which;else return!1;return!i||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)?!1:(i=String.fromCharCode(i),this._onKey.fire({key:i,domEvent:e}),this._showCursor(),this._compositionHelper.keypress?.(i)||this.coreService.triggerDataEvent(i,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,!0)}_inputEvent(e){if(e.data&&e.inputType==="insertText"&&!this.optionsService.rawOptions.screenReaderMode&&this._compositionHelper instanceof Ee&&this._compositionHelper.input(e.data))return!0;if(e.data&&e.inputType==="insertText"&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;let i=e.data;return this.coreService.triggerDataEvent(i,!0),!0}return!1}resize(e,i){if(e===this.cols&&i===this.rows){this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure();return}super.resize(e,i)}_afterResize(e,i){this._charSizeService?.measure()}clear(){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=0;t--)this._addons[t].instance.dispose()}loadAddon(t,e){let i={instance:e,dispose:e.dispose,isDisposed:!1};this._addons.push(i),e.dispose=()=>this._wrappedAddonDispose(i),e.activate(t)}_wrappedAddonDispose(t){if(t.isDisposed)return;let e=-1;for(let i=0;i=this._line.length))return e?(this._line.loadCell(t,e),e):this._line.loadCell(t,new F)}translateToString(t,e,i){return this._line.translateToString(t,e,i)}};var di=class{constructor(t,e){this._buffer=t;this.type=e}init(t){return this._buffer=t,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(t){let e=this._buffer.lines.get(t);if(e)return new xr(e)}getNullCell(){return new F}};var wr=class extends g{constructor(e){super();this._core=e;this._onBufferChange=this._register(new b);this.onBufferChange=this._onBufferChange.event;this._normal=new di(this._core.buffers.normal,"normal"),this._alternate=new di(this._core.buffers.alt,"alternate"),this._register(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)}};var Tr=class{constructor(t){this._core=t}registerCsiHandler(t,e){return this._core.registerCsiHandler(t,i=>e(i.toArray()))}addCsiHandler(t,e){return this.registerCsiHandler(t,e)}registerDcsHandler(t,e){return this._core.registerDcsHandler(t,(i,r)=>e(i,r.toArray()))}addDcsHandler(t,e){return this.registerDcsHandler(t,e)}registerEscHandler(t,e){return this._core.registerEscHandler(t,e)}addEscHandler(t,e){return this.registerEscHandler(t,e)}registerOscHandler(t,e){return this._core.registerOscHandler(t,e)}addOscHandler(t,e){return this.registerOscHandler(t,e)}registerApcHandler(t,e){return this._core.registerApcHandler(t,e)}};var Dr=class{constructor(t){this._core=t}register(t){this._core.unicodeService.register(t)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(t){this._core.unicodeService.activeVersion=t}};var Ro=["cols","rows"],ye=0,An=class extends g{constructor(t){super(),this._core=this._register(new Er(t)),this._addonManager=this._register(new yr),this._publicOptions={...this._core.options};let e=r=>this._core.options[r],i=(r,s)=>{this._checkReadonlyOptions(r),this._core.options[r]=s};for(let r in this._core.options){let s={get:e.bind(this,r),set:i.bind(this,r)};Object.defineProperty(this._publicOptions,r,s)}}_checkReadonlyOptions(t){if(Ro.includes(t))throw new Error(`Option "${t}" 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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new Tr(this._core)}get unicode(){return this._checkProposedApi(),new Dr(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._register(new wr(this._core))}get markers(){return this._core.markers}get modes(){let t=this._core.coreService.decPrivateModes,e="none";switch(this._core.mouseStateService.activeProtocol){case"X10":e="x10";break;case"VT200":e="vt200";break;case"DRAG":e="drag";break;case"ANY":e="any";break}return{applicationCursorKeysMode:t.applicationCursorKeys,applicationKeypadMode:t.applicationKeypad,bracketedPasteMode:t.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:e,originMode:t.origin,reverseWraparoundMode:t.reverseWraparound,sendFocusMode:t.sendFocus,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:t.synchronizedOutput,win32InputMode:t.win32InputMode,wraparoundMode:t.wraparound}}get dimensions(){return this._core.dimensions}get options(){return this._publicOptions}set options(t){for(let e in t)this._publicOptions[e]=t[e]}blur(){this._core.blur()}focus(){this._core.focus()}input(t,e=!0){this._core.input(t,e)}resize(t,e){this._verifyIntegers(t,e),this._core.resize(t,e)}open(t){this._core.open(t)}attachCustomKeyEventHandler(t){this._core.attachCustomKeyEventHandler(t)}attachCustomWheelEventHandler(t){this._core.attachCustomWheelEventHandler(t)}registerLinkProvider(t){return this._core.registerLinkProvider(t)}registerCharacterJoiner(t){return this._core.registerCharacterJoiner(t)}deregisterCharacterJoiner(t){this._core.deregisterCharacterJoiner(t)}registerMarker(t=0){return this._verifyIntegers(t),this._core.registerMarker(t)}registerDecoration(t){return this._verifyPositiveIntegers(t.x??0,t.width??0,t.height??0),this._core.registerDecoration(t)}hasSelection(){return this._core.hasSelection()}select(t,e,i){this._verifyIntegers(t,e,i),this._core.select(t,e,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(t,e){this._verifyIntegers(t,e),this._core.selectLines(t,e)}dispose(){super.dispose()}scrollLines(t){this._verifyIntegers(t),this._core.scrollLines(t)}scrollPages(t){this._verifyIntegers(t),this._core.scrollPages(t)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(t){this._verifyIntegers(t),this._core.scrollToLine(t)}clear(){this._core.clear()}write(t,e){this._core.write(t,e)}writeln(t,e){this._core.write(t),this._core.write(`\r -+`,e)}paste(t){this._core.paste(t)}refresh(t,e){this._verifyIntegers(t,e),this._core.refresh(t,e)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(t){this._addonManager.loadAddon(this,t)}static get strings(){return{get promptLabel(){return Ut.get()},set promptLabel(t){Ut.set(t)},get tooMuchOutput(){return Je.get()},set tooMuchOutput(t){Je.set(t)}}}_verifyIntegers(...t){for(ye of t)if(ye===1/0||isNaN(ye)||ye%1!==0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...t){for(ye of t)if(ye&&(ye===1/0||isNaN(ye)||ye%1!==0||ye<0))throw new Error("This API only accepts positive integers")}};export{An as Terminal}; +-`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),zt&&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:this._activeSelectionMode===3})}_isClickInSelection(e){let t=this._getMouseBufferCoords(e),r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s||!t?!1:this._areCoordsInSelection(t,r,s)}isCellInSelection(e,t){let r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s?!1:this._areCoordsInSelection([e,t],r,s)}_areCoordsInSelection(e,t,r){return e[1]>t[1]&&e[1]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){let r=this._linkifier.currentLink?.link?.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=hs(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let s=this._getMouseBufferCoords(e);return s?(this._selectWordAt(s,t),this._model.selectionEnd=void 0,!0):!1}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){let t=this._mouseCoordsService.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=qt(this._coreBrowserService.window,e,this._screenElement)[1],r=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=r?0:(t>r&&(t-=r),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(t*14))}shouldForceSelection(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:ie?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0&&!(this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&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){let t=this.hasSelection;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,t&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);let r=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);r&&r.length!==this._model.selectionStart[0]&&r.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!1:e.altKey&&!(ie&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));let r=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows-1,e.lines.length-1)):(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){let 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){let r=this._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(r&&r[0]!==void 0&&r[1]!==void 0){let s=Qs(r[0]-1,r[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(s,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){let e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,r=!!e&&!!t&&(e[0]!==t[0]||e[1]!==t[1]);if(!r){this._oldHasSelection&&this._fireOnSelectionChange(e,t,r);return}!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,r)}_fireOnSelectionChange(e,t,r){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=r,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.value=e.activeBuffer.lines.onTrim(t=>this._handleTrim(t))}_convertViewportColToCharacterIndex(e,t){let r=t;for(let s=0;t>=s;s++){let o=e.loadCell(s,this._workCell).getChars().length;this._workCell.getWidth()===0?r--:o>1&&t!==s&&(r+=o-1)}return r}setSelection(e,t,r){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=r,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,r=!0,s=!0){if(e[0]>=this._bufferService.cols)return;let o=this._bufferService.buffer,a=o.lines.get(e[1]);if(!a)return;let l=o.translateBufferLineToString(e[1],!1),h=this._convertViewportColToCharacterIndex(a,e[0]),d=h,c=e[0]-h,u=0,_=0,p=0,v=0;if(l.charAt(h)===" "){for(;h>0&&l.charAt(h-1)===" ";)h--;for(;d1&&(v+=L-1,d+=L-1);I>0&&h>0&&!this._isCharWordSeparator(a.loadCell(I-1,this._workCell));){a.loadCell(I-1,this._workCell);let T=this._workCell.getChars().length;this._workCell.getWidth()===0?(u++,I--):T>1&&(p+=T-1,h-=T-1),h--,I--}for(;w1&&(v+=T-1,d+=T-1),d++,w++}}d++;let f=h+c-u+p,S=Math.min(this._bufferService.cols,d-h+u+_-p-v);if(!(!t&&l.slice(h,d).trim()==="")){if(r&&f===0&&a.getCodePoint(0)!==32){let I=o.lines.get(e[1]-1);if(I&&a.isWrapped&&I.getCodePoint(this._bufferService.cols-1)!==32){let w=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(w){let L=this._bufferService.cols-w.start;f-=L,S+=L}}}if(s&&f+S===this._bufferService.cols&&a.getCodePoint(this._bufferService.cols-1)!==32){let I=o.lines.get(e[1]+1);if(I?.isWrapped&&I.getCodePoint(0)!==32){let w=this._getWordAt([0,e[1]+1],!1,!1,!0);w&&(S+=w.length)}}return{start:f,length:S}}}_selectWordAt(e,t){let r=this._getWordAt(e,t);if(r){for(;r.start<0;)r.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[r.start,e[1]],this._model.selectionStartLength=r.length}}_selectToWordAt(e){let t=this._getWordAt(e,!0);if(t){let r=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,r--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,r++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,r]}}_isCharWordSeparator(e){return e.getWidth()===0?!1:this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){let t=this._bufferService.buffer.getWrappedRangeForLine(e),r={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=hs(r,this._bufferService.cols)}};Et=y([m(3,D),m(4,Y),m(5,Be),m(6,R),m(7,Me),m(8,V),m(9,G)],Et);var jt=class{constructor(){this._data={}}set(i,e,t){this._data[i]||(this._data[i]={}),this._data[i][e]=t}get(i,e){return this._data[i]?this._data[i][e]:void 0}clear(){this._data={}}};var Zt=class{constructor(){this._color=new jt;this._css=new jt}setCss(i,e,t){this._css.set(i,e,t)}getCss(i,e){return this._css.get(i,e)}setColor(i,e,t){this._color.set(i,e,t)}getColor(i,e){return this._color.get(i,e)}clear(){this._color.clear(),this._css.clear()}};var $=Object.freeze((()=>{let n=[P.toColor("#2e3436"),P.toColor("#cc0000"),P.toColor("#4e9a06"),P.toColor("#c4a000"),P.toColor("#3465a4"),P.toColor("#75507b"),P.toColor("#06989a"),P.toColor("#d3d7cf"),P.toColor("#555753"),P.toColor("#ef2929"),P.toColor("#8ae234"),P.toColor("#fce94f"),P.toColor("#729fcf"),P.toColor("#ad7fa8"),P.toColor("#34e2e2"),P.toColor("#eeeeec")],i=[0,95,135,175,215,255];for(let e=0;e<216;e++){let t=i[e/36%6|0],r=i[e/6%6|0],s=i[e%6];n.push({css:O.toCss(t,r,s),rgba:O.toRgba(t,r,s)})}for(let e=0;e<24;e++){let t=8+e*10;n.push({css:O.toCss(t,t,t),rgba:O.toRgba(t,t,t)})}return n})());var qe=P.toColor("#ffffff"),Qt=P.toColor("#000000"),rn=P.toColor("#ffffff"),sn=Qt,Jt={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},ao=qe,yt=class extends g{constructor(e){super();this._optionsService=e;this._contrastCache=new Zt;this._halfContrastCache=new Zt;this._onChangeColors=this._register(new b);this.onChangeColors=this._onChangeColors.event;this._colors={foreground:qe,background:Qt,cursor:rn,cursorAccent:sn,selectionForeground:void 0,selectionBackgroundTransparent:Jt,selectionBackgroundOpaque:k.blend(Qt,Jt),selectionInactiveBackgroundTransparent:Jt,selectionInactiveBackgroundOpaque:k.blend(Qt,Jt),scrollbarSliderBackground:k.opacity(qe,.2),scrollbarSliderHoverBackground:k.opacity(qe,.4),scrollbarSliderActiveBackground:k.opacity(qe,.5),overviewRulerBorder:qe,ansi:$.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)))}get colors(){return this._colors}_setTheme(e={}){let t=this._colors;if(t.foreground=M(e.foreground,qe),t.background=M(e.background,Qt),t.cursor=k.blend(t.background,M(e.cursor,rn)),t.cursorAccent=k.blend(t.background,M(e.cursorAccent,sn)),t.selectionBackgroundTransparent=M(e.selectionBackground,Jt),t.selectionBackgroundOpaque=k.blend(t.background,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundTransparent=M(e.selectionInactiveBackground,t.selectionBackgroundTransparent),t.selectionInactiveBackgroundOpaque=k.blend(t.background,t.selectionInactiveBackgroundTransparent),t.selectionForeground=e.selectionForeground?M(e.selectionForeground,Jr):void 0,t.selectionForeground===Jr&&(t.selectionForeground=void 0),k.isOpaque(t.selectionBackgroundTransparent)&&(t.selectionBackgroundTransparent=k.opacity(t.selectionBackgroundTransparent,.3)),k.isOpaque(t.selectionInactiveBackgroundTransparent)&&(t.selectionInactiveBackgroundTransparent=k.opacity(t.selectionInactiveBackgroundTransparent,.3)),t.scrollbarSliderBackground=M(e.scrollbarSliderBackground,k.opacity(t.foreground,.2)),t.scrollbarSliderHoverBackground=M(e.scrollbarSliderHoverBackground,k.opacity(t.foreground,.4)),t.scrollbarSliderActiveBackground=M(e.scrollbarSliderActiveBackground,k.opacity(t.foreground,.5)),t.overviewRulerBorder=M(e.overviewRulerBorder,ao),t.ansi=$.slice(),t.ansi[0]=M(e.black,$[0]),t.ansi[1]=M(e.red,$[1]),t.ansi[2]=M(e.green,$[2]),t.ansi[3]=M(e.yellow,$[3]),t.ansi[4]=M(e.blue,$[4]),t.ansi[5]=M(e.magenta,$[5]),t.ansi[6]=M(e.cyan,$[6]),t.ansi[7]=M(e.white,$[7]),t.ansi[8]=M(e.brightBlack,$[8]),t.ansi[9]=M(e.brightRed,$[9]),t.ansi[10]=M(e.brightGreen,$[10]),t.ansi[11]=M(e.brightYellow,$[11]),t.ansi[12]=M(e.brightBlue,$[12]),t.ansi[13]=M(e.brightMagenta,$[13]),t.ansi[14]=M(e.brightCyan,$[14]),t.ansi[15]=M(e.brightWhite,$[15]),e.extendedAnsi){let r=Math.min(t.ansi.length-16,e.extendedAnsi.length);for(let s=0;s"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};function on(n,i,e,t){let r={type:0,cancel:!1,key:void 0},s=(n.shiftKey?1:0)|(n.altKey?2:0)|(n.ctrlKey?4:0)|(n.metaKey?8:0);switch(n.keyCode){case 0:n.key==="UIKeyInputUpArrow"?i?r.key="\x1BOA":r.key="\x1B[A":n.key==="UIKeyInputLeftArrow"?i?r.key="\x1BOD":r.key="\x1B[D":n.key==="UIKeyInputRightArrow"?i?r.key="\x1BOC":r.key="\x1B[C":n.key==="UIKeyInputDownArrow"&&(i?r.key="\x1BOB":r.key="\x1B[B");break;case 8:r.key=n.ctrlKey?"\b":"\x7F",n.altKey&&(r.key="\x1B"+r.key);break;case 9:if(n.shiftKey){r.key="\x1B[Z";break}r.key=" ",r.cancel=!0;break;case 13:n.key==="c"&&n.ctrlKey?r.key="":r.key=n.altKey?"\x1B\r":"\r",r.cancel=!0;break;case 27:r.key="\x1B",n.altKey&&(r.key="\x1B\x1B"),r.cancel=!0;break;case 37:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"D":i?r.key="\x1BOD":r.key="\x1B[D";break;case 39:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"C":i?r.key="\x1BOC":r.key="\x1B[C";break;case 38:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"A":i?r.key="\x1BOA":r.key="\x1B[A";break;case 40:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"B":i?r.key="\x1BOB":r.key="\x1B[B";break;case 45:!n.shiftKey&&!n.ctrlKey&&(r.key="\x1B[2~");break;case 46:s?r.key="\x1B[3;"+(s+1)+"~":r.key="\x1B[3~";break;case 36:s?r.key="\x1B[1;"+(s+1)+"H":i?r.key="\x1BOH":r.key="\x1B[H";break;case 35:s?r.key="\x1B[1;"+(s+1)+"F":i?r.key="\x1BOF":r.key="\x1B[F";break;case 33:n.shiftKey?r.type=2:n.ctrlKey?r.key="\x1B[5;"+(s+1)+"~":r.key="\x1B[5~";break;case 34:n.shiftKey?r.type=3:n.ctrlKey?r.key="\x1B[6;"+(s+1)+"~":r.key="\x1B[6~";break;case 112:s?r.key="\x1B[1;"+(s+1)+"P":r.key="\x1BOP";break;case 113:s?r.key="\x1B[1;"+(s+1)+"Q":r.key="\x1BOQ";break;case 114:s?r.key="\x1B[1;"+(s+1)+"R":r.key="\x1BOR";break;case 115:s?r.key="\x1B[1;"+(s+1)+"S":r.key="\x1BOS";break;case 116:s?r.key="\x1B[15;"+(s+1)+"~":r.key="\x1B[15~";break;case 117:s?r.key="\x1B[17;"+(s+1)+"~":r.key="\x1B[17~";break;case 118:s?r.key="\x1B[18;"+(s+1)+"~":r.key="\x1B[18~";break;case 119:s?r.key="\x1B[19;"+(s+1)+"~":r.key="\x1B[19~";break;case 120:s?r.key="\x1B[20;"+(s+1)+"~":r.key="\x1B[20~";break;case 121:s?r.key="\x1B[21;"+(s+1)+"~":r.key="\x1B[21~";break;case 122:s?r.key="\x1B[23;"+(s+1)+"~":r.key="\x1B[23~";break;case 123:s?r.key="\x1B[24;"+(s+1)+"~":r.key="\x1B[24~";break;default:if(n.ctrlKey&&!n.shiftKey&&!n.altKey&&!n.metaKey)n.keyCode>=65&&n.keyCode<=90?r.key=String.fromCharCode(n.keyCode-64):n.keyCode===32?r.key="\0":n.keyCode>=51&&n.keyCode<=55?r.key=String.fromCharCode(n.keyCode-51+27):n.keyCode===56?r.key="\x7F":n.key==="/"?r.key="":n.keyCode===219?r.key="\x1B":n.keyCode===220?r.key="":n.keyCode===221&&(r.key="");else if((!e||t)&&n.altKey&&!n.metaKey){let a=lo[n.keyCode]?.[n.shiftKey?1:0];if(a)r.key="\x1B"+a;else if(n.keyCode>=65&&n.keyCode<=90){let l=n.ctrlKey?n.keyCode-64:n.keyCode+32,h=String.fromCharCode(l);n.shiftKey&&(h=h.toUpperCase()),r.key="\x1B"+h}else if(n.keyCode===32)r.key="\x1B"+(n.ctrlKey?"\0":" ");else if(n.key==="Dead"&&n.code.startsWith("Key")){let l=n.code.slice(3,4);n.shiftKey||(l=l.toLowerCase()),r.key="\x1B"+l,r.cancel=!0}}else if(e&&!n.altKey&&!n.ctrlKey&&!n.shiftKey&&n.metaKey)n.keyCode===65&&(r.type=1);else if(n.key&&!n.ctrlKey&&!n.altKey&&!n.metaKey&&n.keyCode>=48&&n.key.length===1)r.key=n.key;else if(n.key&&n.ctrlKey&&n.shiftKey)switch(n.code){case"Minus":r.key="";break;case"Digit2":r.key="\0";break;case"Digit6":r.key="";break}break}return r}var ei=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440};this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24};this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"};this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(i){if(i.code.startsWith("Numpad")){let e=i.code.slice(6);if(e>="0"&&e<="9")return 57399+parseInt(e,10);switch(e){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(i){switch(i.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(i){let e=0;return i.shiftKey&&(e|=1),i.altKey&&(e|=2),i.ctrlKey&&(e|=4),i.metaKey&&(e|=8),e>0?e+1:0}_getKeyCode(i,e){let t=this._getNumpadKeyCode(i);if(t!==void 0)return t;let r=this._getModifierKeyCode(i);if(r!==void 0)return r;let s=this._functionalKeyCodes[i.key];if(s!==void 0)return s;if((i.shiftKey||e&&i.altKey)&&i.code){if(i.code.startsWith("Digit")&&i.code.length===6){let o=i.code.charAt(5);if(o>="0"&&o<="9")return o.charCodeAt(0)}if(i.code.startsWith("Key")&&i.code.length===4)return i.code.charAt(3).toLowerCase().charCodeAt(0)}if(i.key.length===1){let o=i.key.codePointAt(0);return o>=65&&o<=90?o+32:o}}_isModifierKey(i){return i.key==="Shift"||i.key==="Control"||i.key==="Alt"||i.key==="Meta"}_isLockKey(i){return i.key==="CapsLock"||i.key==="NumLock"||i.key==="ScrollLock"}_buildCsiLetterSequence(i,e,t,r){let s=r&&t!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+t),o+=i,o}return"\x1B["+i}_buildSs3Sequence(i,e,t,r){let s=r&&t!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+t),o+=i,o}return"\x1BO"+i}_buildCsiTildeSequence(i,e,t,r){let s=r&&t!==1,o="\x1B["+i;return(e>0||s)&&(o+=";"+(e>0?e:"1"),s&&(o+=":"+t)),o+="~",o}_buildCsiUSequence(i,e,t,r,s,o,a){let l=!!(s&2),h=!!(s&4),d="\x1B["+e,c;h&&i.shiftKey&&i.key.length===1&&!o&&!a&&(c=i.key.codePointAt(0),d+=":"+c);let _=!!(s&16)&&r!==3&&i.key.length===1&&!o&&!a&&!i.ctrlKey?i.key.codePointAt(0):void 0,p=l&&r!==1&&(r===3||_===void 0);return(t>0||p||_!==void 0)&&(d+=";",t>0?d+=t:p&&(d+="1"),p&&(d+=":"+r)),_!==void 0&&(d+=";"+_),d+="u",d}evaluate(i,e,t=1,r=!1){let s={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(i),a=this._isModifierKey(i),l=!!(e&2);if(!l&&t===3||a&&!(e&8)||this._isLockKey(i)&&!(e&8))return s;let h=this._csiLetterKeys[i.key];if(h)return s.key=this._buildCsiLetterSequence(h,o,t,l),s.cancel=!0,s;let d=this._ss3FunctionKeys[i.key];if(d)return s.key=this._buildSs3Sequence(d,o,t,l),s.cancel=!0,s;let c=this._csiTildeKeys[i.key];if(c!==void 0)return s.key=this._buildCsiTildeSequence(c,o,t,l),s.cancel=!0,s;let u=this._getKeyCode(i,r);if(u===void 0)return s;let _=u===13||u===9||u===127;if(_&&t===3&&!(e&8))return s;let p=this._functionalKeyCodes[i.key]!==void 0||this._getNumpadKeyCode(i)!==void 0;if(!!(e&8||l&&t===3||(e&1||l)&&(p&&!_||o>0&&i.key.length!==1||o-1>1)))s.key=this._buildCsiUSequence(i,u,o,t,e,p,a),s.cancel=!0;else{let f=u===13?"\r":u===9?" ":u===127?"\x7F":void 0;f?s.key=f:i.key.length===1&&!i.ctrlKey&&!i.altKey&&!i.metaKey&&(s.key=i.key)}return s}static shouldUseProtocol(i){return i>0}};var ji=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226};this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40};this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]);this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(i){let e=this._codeToVk[i.code];return e!==void 0?e:i.keyCode||0}_getScanCode(i){return this._codeToScancode[i.code]||0}_getUnicodeChar(i){if(i.ctrlKey&&!i.altKey&&!i.metaKey){if(i.key==="Enter")return 10;if(i.key==="Backspace")return 127}let e=this._keyToControlChar[i.key];if(e!==void 0)return e;if(i.key.length===1){let t=i.key.codePointAt(0)||0;if(i.ctrlKey&&!i.altKey&&!i.metaKey){if(t>=65&&t<=90)return t-64;if(t>=97&&t<=122)return t-96}return t}return 0}_getControlKeyState(i){let e=0;return i.shiftKey&&(e|=16),i.ctrlKey&&(i.code==="ControlRight"?e|=4:e|=8),i.altKey&&(i.code==="AltRight"?e|=1:e|=2),this._enhancedKeyCodes.has(i.code)&&(e|=256),e}evaluateKeyboardEvent(i,e){let t=this._getVirtualKeyCode(i),r=this._getScanCode(i),s=this._getUnicodeChar(i),o=e?1:0,a=this._getControlKeyState(i);return{type:0,cancel:!0,key:`\x1B[${t};${r};${s};${o};${a};1_`}}};var xt=class{constructor(i,e){this._coreService=i;this._optionsService=e}_getWin32InputMode(){return this._win32InputMode??=new ji,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new ei,this._kittyKeyboard}evaluateKeyDown(i){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(i,!0);let e=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(i,e,i.repeat?2:1,ie&&this._optionsService.rawOptions.macOptionIsMeta):on(i,this._coreService.decPrivateModes.applicationCursorKeys,ie,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(i){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(i,!1);let e=this._coreService.kittyKeyboard.flags;if(this.useKitty&&e&2)return this._getKittyKeyboard().evaluate(i,e,3,ie&&this._optionsService.rawOptions.macOptionIsMeta)}get useKitty(){let i=this._coreService.kittyKeyboard.flags;return!!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard&&ei.shouldUseProtocol(i))}get useWin32InputMode(){return!!(this._optionsService.rawOptions.vtExtensions?.win32InputMode&&this._coreService.decPrivateModes.win32InputMode)}};xt=y([m(0,Y),m(1,R)],xt);var us=class{constructor(...i){this._entries=new Map;for(let[e,t]of i)this.set(e,t)}set(i,e){let t=this._entries.get(i);return this._entries.set(i,e),t}forEach(i){for(let[e,t]of this._entries.entries())i(e,t)}has(i){return this._entries.has(i)}get(i){return this._entries.get(i)}},Zi=class{constructor(){this._services=new us;this._services.set(Qe,this)}setService(i,e){this._services.set(i,e)}getService(i){return this._services.get(i)}createInstance(i,...e){let t=Fs(i).sort((o,a)=>o.index-a.index),r=[];for(let o of t){let a=this._services.get(o.id);if(!a)throw new Error(`[createInstance] ${i.name} depends on UNKNOWN service ${o.id._id}.`);r.push(a)}let s=t.length>0?t[0].index:e.length;if(e.length!==s)throw new Error(`[createInstance] First service dependency of ${i.name} at position ${s+1} conflicts with ${e.length} static arguments`);return new i(...e,...r)}};var co={trace:0,debug:1,info:2,warn:3,error:4,off:5},ho="xterm.js: ",wt=class extends g{constructor(e){super();this._optionsService=e;this._logLevel=5;this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}get logLevel(){return this._logLevel}_updateLogLevel(){this._logLevel=co[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;tthis._length)for(let t=this._length;t=e;s--)this._array[this._getCyclicIndex(s+r.length)]=this._array[this._getCyclicIndex(s)];for(let s=0;sthis._maxLength){let s=this._length+r.length-this._maxLength;this._startIndex+=s,this._length=this._maxLength,this.onTrimEmitter.fire(s)}else this._length+=r.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,r){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+r<0)throw new Error("Cannot shift elements in list beyond index 0");if(r>0){for(let o=t-1;o>=0;o--)this.set(e+o+r,this.get(e+o));let s=e+t+r-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>22,e&2097152?this._combined[i].charCodeAt(this._combined[i].length-1):t]}set(i,e){this._cacheValid=!1,this._data[i*3+1]=e[0],e[1].length>1?(this._combined[i]=e[1],this._data[i*3+0]=i|2097152|e[2]<<22):this._data[i*3+0]=e[1].charCodeAt(0)|e[2]<<22}getWidth(i){return this._data[i*3+0]>>22}hasWidth(i){return this._data[i*3+0]&12582912}getFg(i){return this._data[i*3+1]}getBg(i){return this._data[i*3+2]}hasContent(i){return this._data[i*3+0]&4194303}getCodePoint(i){let e=this._data[i*3+0];return e&2097152?this._combined[i].charCodeAt(this._combined[i].length-1):e&2097151}isCombined(i){return this._data[i*3+0]&2097152}getString(i){let e=this._data[i*3+0];return e&2097152?this._combined[i]:e&2097151?be(e&2097151):""}isProtected(i){return this._data[i*3+2]&536870912}loadCell(i,e){return Ji=i*3,e.content=this._data[Ji+0],e.fg=this._data[Ji+1],e.bg=this._data[Ji+2],e.content&2097152?e.combinedData=this._combined[i]:e.combinedData="",e.bg&268435456?e.extended=this._extendedAttrs[i]:(fs._ext=0,fs._urlId=0,e.extended=fs),e}setCell(i,e){this._cacheValid=!1,e.content&2097152&&(this._combined[i]=e.combinedData),e.bg&268435456&&(this._extendedAttrs[i]=e.extended),this._data[i*3+0]=e.content,this._data[i*3+1]=e.fg,this._data[i*3+2]=e.bg}setCellFromCodepoint(i,e,t,r){this._cacheValid=!1,r.bg&268435456&&(this._extendedAttrs[i]=r.extended);let s=i*3;this._data[s+0]=e|t<<22,this._data[s+1]=r.fg,this._data[s+2]=r.bg}addCodepointToCell(i,e,t){this._cacheValid=!1;let r=this._data[i*3+0];r&2097152?this._combined[i]+=be(e):r&2097151?(this._combined[i]=be(r&2097151)+be(e),r&=-2097152,r|=2097152):r=e|1<<22,t&&(r&=-12582913,r|=t<<22),this._data[i*3+0]=r}insertCells(i,e,t){if(this._cacheValid=!1,i%=this.length,i&&this.getWidth(i-1)===2&&this.setCellFromCodepoint(i-1,0,1,t),e=0;--r)this.setCell(i+e+r,this.loadCell(i+r,ln));for(let r=0;rthis.length){if(this._data.buffer.byteLength>=t*4)this._data=new Uint32Array(this._data.buffer,0,t);else{let r=new Uint32Array(t);r.set(this._data),this._data=r}for(let r=this.length;r=i&&delete this._combined[a]}let s=Object.keys(this._extendedAttrs);for(let o=0;o=i&&delete this._extendedAttrs[a]}}return this.length=i,t*4*2=0;--i)if(this._data[i*3+0]&4194303)return i+(this._data[i*3+0]>>22);return 0}getNoBgTrimmedLength(){for(let i=this.length-1;i>=0;--i)if(this._data[i*3+0]&4194303||this._data[i*3+2]&50331648)return i+(this._data[i*3+0]>>22);return 0}copyCellsFrom(i,e,t,r,s){this._cacheValid=!1;let o=i._data;if(s)for(let a=r-1;a>=0;a--){for(let l=0;l<3;l++)this._data[(t+a)*3+l]=o[(e+a)*3+l];this._copyCellMapsFrom(i,e+a,t+a)}else for(let a=0;a>22||1}r&&r.push(e);let a=o.join("");return s&&(this._cache=a,this._cacheValid=!0,this._cacheTrimmed=!!i),a}_copyCellMapsFrom(i,e,t){let r=e*3;i._data[r+0]&2097152&&(this._combined[t]=i._combined[e]),i._data[r+2]&268435456&&(this._extendedAttrs[t]=i._extendedAttrs[e])}_copySparseMapsFrom(i){this._combined={},this._extendedAttrs={};for(let e=0;e=a&&t0&&(f>c||d[f].getTrimmedLength()===0);f--)v++;v>0&&(o.push(a+d.length-v),o.push(v)),a+=d.length-1}return o}function hn(n,i){let e=[],t=0,r=i[t],s=0;for(let o=0;ol&&(s-=l,o++);let h=n[o].getWidth(s-1)===2;h&&s--;let d=h?e-1:e;t.push(d),a+=d}return t}function Tt(n,i,e){if(i===n.length-1)return n[i].getTrimmedLength();let t=!n[i].hasContent(e-1)&&n[i].getWidth(e-1)===1,r=n[i+1].getWidth(0)===2;return t&&r?e-1:e}var er=class er{constructor(i){this.line=i;this.isDisposed=!1;this._disposables=[];this._id=er._nextId++;this._onDispose=this.register(new b);this.onDispose=this._onDispose.event}get id(){return this._id}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),Oe(this._disposables),this._disposables.length=0)}register(i){return this._disposables.push(i),i}};er._nextId=1;var Qi=er;var q={},Re=q.B;q[0]={"`":"\u25C6",a:"\u2592",b:"\u2409",c:"\u240C",d:"\u240D",e:"\u240A",f:"\xB0",g:"\xB1",h:"\u2424",i:"\u240B",j:"\u2518",k:"\u2510",l:"\u250C",m:"\u2514",n:"\u253C",o:"\u23BA",p:"\u23BB",q:"\u2500",r:"\u23BC",s:"\u23BD",t:"\u251C",u:"\u2524",v:"\u2534",w:"\u252C",x:"\u2502",y:"\u2264",z:"\u2265","{":"\u03C0","|":"\u2260","}":"\xA3","~":"\xB7"};q.A={"#":"\xA3"};q.B=void 0;q[4]={"#":"\xA3","@":"\xBE","[":"ij","\\":"\xBD","]":"|","{":"\xA8","|":"f","}":"\xBC","~":"\xB4"};q.C=q[5]={"[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q.R={"#":"\xA3","@":"\xE0","[":"\xB0","\\":"\xE7","]":"\xA7","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xA8"};q.Q={"@":"\xE0","[":"\xE2","\\":"\xE7","]":"\xEA","^":"\xEE","`":"\xF4","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xFB"};q.K={"@":"\xA7","[":"\xC4","\\":"\xD6","]":"\xDC","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xDF"};q.Y={"#":"\xA3","@":"\xA7","[":"\xB0","\\":"\xE7","]":"\xE9","`":"\xF9","{":"\xE0","|":"\xF2","}":"\xE8","~":"\xEC"};q.E=q[6]={"@":"\xC4","[":"\xC6","\\":"\xD8","]":"\xC5","^":"\xDC","`":"\xE4","{":"\xE6","|":"\xF8","}":"\xE5","~":"\xFC"};q.Z={"#":"\xA3","@":"\xA7","[":"\xA1","\\":"\xD1","]":"\xBF","{":"\xB0","|":"\xF1","}":"\xE7"};q.H=q[7]={"@":"\xC9","[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q["="]={"#":"\xF9","@":"\xE0","[":"\xE9","\\":"\xE7","]":"\xEA","^":"\xEE",_:"\xE8","`":"\xF4","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xFB"};var fn=4294967295,ri=class extends g{constructor(e,t,r,s){super();this._hasScrollback=e;this._optionsService=t;this._bufferService=r;this._logService=s;this.ydisp=0;this.ybase=0;this.y=0;this.x=0;this.tabs={};this.savedY=0;this.savedX=0;this.savedCurAttrData=U.clone();this.savedCharset=Re;this.savedCharsets=[];this.savedGlevel=0;this.savedOriginMode=!1;this.savedWraparoundMode=!0;this.markers=[];this._nullCell=F.fromCharData([0,"",1,0]);this._whitespaceCell=F.fromCharData([0," ",1,32]);this._isClearing=!1;this._memoryCleanupPosition=0;this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops(),this._memoryCleanupQueue=new It(this._logService),this._register(E(()=>this._memoryCleanupQueue.clear())),this._register(E(()=>this.clearAllMarkers()))}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 ke),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 ke),this._whitespaceCell}getBlankLine(e,t){return new De(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){let t=this.ybase+this.y-this.ydisp;return t>=0&&tfn?fn:t}fillViewportRows(e){if(this.lines.length===0){e??=U;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 ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){let r=this.getNullCell(U),s=0,o=this._getCorrectBufferLength(t);if(o>this.lines.maxLength&&(this.lines.maxLength=o),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+a+1?(this.ybase--,a++,this.ydisp>0&&this.ydisp--):this.lines.push(new De(e,r,!1)));else for(let l=this._rows;l>t;l--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(o0&&(this.lines.trimStart(l),this.ybase=Math.max(this.ybase-l,0),this.ydisp=Math.max(this.ydisp-l,0),this.savedY=Math.max(this.savedY-l,0)),this.lines.maxLength=o}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),a&&(this.y+=a),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 a=0;a0){let a=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,a)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){let e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&e.backend==="conpty"&&e.buildNumber>=21376:this._hasScrollback}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){let r=this._optionsService.rawOptions.reflowCursorLine,s=cn(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(U),r);if(s.length>0){let o=hn(this.lines,s);dn(this.lines,o.layout),this._reflowLargerAdjustViewport(e,t,o.countRemoved)}}_reflowLargerAdjustViewport(e,t,r){let s=this.getNullCell(U),o=r;for(;o-- >0;)this.ybase===0?(this.y>0&&this.y--,this.lines.length=0;l--){let h=this.lines.get(l);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;let d=[h];for(;h.isWrapped&&l>0;)h=this.lines.get(--l),d.unshift(h);if(!r){let T=this.ybase+this.y;if(T>=l&&T0&&(o.push({start:l+d.length+a,newLines:v}),a+=v.length),d.push(...v);let f=u.length-1,S=u[f];S===0&&(f--,S=u[f]);let I=d.length-_-1,w=c;for(;I>=0;){let T=Math.min(w,S);if(d[f]===void 0)break;if(d[f].copyCellsFrom(d[I],w-T,S-T,T,!0),S-=T,S===0&&(f--,S=u[f]),w-=T,w===0){I--;let te=Math.max(I,0);w=Tt(d,te,this._cols)}}for(let T=0;T0;)this.ybase===0?this.y0){let l=[],h=[];for(let S=0;S=0;S--)if(_&&_.start>c+p){for(let I=_.newLines.length-1;I>=0;I--)this.lines.set(S--,_.newLines[I]);S++,l.push({index:c+1,amount:_.newLines.length}),p+=_.newLines.length,_=o[++u]}else this.lines.set(S,h[c--]);let v=0;for(let S=l.length-1;S>=0;S--)l[S].index+=v,this.lines.onInsertEmitter.fire(l[S]),v+=l[S].amount;let f=Math.max(0,d+a-this.lines.maxLength);f>0&&this.lines.onTrimEmitter.fire(f)}}translateBufferLineToString(e,t,r=0,s){let o=this.lines.get(e);return o?o.translateToString(t,r,s):""}getWrappedRangeForLine(e){let t=e,r=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;r+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(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-=r,t.line<0&&t.dispose()})),t.register(this.lines.onInsert(r=>{t.line>=r.index&&(t.line+=r.amount)})),t.register(this.lines.onDelete(r=>{t.line>=r.index&&t.liner.index&&(t.line-=r.amount)})),t.register(t.onDispose(()=>this._removeMarker(t))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}};var tr=class extends g{constructor(e,t,r){super();this._optionsService=e;this._bufferService=t;this._logService=r;this._normalBuffer=this._register(new B);this._altBuffer=this._register(new B);this._onBufferActivate=this._register(new b);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 ri(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new ri(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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)}};var Dt=class extends g{constructor(e,t){super();this.isUserScrolling=!1;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new tr(e,this,t)),this._register(this.buffers.onBufferActivate(r=>{this._onScroll.fire(r.activeBuffer.ydisp)}))}get buffer(){return this.buffers.active}resize(e,t){let r=this.cols!==e,s=this.rows!==t;this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t,colsChanged:r,rowsChanged:s})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){let r=this.buffer,s;s=this._cachedBlankLine,(!s||s.length!==this.cols||s.getFg(0)!==e.fg||s.getBg(0)!==e.bg)&&(s=r.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;let o=r.ybase+r.scrollTop,a=r.ybase+r.scrollBottom;if(r.scrollTop===0){let l=r.lines.isFull;a===r.lines.length-1?l?r.lines.recycle().copyFrom(s,!0):r.lines.push(s.clone(!0)):r.lines.splice(a+1,0,s.clone(!0)),l?this.isUserScrolling&&(r.ydisp=Math.max(r.ydisp-1,0)):(r.ybase++,this.isUserScrolling||r.ydisp++)}else{let l=a-o+1;r.lines.shiftElements(o+1,l-1,-1),r.lines.set(a,s.clone(!0))}this.isUserScrolling||(r.ydisp=r.ybase),this._onScroll.fire(r.ydisp)}scrollLines(e,t){let r=this.buffer;if(e<0){if(r.ydisp===0)return;this.isUserScrolling=!0}else e+r.ydisp>=r.ybase&&(this.isUserScrolling=!1);let s=r.ydisp;r.ydisp=Math.max(Math.min(r.ydisp+e,r.ybase),0),s!==r.ydisp&&(t||this._onScroll.fire(r.ydisp))}};Dt=y([m(0,R),m(1,fe)],Dt);var Rt={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:ie,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}},fo=["normal","bold","100","200","300","400","500","600","700","800","900"],ir=class extends g{constructor(e){super();this._onOptionChange=this._register(new b);this.onOptionChange=this._onOptionChange.event;let t={...Rt};for(let r in e)if(r in t)try{let s=e[r];t[r]=this._sanitizeAndValidateOption(r,s)}catch(s){console.error(s)}this.rawOptions=t,this.options={...t},this._setupOptions(),this._register(E(()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null}))}onSpecificOptionChange(e,t){return this.onOptionChange(r=>{r===e&&t(this.rawOptions[e])})}onMultipleOptionChange(e,t){return this.onOptionChange(r=>{e.indexOf(r)!==-1&&t()})}_setupOptions(){let e=r=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);return this.rawOptions[r]},t=(r,s)=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);s=this._sanitizeAndValidateOption(r,s),this.rawOptions[r]!==s&&(this.rawOptions[r]=s,this._onOptionChange.fire(r))};for(let r in this.rawOptions){let s={get:e.bind(this,r),set:t.bind(this,r)};Object.defineProperty(this.options,r,s)}}_sanitizeAndValidateOption(e,t){switch(e){case"cursorStyle":if(t||(t=Rt[e]),!_o(t))throw new Error(`"${t}" is not a valid value for ${e}`);break;case"wordSeparator":t||(t=Rt[e]);break;case"fontWeight":case"fontWeightBold":if(typeof t=="number"&&1<=t&&t<=1e3)break;t=fo.includes(t)?t:Rt[e];break;case"blinkIntervalDuration":if(t=Math.floor(t),t<0)throw new Error(`${e} cannot be less than 0, value: ${t}`);break;case"cursorWidth":t=Math.floor(t);case"lineHeight":case"tabStopWidth":if(t<1)throw new Error(`${e} cannot be less than 1, value: ${t}`);break;case"minimumContrastRatio":t=Math.max(1,Math.min(21,Math.round(t*10)/10));break;case"scrollback":if(t=Math.min(t,4294967295),t<0)throw new Error(`${e} cannot be less than 0, value: ${t}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(t<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${t}`);break;case"rows":case"cols":if(!t&&t!==0)throw new Error(`${e} must be numeric, value: ${t}`);break;case"windowsPty":t=t??{};break}return t}};function _o(n){return n==="block"||n==="underline"||n==="bar"}var _n=Object.freeze({insertMode:!1}),pn=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0}),mn=()=>({flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}),Lt=class extends g{constructor(e,t,r){super();this._bufferService=e;this._logService=t;this._optionsService=r;this.isCursorHidden=!1;this._onData=this._register(new b);this.onData=this._onData.event;this._onUserInput=this._register(new b);this.onUserInput=this._onUserInput.event;this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onRequestScrollToBottom=this._register(new b);this.onRequestScrollToBottom=this._onRequestScrollToBottom.event;this.isCursorInitialized=r.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(_n),this.decPrivateModes=structuredClone(pn),this.kittyKeyboard=mn()}reset(){this.modes=structuredClone(_n),this.decPrivateModes=structuredClone(pn),this.kittyKeyboard=mn()}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;let r=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&r.ybase!==r.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(s=>s.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(t=>t.charCodeAt(0))),this._onBinary.fire(e))}};Lt=y([m(0,D),m(1,fe),m(2,R)],Lt);var bn={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:n=>n.button===4||n.action!==1?!1:(n.ctrl=!1,n.alt=!1,n.shift=!1,!0)},VT200:{events:19,restrict:n=>n.action!==32},DRAG:{events:23,restrict:n=>!(n.action===32&&n.button===3)},ANY:{events:31,restrict:n=>!0}};function ms(n,i){let e=(n.ctrl?16:0)|(n.shift?4:0)|(n.alt?8:0);return n.button===4?(e|=64,e|=n.action):(e|=n.button&3,n.button&4&&(e|=64),n.button&8&&(e|=128),n.action===32?e|=32:n.action===0&&!i&&(e|=3)),e}var bs=String.fromCharCode,vn={DEFAULT:n=>{let i=[ms(n,!1)+32,n.col+32,n.row+32];return i[0]>255||i[1]>255||i[2]>255?"":`\x1B[M${bs(i[0])}${bs(i[1])}${bs(i[2])}`},SGR:n=>{let i=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${ms(n,!0)};${n.col};${n.row}${i}`},SGR_PIXELS:n=>{let i=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${ms(n,!0)};${n.x};${n.y}${i}`}},rr=class extends g{constructor(){super();this._protocols={};this._encodings={};this._activeProtocol="";this._activeEncoding="";this._onProtocolChange=this._register(new b);this.onProtocolChange=this._onProtocolChange.event;for(let e of Object.keys(bn))this.addProtocol(e,bn[e]);for(let e of Object.keys(vn))this.addEncoding(e,vn[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 this._protocols[this._activeProtocol].events!==0}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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return this._customWheelEventHandler?this._customWheelEventHandler(e)!==!1:!0}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return this._activeEncoding==="DEFAULT"}get isPixelEncoding(){return this._activeEncoding==="SGR_PIXELS"}};var me=class n{constructor(){this._providers=Object.create(null);this._active="";this._onChange=new b;this.onChange=this._onChange.event}static extractShouldJoin(i){return(i&1)!==0}static extractWidth(i){return i>>1&3}static extractCharKind(i){return i>>3}static createPropertyValue(i,e,t=!1){return(i&16777215)<<3|(e&3)<<1|(t?1:0)}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(i){if(!this._providers[i])throw new Error(`unknown Unicode version "${i}"`);this._active=i,this._activeProvider=this._providers[i],this._onChange.fire(i)}register(i){this._providers[i.version]=i,this._active||(this.activeVersion=i.version)}wcwidth(i){return this._activeProvider.wcwidth(i)}getStringCellWidth(i){let e=0,t=0,r=i.length;for(let s=0;s=r)return e+this.wcwidth(o);let h=i.charCodeAt(s);56320<=h&&h<=57343?o=(o-55296)*1024+h-56320+65536:e+=this.wcwidth(h)}let a=this.charProperties(o,t),l=n.extractWidth(a);n.extractShouldJoin(a)&&(l-=n.extractWidth(t)),e+=l,t=a}return e}charProperties(i,e){return this._activeProvider.charProperties(i,e)}};var vs=[[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]],po=[[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]],X;function mo(n,i){let e=0,t=i.length-1,r;if(ni[t][1])return!1;for(;t>=e;)if(r=e+t>>1,n>i[r][1])e=r+1;else if(n=131072&&i<=196605||i>=196608&&i<=262141?2:1}charProperties(i,e){let t=this.wcwidth(i),r=t===0&&e!==0;if(r){let s=me.extractWidth(e);s===0?r=!1:s>t&&(t=s)}return me.createPropertyValue(0,t,r)}};var nr=class{constructor(){this.glevel=0;this._charsets=[]}get charsets(){return this._charsets}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(i){this.glevel=i,this.charset=this._charsets[i]}setgCharset(i,e){this._charsets[i]=e,this.glevel===i&&(this.charset=e)}};function Ss(n){let e=n.buffer.lines.get(n.buffer.ybase+n.buffer.y-1)?.get(n.cols-1),t=n.buffer.lines.get(n.buffer.ybase+n.buffer.y);t&&e&&(t.isWrapped=e[3]!==0&&e[3]!==32)}var At=class n{constructor(i=32,e=32){this.maxLength=i;this.maxSubParamsLength=e;if(e>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(i),this.length=0,this._subParams=new Int32Array(e),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(i),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}static fromArray(i){let e=new n;if(!i.length)return e;for(let t=Array.isArray(i[0])?1:0;t>8,r=this._subParamsIdx[e]&255;r-t>0&&i.push(Array.prototype.slice.call(this._subParams,t,r))}return i}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(i){if(this._digitIsSub=!1,this.length>=this.maxLength){this._rejectDigits=!0;return}if(i<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=i>2147483647?2147483647:i}addSubParam(i){if(this._digitIsSub=!0,!!this.length){if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength){this._rejectSubDigits=!0;return}if(i<-1)throw new Error("values less than -1 are not allowed");this._subParams[this._subParamsLength++]=i>2147483647?2147483647:i,this._subParamsIdx[this.length-1]++}}hasSubParams(i){return(this._subParamsIdx[i]&255)-(this._subParamsIdx[i]>>8)>0}getSubParams(i){let e=this._subParamsIdx[i]>>8,t=this._subParamsIdx[i]&255;return t-e>0?this._subParams.subarray(e,t):null}getSubParamsAll(){let i={};for(let e=0;e>8,r=this._subParamsIdx[e]&255;r-t>0&&(i[e]=this._subParams.slice(t,r))}return i}addDigit(i){let e;if(this._rejectDigits||!(e=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;let t=this._digitIsSub?this._subParams:this.params,r=t[e-1];t[e-1]=~r?Math.min(r*10+i,2147483647):i}};var gs=class{constructor(){this._chunks=[];this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(i){this._chunks.push(i),this._length+=i.length}toString(){return this._chunks.join("")}},We=class{constructor(i){this._limit=i;this._builder=new gs}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(i){return this._builder.append(i),this._builder.length>this._limit?(this._builder.reset(),!0):!1}toString(){return this._builder.toString()}};var si=[],or=class{constructor(){this._state=0;this._active=si;this._id=-1;this._handlers=Object.create(null);this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=si}reset(){if(this._state===2)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].end(!1);this._stack.paused=!1,this._active=si,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||si,!this._active.length)this._handlerFb(this._id,"START");else for(let i=this._active.length-1;i>=0;i--)this._active[i].start()}_put(i,e,t){if(!this._active.length)this._handlerFb(this._id,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}start(){this.reset(),this._state=1}put(i,e,t){if(this._state!==3){if(this._state===1)for(;e0&&this._put(i,e,t)}}end(i,e=!0){if(this._state!==0){if(this._state!==3)if(this._state===1&&this._start(),!this._active.length)this._handlerFb(this._id,"END",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].end(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].end(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=si,this._id=-1,this._state=0}}},ar=class ar{constructor(i){this._handler=i;this._data=new We(ar._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}end(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(t=>(this._data.reset(),this._hitLimit=!1,t));return this._data.reset(),this._hitLimit=!1,e}};ar._payloadLimit=1e7;var ne=ar;var ni=[],lr=class{constructor(){this._handlers=Object.create(null);this._active=ni;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ni}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}reset(){if(this._active.length)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].unhook(!1);this._stack.paused=!1,this._active=ni,this._ident=0}hook(i,e){if(this.reset(),this._ident=i,this._active=this._handlers[i]||ni,!this._active.length)this._handlerFb(this._ident,"HOOK",e);else for(let t=this._active.length-1;t>=0;t--)this._active[t].hook(e)}put(i,e,t){if(!this._active.length)this._handlerFb(this._ident,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}unhook(i,e=!0){if(!this._active.length)this._handlerFb(this._ident,"UNHOOK",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].unhook(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].unhook(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=ni,this._ident=0}},oi=new At;oi.addParam(0);var cr=class cr{constructor(i){this._handler=i;this._data=new We(cr._payloadLimit);this._params=oi;this._hitLimit=!1}hook(i){this._params=i.length>1||i.params[0]?i.clone():oi,this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}unhook(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString(),this._params),e instanceof Promise))return e.then(t=>(this._params=oi,this._data.reset(),this._hitLimit=!1,t));return this._params=oi,this._data.reset(),this._hitLimit=!1,e}};cr._payloadLimit=1e7;var ai=cr;var li=[],hr=class{constructor(){this._handlers=Object.create(null);this._active=li;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(i,e){this._handlers[i]??=[];let t=this._handlers[i];return t.push(e),{dispose:()=>{let r=t.indexOf(e);r!==-1&&t.splice(r,1)}}}clearHandler(i){this._handlers[i]&&delete this._handlers[i]}setHandlerFallback(i){this._handlerFb=i}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=li}reset(){if(this._active.length)for(let i=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;i>=0;--i)this._active[i].end(!1);this._stack.paused=!1,this._active=li,this._ident=0}start(i){if(this.reset(),this._ident=i,this._active=this._handlers[i]||li,!this._active.length)this._handlerFb(this._ident,"START");else for(let e=this._active.length-1;e>=0;e--)this._active[e].start()}put(i,e,t){if(!this._active.length)this._handlerFb(this._ident,"PUT",ye(i,e,t));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(i,e,t)}end(i,e=!0){if(!this._active.length)this._handlerFb(this._ident,"END",i);else{let t=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,t=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&t===!1){for(;r>=0&&(t=this._active[r].end(i),t!==!0);r--)if(t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,t;r--}for(;r>=0;r--)if(t=this._active[r].end(!1),t instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,t}this._active=li,this._ident=0}},ur=class ur{constructor(i){this._handler=i;this._data=new We(ur._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(i,e,t){this._hitLimit||this._data.append(ye(i,e,t))&&(this._hitLimit=!0)}end(i){let e=!1;if(this._hitLimit)e=!1;else if(i&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(t=>(this._data.reset(),this._hitLimit=!1,t));return this._data.reset(),this._hitLimit=!1,e}};ur._payloadLimit=1e7;var dr=ur;var Is=class{constructor(i){this.table=new Uint16Array(i)}setDefault(i,e){this.table.fill(i<<8|e)}add(i,e,t,r){this.table[e<<8|i]=t<<8|r}addMany(i,e,t,r){for(let s=0;sl),t=(a,l)=>e.slice(a,l),r=t(32,127),s=t(0,24);s.push(25),s.push.apply(s,t(28,32));let o=t(0,17);n.setDefault(1,0),n.addMany(r,0,2,0);for(let a of o)n.addMany([24,26,153,154],a,3,0),n.addMany(t(128,144),a,3,0),n.addMany(t(144,152),a,3,0),n.add(156,a,0,0),n.add(27,a,11,1),n.add(157,a,4,8),n.addMany([152,158],a,0,7),n.add(159,a,11,14),n.add(155,a,11,3),n.add(144,a,11,9);return n.addMany(s,0,3,0),n.addMany(s,1,3,1),n.add(127,1,0,1),n.addMany(s,8,0,8),n.addMany(s,3,3,3),n.add(127,3,0,3),n.addMany(s,4,3,4),n.add(127,4,0,4),n.addMany(s,6,3,6),n.addMany(s,5,3,5),n.add(127,5,0,5),n.addMany(s,2,3,2),n.add(127,2,0,2),n.add(93,1,4,8),n.addMany(r,8,5,8),n.add(127,8,5,8),n.addMany([156,27,24,26,7],8,6,0),n.addMany(t(28,32),8,0,8),n.addMany([88,94],1,0,7),n.addMany(r,7,0,7),n.addMany(s,7,0,7),n.add(156,7,0,0),n.add(127,7,0,7),n.add(95,1,11,14),n.addMany(s,14,0,14),n.add(127,14,0,14),n.addMany(t(32,48),14,9,15),n.addMany(t(48,127),14,15,16),n.addMany(t(48,127),15,15,16),n.addMany(s,15,0,15),n.addMany(t(32,48),15,9,15),n.add(127,15,0,15),n.addMany(r,16,16,16),n.addMany(s,16,0,16),n.addMany(t(8,14),16,16,16),n.add(127,16,0,16),n.addMany([27,156,24,26],16,17,0),n.add(91,1,11,3),n.addMany(t(64,127),3,7,0),n.addMany(t(48,60),3,8,4),n.addMany([60,61,62,63],3,9,4),n.addMany(t(48,60),4,8,4),n.addMany(t(64,127),4,7,0),n.addMany([60,61,62,63],4,0,6),n.addMany(t(32,64),6,0,6),n.add(127,6,0,6),n.addMany(t(64,127),6,0,0),n.addMany(t(32,48),3,9,5),n.addMany(t(32,48),5,9,5),n.addMany(t(48,64),5,0,6),n.addMany(t(64,127),5,7,0),n.addMany(t(32,48),4,9,5),n.addMany(t(32,48),1,9,2),n.addMany(t(32,48),2,9,2),n.addMany(t(48,127),2,10,0),n.addMany(t(48,80),1,10,0),n.addMany(t(81,88),1,10,0),n.addMany([89,90,92],1,10,0),n.addMany(t(96,127),1,10,0),n.add(80,1,11,9),n.addMany(s,9,0,9),n.add(127,9,0,9),n.addMany(t(32,48),9,9,12),n.addMany(t(48,60),9,8,10),n.addMany([60,61,62,63],9,9,10),n.addMany(s,11,0,11),n.addMany(t(32,128),11,0,11),n.addMany(s,10,0,10),n.add(127,10,0,10),n.addMany(t(48,60),10,8,10),n.addMany([60,61,62,63],10,0,11),n.addMany(t(32,48),10,9,12),n.addMany(s,12,0,12),n.add(127,12,0,12),n.addMany(t(32,48),12,9,12),n.addMany(t(48,64),12,0,11),n.addMany(t(64,127),12,12,13),n.addMany(t(64,127),10,12,13),n.addMany(t(64,127),9,12,13),n.addMany(s,13,13,13),n.addMany(r,13,13,13),n.add(127,13,0,13),n.addMany([27,156,24,26],13,14,0),n.add(oe,0,2,0),n.add(oe,8,5,8),n.add(oe,6,0,6),n.add(oe,11,0,11),n.add(oe,13,13,13),n.add(oe,16,16,16),n})(),fr=class extends g{constructor(e=bo){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 At,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(t,r,s)=>{},this._executeHandlerFb=t=>{},this._csiHandlerFb=(t,r)=>{},this._escHandlerFb=t=>{},this._errorHandlerFb=t=>t,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this._register(E(()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new or),this._dcsParser=this._register(new lr),this._apcParser=this._register(new hr),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},()=>!0)}_identifier(e,t=[64,126]){let r=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(r=e.prefix.charCodeAt(0),r<60||r>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 o=0;oa||a>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");r<<=8,r|=a}}if(e.final.length!==1)throw new Error("final must be a single byte");let 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 r<<=8,r|=s,r}identToString(e){let t=[];for(;e;)t.push(String.fromCharCode(e&255)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){let r=this._identifier(e,[48,126]);this._escHandlers[r]??=[];let s=this._escHandlers[r];return s.push(t),{dispose:()=>{let o=s.indexOf(t);o!==-1&&s.splice(o,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){let r=e.charCodeAt(0);this._executeHandlers[r]=t,r<24&&(this._executeHandlersArr[r]=t)}clearExecuteHandler(e){let t=e.charCodeAt(0);this._executeHandlers[t]&&delete this._executeHandlers[t],t<24&&(this._executeHandlersArr[t]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){let r=this._identifier(e);this._csiHandlers[r]??=[];let s=this._csiHandlers[r];return s.push(t),{dispose:()=>{let o=s.indexOf(t);o!==-1&&s.splice(o,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)}registerApcHandler(e,t){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),t)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0,this._parseStack.state!==0&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,r,s,o){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=r,this._parseStack.transition=s,this._parseStack.chunkPos=o}parse(e,t,r){let s,o,a=0,l;if(this._parseStack.state)if(this._parseStack.state===2)this._parseStack.state=0,a=this._parseStack.chunkPos+1;else{if(r===void 0||this._parseStack.state===1)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");let h=this._parseStack.handlers,d=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](this._params),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 4:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],l=this._dcsParser.unhook(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],l=this._oscParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],l=this._apcParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break}this._parseStack.state=0,a=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=this._parseStack.transition&255}for(let h=a;h=60&&c<=63&&(this._collect=c,d++);let u=!1;for(;d=48&&c<=57)this._params.addDigit(c-48);else if(c===59)this._params.addParam(0);else if(c===58)this._params.addSubParam(-1);else if(c>=64&&c<=126){let _=this._csiHandlers[this._collect<<8|c],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return o=1792,this._preserveStack(3,_,p,o,d),l;p<0&&this._csiHandlerFb(this._collect<<8|c,this._params),this.precedingJoinState=0,h=d,this.currentState=0,u=!0;break}else break;u||(h=d-1,this.currentState=4);continue}switch(o=this._transitions.table[this.currentState<<8|(s>8){case 2:let d=h,c=t-4;for(;d=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe););if(d>=c)for(;d=32&&(e[d]<=126||e[d]>=oe);)d++;this._printHandler(e,h,d),h=d-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:h,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:let _=this._csiHandlers[this._collect<<8|s],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return this._preserveStack(3,_,p,o,h),l;p<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}while(++h47&&s<60);h--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:let v=this._escHandlers[this._collect<<8|s],f=v?v.length-1:-1;for(;f>=0&&(l=v[f](),l!==!0);f--)if(l instanceof Promise)return this._preserveStack(4,v,f,o,h),l;f<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let S=h+1;;++S)if(S>=t||(s=e[S])===24||s===26||s===27||s>127&&s=t||(s=e[S])<32||s>127&&s=32&&e[S]<127||e[S]>=8&&e[S]<14||e[S]>=oe))){this._apcParser.put(e,h,S),h=S-1;break}break;case 17:if(l=this._apcParser.end(s!==24&&s!==26),l)return this._preserveStack(7,[],0,o,h),l;s===27&&(o|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0;break}this.currentState=o&255}}};var vo=/^([\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})$/,So=/^[\da-f]+$/;function Es(n){if(!n)return;let i=n.toLowerCase();if(i.startsWith("rgb:")){i=i.slice(4);let e=vo.exec(i);if(e){let 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(i.startsWith("#")&&(i=i.slice(1),So.exec(i)&&[3,6,9,12].includes(i.length))){let e=i.length/3,t=[0,0,0];for(let r=0;r<3;++r){let s=parseInt(i.slice(e*r,e*r+e),16);t[r]=e===1?s<<4:e===2?s:e===3?s>>4:s>>8}return t}}function Cs(n,i){let e=n.toString(16),t=e.length<2?"0"+e:e;switch(i){case 4:return e[0];case 8:return t;case 12:return(t+t).slice(0,3);default:return t+t}}function In(n,i=16){let[e,t,r]=n;return`rgb:${Cs(e,i)}/${Cs(t,i)}/${Cs(r,i)}`}var Cn="6.1.0-beta.303";var Io={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function En(n,i){if(n>24)return i.setWinLines||!1;switch(n){case 1:return!!i.restoreWin;case 2:return!!i.minimizeWin;case 3:return!!i.setWinPosition;case 4:return!!i.setWinSizePixels;case 5:return!!i.raiseWin;case 6:return!!i.lowerWin;case 7:return!!i.refreshWin;case 8:return!!i.setWinSizeChars;case 9:return!!i.maximizeWin;case 10:return!!i.fullscreenWin;case 11:return!!i.getWinState;case 13:return!!i.getWinPosition;case 14:return!!i.getWinSizePixels;case 15:return!!i.getScreenSizePixels;case 16:return!!i.getCellSizePixels;case 18:return!!i.getWinSizeChars;case 19:return!!i.getScreenSizeChars;case 20:return!!i.getIconTitle;case 21:return!!i.getWinTitle;case 22:return!!i.pushTitle;case 23:return!!i.popTitle;case 24:return!!i.setWinLines}return!1}var yn=0,_r=class extends g{constructor(e,t,r,s,o,a,l,h,d=new fr){super();this._bufferService=e;this._charsetService=t;this._coreService=r;this._logService=s;this._optionsService=o;this._oscLinkService=a;this._mouseStateService=l;this._unicodeService=h;this._parser=d;this._parseBuffer=new Uint32Array(4096);this._stringDecoder=new pi;this._utf8Decoder=new mi;this._windowTitle="";this._iconName="";this._windowTitleStack=[];this._iconNameStack=[];this._curAttrData=U.clone();this._eraseAttrDataInternal=U.clone();this._onRequestBell=this._register(new b);this.onRequestBell=this._onRequestBell.event;this._onRequestRefreshRows=this._register(new b);this.onRequestRefreshRows=this._onRequestRefreshRows.event;this._onRequestReset=this._register(new b);this.onRequestReset=this._onRequestReset.event;this._onRequestSendFocus=this._register(new b);this.onRequestSendFocus=this._onRequestSendFocus.event;this._onRequestSyncScrollBar=this._register(new b);this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event;this._onRequestWindowsOptionsReport=this._register(new b);this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event;this._onA11yChar=this._register(new b);this.onA11yChar=this._onA11yChar.event;this._onA11yTab=this._register(new b);this.onA11yTab=this._onA11yTab.event;this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onColor=this._register(new b);this.onColor=this._onColor.event;this._onRequestColorSchemeQuery=this._register(new b);this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 ci(this._bufferService),this._activeBuffer=this._bufferService.buffer,this._register(this._bufferService.buffers.onBufferActivate(c=>this._activeBuffer=c.activeBuffer)),this._parser.setCsiHandlerFallback((c,u)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(c),params:u.toArray()})}),this._parser.setEscHandlerFallback(c=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(c)})}),this._parser.setExecuteHandlerFallback(c=>{this._logService.debug("Unknown EXECUTE code: ",{code:c})}),this._parser.setOscHandlerFallback((c,u,_)=>{this._logService.debug("Unknown OSC code: ",{identifier:c,action:u,data:_})}),this._parser.setDcsHandlerFallback((c,u,_)=>{u==="HOOK"&&(_=_.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setApcHandlerFallback((c,u,_)=>{this._logService.debug("Unknown APC code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setPrintHandler((c,u,_)=>this.print(c,u,_)),this._parser.registerCsiHandler({final:"@"},c=>this.insertChars(c)),this._parser.registerCsiHandler({intermediates:" ",final:"@"},c=>this.scrollLeft(c)),this._parser.registerCsiHandler({final:"A"},c=>this.cursorUp(c)),this._parser.registerCsiHandler({intermediates:" ",final:"A"},c=>this.scrollRight(c)),this._parser.registerCsiHandler({final:"B"},c=>this.cursorDown(c)),this._parser.registerCsiHandler({final:"C"},c=>this.cursorForward(c)),this._parser.registerCsiHandler({final:"D"},c=>this.cursorBackward(c)),this._parser.registerCsiHandler({final:"E"},c=>this.cursorNextLine(c)),this._parser.registerCsiHandler({final:"F"},c=>this.cursorPrecedingLine(c)),this._parser.registerCsiHandler({final:"G"},c=>this.cursorCharAbsolute(c)),this._parser.registerCsiHandler({final:"H"},c=>this.cursorPosition(c)),this._parser.registerCsiHandler({final:"I"},c=>this.cursorForwardTab(c)),this._parser.registerCsiHandler({final:"J"},c=>this.eraseInDisplay(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"J"},c=>this.eraseInDisplay(c,!0)),this._parser.registerCsiHandler({final:"K"},c=>this.eraseInLine(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"K"},c=>this.eraseInLine(c,!0)),this._parser.registerCsiHandler({final:"L"},c=>this.insertLines(c)),this._parser.registerCsiHandler({final:"M"},c=>this.deleteLines(c)),this._parser.registerCsiHandler({final:"P"},c=>this.deleteChars(c)),this._parser.registerCsiHandler({final:"S"},c=>this.scrollUp(c)),this._parser.registerCsiHandler({final:"T"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"X"},c=>this.eraseChars(c)),this._parser.registerCsiHandler({final:"Z"},c=>this.cursorBackwardTab(c)),this._parser.registerCsiHandler({final:"^"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"`"},c=>this.charPosAbsolute(c)),this._parser.registerCsiHandler({final:"a"},c=>this.hPositionRelative(c)),this._parser.registerCsiHandler({final:"b"},c=>this.repeatPrecedingCharacter(c)),this._parser.registerCsiHandler({final:"c"},c=>this.sendDeviceAttributesPrimary(c)),this._parser.registerCsiHandler({prefix:">",final:"c"},c=>this.sendDeviceAttributesSecondary(c)),this._parser.registerCsiHandler({final:"d"},c=>this.linePosAbsolute(c)),this._parser.registerCsiHandler({final:"e"},c=>this.vPositionRelative(c)),this._parser.registerCsiHandler({final:"f"},c=>this.hVPosition(c)),this._parser.registerCsiHandler({final:"g"},c=>this.tabClear(c)),this._parser.registerCsiHandler({final:"h"},c=>this.setMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"h"},c=>this.setModePrivate(c)),this._parser.registerCsiHandler({final:"l"},c=>this.resetMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"l"},c=>this.resetModePrivate(c)),this._parser.registerCsiHandler({final:"m"},c=>this.charAttributes(c)),this._parser.registerCsiHandler({final:"n"},c=>this.deviceStatus(c)),this._parser.registerCsiHandler({prefix:"?",final:"n"},c=>this.deviceStatusPrivate(c)),this._parser.registerCsiHandler({intermediates:"!",final:"p"},c=>this.softReset(c)),this._parser.registerCsiHandler({prefix:">",final:"q"},c=>this.sendXtVersion(c)),this._parser.registerCsiHandler({intermediates:" ",final:"q"},c=>this.setCursorStyle(c)),this._parser.registerCsiHandler({final:"r"},c=>this.setScrollRegion(c)),this._parser.registerCsiHandler({final:"s"},c=>this.saveCursor(c)),this._parser.registerCsiHandler({final:"t"},c=>this.windowOptions(c)),this._parser.registerCsiHandler({final:"u"},c=>this.restoreCursor(c)),this._parser.registerCsiHandler({intermediates:"'",final:"}"},c=>this.insertColumns(c)),this._parser.registerCsiHandler({intermediates:"'",final:"~"},c=>this.deleteColumns(c)),this._parser.registerCsiHandler({intermediates:'"',final:"q"},c=>this.selectProtected(c)),this._parser.registerCsiHandler({intermediates:"$",final:"p"},c=>this.requestMode(c,!0)),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},c=>this.requestMode(c,!1)),this._parser.registerCsiHandler({prefix:"=",final:"u"},c=>this.kittyKeyboardSet(c)),this._parser.registerCsiHandler({prefix:"?",final:"u"},c=>this.kittyKeyboardQuery(c)),this._parser.registerCsiHandler({prefix:">",final:"u"},c=>this.kittyKeyboardPush(c)),this._parser.registerCsiHandler({prefix:"<",final:"u"},c=>this.kittyKeyboardPop(c)),this._parser.setExecuteHandler("\x07",()=>this.bell()),this._parser.setExecuteHandler(` +-`,()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler(" ",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("\x84",()=>this.index()),this._parser.setExecuteHandler("\x85",()=>this.nextLine()),this._parser.setExecuteHandler("\x88",()=>this.tabSet()),this._parser.registerOscHandler(0,new ne(c=>(this.setTitle(c),this.setIconName(c),!0))),this._parser.registerOscHandler(1,new ne(c=>this.setIconName(c))),this._parser.registerOscHandler(2,new ne(c=>this.setTitle(c))),this._parser.registerOscHandler(4,new ne(c=>this.setOrReportIndexedColor(c))),this._parser.registerOscHandler(8,new ne(c=>this.setHyperlink(c))),this._parser.registerOscHandler(10,new ne(c=>this.setOrReportFgColor(c))),this._parser.registerOscHandler(11,new ne(c=>this.setOrReportBgColor(c))),this._parser.registerOscHandler(12,new ne(c=>this.setOrReportCursorColor(c))),this._parser.registerOscHandler(104,new ne(c=>this.restoreIndexedColor(c))),this._parser.registerOscHandler(110,new ne(c=>this.restoreFgColor(c))),this._parser.registerOscHandler(111,new ne(c=>this.restoreBgColor(c))),this._parser.registerOscHandler(112,new ne(c=>this.restoreCursorColor(c))),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(let c in q)this._parser.registerEscHandler({intermediates:"(",final:c},()=>this.selectCharset("("+c)),this._parser.registerEscHandler({intermediates:")",final:c},()=>this.selectCharset(")"+c)),this._parser.registerEscHandler({intermediates:"*",final:c},()=>this.selectCharset("*"+c)),this._parser.registerEscHandler({intermediates:"+",final:c},()=>this.selectCharset("+"+c)),this._parser.registerEscHandler({intermediates:"-",final:c},()=>this.selectCharset("-"+c)),this._parser.registerEscHandler({intermediates:".",final:c},()=>this.selectCharset("."+c)),this._parser.registerEscHandler({intermediates:"/",final:c},()=>this.selectCharset("/"+c));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(c=>(this._logService.error("Parsing error: ",c),c)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new ai((c,u)=>this.requestStatusString(c,u)))}getAttrData(){return this._curAttrData}_preserveStack(e,t,r,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=r,this._parseStack.position=s}_logSlowResolvingAsync(e){if(this._logService.logLevel<=3){let t,r=new Promise((s,o)=>{t=setTimeout(()=>o("#SLOW_TIMEOUT"),5e3)});Promise.race([e,r]).then(()=>{t!==void 0&&clearTimeout(t)},s=>{if(t!==void 0&&clearTimeout(t),s!=="#SLOW_TIMEOUT")throw s;console.warn("async parser handler taking longer than 5000 ms")})}}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let r,s=this._activeBuffer.x,o=this._activeBuffer.y,a=0,l=this._parseStack.paused;if(l){if(r=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(r),r;s=this._parseStack.cursorStartX,o=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>131072&&(a=this._parseStack.position+131072)}if(this._logService.logLevel<=1&&this._logService.debug(`parsing data ${typeof e=="string"?` "${e}"`:` "${Array.prototype.map.call(e,c=>String.fromCharCode(c)).join("")}"`}`),this._logService.logLevel===0&&this._logService.trace("parsing data (codes)",typeof e=="string"?e.split("").map(c=>c.charCodeAt(0)):e),this._parseBuffer.length131072)for(let c=a;c0&&_.getWidth(this._activeBuffer.x-1)===2&&_.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let p=this._parser.precedingJoinState;for(let v=t;vh){if(d){let L=_,T=this._activeBuffer.x-I;if(this._activeBuffer.x=I,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),_=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!_)return;for(I>0&&_ instanceof De&&_.copyCellsFrom(L,T,0,I,!1);T=0;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(c&&(_.insertCells(this._activeBuffer.x,o-I,this._activeBuffer.getNullCell(u)),_.getWidth(h-1)===2&&_.setCellFromCodepoint(h-1,0,1,u)),_.setCellFromCodepoint(this._activeBuffer.x++,s,o,u),o>0)for(;--o;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=p,this._activeBuffer.x0&&_.getWidth(this._activeBuffer.x)===0&&!_.hasContent(this._activeBuffer.x)&&_.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return e.final==="t"&&!e.prefix&&!e.intermediates?this._parser.registerCsiHandler(e,r=>En(r.params[0],this._optionsService.rawOptions.windowOptions)?t(r):!0):this._parser.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new ai(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new ne(t))}registerApcHandler(e,t){return this._parser.registerApcHandler(e,new dr(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(this._activeBuffer.x===0&&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;let 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;let 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){let 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){let 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){let t=e.params[0];return t===0?delete this._activeBuffer.tabs[this._activeBuffer.x]:t===3&&(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){let t=e.params[0];return t===1&&(this._curAttrData.bg|=536870912),(t===2||t===0)&&(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,r,s=!1,o=!1){let a=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);a&&(a.replaceCells(t,r,this._activeBuffer.getNullCell(this._eraseAttrData()),o),s&&(a.isWrapped=!1))}_resetBufferLine(e,t=!1){let r=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);r&&(r.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),r.isWrapped=!1)}eraseInDisplay(e,t=!1){this._restrictCursor(this._bufferService.cols);let r;switch(e.params[0]){case 0:for(r=this._activeBuffer.y,this._dirtyRowTracker.markDirty(r),this._eraseInBufferLine(r++,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,t);r=this._bufferService.cols){let o=this._activeBuffer.lines.get(r+1);o&&(o.isWrapped=!1)}for(;r--;)this._resetBufferLine(r,t);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(r=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,r-1);r--&&!this._activeBuffer.lines.get(this._activeBuffer.ybase+r)?.getTrimmedLength(););for(;r>=0;r--)this._bufferService.scroll(this._eraseAttrData())}else{for(r=this._bufferService.rows,this._dirtyRowTracker.markDirty(r-1);r--;)this._resetBufferLine(r,t);this._dirtyRowTracker.markDirty(0)}break;case 3:let s=this._activeBuffer.lines.length-this._bufferService.rows;s>0&&(this._activeBuffer.lines.trimStart(s),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-s,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-s,0),this._activeBuffer===this._bufferService.buffers.normal&&(this._bufferService.isUserScrolling=!1),this._onScroll.fire(0));break}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,this._activeBuffer.x===0,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);break}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 c=d;for(let u=1;u0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent("\x1B[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("\x1B[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("\x1B[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("\x1B[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("\x1B[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`\x1BP>|xterm.js(${Cn})\x1B\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let t=0;t(te[te.NOT_RECOGNIZED=0]="NOT_RECOGNIZED",te[te.SET=1]="SET",te[te.RESET=2]="RESET",te[te.PERMANENTLY_SET=3]="PERMANENTLY_SET",te[te.PERMANENTLY_RESET=4]="PERMANENTLY_RESET"))(r||={});let s=this._coreService.decPrivateModes,{activeProtocol:o,activeEncoding:a}=this._mouseStateService,l=this._coreService,{buffers:h,cols:d}=this._bufferService,{active:c,alt:u}=h,_=this._optionsService.rawOptions,p=(S,I)=>(l.triggerDataEvent(`\x1B[${t?"":"?"}${S};${I}$y`),!0),v=S=>S?1:2,f=e.params[0];return t?f===2?p(f,4):f===4?p(f,v(l.modes.insertMode)):f===12?p(f,3):f===20?p(f,v(_.convertEol)):p(f,0):f===1?p(f,v(s.applicationCursorKeys)):f===3?p(f,_.windowOptions.setWinLines?d===80?2:d===132?1:0:0):f===6?p(f,v(s.origin)):f===7?p(f,v(s.wraparound)):f===8?p(f,3):f===9?p(f,v(o==="X10")):f===12?p(f,v(_.cursorBlink)):f===25?p(f,v(!l.isCursorHidden)):f===45?p(f,v(s.reverseWraparound)):f===66?p(f,v(s.applicationKeypad)):f===67?p(f,4):f===1e3?p(f,v(o==="VT200")):f===1002?p(f,v(o==="DRAG")):f===1003?p(f,v(o==="ANY")):f===1004?p(f,v(s.sendFocus)):f===1005?p(f,4):f===1006?p(f,v(a==="SGR")):f===1015?p(f,4):f===1016?p(f,v(a==="SGR_PIXELS")):f===1048?p(f,1):f===47||f===1047||f===1049?p(f,v(c===u)):f===2004?p(f,v(s.bracketedPasteMode)):f===2026?p(f,v(s.synchronizedOutput)):f===9001&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?p(f,v(s.win32InputMode)):p(f,0)}_updateAttrColor(e,t,r,s,o){return t===2?(e|=50331648,e&=-16777216,e|=ue.fromColorRGB([r,s,o])):t===5&&(e&=-67108864,e|=33554432|r&255),e}_extractColor(e,t,r){let s=[0,0,-1,0,0,0],o=0,a=0;do{if(s[a+o]=e.params[t+a],e.hasSubParams(t+a)){let l=e.getSubParams(t+a),h=0;do s[1]===5&&(o=1),s[a+h+1+o]=l[h];while(++h=2||s[1]===2&&a+o>=5)break;s[1]&&(o=1)}while(++a+t5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,e===0&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=U.fg,e.bg=U.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(e.length===1&&e.params[0]===0)return this._processSGR0(this._curAttrData),!0;let t=e.length,r,s=this._curAttrData;for(let o=0;o=30&&r<=37?(s.fg&=-67108864,s.fg|=16777216|r-30):r>=40&&r<=47?(s.bg&=-67108864,s.bg|=16777216|r-40):r>=90&&r<=97?(s.fg&=-67108864,s.fg|=16777216|r-90|8):r>=100&&r<=107?(s.bg&=-67108864,s.bg|=16777216|r-100|8):r===0?this._processSGR0(s):r===1?s.fg|=134217728:r===3?s.bg|=67108864:r===4?(s.fg|=268435456,this._processUnderline(e.hasSubParams(o)?e.getSubParams(o)[0]:1,s)):r===5?s.fg|=536870912:r===7?s.fg|=67108864:r===8?s.fg|=1073741824:r===9?s.fg|=2147483648:r===2?s.bg|=134217728:r===21?this._processUnderline(2,s):r===22?(s.fg&=-134217729,s.bg&=-134217729):r===23?s.bg&=-67108865:r===24?(s.fg&=-268435457,this._processUnderline(0,s)):r===25?s.fg&=-536870913:r===27?s.fg&=-67108865:r===28?s.fg&=-1073741825:r===29?s.fg&=2147483647:r===39?(s.fg&=-67108864,s.fg|=U.fg&16777215):r===49?(s.bg&=-67108864,s.bg|=U.bg&16777215):r===38||r===48||r===58?o+=this._extractColor(e,o,s):r===53?s.bg|=1073741824:r===55?s.bg&=-1073741825:r===221&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.fg&=-134217729:r===222&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.bg&=-134217729:r===59?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",r);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("\x1B[0n");break;case 6:let t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[${t};${r}R`);break}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:let t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[?${t};${r}R`);break;case 15:break;case 25:break;case 26:break;case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??!0)&&this._onRequestColorSchemeQuery.fire();break}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=U.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){let t=e.length===0?1:e.params[0];if(t===0)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(t){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar";break}let r=t%2===1;this._coreService.decPrivateModes.cursorBlink=r}return!0}setScrollRegion(e){let t=e.params[0]||1,r;return(e.length<2||(r=e.params[1])>this._bufferService.rows||r===0)&&(r=this._bufferService.rows),r>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=r-1,this._setCursor(0,0)),!0}windowOptions(e){if(!En(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;let t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:t!==2&&this._onRequestWindowsOptionsReport.fire(0);break;case 16:this._onRequestWindowsOptionsReport.fire(1);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`\x1B[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:(t===0||t===2)&&(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),(t===0||t===1)&&(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:(t===0||t===2)&&this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),(t===0||t===1)&&this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop());break}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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let t=0;t1;){let s=r.shift(),o=r.shift();if(/^\d+$/.exec(s)){let a=parseInt(s,10);if(xn(a))if(o==="?")t.push({type:0,index:a});else{let l=Es(o);l&&t.push({type:1,index:a,color:l})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){let t=e.indexOf(";");if(t===-1)return!0;let r=e.slice(0,t).trim(),s=e.slice(t+1);return s?this._createHyperlink(r,s):r.trim()?!1:this._finishHyperlink()}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();let r=e.split(":"),s,o=r.findIndex(a=>a.startsWith("id="));return o!==-1&&(s=r[o].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){let r=e.split(";");for(let s=0;s=this._specialColors.length);++s,++t)if(r[s]==="?")this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{let o=Es(r[s]);o&&this._onColor.fire([{type:1,index:this._specialColors[t],color:o}])}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;let t=[],r=e.split(";");for(let s=0;s=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){let 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=U.clone(),this._eraseAttrDataInternal=U.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=this._curAttrData.bg&67108863,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){let e=new F;e.content=1<<22|69,e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t(this._coreService.triggerDataEvent(`\x1B${l}\x1B\\`),!0),s=this._bufferService.buffer,o=this._optionsService.rawOptions,a={block:2,underline:4,bar:6};return r(e==='"q'?`P1$r${this._curAttrData.isProtected()?1:0}"q`:e==='"p'?'P1$r61;1"p':e==="r"?`P1$r${s.scrollTop+1};${s.scrollBottom+1}r`:e==="m"?"P1$r0m":e===" q"?`P1$r${a[o.cursorStyle]-(o.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=e.params[0]||0,r=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(r){case 1:s.flags=t;break;case 2:s.flags|=t;break;case 3:s.flags&=~t;break}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`\x1B[?${t}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=e.params[0]||0,r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;return o.length>=16&&o.shift(),o.push(r.flags),r.flags=t,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let t=Math.max(1,e.params[0]||1),r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;for(let a=0;a0;a++)r.flags=o.pop();return o.length===0&&t>0&&(r.flags=0),!0}},ci=class{constructor(i){this._bufferService=i;this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(i){ithis.end&&(this.end=i)}markRangeDirty(i,e){i>e&&(yn=i,i=e,e=yn),ithis.end&&(this.end=e)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};ci=y([m(0,D)],ci);function xn(n){return 0<=n&&n<256}var pr=class extends g{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._innerWriteTimer=this._register(new Ie);this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._register(E(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed||this._isSyncWriting)return;this._isSyncWriting=!0;let e,t=!1;for(;e=this._writeBuffer.shift();){t=!0,this._action(e);let r=this._callbacks.shift();r&&r()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,t&&this._onWriteParsed.fire()}writeSync(e,t){if(this._store.isDisposed)return;if(t!==void 0&&this._syncCalls>t){this._syncCalls=0;return}if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;this._isSyncWriting=!0;let r;for(;r=this._writeBuffer.shift();){this._action(r);let s=this._callbacks.shift();s&&s()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(!this._store.isDisposed){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){this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),this._innerWrite();return}this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}}_scheduleInnerWrite(e=0,t=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,t),0)}_innerWrite(e=0,t=!0){if(this._store.isDisposed)return;let r=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){let s=this._writeBuffer[this._bufferOffset],o=this._action(s,t);if(o){let l=h=>{this._store.isDisposed||(performance.now()-r>=12?this._scheduleInnerWrite(0,h):this._innerWrite(r,h))};o.catch(h=>(queueMicrotask(()=>{throw h}),Promise.resolve(!1))).then(l);return}let a=this._callbacks[this._bufferOffset];if(a&&a(),this._bufferOffset++,this._pendingData-=s.length,performance.now()-r>=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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}};var kt=class{constructor(i){this._bufferService=i;this._nextId=1;this._entriesWithId=new Map;this._dataByLinkId=new Map}registerLink(i){let e=this._bufferService.buffer;if(i.id===void 0){let l=e.addMarker(e.ybase+e.y),h={data:i,id:this._nextId++,lines:[l]};return l.onDispose(()=>this._removeMarkerFromLink(h,l)),this._dataByLinkId.set(h.id,h),h.id}let t=i,r=this._getEntryIdKey(t),s=this._entriesWithId.get(r);if(s)return this.addLineToLink(s.id,e.ybase+e.y),s.id;let o=e.addMarker(e.ybase+e.y),a={id:this._nextId++,key:this._getEntryIdKey(t),data:t,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(a,o)),this._entriesWithId.set(a.key,a),this._dataByLinkId.set(a.id,a),a.id}addLineToLink(i,e){let t=this._dataByLinkId.get(i);if(t&&t.lines.every(r=>r.line!==e)){let r=this._bufferService.buffer.addMarker(e);t.lines.push(r),r.onDispose(()=>this._removeMarkerFromLink(t,r))}}getLinkData(i){return this._dataByLinkId.get(i)?.data}_getEntryIdKey(i){return`${i.id};;${i.uri}`}_removeMarkerFromLink(i,e){let t=i.lines.indexOf(e);t!==-1&&(i.lines.splice(t,1),i.lines.length===0&&(i.data.id!==void 0&&this._entriesWithId.delete(i.key),this._dataByLinkId.delete(i.id)))}};kt=y([m(0,D)],kt);var wn=!1,mr=class extends g{constructor(e){super();this._windowsWrappingHeuristics=this._register(new B);this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onData=this._register(new b);this.onData=this._onData.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._onScroll=this._register(new b);this._instantiationService=new Zi,this.optionsService=this._register(new ir(e)),this._instantiationService.setService(R,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(wt)),this._instantiationService.setService(fe,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(Dt)),this._instantiationService.setService(D,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(Lt)),this._instantiationService.setService(Y,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(rr)),this._instantiationService.setService(Me,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(me)),this.unicodeService.register(new sr),this._instantiationService.setService(Ws,this.unicodeService),this._charsetService=this._instantiationService.createInstance(nr),this._instantiationService.setService(Hs,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(kt),this._instantiationService.setService(bi,this._oscLinkService),this._inputHandler=this._register(new _r(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(j.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(j.forward(this._bufferService.onResize,this._onResize)),this._register(j.forward(this.coreService.onData,this._onData)),this._register(j.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this._writeBuffer=this._register(new pr((t,r)=>this._inputHandler.parse(t,r))),this._register(j.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new b),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(let t in e)this.optionsService.options[t]=e[t]}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=3&&!wn&&(this._logService.warn("writeSync is unreliable and will be removed soon."),wn=!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,2),t=Math.max(t,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t){this._bufferService.scrollLines(e,t)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let t=e-this._bufferService.buffer.ydisp;t!==0&&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)}registerApcHandler(e,t){return this._inputHandler.registerApcHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1,t=this.optionsService.rawOptions.windowsPty;t&&t.backend!==void 0&&t.buildNumber!==void 0&&(e=t.backend==="conpty"&&t.buildNumber<21376),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){let e=[];e.push(this.onLineFeed(Ss.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>(Ss(this._bufferService),!1))),this._windowsWrappingHeuristics.value=E(()=>{for(let t of e)t.dispose()})}}};var z=0,br=class{constructor(i,e){this._getKey=i;this._array=[];this._insertedValues=[];this._isFlushingInserted=!1;this._deletedIndices=[];this._isFlushingDeleted=!1;this._flushInsertedTask=new It(e),this._flushDeletedTask=new It(e)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(i){this._flushCleanupDeleted(),this._insertedValues.length===0&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(i)}_flushInserted(){let i=this._insertedValues.sort((s,o)=>this._getKey(s)-this._getKey(o)),e=0,t=0,r=new Array(this._array.length+this._insertedValues.length);for(let s=0;s=this._array.length||this._getKey(i[e])<=this._getKey(this._array[t])?(r[s]=i[e],e++):r[s]=this._array[t++];this._array=r,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(i){if(this._flushCleanupInserted(),this._array.length===0)return!1;let e=this._getKey(i);if(e===void 0||(z=this._search(e),z===-1)||this._getKey(this._array[z])!==e)return!1;do if(this._array[z]===i)return this._deletedIndices.length===0&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(z),!0;while(++zs-o),e=0,t=new Array(this._array.length-i.length),r=0;for(let s=0;s0&&this._flushDeletedTask.flush()}*getKeyIterator(i){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),this._array.length!==0&&(z=this._search(i),!(z<0||z>=this._array.length)&&this._getKey(this._array[z])===i))do yield this._array[z];while(++z=this._array.length)&&this._getKey(this._array[z])===i))do e(this._array[z]);while(++z=e;){let r=e+t>>1,s=this._getKey(this._array[r]);if(s>i)t=r-1;else if(s0&&this._getKey(this._array[r-1])===i;)r--;return r}}return e}};var Mt=0,vr=0,Pt=class extends g{constructor(e,t){super();this._logService=e;this._bufferService=t;this._lineCache=this._register(new ys);this._onDecorationRegistered=this._register(new b);this.onDecorationRegistered=this._onDecorationRegistered.event;this._onDecorationRemoved=this._register(new b);this.onDecorationRemoved=this._onDecorationRemoved.event;this._decorations=new br(r=>r?.marker.line,this._logService),this._register(E(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}get decorations(){return this._decorations.values()}registerDecoration(e){if(e.marker.isDisposed)return;let t=new xs(e);if(t){let r=t.marker.onDispose(()=>t.dispose()),s=t.onDispose(()=>{s.dispose(),t&&(this._decorations.delete(t)&&(this._lineCache.remove(t),this._onDecorationRemoved.fire(t)),r.dispose())});this._decorations.insert(t),this._lineCache.add(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(let e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,t,r){let s=this._lineCache.getDecorationsOnLine(t);if(s)for(let o of s)Mt=o.options.x??0,vr=Mt+(o.options.width??1),e>=Mt&&e=Mt&&ethis._handleBufferLinesTrim(r))),t.add(e.onInsert(r=>this._handleBufferLinesInsert(r))),t.add(e.onDelete(r=>this._handleBufferLinesDelete(r)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){let t=e.marker.line;if(t<0)return;e._indexedStartLine=t;let r=this._getDecorationHeight(e);for(let s=t;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{let t=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(let r of t)r()})}_handleBufferLinesTrim(e){if(e<=0||!this._decorationsByLine.size)return;let t=new Map;for(let[r,s]of this._decorationsByLine){let o=r-e;o<0||this._mergeLineBucket(t,o,s)}this._decorationsByLine.clear();for(let[r,s]of t)this._decorationsByLine.set(r,s);for(let r of this._decorations)r.marker.isDisposed||(r._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,t,r){let s=e.get(t);if(s)for(let o=0,a=r.length;ot&&(s.push(a),this._removeFromLineBuckets(a))}let o=new Map;for(let[a,l]of this._decorationsByLine){let h=a>=t?a+r:a;this._mergeLineBucket(o,h,l)}this._decorationsByLine.clear();for(let[a,l]of o)this._decorationsByLine.set(a,l);for(let a of this._decorations)a.marker.isDisposed||a._indexedStartLine>=t&&(a._indexedStartLine=a.marker.line);for(let a of s)this._addToLineBuckets(a)}_applyBufferLinesDelete(e){let t=e.index+e.amount,r=new Map;for(let[o,a]of this._decorationsByLine){if(o>=e.index&&o=t?o-e.amount:o;this._mergeLineBucket(r,l,a)}this._decorationsByLine.clear();for(let[o,a]of r)this._decorationsByLine.set(o,a);let s=[];for(let o of this._decorations){if(o.marker.isDisposed)continue;let a=o._indexedStartLine,l=this._getDecorationHeight(o);a>=t?o._indexedStartLine=o.marker.line:at&&s.push(o)}for(let o of s)this._reindexDecoration(o)}},xs=class extends pe{constructor(e){super();this.options=e;this.onRenderEmitter=this.add(new b);this.onRender=this.onRenderEmitter.event;this._onDispose=this.add(new b);this.onDispose=this._onDispose.event;this._cachedBg=null;this._cachedFg=null;this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}get backgroundColorRGB(){return this._cachedBg===null&&(this.options.backgroundColor?this._cachedBg=P.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return this._cachedFg===null&&(this.options.foregroundColor?this._cachedFg=P.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}dispose(){this._onDispose.fire(),super.dispose()}};var Co=1e3,Sr=class{constructor(i,e=Co){this._renderCallback=i;this._debounceThresholdMS=e;this._lastRefreshMs=0;this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(i,e,t){this._rowCount=t,i=i??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,i):i,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e;let r=performance.now();if(r-this._lastRefreshMs>=this._debounceThresholdMS)this._refreshTimeoutID!==void 0&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),this._lastRefreshMs=r,this._innerRefresh();else if(!this._additionalRefreshRequested){let s=r-this._lastRefreshMs,o=this._debounceThresholdMS-s;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout(()=>{this._lastRefreshMs=performance.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0},o)}}_innerRefresh(){if(this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return;let i=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(i,e)}};var Tn=!1,Ye=class extends g{constructor(e,t,r,s){super();this._terminal=e;this._coreBrowserService=r;this._renderService=s;this._rowColumns=new WeakMap;this._liveRegionLineCount=0;this._charsToConsume=[];this._charsToAnnounce="";let o=this._coreBrowserService.mainDocument;this._accessibilityContainer=o.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=o.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let a=0;athis._handleBoundaryFocus(a,0),this._bottomBoundaryFocusListener=a=>this._handleBoundaryFocus(a,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=o.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new Sr(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");Tn?(this._accessibilityContainer.classList.add("debug"),this._rowContainer.classList.add("debug"),this._debugRootContainer=o.createElement("div"),this._debugRootContainer.classList.add("xterm"),this._debugRootContainer.appendChild(o.createTextNode("------start a11y------")),this._debugRootContainer.appendChild(this._accessibilityContainer),this._debugRootContainer.appendChild(o.createTextNode("------end a11y------")),this._terminal.element.insertAdjacentElement("afterend",this._debugRootContainer)):this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this._register(this._terminal.onResize(a=>this._handleResize(a.rows))),this._register(this._terminal.onRender(a=>this._refreshRows(a.start,a.end))),this._register(this._terminal.onScroll(()=>this._refreshRows())),this._register(this._terminal.onA11yChar(a=>this._handleChar(a))),this._register(this._terminal.onLineFeed(()=>this._handleChar(` +-`))),this._register(this._terminal.onA11yTab(a=>this._handleTab(a))),this._register(this._terminal.onKey(a=>this._handleKey(a.key))),this._register(this._terminal.onBlur(()=>this._clearLiveRegion())),this._register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._register(C(o,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register(E(()=>{Tn?this._debugRootContainer.remove():this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,e===` +-`&&(this._liveRegionLineCount++,this._liveRegionLineCount===21&&(this._liveRegion.textContent=Ze.get())))}_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){let r=this._terminal.buffer,s=r.lines.length.toString();for(let o=e;o<=t;o++){let a=r.lines.get(r.ydisp+o),l=[],h=a?.translateToString(!0,void 0,void 0,l)||"",d=(r.ydisp+o+1).toString(),c=this._rowElements[o];c&&(h.length===0?(c.textContent="\xA0",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,l)),c.setAttribute("aria-posinset",d),c.setAttribute("aria-setsize",s),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent===Ze.get()&&this._clearLiveRegion(),this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){let r=e.target,s=this._rowElements[t===0?1:this._rowElements.length-2],o=r.getAttribute("aria-posinset"),a=t===0?"1":`${this._terminal.buffer.lines.length}`;if(o===a||e.relatedTarget!==s)return;let l,h;if(t===0?(l=r,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(l=this._rowElements.shift(),h=r,this._rowContainer.removeChild(l)),l.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),t===0){let d=this._createAccessibilityTreeNode();this._rowElements.unshift(d),this._rowContainer.insertAdjacentElement("afterbegin",d)}else{let d=this._createAccessibilityTreeNode();this._rowElements.push(d),this._rowContainer.appendChild(d)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(t===0?-1:1),this._rowElements[t===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let t={node:e.anchorNode,offset:e.anchorOffset},r={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(r.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===r.node&&t.offset>r.offset)&&([t,r]=[r,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;let s=this._rowElements.slice(-1)[0];if(r.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(r={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(r.node))return;let o=({node:h,offset:d})=>{let c=h instanceof Text?h.parentNode:h,u=parseInt(c?.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let _=this._rowColumns.get(c);if(!_)return console.warn("columns is null. Race condition?"),null;let p=d<_.length?_[d]:_.slice(-1)[0]+1;return p>=this._terminal.cols&&(++u,p=0),{row:u,column:p}},a=o(t),l=o(r);if(!(!a||!l)){if(a.row>l.row||a.row===l.row&&a.column>=l.column)throw new Error("invalid range");this._terminal.select(a.column,a.row,(l.row-a.row)*this._terminal.cols-a.column+l.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let t=this._rowContainer.children.length;te;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let 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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{Oe(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register(C(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register(C(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register(C(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register(C(this._element,"mouseup",this._handleMouseUp.bind(this)))}get currentLink(){return this._currentLink}_handleMouseMove(e){this._lastMouseEvent=e;let t=this._positionFromMouseEvent(e,this._element);if(!t)return;this._isMouseOut=!1;let r=e.composedPath();for(let s=0;s{s?.forEach(o=>{o.link.dispose&&o.link.dispose()})}),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(let[s,o]of this._linkProviderService.linkProviders.entries())t?this._activeProviderReplies?.get(s)&&(r=this._checkLinkProviderResult(s,e,r)):o.provideLinks(e.y,a=>{if(this._isMouseOut)return;let l=a?.map(h=>({link:h}));this._activeProviderReplies?.set(s,l),r=this._checkLinkProviderResult(s,e,r),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)})}_removeIntersectingLinks(e,t){let r=new Set;for(let s=0;se?this._bufferService.cols:l.link.range.end.x;for(let c=h;c<=d;c++){if(r.has(c)){o.splice(a--,1);break}r.add(c)}}}}_checkLinkProviderResult(e,t,r){if(!this._activeProviderReplies)return r;let s=this._activeProviderReplies.get(e),o=!1;for(let a=0;athis._linkAtPosition(l.link,t));a&&(r=!0,this._handleNewLink(a))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!r)for(let a=0;athis._linkAtPosition(h.link,t));if(l){r=!0,this._handleNewLink(l);break}}return r}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;let t=this._positionFromMouseEvent(e,this._element);t&&this._mouseDownLink&&Eo(this._mouseDownLink.link,this._currentLink.link)&&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,Oe(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;let t=this._positionFromMouseEvent(this._lastMouseEvent,this._element);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:e.link.decorations===void 0?!0:e.link.decorations.underline,pointerCursor:e.link.decorations===void 0?!0: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:r=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==r&&(this._currentLink.state.decorations.pointerCursor=r,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",r))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:r=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==r&&(this._currentLink.state.decorations.underline=r,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,r))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(r=>{if(!this._currentLink)return;let s=r.start===0?0:r.start+1+this._bufferService.buffer.ydisp,o=this._bufferService.buffer.ydisp+1+r.end;if(this._currentLink.link.range.start.y>=s&&this._currentLink.link.range.end.y<=o&&(this._clearCurrentLink(s,o),this._lastMouseEvent)){let a=this._positionFromMouseEvent(this._lastMouseEvent,this._element);a&&this._askForLink(a,!1)}})))}_linkHover(e,t,r){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(r,t.text)}_fireUnderlineEvent(e,t){let r=e.range,s=this._bufferService.buffer.ydisp,o=this._createLinkUnderlineEvent(r.start.x-1,r.start.y-s-1,r.end.x,r.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(o)}_linkLeave(e,t,r){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(r,t.text)}_linkAtPosition(e,t){let r=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,o=t.y*this._bufferService.cols+t.x;return r<=o&&o<=s}_positionFromMouseEvent(e,t){let r=this._mouseCoordsService.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(r)return{x:r[0],y:r[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,r,s,o){return{x1:e,y1:t,x2:r,y2:s,cols:this._bufferService.cols,fg:o}}};Bt=y([m(1,Be),m(2,V),m(3,D),m(4,gi)],Bt);function Eo(n,i){return n.text===i.text&&n.range.start.x===i.range.start.x&&n.range.start.y===i.range.start.y&&n.range.end.x===i.range.end.x&&n.range.end.y===i.range.end.y}var gr=class extends mr{constructor(e={}){super(e);this._linkifier=this._register(new B);this.browser=Ke;this._keyDownHandled=!1;this._keyDownSeen=!1;this._keyPressHandled=!1;this._unprocessedDeadKey=!1;this._accessibilityManager=this._register(new B);this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onKey=this._register(new b);this.onKey=this._onKey.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onBell=this._register(new b);this.onBell=this._onBell.event;this._onFocus=this._register(new b);this._onBlur=this._register(new b);this._onA11yCharEmitter=this._register(new b);this._onA11yTabEmitter=this._register(new b);this._onWillOpen=this._register(new b);this._onDimensionsChange=this._register(new b);this.onDimensionsChange=this._onDimensionsChange.event;this._setup(),this._decorationService=this._instantiationService.createInstance(Pt),this._instantiationService.setService(ge,this._decorationService),this._keyboardService=this._instantiationService.createInstance(xt),this._instantiationService.setService(Ks,this._keyboardService),this._linkProviderService=this._instantiationService.createInstance(Ki),this._instantiationService.setService(gi,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(et)),this._register(this._inputHandler.onRequestBell(()=>this._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(t=>this.refresh(t?.start??0,t?.end??this.rows-1))),this._register(this._inputHandler.onRequestSendFocus(()=>this._reportFocus())),this._register(this._inputHandler.onRequestReset(()=>this.reset())),this._register(this._inputHandler.onRequestWindowsOptionsReport(t=>this._reportWindowsOptions(t))),this._register(this._inputHandler.onColor(t=>this._handleColorEvent(t))),this._register(j.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(j.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(j.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(j.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(t=>this._afterResize(t.cols,t.rows))),this._register(E(()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)}))}get linkifier(){return this._linkifier.value}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}get dimensions(){if(!this._renderService)return;let e=this._renderService.dimensions;return{css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}}_handleColorEvent(e){if(this._themeService)for(let t of e){let r,s;switch(t.index){case 256:r="foreground",s="10";break;case 257:r="background",s="11";break;case 258:r="cursor",s="12";break;default:r="ansi",s="4;"+t.index}switch(t.type){case 0:let o=k.toColorRGB(r==="ansi"?this._themeService.colors.ansi[t.index]:this._themeService.colors[r]);this.coreService.triggerDataEvent(`\x1B]${s};${In(o)}\x1B\\`);break;case 1:if(r==="ansi")this._themeService.modifyColors(a=>a.ansi[t.index]=O.toColor(...t.color));else{let a=r;this._themeService.modifyColors(l=>l[a]=O.toColor(...t.color))}break;case 2:this._themeService.restoreColor(t.index);break}}}_reportColorScheme(){if(!this._themeService)return;let e=Z.relativeLuminance(this._themeService.colors.background.rgba>>8),t=Z.relativeLuminance(this._themeService.colors.foreground.rgba>>8),r=e{this.hasSelection()&&Bs(t,this._selectionService)}));let e=t=>Os(t,this.textarea,this.coreService,this.optionsService);this._register(C(this.textarea,"paste",e)),this._register(C(this.element,"paste",e)),nt?this._register(C(this.element,"mousedown",t=>{t.button===2&&Or(t,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register(C(this.element,"contextmenu",t=>{Or(t,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),zt&&this._register(C(this.element,"auxclick",t=>{t.button===1&&Br(t,this.textarea,this.screenElement)}))}_bindKeys(){this._register(C(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register(C(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register(C(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register(C(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register(C(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register(C(this.textarea,"compositionend",()=>this._compositionHelper.compositionend())),this._register(C(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){this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView);return}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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",l=>this.element.classList.toggle("allow-transparency",l))),e.appendChild(this.element);let t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),t.appendChild(this._viewportElement),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register(C(this.screenElement,"mousemove",l=>this.updateCursorStyle(l))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement);let r=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",Ut.get()),$r||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>r.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(Ui,this.textarea,e.ownerDocument.defaultView??window,this._document??(typeof window<"u"?window.document:null))),this._instantiationService.setService(G,this._coreBrowserService),this._register(C(this.textarea,"focus",l=>this._handleTextAreaFocus(l))),this._register(C(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(bt,this._document,this._helperContainer),this._instantiationService.setService(Pe,this._charSizeService),this._themeService=this._instantiationService.createInstance(yt),this._instantiationService.setService(_e,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(He),this._instantiationService.setService(Si,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(Ct,this.rows,this.screenElement)),this._instantiationService.setService(V,this._renderService),this._register(this._renderService.onRenderedViewportChange(l=>this._onRender.fire(l))),this._register(this._renderService.onDimensionsChange(l=>this._onDimensionsChange.fire({css:{canvas:{...l.css.canvas},cell:{...l.css.cell}},device:{canvas:{...l.device.canvas},cell:{...l.device.cell},char:{...l.device.char}}}))),this.onResize(l=>this._renderService.resize(l.cols,l.rows)),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(ft,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(vt),this._instantiationService.setService(Be,this._mouseCoordsService);let s=this._linkifier.value=this._register(this._instantiationService.createInstance(Bt,this.screenElement));this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch(l){this._logService.error("onWillOpen handler threw an exception",l)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(dt,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(l=>{super.scrollLines(l,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(Et,this.element,this.screenElement,s)),this._instantiationService.setService(vi,this._selectionService),this._mouseService=this._instantiationService.createInstance(gt),this._instantiationService.setService(Us,this._mouseService),this._register(this._selectionService.onRequestScrollLines(l=>this.scrollLines(l.amount,l.suppressScrollEvent))),this._register(this._selectionService.onSelectionChange(()=>this._onSelectionChange.fire())),this._register(this._selectionService.onRequestRedraw(l=>this._renderService.handleSelectionChanged(l.start,l.end,l.columnSelectMode))),this._register(this._selectionService.onLinuxMouseSelection(l=>{this.textarea.value=l,this.textarea.focus(),this.textarea.select()})),this._register(j.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(ut,this.screenElement)),this._register(C(this.element,"mousedown",l=>this._selectionService.handleMouseDown(l))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(Ye,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",l=>this._handleScreenReaderModeOptionChange(l)));let o=this.options.scrollbar?.showScrollbar??!0,a=this.options.scrollbar?.width;o&&a&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(ze,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",l=>{let h=(l?.showScrollbar??!0)&&!!l?.width;!this._overviewRulerRenderer&&h&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(ze,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:l=>this._viewport?.handleTouchScroll(l)},l=>this._register(l),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(mt,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,t,r=!1){this._renderService?.refreshRows(e,t,r)}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){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,t),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let t=e-this._bufferService.buffer.ydisp;t!==0&&this.scrollLines(t)}paste(e){Pr(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(e)}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");let 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:!1}select(e,t,r){this._selectionService.setSelection(e,t,r)}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&&this._customKeyEventHandler(e)===!1)return!1;let 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(!0),!1;!t&&(e.key==="Dead"||e.key==="AltGraph")&&(this._unprocessedDeadKey=!0);let r=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),r.type===3||r.type===2){let o=this.rows-1;return this.scrollLines(r.type===2?-o:o),e.preventDefault(),e.stopPropagation(),!1}if(r.type===1&&this.selectAll(),this._isThirdLevelShift(this.browser,e)||(r.cancel&&(e.preventDefault(),e.stopPropagation()),!r.key)||!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.key.length===1&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;(r.key===""||r.key==="\r")&&(this.textarea.value="");let s=this._keyboardService.useWin32InputMode&&ws(e);if(this._onKey.fire({key:r.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(r.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;this._keyDownHandled=!0}_isThirdLevelShift(e,t){let r=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 t.type==="keypress"?r:r&&(!t.keyCode||t.keyCode>47)}_keyUp(e){if(this._keyDownSeen=!1,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return;ws(e)||this.focus();let t=this._keyboardService.evaluateKeyUp(e);if(t?.key){let r=this._keyboardService.useWin32InputMode&&ws(e);this.coreService.triggerDataEvent(t.key,!r)}this.updateCursorStyle(e),this._keyPressHandled=!1}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled||this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;if(e.charCode)t=e.charCode;else if(e.which===null||e.which===void 0)t=e.keyCode;else if(e.which!==0&&e.charCode!==0)t=e.which;else return!1;return!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)?!1:(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&&e.inputType==="insertText"&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;let t=e.data;return this.coreService.triggerDataEvent(t,!0),!0}return!1}resize(e,t){if(e===this.cols&&t===this.rows){this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure();return}super.resize(e,t)}_afterResize(e,t){this._charSizeService?.measure()}clear(){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=0;i--)this._addons[i].instance.dispose()}loadAddon(i,e){let t={instance:e,dispose:e.dispose,isDisposed:!1};this._addons.push(t),e.dispose=()=>this._wrappedAddonDispose(t),e.activate(i)}_wrappedAddonDispose(i){if(i.isDisposed)return;let e=-1;for(let t=0;t=this._line.length))return e?(this._line.loadCell(i,e),e):this._line.loadCell(i,new F)}translateToString(i,e,t){return this._line.translateToString(i,e,t)}};var hi=class{constructor(i,e){this._buffer=i;this.type=e}init(i){return this._buffer=i,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(i){let e=this._buffer.lines.get(i);if(e)return new Cr(e)}getNullCell(){return new F}};var Er=class extends g{constructor(e){super();this._core=e;this._onBufferChange=this._register(new b);this.onBufferChange=this._onBufferChange.event;this._normal=new hi(this._core.buffers.normal,"normal"),this._alternate=new hi(this._core.buffers.alt,"alternate"),this._register(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)}};var yr=class{constructor(i){this._core=i}registerCsiHandler(i,e){return this._core.registerCsiHandler(i,t=>e(t.toArray()))}addCsiHandler(i,e){return this.registerCsiHandler(i,e)}registerDcsHandler(i,e){return this._core.registerDcsHandler(i,(t,r)=>e(t,r.toArray()))}addDcsHandler(i,e){return this.registerDcsHandler(i,e)}registerEscHandler(i,e){return this._core.registerEscHandler(i,e)}addEscHandler(i,e){return this.registerEscHandler(i,e)}registerOscHandler(i,e){return this._core.registerOscHandler(i,e)}addOscHandler(i,e){return this.registerOscHandler(i,e)}registerApcHandler(i,e){return this._core.registerApcHandler(i,e)}};var xr=class{constructor(i){this._core=i}register(i){this._core.unicodeService.register(i)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(i){this._core.unicodeService.activeVersion=i}};var yo=["cols","rows"],Ee=0,Dn=class extends g{constructor(i){super(),this._core=this._register(new gr(i)),this._addonManager=this._register(new Ir),this._publicOptions={...this._core.options};let e=r=>this._core.options[r],t=(r,s)=>{this._checkReadonlyOptions(r),this._core.options[r]=s};for(let r in this._core.options){let s={get:e.bind(this,r),set:t.bind(this,r)};Object.defineProperty(this._publicOptions,r,s)}}_checkReadonlyOptions(i){if(yo.includes(i))throw new Error(`Option "${i}" 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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new yr(this._core)}get unicode(){return this._checkProposedApi(),new xr(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._register(new Er(this._core))}get markers(){return this._core.markers}get modes(){let i=this._core.coreService.decPrivateModes,e="none";switch(this._core.mouseStateService.activeProtocol){case"X10":e="x10";break;case"VT200":e="vt200";break;case"DRAG":e="drag";break;case"ANY":e="any";break}return{applicationCursorKeysMode:i.applicationCursorKeys,applicationKeypadMode:i.applicationKeypad,bracketedPasteMode:i.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:e,originMode:i.origin,reverseWraparoundMode:i.reverseWraparound,sendFocusMode:i.sendFocus,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:i.synchronizedOutput,win32InputMode:i.win32InputMode,wraparoundMode:i.wraparound}}get dimensions(){return this._core.dimensions}get options(){return this._publicOptions}set options(i){for(let e in i)this._publicOptions[e]=i[e]}blur(){this._core.blur()}focus(){this._core.focus()}input(i,e=!0){this._core.input(i,e)}resize(i,e){this._verifyIntegers(i,e),this._core.resize(i,e)}open(i){this._core.open(i)}attachCustomKeyEventHandler(i){this._core.attachCustomKeyEventHandler(i)}attachCustomWheelEventHandler(i){this._core.attachCustomWheelEventHandler(i)}registerLinkProvider(i){return this._core.registerLinkProvider(i)}registerCharacterJoiner(i){return this._core.registerCharacterJoiner(i)}deregisterCharacterJoiner(i){this._core.deregisterCharacterJoiner(i)}registerMarker(i=0){return this._verifyIntegers(i),this._core.registerMarker(i)}registerDecoration(i){return this._verifyPositiveIntegers(i.x??0,i.width??0,i.height??0),this._core.registerDecoration(i)}hasSelection(){return this._core.hasSelection()}select(i,e,t){this._verifyIntegers(i,e,t),this._core.select(i,e,t)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(i,e){this._verifyIntegers(i,e),this._core.selectLines(i,e)}dispose(){super.dispose()}scrollLines(i){this._verifyIntegers(i),this._core.scrollLines(i)}scrollPages(i){this._verifyIntegers(i),this._core.scrollPages(i)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(i){this._verifyIntegers(i),this._core.scrollToLine(i)}clear(){this._core.clear()}write(i,e){this._core.write(i,e)}writeln(i,e){this._core.write(i),this._core.write(`\r +-`,e)}paste(i){this._core.paste(i)}refresh(i,e){this._verifyIntegers(i,e),this._core.refresh(i,e)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(i){this._addonManager.loadAddon(this,i)}static get strings(){return{get promptLabel(){return Ut.get()},set promptLabel(i){Ut.set(i)},get tooMuchOutput(){return Ze.get()},set tooMuchOutput(i){Ze.set(i)}}}_verifyIntegers(...i){for(Ee of i)if(Ee===1/0||isNaN(Ee)||Ee%1!==0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...i){for(Ee of i)if(Ee&&(Ee===1/0||isNaN(Ee)||Ee%1!==0||Ee<0))throw new Error("This API only accepts positive integers")}};export{Dn as Terminal}; ++`)}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame(()=>this._refresh())),zt&&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:this._activeSelectionMode===3})}_isClickInSelection(e){let i=this._getMouseBufferCoords(e),r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s||!i?!1:this._areCoordsInSelection(i,r,s)}isCellInSelection(e,i){let r=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!r||!s?!1:this._areCoordsInSelection([e,i],r,s)}_areCoordsInSelection(e,i,r){return e[1]>i[1]&&e[1]=i[0]&&e[0]=i[0]}_selectWordAtCursor(e,i){let r=this._linkifier.currentLink?.link?.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=hs(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;let s=this._getMouseBufferCoords(e);return s?(this._selectWordAt(s,i),this._model.selectionEnd=void 0,!0):!1}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,i){this._model.clearSelection(),e=Math.max(e,0),i=Math.min(i,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,i],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){let i=this._mouseCoordsService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(i)return i[0]--,i[1]--,i[1]+=this._bufferService.buffer.ydisp,i}_getMouseEventScrollAmount(e){let i=qt(this._coreBrowserService.window,e,this._screenElement)[1],r=this._renderService.dimensions.css.canvas.height;return i>=0&&i<=r?0:(i>r&&(i-=r),i=Math.min(Math.max(i,-50),50),i/=50,i/Math.abs(i)+Math.round(i*14))}shouldForceSelection(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!e.altKey:ie?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,!(e.button===2&&this.hasSelection)&&e.button===0&&!(this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive&&e.altKey)){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):e.detail===1?this._handleSingleClick(e):e.detail===2?this._handleDoubleClick(e):e.detail===3&&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){let i=this.hasSelection;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,i&&this._fireOnSelectionChange(this._model.finalSelectionStart,this._model.finalSelectionEnd,!1);let r=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);r&&r.length!==this._model.selectionStart[0]&&r.hasWidth(this._model.selectionStart[0])===0&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){let i=this._getMouseBufferCoords(e);i&&(this._activeSelectionMode=2,this._selectLineAt(i[1]))}shouldColumnSelect(e){return this._optionsService.rawOptions.mouseEventsRequireAlt&&this._mouseStateService.areMouseEventsActive?!1:e.altKey&&!(ie&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;let i=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd){this.refresh(!0);return}this._activeSelectionMode===2?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));let r=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows-1,e.lines.length-1)):(this._activeSelectionMode!==3&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){let i=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&i<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){let r=this._mouseCoordsService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(r&&r[0]!==void 0&&r[1]!==void 0){let s=en(r[0]-1,r[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(s,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){let e=this._model.finalSelectionStart,i=this._model.finalSelectionEnd,r=!!e&&!!i&&(e[0]!==i[0]||e[1]!==i[1]);if(!r){this._oldHasSelection&&this._fireOnSelectionChange(e,i,r);return}!e||!i||(!this._oldSelectionStart||!this._oldSelectionEnd||e[0]!==this._oldSelectionStart[0]||e[1]!==this._oldSelectionStart[1]||i[0]!==this._oldSelectionEnd[0]||i[1]!==this._oldSelectionEnd[1])&&this._fireOnSelectionChange(e,i,r)}_fireOnSelectionChange(e,i,r){this._oldSelectionStart=e,this._oldSelectionEnd=i,this._oldHasSelection=r,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.value=e.activeBuffer.lines.onTrim(i=>this._handleTrim(i))}_convertViewportColToCharacterIndex(e,i){let r=i;for(let s=0;i>=s;s++){let o=e.loadCell(s,this._workCell).getChars().length;this._workCell.getWidth()===0?r--:o>1&&i!==s&&(r+=o-1)}return r}setSelection(e,i,r){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,i],this._model.selectionStartLength=r,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,i,r=!0,s=!0){if(e[0]>=this._bufferService.cols)return;let o=this._bufferService.buffer,a=o.lines.get(e[1]);if(!a)return;let l=o.translateBufferLineToString(e[1],!1),h=this._convertViewportColToCharacterIndex(a,e[0]),d=h,c=e[0]-h,u=0,_=0,p=0,v=0;if(l.charAt(h)===" "){for(;h>0&&l.charAt(h-1)===" ";)h--;for(;d1&&(v+=A-1,d+=A-1);C>0&&h>0&&!this._isCharWordSeparator(a.loadCell(C-1,this._workCell));){a.loadCell(C-1,this._workCell);let T=this._workCell.getChars().length;this._workCell.getWidth()===0?(u++,C--):T>1&&(p+=T-1,h-=T-1),h--,C--}for(;w1&&(v+=T-1,d+=T-1),d++,w++}}d++;let f=h+c-u+p,S=Math.min(this._bufferService.cols,d-h+u+_-p-v);if(!(!i&&l.slice(h,d).trim()==="")){if(r&&f===0&&a.getCodePoint(0)!==32){let C=o.lines.get(e[1]-1);if(C&&a.isWrapped&&C.getCodePoint(this._bufferService.cols-1)!==32){let w=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(w){let A=this._bufferService.cols-w.start;f-=A,S+=A}}}if(s&&f+S===this._bufferService.cols&&a.getCodePoint(this._bufferService.cols-1)!==32){let C=o.lines.get(e[1]+1);if(C?.isWrapped&&C.getCodePoint(0)!==32){let w=this._getWordAt([0,e[1]+1],!1,!1,!0);w&&(S+=w.length)}}return{start:f,length:S}}}_selectWordAt(e,i){let r=this._getWordAt(e,i);if(r){for(;r.start<0;)r.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[r.start,e[1]],this._model.selectionStartLength=r.length}}_selectToWordAt(e){let i=this._getWordAt(e,!0);if(i){let r=e[1];for(;i.start<0;)i.start+=this._bufferService.cols,r--;if(!this._model.areSelectionValuesReversed())for(;i.start+i.length>this._bufferService.cols;)i.length-=this._bufferService.cols,r++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?i.start:i.start+i.length,r]}}_isCharWordSeparator(e){return e.getWidth()===0?!1:this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){let i=this._bufferService.buffer.getWrappedRangeForLine(e),r={start:{x:0,y:i.first},end:{x:this._bufferService.cols-1,y:i.last}};this._model.selectionStart=[0,i.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=hs(r,this._bufferService.cols)}};Et=y([m(3,D),m(4,Y),m(5,Oe),m(6,R),m(7,Me),m(8,V),m(9,G)],Et);var jt=class{constructor(){this._data={}}set(t,e,i){this._data[t]||(this._data[t]={}),this._data[t][e]=i}get(t,e){return this._data[t]?this._data[t][e]:void 0}clear(){this._data={}}};var Zt=class{constructor(){this._color=new jt;this._css=new jt}setCss(t,e,i){this._css.set(t,e,i)}getCss(t,e){return this._css.get(t,e)}setColor(t,e,i){this._color.set(t,e,i)}getColor(t,e){return this._color.get(t,e)}clear(){this._color.clear(),this._css.clear()}};var $=Object.freeze((()=>{let n=[M.toColor("#2e3436"),M.toColor("#cc0000"),M.toColor("#4e9a06"),M.toColor("#c4a000"),M.toColor("#3465a4"),M.toColor("#75507b"),M.toColor("#06989a"),M.toColor("#d3d7cf"),M.toColor("#555753"),M.toColor("#ef2929"),M.toColor("#8ae234"),M.toColor("#fce94f"),M.toColor("#729fcf"),M.toColor("#ad7fa8"),M.toColor("#34e2e2"),M.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let e=0;e<216;e++){let i=t[e/36%6|0],r=t[e/6%6|0],s=t[e%6];n.push({css:O.toCss(i,r,s),rgba:O.toRgba(i,r,s)})}for(let e=0;e<24;e++){let i=8+e*10;n.push({css:O.toCss(i,i,i),rgba:O.toRgba(i,i,i)})}return n})());var Xe=M.toColor("#ffffff"),Qt=M.toColor("#000000"),sn=M.toColor("#ffffff"),nn=Qt,Jt={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117},ho=Xe,yt=class extends g{constructor(e){super();this._optionsService=e;this._contrastCache=new Zt;this._halfContrastCache=new Zt;this._onChangeColors=this._register(new b);this.onChangeColors=this._onChangeColors.event;this._colors={foreground:Xe,background:Qt,cursor:sn,cursorAccent:nn,selectionForeground:void 0,selectionBackgroundTransparent:Jt,selectionBackgroundOpaque:L.blend(Qt,Jt),selectionInactiveBackgroundTransparent:Jt,selectionInactiveBackgroundOpaque:L.blend(Qt,Jt),scrollbarSliderBackground:L.opacity(Xe,.2),scrollbarSliderHoverBackground:L.opacity(Xe,.4),scrollbarSliderActiveBackground:L.opacity(Xe,.5),overviewRulerBorder:Xe,ansi:$.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)))}get colors(){return this._colors}_setTheme(e={}){let i=this._colors;if(i.foreground=P(e.foreground,Xe),i.background=P(e.background,Qt),i.cursor=L.blend(i.background,P(e.cursor,sn)),i.cursorAccent=L.blend(i.background,P(e.cursorAccent,nn)),i.selectionBackgroundTransparent=P(e.selectionBackground,Jt),i.selectionBackgroundOpaque=L.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=P(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=L.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?P(e.selectionForeground,Jr):void 0,i.selectionForeground===Jr&&(i.selectionForeground=void 0),L.isOpaque(i.selectionBackgroundTransparent)&&(i.selectionBackgroundTransparent=L.opacity(i.selectionBackgroundTransparent,.3)),L.isOpaque(i.selectionInactiveBackgroundTransparent)&&(i.selectionInactiveBackgroundTransparent=L.opacity(i.selectionInactiveBackgroundTransparent,.3)),i.scrollbarSliderBackground=P(e.scrollbarSliderBackground,L.opacity(i.foreground,.2)),i.scrollbarSliderHoverBackground=P(e.scrollbarSliderHoverBackground,L.opacity(i.foreground,.4)),i.scrollbarSliderActiveBackground=P(e.scrollbarSliderActiveBackground,L.opacity(i.foreground,.5)),i.overviewRulerBorder=P(e.overviewRulerBorder,ho),i.ansi=$.slice(),i.ansi[0]=P(e.black,$[0]),i.ansi[1]=P(e.red,$[1]),i.ansi[2]=P(e.green,$[2]),i.ansi[3]=P(e.yellow,$[3]),i.ansi[4]=P(e.blue,$[4]),i.ansi[5]=P(e.magenta,$[5]),i.ansi[6]=P(e.cyan,$[6]),i.ansi[7]=P(e.white,$[7]),i.ansi[8]=P(e.brightBlack,$[8]),i.ansi[9]=P(e.brightRed,$[9]),i.ansi[10]=P(e.brightGreen,$[10]),i.ansi[11]=P(e.brightYellow,$[11]),i.ansi[12]=P(e.brightBlue,$[12]),i.ansi[13]=P(e.brightMagenta,$[13]),i.ansi[14]=P(e.brightCyan,$[14]),i.ansi[15]=P(e.brightWhite,$[15]),e.extendedAnsi){let r=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let s=0;s"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};function an(n,t,e,i){let r={type:0,cancel:!1,key:void 0},s=(n.shiftKey?1:0)|(n.altKey?2:0)|(n.ctrlKey?4:0)|(n.metaKey?8:0);switch(n.keyCode){case 0:n.key==="UIKeyInputUpArrow"?t?r.key="\x1BOA":r.key="\x1B[A":n.key==="UIKeyInputLeftArrow"?t?r.key="\x1BOD":r.key="\x1B[D":n.key==="UIKeyInputRightArrow"?t?r.key="\x1BOC":r.key="\x1B[C":n.key==="UIKeyInputDownArrow"&&(t?r.key="\x1BOB":r.key="\x1B[B");break;case 8:r.key=n.ctrlKey?"\b":"\x7F",n.altKey&&(r.key="\x1B"+r.key);break;case 9:if(n.shiftKey){r.key="\x1B[Z";break}r.key=" ",r.cancel=!0;break;case 13:n.key==="c"&&n.ctrlKey?r.key="":r.key=n.altKey?"\x1B\r":"\r",r.cancel=!0;break;case 27:r.key="\x1B",n.altKey&&(r.key="\x1B\x1B"),r.cancel=!0;break;case 37:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"D":t?r.key="\x1BOD":r.key="\x1B[D";break;case 39:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"C":t?r.key="\x1BOC":r.key="\x1B[C";break;case 38:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"A":t?r.key="\x1BOA":r.key="\x1B[A";break;case 40:if(n.metaKey)break;s?r.key="\x1B[1;"+(s+1)+"B":t?r.key="\x1BOB":r.key="\x1B[B";break;case 45:!n.shiftKey&&!n.ctrlKey&&(r.key="\x1B[2~");break;case 46:s?r.key="\x1B[3;"+(s+1)+"~":r.key="\x1B[3~";break;case 36:s?r.key="\x1B[1;"+(s+1)+"H":t?r.key="\x1BOH":r.key="\x1B[H";break;case 35:s?r.key="\x1B[1;"+(s+1)+"F":t?r.key="\x1BOF":r.key="\x1B[F";break;case 33:n.shiftKey?r.type=2:n.ctrlKey?r.key="\x1B[5;"+(s+1)+"~":r.key="\x1B[5~";break;case 34:n.shiftKey?r.type=3:n.ctrlKey?r.key="\x1B[6;"+(s+1)+"~":r.key="\x1B[6~";break;case 112:s?r.key="\x1B[1;"+(s+1)+"P":r.key="\x1BOP";break;case 113:s?r.key="\x1B[1;"+(s+1)+"Q":r.key="\x1BOQ";break;case 114:s?r.key="\x1B[1;"+(s+1)+"R":r.key="\x1BOR";break;case 115:s?r.key="\x1B[1;"+(s+1)+"S":r.key="\x1BOS";break;case 116:s?r.key="\x1B[15;"+(s+1)+"~":r.key="\x1B[15~";break;case 117:s?r.key="\x1B[17;"+(s+1)+"~":r.key="\x1B[17~";break;case 118:s?r.key="\x1B[18;"+(s+1)+"~":r.key="\x1B[18~";break;case 119:s?r.key="\x1B[19;"+(s+1)+"~":r.key="\x1B[19~";break;case 120:s?r.key="\x1B[20;"+(s+1)+"~":r.key="\x1B[20~";break;case 121:s?r.key="\x1B[21;"+(s+1)+"~":r.key="\x1B[21~";break;case 122:s?r.key="\x1B[23;"+(s+1)+"~":r.key="\x1B[23~";break;case 123:s?r.key="\x1B[24;"+(s+1)+"~":r.key="\x1B[24~";break;default:if(n.ctrlKey&&!n.shiftKey&&!n.altKey&&!n.metaKey)n.keyCode>=65&&n.keyCode<=90?r.key=String.fromCharCode(n.keyCode-64):n.keyCode===32?r.key="\0":n.keyCode>=51&&n.keyCode<=55?r.key=String.fromCharCode(n.keyCode-51+27):n.keyCode===56?r.key="\x7F":n.key==="/"?r.key="":n.keyCode===219?r.key="\x1B":n.keyCode===220?r.key="":n.keyCode===221&&(r.key="");else if((!e||i)&&n.altKey&&!n.metaKey){let a=uo[n.keyCode]?.[n.shiftKey?1:0];if(a)r.key="\x1B"+a;else if(n.keyCode>=65&&n.keyCode<=90){let l=n.ctrlKey?n.keyCode-64:n.keyCode+32,h=String.fromCharCode(l);n.shiftKey&&(h=h.toUpperCase()),r.key="\x1B"+h}else if(n.keyCode===32)r.key="\x1B"+(n.ctrlKey?"\0":" ");else if(n.key==="Dead"&&n.code.startsWith("Key")){let l=n.code.slice(3,4);n.shiftKey||(l=l.toLowerCase()),r.key="\x1B"+l,r.cancel=!0}}else if(e&&!n.altKey&&!n.ctrlKey&&!n.shiftKey&&n.metaKey)n.keyCode===65&&(r.type=1);else if(n.key&&!n.ctrlKey&&!n.altKey&&!n.metaKey&&n.keyCode>=48&&n.key.length===1)r.key=n.key;else if(n.key&&n.ctrlKey&&n.shiftKey)switch(n.code){case"Minus":r.key="";break;case"Digit2":r.key="\0";break;case"Digit6":r.key="";break}break}return r}var ei=class{constructor(){this._functionalKeyCodes={Escape:27,Enter:13,Tab:9,Backspace:127,CapsLock:57358,ScrollLock:57359,NumLock:57360,PrintScreen:57361,Pause:57362,ContextMenu:57363,F13:57376,F14:57377,F15:57378,F16:57379,F17:57380,F18:57381,F19:57382,F20:57383,F21:57384,F22:57385,F23:57386,F24:57387,F25:57388,KP_0:57399,KP_1:57400,KP_2:57401,KP_3:57402,KP_4:57403,KP_5:57404,KP_6:57405,KP_7:57406,KP_8:57407,KP_9:57408,KP_Decimal:57409,KP_Divide:57410,KP_Multiply:57411,KP_Subtract:57412,KP_Add:57413,KP_Enter:57414,KP_Equal:57415,ShiftLeft:57441,ShiftRight:57447,ControlLeft:57442,ControlRight:57448,AltLeft:57443,AltRight:57449,MetaLeft:57444,MetaRight:57450,MediaPlayPause:57430,MediaStop:57432,MediaTrackNext:57435,MediaTrackPrevious:57436,AudioVolumeDown:57438,AudioVolumeUp:57439,AudioVolumeMute:57440};this._csiTildeKeys={Insert:2,Delete:3,PageUp:5,PageDown:6,F5:15,F6:17,F7:18,F8:19,F9:20,F10:21,F11:23,F12:24};this._csiLetterKeys={ArrowUp:"A",ArrowDown:"B",ArrowRight:"C",ArrowLeft:"D",Home:"H",End:"F"};this._ss3FunctionKeys={F1:"P",F2:"Q",F3:"R",F4:"S"}}_getNumpadKeyCode(t){if(t.code.startsWith("Numpad")){let e=t.code.slice(6);if(e>="0"&&e<="9")return 57399+parseInt(e,10);switch(e){case"Decimal":return 57409;case"Divide":return 57410;case"Multiply":return 57411;case"Subtract":return 57412;case"Add":return 57413;case"Enter":return 57414;case"Equal":return 57415}}}_getModifierKeyCode(t){switch(t.code){case"ShiftLeft":return 57441;case"ShiftRight":return 57447;case"ControlLeft":return 57442;case"ControlRight":return 57448;case"AltLeft":return 57443;case"AltRight":return 57449;case"MetaLeft":return 57444;case"MetaRight":return 57450}}_encodeModifiers(t){let e=0;return t.shiftKey&&(e|=1),t.altKey&&(e|=2),t.ctrlKey&&(e|=4),t.metaKey&&(e|=8),e>0?e+1:0}_getKeyCode(t,e){let i=this._getNumpadKeyCode(t);if(i!==void 0)return i;let r=this._getModifierKeyCode(t);if(r!==void 0)return r;let s=this._functionalKeyCodes[t.key];if(s!==void 0)return s;if((t.shiftKey||e&&t.altKey)&&t.code){if(t.code.startsWith("Digit")&&t.code.length===6){let o=t.code.charAt(5);if(o>="0"&&o<="9")return o.charCodeAt(0)}if(t.code.startsWith("Key")&&t.code.length===4)return t.code.charAt(3).toLowerCase().charCodeAt(0)}if(t.key.length===1){let o=t.key.codePointAt(0);return o>=65&&o<=90?o+32:o}}_isModifierKey(t){return t.key==="Shift"||t.key==="Control"||t.key==="Alt"||t.key==="Meta"}_isLockKey(t){return t.key==="CapsLock"||t.key==="NumLock"||t.key==="ScrollLock"}_buildCsiLetterSequence(t,e,i,r){let s=r&&i!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+i),o+=t,o}return"\x1B["+t}_buildSs3Sequence(t,e,i,r){let s=r&&i!==1;if(e>0||s){let o="\x1B[1;"+(e>0?e:"1");return s&&(o+=":"+i),o+=t,o}return"\x1BO"+t}_buildCsiTildeSequence(t,e,i,r){let s=r&&i!==1,o="\x1B["+t;return(e>0||s)&&(o+=";"+(e>0?e:"1"),s&&(o+=":"+i)),o+="~",o}_buildCsiUSequence(t,e,i,r,s,o,a){let l=!!(s&2),h=!!(s&4),d="\x1B["+e,c;h&&t.shiftKey&&t.key.length===1&&!o&&!a&&(c=t.key.codePointAt(0),d+=":"+c);let _=!!(s&16)&&r!==3&&t.key.length===1&&!o&&!a&&!t.ctrlKey?t.key.codePointAt(0):void 0,p=l&&r!==1&&(r===3||_===void 0);return(i>0||p||_!==void 0)&&(d+=";",i>0?d+=i:p&&(d+="1"),p&&(d+=":"+r)),_!==void 0&&(d+=";"+_),d+="u",d}evaluate(t,e,i=1,r=!1){let s={type:0,cancel:!1,key:void 0},o=this._encodeModifiers(t),a=this._isModifierKey(t),l=!!(e&2);if(!l&&i===3||a&&!(e&8)||this._isLockKey(t)&&!(e&8))return s;let h=this._csiLetterKeys[t.key];if(h)return s.key=this._buildCsiLetterSequence(h,o,i,l),s.cancel=!0,s;let d=this._ss3FunctionKeys[t.key];if(d)return s.key=this._buildSs3Sequence(d,o,i,l),s.cancel=!0,s;let c=this._csiTildeKeys[t.key];if(c!==void 0)return s.key=this._buildCsiTildeSequence(c,o,i,l),s.cancel=!0,s;let u=this._getKeyCode(t,r);if(u===void 0)return s;let _=u===13||u===9||u===127;if(_&&i===3&&!(e&8))return s;let p=this._functionalKeyCodes[t.key]!==void 0||this._getNumpadKeyCode(t)!==void 0;if(!!(e&8||l&&i===3||(e&1||l)&&(p&&!_||o>0&&t.key.length!==1||o-1>1)))s.key=this._buildCsiUSequence(t,u,o,i,e,p,a),s.cancel=!0;else{let f=u===13?"\r":u===9?" ":u===127?"\x7F":void 0;f?s.key=f:t.key.length===1&&!t.ctrlKey&&!t.altKey&&!t.metaKey&&(s.key=t.key)}return s}static shouldUseProtocol(t){return t>0}};var ji=class{constructor(){this._codeToVk={KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,Numpad0:96,Numpad1:97,Numpad2:98,Numpad3:99,Numpad4:100,Numpad5:101,Numpad6:102,Numpad7:103,Numpad8:104,Numpad9:105,NumpadMultiply:106,NumpadAdd:107,NumpadSeparator:108,NumpadSubtract:109,NumpadDecimal:110,NumpadDivide:111,NumpadEnter:13,NumLock:144,ArrowUp:38,ArrowDown:40,ArrowLeft:37,ArrowRight:39,Home:36,End:35,PageUp:33,PageDown:34,Insert:45,Delete:46,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,CapsLock:20,ScrollLock:145,Escape:27,Enter:13,Tab:9,Space:32,Backspace:8,Pause:19,ContextMenu:93,PrintScreen:44,Semicolon:186,Equal:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,IntlBackslash:226};this._codeToScancode={KeyQ:16,KeyW:17,KeyE:18,KeyR:19,KeyT:20,KeyY:21,KeyU:22,KeyI:23,KeyO:24,KeyP:25,KeyA:30,KeyS:31,KeyD:32,KeyF:33,KeyG:34,KeyH:35,KeyJ:36,KeyK:37,KeyL:38,KeyZ:44,KeyX:45,KeyC:46,KeyV:47,KeyB:48,KeyN:49,KeyM:50,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Numpad0:82,Numpad1:79,Numpad2:80,Numpad3:81,Numpad4:75,Numpad5:76,Numpad6:77,Numpad7:71,Numpad8:72,Numpad9:73,NumpadMultiply:55,NumpadAdd:78,NumpadSubtract:74,NumpadDecimal:83,NumpadDivide:53,NumpadEnter:28,NumLock:69,ArrowUp:72,ArrowDown:80,ArrowLeft:75,ArrowRight:77,Home:71,End:79,PageUp:73,PageDown:81,Insert:82,Delete:83,ShiftLeft:42,ShiftRight:54,ControlLeft:29,ControlRight:29,AltLeft:56,AltRight:56,CapsLock:58,ScrollLock:70,Escape:1,Enter:28,Tab:15,Space:57,Backspace:14,Pause:69,Semicolon:39,Equal:13,Comma:51,Minus:12,Period:52,Slash:53,Backquote:41,BracketLeft:26,Backslash:43,BracketRight:27,Quote:40};this._enhancedKeyCodes=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Insert","Delete","NumpadEnter","NumpadDivide","ControlRight","AltRight","PrintScreen","Pause","ContextMenu","MetaLeft","MetaRight"]);this._keyToControlChar={Enter:13,Backspace:8,Tab:9,Escape:27}}_getVirtualKeyCode(t){let e=this._codeToVk[t.code];return e!==void 0?e:t.keyCode||0}_getScanCode(t){return this._codeToScancode[t.code]||0}_getUnicodeChar(t){if(t.ctrlKey&&!t.altKey&&!t.metaKey){if(t.key==="Enter")return 10;if(t.key==="Backspace")return 127}let e=this._keyToControlChar[t.key];if(e!==void 0)return e;if(t.key.length===1){let i=t.key.codePointAt(0)||0;if(t.ctrlKey&&!t.altKey&&!t.metaKey){if(i>=65&&i<=90)return i-64;if(i>=97&&i<=122)return i-96}return i}return 0}_getControlKeyState(t){let e=0;return t.shiftKey&&(e|=16),t.ctrlKey&&(t.code==="ControlRight"?e|=4:e|=8),t.altKey&&(t.code==="AltRight"?e|=1:e|=2),this._enhancedKeyCodes.has(t.code)&&(e|=256),e}evaluateKeyboardEvent(t,e){let i=this._getVirtualKeyCode(t),r=this._getScanCode(t),s=this._getUnicodeChar(t),o=e?1:0,a=this._getControlKeyState(t);return{type:0,cancel:!0,key:`\x1B[${i};${r};${s};${o};${a};1_`}}};var xt=class{constructor(t,e){this._coreService=t;this._optionsService=e}_getWin32InputMode(){return this._win32InputMode??=new ji,this._win32InputMode}_getKittyKeyboard(){return this._kittyKeyboard??=new ei,this._kittyKeyboard}evaluateKeyDown(t){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(t,!0);let e=this._coreService.kittyKeyboard.flags;return this.useKitty?this._getKittyKeyboard().evaluate(t,e,t.repeat?2:1,ie&&this._optionsService.rawOptions.macOptionIsMeta):an(t,this._coreService.decPrivateModes.applicationCursorKeys,ie,this._optionsService.rawOptions.macOptionIsMeta)}evaluateKeyUp(t){if(this.useWin32InputMode)return this._getWin32InputMode().evaluateKeyboardEvent(t,!1);let e=this._coreService.kittyKeyboard.flags;if(this.useKitty&&e&2)return this._getKittyKeyboard().evaluate(t,e,3,ie&&this._optionsService.rawOptions.macOptionIsMeta)}get useKitty(){let t=this._coreService.kittyKeyboard.flags;return!!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard&&ei.shouldUseProtocol(t))}get useWin32InputMode(){return!!(this._optionsService.rawOptions.vtExtensions?.win32InputMode&&this._coreService.decPrivateModes.win32InputMode)}};xt=y([m(0,Y),m(1,R)],xt);var us=class{constructor(...t){this._entries=new Map;for(let[e,i]of t)this.set(e,i)}set(t,e){let i=this._entries.get(t);return this._entries.set(t,e),i}forEach(t){for(let[e,i]of this._entries.entries())t(e,i)}has(t){return this._entries.has(t)}get(t){return this._entries.get(t)}},Zi=class{constructor(){this._services=new us;this._services.set(et,this)}setService(t,e){this._services.set(t,e)}getService(t){return this._services.get(t)}createInstance(t,...e){let i=Fs(t).sort((o,a)=>o.index-a.index),r=[];for(let o of i){let a=this._services.get(o.id);if(!a)throw new Error(`[createInstance] ${t.name} depends on UNKNOWN service ${o.id._id}.`);r.push(a)}let s=i.length>0?i[0].index:e.length;if(e.length!==s)throw new Error(`[createInstance] First service dependency of ${t.name} at position ${s+1} conflicts with ${e.length} static arguments`);return new t(...e,...r)}};var fo={trace:0,debug:1,info:2,warn:3,error:4,off:5},_o="xterm.js: ",wt=class extends g{constructor(e){super();this._optionsService=e;this._logLevel=5;this._updateLogLevel(),this._register(this._optionsService.onSpecificOptionChange("logLevel",()=>this._updateLogLevel()))}get logLevel(){return this._logLevel}_updateLogLevel(){this._logLevel=fo[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let i=0;ithis._length)for(let i=this._length;i=e;s--)this._array[this._getCyclicIndex(s+r.length)]=this._array[this._getCyclicIndex(s)];for(let s=0;sthis._maxLength){let s=this._length+r.length-this._maxLength;this._startIndex+=s,this._length=this._maxLength,this.onTrimEmitter.fire(s)}else this._length+=r.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,i,r){if(!(i<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+r<0)throw new Error("Cannot shift elements in list beyond index 0");if(r>0){for(let o=i-1;o>=0;o--)this.set(e+o+r,this.get(e+o));let s=e+i+r-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>22,e&2097152?this._combined[t].charCodeAt(this._combined[t].length-1):i]}set(t,e){this._cacheValid=!1,this._data[t*3+1]=e[0],e[1].length>1?(this._combined[t]=e[1],this._data[t*3+0]=t|2097152|e[2]<<22):this._data[t*3+0]=e[1].charCodeAt(0)|e[2]<<22}getWidth(t){return this._data[t*3+0]>>22}hasWidth(t){return this._data[t*3+0]&12582912}getFg(t){return this._data[t*3+1]}getBg(t){return this._data[t*3+2]}hasContent(t){return this._data[t*3+0]&4194303}getCodePoint(t){let e=this._data[t*3+0];return e&2097152?this._combined[t].charCodeAt(this._combined[t].length-1):e&2097151}isCombined(t){return this._data[t*3+0]&2097152}getString(t){let e=this._data[t*3+0];return e&2097152?this._combined[t]:e&2097151?be(e&2097151):""}isProtected(t){return this._data[t*3+2]&536870912}loadCell(t,e){return Ji=t*3,e.content=this._data[Ji+0],e.fg=this._data[Ji+1],e.bg=this._data[Ji+2],e.content&2097152?e.combinedData=this._combined[t]:e.combinedData="",e.bg&268435456?e.extended=this._extendedAttrs[t]:(fs._ext=0,fs._urlId=0,e.extended=fs),e}setCell(t,e){this._cacheValid=!1,e.content&2097152&&(this._combined[t]=e.combinedData),e.bg&268435456&&(this._extendedAttrs[t]=e.extended),this._data[t*3+0]=e.content,this._data[t*3+1]=e.fg,this._data[t*3+2]=e.bg}setCellFromCodepoint(t,e,i,r){this._cacheValid=!1,r.bg&268435456&&(this._extendedAttrs[t]=r.extended);let s=t*3;this._data[s+0]=e|i<<22,this._data[s+1]=r.fg,this._data[s+2]=r.bg}addCodepointToCell(t,e,i){this._cacheValid=!1;let r=this._data[t*3+0];r&2097152?this._combined[t]+=be(e):r&2097151?(this._combined[t]=be(r&2097151)+be(e),r&=-2097152,r|=2097152):r=e|1<<22,i&&(r&=-12582913,r|=i<<22),this._data[t*3+0]=r}insertCells(t,e,i){if(this._cacheValid=!1,t%=this.length,t&&this.getWidth(t-1)===2&&this.setCellFromCodepoint(t-1,0,1,i),e=0;--r)this.setCell(t+e+r,this.loadCell(t+r,cn));for(let r=0;rthis.length){if(this._data.buffer.byteLength>=i*4)this._data=new Uint32Array(this._data.buffer,0,i);else{let r=new Uint32Array(i);r.set(this._data),this._data=r}for(let r=this.length;r=t&&delete this._combined[a]}let s=Object.keys(this._extendedAttrs);for(let o=0;o=t&&delete this._extendedAttrs[a]}}return this.length=t,i*4*2=0;--t)if(this._data[t*3+0]&4194303)return t+(this._data[t*3+0]>>22);return 0}getNoBgTrimmedLength(){for(let t=this.length-1;t>=0;--t)if(this._data[t*3+0]&4194303||this._data[t*3+2]&50331648)return t+(this._data[t*3+0]>>22);return 0}copyCellsFrom(t,e,i,r,s){this._cacheValid=!1;let o=t._data;if(s)for(let a=r-1;a>=0;a--){for(let l=0;l<3;l++)this._data[(i+a)*3+l]=o[(e+a)*3+l];this._copyCellMapsFrom(t,e+a,i+a)}else for(let a=0;a>22||1}r&&r.push(e);let a=o.join("");return s&&(this._cache=a,this._cacheValid=!0,this._cacheTrimmed=!!t),a}_copyCellMapsFrom(t,e,i){let r=e*3;t._data[r+0]&2097152&&(this._combined[i]=t._combined[e]),t._data[r+2]&268435456&&(this._extendedAttrs[i]=t._extendedAttrs[e])}_copySparseMapsFrom(t){this._combined={},this._extendedAttrs={};for(let e=0;e=a&&i0&&(f>c||d[f].getTrimmedLength()===0);f--)v++;v>0&&(o.push(a+d.length-v),o.push(v)),a+=d.length-1}return o}function dn(n,t){let e=[],i=0,r=t[i],s=0;for(let o=0;ol&&(s-=l,o++);let h=n[o].getWidth(s-1)===2;h&&s--;let d=h?e-1:e;i.push(d),a+=d}return i}function Tt(n,t,e){if(t===n.length-1)return n[t].getTrimmedLength();let i=!n[t].hasContent(e-1)&&n[t].getWidth(e-1)===1,r=n[t+1].getWidth(0)===2;return i&&r?e-1:e}var er=class er{constructor(t){this.line=t;this.isDisposed=!1;this._disposables=[];this._id=er._nextId++;this._onDispose=this.register(new b);this.onDispose=this._onDispose.event}get id(){return this._id}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),Ne(this._disposables),this._disposables.length=0)}register(t){return this._disposables.push(t),t}};er._nextId=1;var Qi=er;var q={},Le=q.B;q[0]={"`":"\u25C6",a:"\u2592",b:"\u2409",c:"\u240C",d:"\u240D",e:"\u240A",f:"\xB0",g:"\xB1",h:"\u2424",i:"\u240B",j:"\u2518",k:"\u2510",l:"\u250C",m:"\u2514",n:"\u253C",o:"\u23BA",p:"\u23BB",q:"\u2500",r:"\u23BC",s:"\u23BD",t:"\u251C",u:"\u2524",v:"\u2534",w:"\u252C",x:"\u2502",y:"\u2264",z:"\u2265","{":"\u03C0","|":"\u2260","}":"\xA3","~":"\xB7"};q.A={"#":"\xA3"};q.B=void 0;q[4]={"#":"\xA3","@":"\xBE","[":"ij","\\":"\xBD","]":"|","{":"\xA8","|":"f","}":"\xBC","~":"\xB4"};q.C=q[5]={"[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q.R={"#":"\xA3","@":"\xE0","[":"\xB0","\\":"\xE7","]":"\xA7","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xA8"};q.Q={"@":"\xE0","[":"\xE2","\\":"\xE7","]":"\xEA","^":"\xEE","`":"\xF4","{":"\xE9","|":"\xF9","}":"\xE8","~":"\xFB"};q.K={"@":"\xA7","[":"\xC4","\\":"\xD6","]":"\xDC","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xDF"};q.Y={"#":"\xA3","@":"\xA7","[":"\xB0","\\":"\xE7","]":"\xE9","`":"\xF9","{":"\xE0","|":"\xF2","}":"\xE8","~":"\xEC"};q.E=q[6]={"@":"\xC4","[":"\xC6","\\":"\xD8","]":"\xC5","^":"\xDC","`":"\xE4","{":"\xE6","|":"\xF8","}":"\xE5","~":"\xFC"};q.Z={"#":"\xA3","@":"\xA7","[":"\xA1","\\":"\xD1","]":"\xBF","{":"\xB0","|":"\xF1","}":"\xE7"};q.H=q[7]={"@":"\xC9","[":"\xC4","\\":"\xD6","]":"\xC5","^":"\xDC","`":"\xE9","{":"\xE4","|":"\xF6","}":"\xE5","~":"\xFC"};q["="]={"#":"\xF9","@":"\xE0","[":"\xE9","\\":"\xE7","]":"\xEA","^":"\xEE",_:"\xE8","`":"\xF4","{":"\xE4","|":"\xF6","}":"\xFC","~":"\xFB"};var _n=4294967295,ri=class extends g{constructor(e,i,r,s){super();this._hasScrollback=e;this._optionsService=i;this._bufferService=r;this._logService=s;this.ydisp=0;this.ybase=0;this.y=0;this.x=0;this.tabs={};this.savedY=0;this.savedX=0;this.savedCurAttrData=U.clone();this.savedCharset=Le;this.savedCharsets=[];this.savedGlevel=0;this.savedOriginMode=!1;this.savedWraparoundMode=!0;this.markers=[];this._nullCell=F.fromCharData([0,"",1,0]);this._whitespaceCell=F.fromCharData([0," ",1,32]);this._isClearing=!1;this._memoryCleanupPosition=0;this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops(),this._memoryCleanupQueue=new Ct(this._logService),this._register(E(()=>this._memoryCleanupQueue.clear())),this._register(E(()=>this.clearAllMarkers()))}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 Pe),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 Pe),this._whitespaceCell}getBlankLine(e,i){return new Re(this._bufferService.cols,this.getNullCell(e),i)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){let i=this.ybase+this.y-this.ydisp;return i>=0&&i_n?_n:i}fillViewportRows(e){if(this.lines.length===0){e??=U;let i=this._rows;for(;i--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new ti(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,i){let r=this.getNullCell(U),s=0,o=this._getCorrectBufferLength(i);if(o>this.lines.maxLength&&(this.lines.maxLength=o),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+a+1?(this.ybase--,a++,this.ydisp>0&&this.ydisp--):this.lines.push(new Re(e,r,!1)));else for(let l=this._rows;l>i;l--)this.lines.length>i+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(o0&&(this.lines.trimStart(l),this.ybase=Math.max(this.ybase-l,0),this.ydisp=Math.max(this.ydisp-l,0),this.savedY=Math.max(this.savedY-l,0)),this.lines.maxLength=o}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,i-1),a&&(this.y+=a),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=i-1,this._isReflowEnabled&&(this._reflow(e,i),this._cols>e))for(let a=0;a0){let a=Math.max(0,this.lines.length-this.ybase-1);this.y=Math.min(this.y,a)}this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue(()=>this._batchedMemoryCleanup()))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let i=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){let e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&e.backend==="conpty"&&e.buildNumber>=21376:this._hasScrollback}_reflow(e,i){this._cols!==e&&(e>this._cols?this._reflowLarger(e,i):this._reflowSmaller(e,i))}_reflowLarger(e,i){let r=this._optionsService.rawOptions.reflowCursorLine,s=hn(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(U),r);if(s.length>0){let o=dn(this.lines,s);un(this.lines,o.layout),this._reflowLargerAdjustViewport(e,i,o.countRemoved)}}_reflowLargerAdjustViewport(e,i,r){let s=this.getNullCell(U),o=r;for(;o-- >0;)this.ybase===0?(this.y>0&&this.y--,this.lines.length=0;l--){let h=this.lines.get(l);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;let d=[h];for(;h.isWrapped&&l>0;)h=this.lines.get(--l),d.unshift(h);if(!r){let T=this.ybase+this.y;if(T>=l&&T0&&(o.push({start:l+d.length+a,newLines:v}),a+=v.length),d.push(...v);let f=u.length-1,S=u[f];S===0&&(f--,S=u[f]);let C=d.length-_-1,w=c;for(;C>=0;){let T=Math.min(w,S);if(d[f]===void 0)break;if(d[f].copyCellsFrom(d[C],w-T,S-T,T,!0),S-=T,S===0&&(f--,S=u[f]),w-=T,w===0){C--;let te=Math.max(C,0);w=Tt(d,te,this._cols)}}for(let T=0;T0;)this.ybase===0?this.y0){let l=[],h=[];for(let S=0;S=0;S--)if(_&&_.start>c+p){for(let C=_.newLines.length-1;C>=0;C--)this.lines.set(S--,_.newLines[C]);S++,l.push({index:c+1,amount:_.newLines.length}),p+=_.newLines.length,_=o[++u]}else this.lines.set(S,h[c--]);let v=0;for(let S=l.length-1;S>=0;S--)l[S].index+=v,this.lines.onInsertEmitter.fire(l[S]),v+=l[S].amount;let f=Math.max(0,d+a-this.lines.maxLength);f>0&&this.lines.onTrimEmitter.fire(f)}}translateBufferLineToString(e,i,r=0,s){let o=this.lines.get(e);return o?o.translateToString(i,r,s):""}getWrappedRangeForLine(e){let i=e,r=e;for(;i>0&&this.lines.get(i).isWrapped;)i--;for(;r+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(e??=this.x;!this.tabs[++e]&&e=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let i=0;i{i.line-=r,i.line<0&&i.dispose()})),i.register(this.lines.onInsert(r=>{i.line>=r.index&&(i.line+=r.amount)})),i.register(this.lines.onDelete(r=>{i.line>=r.index&&i.liner.index&&(i.line-=r.amount)})),i.register(i.onDispose(()=>this._removeMarker(i))),i}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}};var tr=class extends g{constructor(e,i,r){super();this._optionsService=e;this._bufferService=i;this._logService=r;this._normalBuffer=this._register(new B);this._altBuffer=this._register(new B);this._onBufferActivate=this._register(new b);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 ri(!0,this._optionsService,this._bufferService,this._logService),this._normalBuffer.value=this._normal,this._normal.fillViewportRows(),this._alt=new ri(!1,this._optionsService,this._bufferService,this._logService),this._altBuffer.value=this._alt,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,i){this._normal.resize(e,i),this._alt.resize(e,i),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}};var Dt=class extends g{constructor(e,i){super();this.isUserScrolling=!1;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this.cols=Math.max(e.rawOptions.cols||0,2),this.rows=Math.max(e.rawOptions.rows||0,1),this.buffers=this._register(new tr(e,this,i)),this._register(this.buffers.onBufferActivate(r=>{this._onScroll.fire(r.activeBuffer.ydisp)}))}get buffer(){return this.buffers.active}resize(e,i){let r=this.cols!==e,s=this.rows!==i;this.cols=e,this.rows=i,this.buffers.resize(e,i),this._onResize.fire({cols:e,rows:i,colsChanged:r,rowsChanged:s})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,i=!1){let r=this.buffer,s;s=this._cachedBlankLine,(!s||s.length!==this.cols||s.getFg(0)!==e.fg||s.getBg(0)!==e.bg)&&(s=r.getBlankLine(e,i),this._cachedBlankLine=s),s.isWrapped=i;let o=r.ybase+r.scrollTop,a=r.ybase+r.scrollBottom;if(r.scrollTop===0){let l=r.lines.isFull;a===r.lines.length-1?l?r.lines.recycle().copyFrom(s,!0):r.lines.push(s.clone(!0)):r.lines.splice(a+1,0,s.clone(!0)),l?this.isUserScrolling&&(r.ydisp=Math.max(r.ydisp-1,0)):(r.ybase++,this.isUserScrolling||r.ydisp++)}else{let l=a-o+1;r.lines.shiftElements(o+1,l-1,-1),r.lines.set(a,s.clone(!0))}this.isUserScrolling||(r.ydisp=r.ybase),this._onScroll.fire(r.ydisp)}scrollLines(e,i){let r=this.buffer;if(e<0){if(r.ydisp===0)return;this.isUserScrolling=!0}else e+r.ydisp>=r.ybase&&(this.isUserScrolling=!1);let s=r.ydisp;r.ydisp=Math.max(Math.min(r.ydisp+e,r.ybase),0),s!==r.ydisp&&(i||this._onScroll.fire(r.ydisp))}};Dt=y([m(0,R),m(1,_e)],Dt);var Rt={cols:80,rows:24,showCursorImmediately:!1,cursorBlink:!1,blinkIntervalDuration:0,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollSensitivity:5,fontFamily:"monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollbar:{showScrollbar:!0},scrollOnEraseInDisplay:!1,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,mouseEventsRequireAlt:!1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},reflowCursorLine:!1,rescaleOverlappingGlyphs:!1,rightClickSelectsWord:ie,windowOptions:{},windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",quirks:{},vtExtensions:{}},mo=["normal","bold","100","200","300","400","500","600","700","800","900"],ir=class extends g{constructor(e){super();this._onOptionChange=this._register(new b);this.onOptionChange=this._onOptionChange.event;let i={...Rt};for(let r in e)if(r in i)try{let s=e[r];i[r]=this._sanitizeAndValidateOption(r,s)}catch(s){console.error(s)}this.rawOptions=i,this.options={...i},this._setupOptions(),this._register(E(()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null}))}onSpecificOptionChange(e,i){return this.onOptionChange(r=>{r===e&&i(this.rawOptions[e])})}onMultipleOptionChange(e,i){return this.onOptionChange(r=>{e.indexOf(r)!==-1&&i()})}_setupOptions(){let e=r=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);return this.rawOptions[r]},i=(r,s)=>{if(!(r in Rt))throw new Error(`No option with key "${r}"`);s=this._sanitizeAndValidateOption(r,s),this.rawOptions[r]!==s&&(this.rawOptions[r]=s,this._onOptionChange.fire(r))};for(let r in this.rawOptions){let s={get:e.bind(this,r),set:i.bind(this,r)};Object.defineProperty(this.options,r,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=Rt[e]),!bo(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=Rt[e]);break;case"fontWeight":case"fontWeightBold":if(typeof i=="number"&&1<=i&&i<=1e3)break;i=mo.includes(i)?i:Rt[e];break;case"blinkIntervalDuration":if(i=Math.floor(i),i<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);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(i*10)/10));break;case"scrollback":if(i=Math.min(i,4294967295),i<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&&i!==0)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=i??{};break}return i}};function bo(n){return n==="block"||n==="underline"||n==="bar"}var pn=Object.freeze({insertMode:!1}),mn=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,colorSchemeUpdates:!1,cursorBlink:void 0,cursorStyle:void 0,origin:!1,reverseWraparound:!1,sendFocus:!1,synchronizedOutput:!1,win32InputMode:!1,wraparound:!0}),bn=()=>({flags:0,mainFlags:0,altFlags:0,mainStack:[],altStack:[]}),Lt=class extends g{constructor(e,i,r){super();this._bufferService=e;this._logService=i;this._optionsService=r;this.isCursorHidden=!1;this._onData=this._register(new b);this.onData=this._onData.event;this._onUserInput=this._register(new b);this.onUserInput=this._onUserInput.event;this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onRequestScrollToBottom=this._register(new b);this.onRequestScrollToBottom=this._onRequestScrollToBottom.event;this.isCursorInitialized=r.rawOptions.showCursorImmediately??!1,this.modes=structuredClone(pn),this.decPrivateModes=structuredClone(mn),this.kittyKeyboard=bn()}reset(){this.modes=structuredClone(pn),this.decPrivateModes=structuredClone(mn),this.kittyKeyboard=bn()}triggerDataEvent(e,i=!1){if(this._optionsService.rawOptions.disableStdin)return;let r=this._bufferService.buffer;i&&this._optionsService.rawOptions.scrollOnUserInput&&r.ybase!==r.ydisp&&this._onRequestScrollToBottom.fire(),i&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`),this._logService.trace("sending data (codes)",()=>e.split("").map(s=>s.charCodeAt(0))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`),this._logService.trace("sending binary (codes)",()=>e.split("").map(i=>i.charCodeAt(0))),this._onBinary.fire(e))}};Lt=y([m(0,D),m(1,_e),m(2,R)],Lt);var vn={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:n=>n.button===4||n.action!==1?!1:(n.ctrl=!1,n.alt=!1,n.shift=!1,!0)},VT200:{events:19,restrict:n=>n.action!==32},DRAG:{events:23,restrict:n=>!(n.action===32&&n.button===3)},ANY:{events:31,restrict:n=>!0}};function ms(n,t){let e=(n.ctrl?16:0)|(n.shift?4:0)|(n.alt?8:0);return n.button===4?(e|=64,e|=n.action):(e|=n.button&3,n.button&4&&(e|=64),n.button&8&&(e|=128),n.action===32?e|=32:n.action===0&&!t&&(e|=3)),e}var bs=String.fromCharCode,Sn={DEFAULT:n=>{let t=[ms(n,!1)+32,n.col+32,n.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`\x1B[M${bs(t[0])}${bs(t[1])}${bs(t[2])}`},SGR:n=>{let t=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${ms(n,!0)};${n.col};${n.row}${t}`},SGR_PIXELS:n=>{let t=n.action===0&&n.button!==4?"m":"M";return`\x1B[<${ms(n,!0)};${n.x};${n.y}${t}`}},rr=class extends g{constructor(){super();this._protocols={};this._encodings={};this._activeProtocol="";this._activeEncoding="";this._onProtocolChange=this._register(new b);this.onProtocolChange=this._onProtocolChange.event;for(let e of Object.keys(vn))this.addProtocol(e,vn[e]);for(let e of Object.keys(Sn))this.addEncoding(e,Sn[e]);this.reset()}addProtocol(e,i){this._protocols[e]=i}addEncoding(e,i){this._encodings[e]=i}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return this._protocols[this._activeProtocol].events!==0}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"}setCustomWheelEventHandler(e){this._customWheelEventHandler=e}allowCustomWheelEvent(e){return this._customWheelEventHandler?this._customWheelEventHandler(e)!==!1:!0}restrictMouseEvent(e){return this._protocols[this._activeProtocol].restrict(e)}encodeMouseEvent(e){return this._encodings[this._activeEncoding](e)}get isDefaultEncoding(){return this._activeEncoding==="DEFAULT"}get isPixelEncoding(){return this._activeEncoding==="SGR_PIXELS"}};var me=class n{constructor(){this._providers=Object.create(null);this._active="";this._onChange=new b;this.onChange=this._onChange.event}static extractShouldJoin(t){return(t&1)!==0}static extractWidth(t){return t>>1&3}static extractCharKind(t){return t>>3}static createPropertyValue(t,e,i=!1){return(t&16777215)<<3|(e&3)<<1|(i?1:0)}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(t){if(!this._providers[t])throw new Error(`unknown Unicode version "${t}"`);this._active=t,this._activeProvider=this._providers[t],this._onChange.fire(t)}register(t){this._providers[t.version]=t,this._active||(this.activeVersion=t.version)}wcwidth(t){return this._activeProvider.wcwidth(t)}getStringCellWidth(t){let e=0,i=0,r=t.length;for(let s=0;s=r)return e+this.wcwidth(o);let h=t.charCodeAt(s);56320<=h&&h<=57343?o=(o-55296)*1024+h-56320+65536:e+=this.wcwidth(h)}let a=this.charProperties(o,i),l=n.extractWidth(a);n.extractShouldJoin(a)&&(l-=n.extractWidth(i)),e+=l,i=a}return e}charProperties(t,e){return this._activeProvider.charProperties(t,e)}};var vs=[[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]],vo=[[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]],X;function So(n,t){let e=0,i=t.length-1,r;if(nt[i][1])return!1;for(;i>=e;)if(r=e+i>>1,n>t[r][1])e=r+1;else if(n=131072&&t<=196605||t>=196608&&t<=262141?2:1}charProperties(t,e){let i=this.wcwidth(t),r=i===0&&e!==0;if(r){let s=me.extractWidth(e);s===0?r=!1:s>i&&(i=s)}return me.createPropertyValue(0,i,r)}};var nr=class{constructor(){this.glevel=0;this._charsets=[]}get charsets(){return this._charsets}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(t){this.glevel=t,this.charset=this._charsets[t]}setgCharset(t,e){this._charsets[t]=e,this.glevel===t&&(this.charset=e)}};function Ss(n){let e=n.buffer.lines.get(n.buffer.ybase+n.buffer.y-1)?.get(n.cols-1),i=n.buffer.lines.get(n.buffer.ybase+n.buffer.y);i&&e&&(i.isWrapped=e[3]!==0&&e[3]!==32)}var At=class n{constructor(t=32,e=32){this.maxLength=t;this.maxSubParamsLength=e;if(e>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(t),this.length=0,this._subParams=new Int32Array(e),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(t),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}static fromArray(t){let e=new n;if(!t.length)return e;for(let i=Array.isArray(t[0])?1:0;i>8,r=this._subParamsIdx[e]&255;r-i>0&&t.push(Array.prototype.slice.call(this._subParams,i,r))}return t}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}resetZdm(){this.length=1,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1,this._subParamsIdx[0]=0,this.params[0]=0}addParam(t){if(this._digitIsSub=!1,this.length>=this.maxLength){this._rejectDigits=!0;return}if(t<-1)throw new Error("values less than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=t>2147483647?2147483647:t}addSubParam(t){if(this._digitIsSub=!0,!!this.length){if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength){this._rejectSubDigits=!0;return}if(t<-1)throw new Error("values less than -1 are not allowed");this._subParams[this._subParamsLength++]=t>2147483647?2147483647:t,this._subParamsIdx[this.length-1]++}}hasSubParams(t){return(this._subParamsIdx[t]&255)-(this._subParamsIdx[t]>>8)>0}getSubParams(t){let e=this._subParamsIdx[t]>>8,i=this._subParamsIdx[t]&255;return i-e>0?this._subParams.subarray(e,i):null}getSubParamsAll(){let t={};for(let e=0;e>8,r=this._subParamsIdx[e]&255;r-i>0&&(t[e]=this._subParams.slice(i,r))}return t}addDigit(t){let e;if(this._rejectDigits||!(e=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;let i=this._digitIsSub?this._subParams:this.params,r=i[e-1];i[e-1]=~r?Math.min(r*10+t,2147483647):t}};var gs=class{constructor(){this._chunks=[];this._length=0}get length(){return this._length}reset(){this._chunks.length=0,this._length=0}append(t){this._chunks.push(t),this._length+=t.length}toString(){return this._chunks.join("")}},Ue=class{constructor(t){this._limit=t;this._builder=new gs}get length(){return this._builder.length}get limit(){return this._limit}reset(){this._builder.reset()}append(t){return this._builder.append(t),this._builder.length>this._limit?(this._builder.reset(),!0):!1}toString(){return this._builder.toString()}};var si=[],or=class{constructor(){this._state=0;this._active=si;this._id=-1;this._handlers=Object.create(null);this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=si}reset(){if(this._state===2)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].end(!1);this._stack.paused=!1,this._active=si,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||si,!this._active.length)this._handlerFb(this._id,"START");else for(let t=this._active.length-1;t>=0;t--)this._active[t].start()}_put(t,e,i){if(!this._active.length)this._handlerFb(this._id,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}start(){this.reset(),this._state=1}put(t,e,i){if(this._state!==3){if(this._state===1)for(;e0&&this._put(t,e,i)}}end(t,e=!0){if(this._state!==0){if(this._state!==3)if(this._state===1&&this._start(),!this._active.length)this._handlerFb(this._id,"END",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].end(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=si,this._id=-1,this._state=0}}},ar=class ar{constructor(t){this._handler=t;this._data=new Ue(ar._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}end(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(i=>(this._data.reset(),this._hitLimit=!1,i));return this._data.reset(),this._hitLimit=!1,e}};ar._payloadLimit=1e7;var ne=ar;var ni=[],lr=class{constructor(){this._handlers=Object.create(null);this._active=ni;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=ni}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}reset(){if(this._active.length)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].unhook(!1);this._stack.paused=!1,this._active=ni,this._ident=0}hook(t,e){if(this.reset(),this._ident=t,this._active=this._handlers[t]||ni,!this._active.length)this._handlerFb(this._ident,"HOOK",e);else for(let i=this._active.length-1;i>=0;i--)this._active[i].hook(e)}put(t,e,i){if(!this._active.length)this._handlerFb(this._ident,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}unhook(t,e=!0){if(!this._active.length)this._handlerFb(this._ident,"UNHOOK",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].unhook(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=ni,this._ident=0}},oi=new At;oi.addParam(0);var cr=class cr{constructor(t){this._handler=t;this._data=new Ue(cr._payloadLimit);this._params=oi;this._hitLimit=!1}hook(t){this._params=t.length>1||t.params[0]?t.clone():oi,this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}unhook(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString(),this._params),e instanceof Promise))return e.then(i=>(this._params=oi,this._data.reset(),this._hitLimit=!1,i));return this._params=oi,this._data.reset(),this._hitLimit=!1,e}};cr._payloadLimit=1e7;var ai=cr;var li=[],hr=class{constructor(){this._handlers=Object.create(null);this._active=li;this._ident=0;this._handlerFb=()=>{};this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(t,e){this._handlers[t]??=[];let i=this._handlers[t];return i.push(e),{dispose:()=>{let r=i.indexOf(e);r!==-1&&i.splice(r,1)}}}clearHandler(t){this._handlers[t]&&delete this._handlers[t]}setHandlerFallback(t){this._handlerFb=t}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=li}reset(){if(this._active.length)for(let t=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;t>=0;--t)this._active[t].end(!1);this._stack.paused=!1,this._active=li,this._ident=0}start(t){if(this.reset(),this._ident=t,this._active=this._handlers[t]||li,!this._active.length)this._handlerFb(this._ident,"START");else for(let e=this._active.length-1;e>=0;e--)this._active[e].start()}put(t,e,i){if(!this._active.length)this._handlerFb(this._ident,"PUT",xe(t,e,i));else for(let r=this._active.length-1;r>=0;r--)this._active[r].put(t,e,i)}end(t,e=!0){if(!this._active.length)this._handlerFb(this._ident,"END",t);else{let i=!1,r=this._active.length-1,s=!1;if(this._stack.paused&&(r=this._stack.loopPosition-1,i=e,s=this._stack.fallThrough,this._stack.paused=!1),!s&&i===!1){for(;r>=0&&(i=this._active[r].end(t),i!==!0);r--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!1,i;r--}for(;r>=0;r--)if(i=this._active[r].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=r,this._stack.fallThrough=!0,i}this._active=li,this._ident=0}},ur=class ur{constructor(t){this._handler=t;this._data=new Ue(ur._payloadLimit);this._hitLimit=!1}start(){this._data.reset(),this._hitLimit=!1}put(t,e,i){this._hitLimit||this._data.append(xe(t,e,i))&&(this._hitLimit=!0)}end(t){let e=!1;if(this._hitLimit)e=!1;else if(t&&(e=this._handler(this._data.toString()),e instanceof Promise))return e.then(i=>(this._data.reset(),this._hitLimit=!1,i));return this._data.reset(),this._hitLimit=!1,e}};ur._payloadLimit=1e7;var dr=ur;var Cs=class{constructor(t){this.table=new Uint16Array(t)}setDefault(t,e){this.table.fill(t<<8|e)}add(t,e,i,r){this.table[e<<8|t]=i<<8|r}addMany(t,e,i,r){for(let s=0;sl),i=(a,l)=>e.slice(a,l),r=i(32,127),s=i(0,24);s.push(25),s.push.apply(s,i(28,32));let o=i(0,17);n.setDefault(1,0),n.addMany(r,0,2,0);for(let a of o)n.addMany([24,26,153,154],a,3,0),n.addMany(i(128,144),a,3,0),n.addMany(i(144,152),a,3,0),n.add(156,a,0,0),n.add(27,a,11,1),n.add(157,a,4,8),n.addMany([152,158],a,0,7),n.add(159,a,11,14),n.add(155,a,11,3),n.add(144,a,11,9);return n.addMany(s,0,3,0),n.addMany(s,1,3,1),n.add(127,1,0,1),n.addMany(s,8,0,8),n.addMany(s,3,3,3),n.add(127,3,0,3),n.addMany(s,4,3,4),n.add(127,4,0,4),n.addMany(s,6,3,6),n.addMany(s,5,3,5),n.add(127,5,0,5),n.addMany(s,2,3,2),n.add(127,2,0,2),n.add(93,1,4,8),n.addMany(r,8,5,8),n.add(127,8,5,8),n.addMany([156,27,24,26,7],8,6,0),n.addMany(i(28,32),8,0,8),n.addMany([88,94],1,0,7),n.addMany(r,7,0,7),n.addMany(s,7,0,7),n.add(156,7,0,0),n.add(127,7,0,7),n.add(95,1,11,14),n.addMany(s,14,0,14),n.add(127,14,0,14),n.addMany(i(32,48),14,9,15),n.addMany(i(48,127),14,15,16),n.addMany(i(48,127),15,15,16),n.addMany(s,15,0,15),n.addMany(i(32,48),15,9,15),n.add(127,15,0,15),n.addMany(r,16,16,16),n.addMany(s,16,0,16),n.addMany(i(8,14),16,16,16),n.add(127,16,0,16),n.addMany([27,156,24,26],16,17,0),n.add(91,1,11,3),n.addMany(i(64,127),3,7,0),n.addMany(i(48,60),3,8,4),n.addMany([60,61,62,63],3,9,4),n.addMany(i(48,60),4,8,4),n.addMany(i(64,127),4,7,0),n.addMany([60,61,62,63],4,0,6),n.addMany(i(32,64),6,0,6),n.add(127,6,0,6),n.addMany(i(64,127),6,0,0),n.addMany(i(32,48),3,9,5),n.addMany(i(32,48),5,9,5),n.addMany(i(48,64),5,0,6),n.addMany(i(64,127),5,7,0),n.addMany(i(32,48),4,9,5),n.addMany(i(32,48),1,9,2),n.addMany(i(32,48),2,9,2),n.addMany(i(48,127),2,10,0),n.addMany(i(48,80),1,10,0),n.addMany(i(81,88),1,10,0),n.addMany([89,90,92],1,10,0),n.addMany(i(96,127),1,10,0),n.add(80,1,11,9),n.addMany(s,9,0,9),n.add(127,9,0,9),n.addMany(i(32,48),9,9,12),n.addMany(i(48,60),9,8,10),n.addMany([60,61,62,63],9,9,10),n.addMany(s,11,0,11),n.addMany(i(32,128),11,0,11),n.addMany(s,10,0,10),n.add(127,10,0,10),n.addMany(i(48,60),10,8,10),n.addMany([60,61,62,63],10,0,11),n.addMany(i(32,48),10,9,12),n.addMany(s,12,0,12),n.add(127,12,0,12),n.addMany(i(32,48),12,9,12),n.addMany(i(48,64),12,0,11),n.addMany(i(64,127),12,12,13),n.addMany(i(64,127),10,12,13),n.addMany(i(64,127),9,12,13),n.addMany(s,13,13,13),n.addMany(r,13,13,13),n.add(127,13,0,13),n.addMany([27,156,24,26],13,14,0),n.add(oe,0,2,0),n.add(oe,8,5,8),n.add(oe,6,0,6),n.add(oe,11,0,11),n.add(oe,13,13,13),n.add(oe,16,16,16),n})(),fr=class extends g{constructor(e=go){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 At,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(i,r,s)=>{},this._executeHandlerFb=i=>{},this._csiHandlerFb=(i,r)=>{},this._escHandlerFb=i=>{},this._errorHandlerFb=i=>i,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this._register(E(()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._executeHandlersArr=new Array(24).fill(void 0),this._escHandlers=Object.create(null)})),this._oscParser=this._register(new or),this._dcsParser=this._register(new lr),this._apcParser=this._register(new hr),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},()=>!0)}_identifier(e,i=[64,126]){let r=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(r=e.prefix.charCodeAt(0),r<60||r>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 o=0;oa||a>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");r<<=8,r|=a}}if(e.final.length!==1)throw new Error("final must be a single byte");let s=e.final.charCodeAt(0);if(i[0]>s||s>i[1])throw new Error(`final must be in range ${i[0]} .. ${i[1]}`);return r<<=8,r|=s,r}identToString(e){let i=[];for(;e;)i.push(String.fromCharCode(e&255)),e>>=8;return i.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,i){let r=this._identifier(e,[48,126]);this._escHandlers[r]??=[];let s=this._escHandlers[r];return s.push(i),{dispose:()=>{let o=s.indexOf(i);o!==-1&&s.splice(o,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,i){let r=e.charCodeAt(0);this._executeHandlers[r]=i,r<24&&(this._executeHandlersArr[r]=i)}clearExecuteHandler(e){let i=e.charCodeAt(0);this._executeHandlers[i]&&delete this._executeHandlers[i],i<24&&(this._executeHandlersArr[i]=void 0)}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,i){let r=this._identifier(e);this._csiHandlers[r]??=[];let s=this._csiHandlers[r];return s.push(i),{dispose:()=>{let o=s.indexOf(i);o!==-1&&s.splice(o,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,i){return this._dcsParser.registerHandler(this._identifier(e),i)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,i){return this._oscParser.registerHandler(e,i)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}registerApcHandler(e,i){return e.prefix=void 0,this._apcParser.registerHandler(this._identifier(e,[48,126]),i)}clearApcHandler(e){e.prefix=void 0,this._apcParser.clearHandler(this._identifier(e,[48,126]))}setApcHandlerFallback(e){this._apcParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._apcParser.reset(),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0,this._parseStack.state!==0&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,i,r,s,o){this._parseStack.state=e,this._parseStack.handlers=i,this._parseStack.handlerPos=r,this._parseStack.transition=s,this._parseStack.chunkPos=o}parse(e,i,r){let s,o,a=0,l;if(this._parseStack.state)if(this._parseStack.state===2)this._parseStack.state=0,a=this._parseStack.chunkPos+1;else{if(r===void 0||this._parseStack.state===1)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");let h=this._parseStack.handlers,d=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](this._params),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 4:if(r===!1&&d>-1){for(;d>=0&&(l=h[d](),l!==!0);d--)if(l instanceof Promise)return this._parseStack.handlerPos=d,l}this._parseStack.handlers=[];break;case 6:if(s=e[this._parseStack.chunkPos],l=this._dcsParser.unhook(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 5:if(s=e[this._parseStack.chunkPos],l=this._oscParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break;case 7:if(s=e[this._parseStack.chunkPos],l=this._apcParser.end(s!==24&&s!==26,r),l)return l;s===27&&(this._parseStack.transition|=1),this._params.resetZdm(),this._collect=0;break}this._parseStack.state=0,a=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=this._parseStack.transition&255}for(let h=a;h=60&&c<=63&&(this._collect=c,d++);let u=!1;for(;d=48&&c<=57)this._params.addDigit(c-48);else if(c===59)this._params.addParam(0);else if(c===58)this._params.addSubParam(-1);else if(c>=64&&c<=126){let _=this._csiHandlers[this._collect<<8|c],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return o=1792,this._preserveStack(3,_,p,o,d),l;p<0&&this._csiHandlerFb(this._collect<<8|c,this._params),this.precedingJoinState=0,h=d,this.currentState=0,u=!0;break}else break;u||(h=d-1,this.currentState=4);continue}switch(o=this._transitions.table[this.currentState<<8|(s>8){case 2:let d=h,c=i-4;for(;d=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe)&&e[++d]>=32&&(e[d]<=126||e[d]>=oe););if(d>=c)for(;d=32&&(e[d]<=126||e[d]>=oe);)d++;this._printHandler(e,h,d),h=d-1;break;case 3:this._executeHandlers[s]?this._executeHandlers[s]():this._executeHandlerFb(s),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:h,code:s,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:let _=this._csiHandlers[this._collect<<8|s],p=_?_.length-1:-1;for(;p>=0&&(l=_[p](this._params),l!==!0);p--)if(l instanceof Promise)return this._preserveStack(3,_,p,o,h),l;p<0&&this._csiHandlerFb(this._collect<<8|s,this._params),this.precedingJoinState=0;break;case 8:do switch(s){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(s-48)}while(++h47&&s<60);h--;break;case 9:this._collect<<=8,this._collect|=s;break;case 10:let v=this._escHandlers[this._collect<<8|s],f=v?v.length-1:-1;for(;f>=0&&(l=v[f](),l!==!0);f--)if(l instanceof Promise)return this._preserveStack(4,v,f,o,h),l;f<0&&this._escHandlerFb(this._collect<<8|s),this.precedingJoinState=0;break;case 11:this._params.resetZdm(),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|s,this._params);break;case 13:for(let S=h+1;;++S)if(S>=i||(s=e[S])===24||s===26||s===27||s>127&&s=i||(s=e[S])<32||s>127&&s=32&&e[S]<127||e[S]>=8&&e[S]<14||e[S]>=oe))){this._apcParser.put(e,h,S),h=S-1;break}break;case 17:if(l=this._apcParser.end(s!==24&&s!==26),l)return this._preserveStack(7,[],0,o,h),l;s===27&&(o|=1),this._params.resetZdm(),this._collect=0,this.precedingJoinState=0;break}this.currentState=o&255}}};var Co=/^([\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})$/,Io=/^[\da-f]+$/;function Es(n){if(!n)return;let t=n.toLowerCase();if(t.startsWith("rgb:")){t=t.slice(4);let e=Co.exec(t);if(e){let i=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/i*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/i*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/i*255)]}}else if(t.startsWith("#")&&(t=t.slice(1),Io.exec(t)&&[3,6,9,12].includes(t.length))){let e=t.length/3,i=[0,0,0];for(let r=0;r<3;++r){let s=parseInt(t.slice(e*r,e*r+e),16);i[r]=e===1?s<<4:e===2?s:e===3?s>>4:s>>8}return i}}function Is(n,t){let e=n.toString(16),i=e.length<2?"0"+e:e;switch(t){case 4:return e[0];case 8:return i;case 12:return(i+i).slice(0,3);default:return i+i}}function In(n,t=16){let[e,i,r]=n;return`rgb:${Is(e,t)}/${Is(i,t)}/${Is(r,t)}`}var En="6.1.0-beta.303";var yo={"(":0,")":1,"*":2,"+":3,"-":1,".":2};function yn(n,t){if(n>24)return t.setWinLines||!1;switch(n){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 xn=0,_r=class extends g{constructor(e,i,r,s,o,a,l,h,d=new fr){super();this._bufferService=e;this._charsetService=i;this._coreService=r;this._logService=s;this._optionsService=o;this._oscLinkService=a;this._mouseStateService=l;this._unicodeService=h;this._parser=d;this._parseBuffer=new Uint32Array(4096);this._stringDecoder=new pi;this._utf8Decoder=new mi;this._windowTitle="";this._iconName="";this._windowTitleStack=[];this._iconNameStack=[];this._curAttrData=U.clone();this._eraseAttrDataInternal=U.clone();this._onRequestBell=this._register(new b);this.onRequestBell=this._onRequestBell.event;this._onRequestRefreshRows=this._register(new b);this.onRequestRefreshRows=this._onRequestRefreshRows.event;this._onRequestReset=this._register(new b);this.onRequestReset=this._onRequestReset.event;this._onRequestSendFocus=this._register(new b);this.onRequestSendFocus=this._onRequestSendFocus.event;this._onRequestSyncScrollBar=this._register(new b);this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event;this._onRequestWindowsOptionsReport=this._register(new b);this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event;this._onA11yChar=this._register(new b);this.onA11yChar=this._onA11yChar.event;this._onA11yTab=this._register(new b);this.onA11yTab=this._onA11yTab.event;this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onScroll=this._register(new b);this.onScroll=this._onScroll.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onColor=this._register(new b);this.onColor=this._onColor.event;this._onRequestColorSchemeQuery=this._register(new b);this.onRequestColorSchemeQuery=this._onRequestColorSchemeQuery.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 ci(this._bufferService),this._activeBuffer=this._bufferService.buffer,this._register(this._bufferService.buffers.onBufferActivate(c=>this._activeBuffer=c.activeBuffer)),this._parser.setCsiHandlerFallback((c,u)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(c),params:u.toArray()})}),this._parser.setEscHandlerFallback(c=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(c)})}),this._parser.setExecuteHandlerFallback(c=>{this._logService.debug("Unknown EXECUTE code: ",{code:c})}),this._parser.setOscHandlerFallback((c,u,_)=>{this._logService.debug("Unknown OSC code: ",{identifier:c,action:u,data:_})}),this._parser.setDcsHandlerFallback((c,u,_)=>{u==="HOOK"&&(_=_.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setApcHandlerFallback((c,u,_)=>{this._logService.debug("Unknown APC code: ",{identifier:this._parser.identToString(c),action:u,payload:_})}),this._parser.setPrintHandler((c,u,_)=>this.print(c,u,_)),this._parser.registerCsiHandler({final:"@"},c=>this.insertChars(c)),this._parser.registerCsiHandler({intermediates:" ",final:"@"},c=>this.scrollLeft(c)),this._parser.registerCsiHandler({final:"A"},c=>this.cursorUp(c)),this._parser.registerCsiHandler({intermediates:" ",final:"A"},c=>this.scrollRight(c)),this._parser.registerCsiHandler({final:"B"},c=>this.cursorDown(c)),this._parser.registerCsiHandler({final:"C"},c=>this.cursorForward(c)),this._parser.registerCsiHandler({final:"D"},c=>this.cursorBackward(c)),this._parser.registerCsiHandler({final:"E"},c=>this.cursorNextLine(c)),this._parser.registerCsiHandler({final:"F"},c=>this.cursorPrecedingLine(c)),this._parser.registerCsiHandler({final:"G"},c=>this.cursorCharAbsolute(c)),this._parser.registerCsiHandler({final:"H"},c=>this.cursorPosition(c)),this._parser.registerCsiHandler({final:"I"},c=>this.cursorForwardTab(c)),this._parser.registerCsiHandler({final:"J"},c=>this.eraseInDisplay(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"J"},c=>this.eraseInDisplay(c,!0)),this._parser.registerCsiHandler({final:"K"},c=>this.eraseInLine(c,!1)),this._parser.registerCsiHandler({prefix:"?",final:"K"},c=>this.eraseInLine(c,!0)),this._parser.registerCsiHandler({final:"L"},c=>this.insertLines(c)),this._parser.registerCsiHandler({final:"M"},c=>this.deleteLines(c)),this._parser.registerCsiHandler({final:"P"},c=>this.deleteChars(c)),this._parser.registerCsiHandler({final:"S"},c=>this.scrollUp(c)),this._parser.registerCsiHandler({final:"T"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"X"},c=>this.eraseChars(c)),this._parser.registerCsiHandler({final:"Z"},c=>this.cursorBackwardTab(c)),this._parser.registerCsiHandler({final:"^"},c=>this.scrollDown(c)),this._parser.registerCsiHandler({final:"`"},c=>this.charPosAbsolute(c)),this._parser.registerCsiHandler({final:"a"},c=>this.hPositionRelative(c)),this._parser.registerCsiHandler({final:"b"},c=>this.repeatPrecedingCharacter(c)),this._parser.registerCsiHandler({final:"c"},c=>this.sendDeviceAttributesPrimary(c)),this._parser.registerCsiHandler({prefix:">",final:"c"},c=>this.sendDeviceAttributesSecondary(c)),this._parser.registerCsiHandler({final:"d"},c=>this.linePosAbsolute(c)),this._parser.registerCsiHandler({final:"e"},c=>this.vPositionRelative(c)),this._parser.registerCsiHandler({final:"f"},c=>this.hVPosition(c)),this._parser.registerCsiHandler({final:"g"},c=>this.tabClear(c)),this._parser.registerCsiHandler({final:"h"},c=>this.setMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"h"},c=>this.setModePrivate(c)),this._parser.registerCsiHandler({final:"l"},c=>this.resetMode(c)),this._parser.registerCsiHandler({prefix:"?",final:"l"},c=>this.resetModePrivate(c)),this._parser.registerCsiHandler({final:"m"},c=>this.charAttributes(c)),this._parser.registerCsiHandler({final:"n"},c=>this.deviceStatus(c)),this._parser.registerCsiHandler({prefix:"?",final:"n"},c=>this.deviceStatusPrivate(c)),this._parser.registerCsiHandler({intermediates:"!",final:"p"},c=>this.softReset(c)),this._parser.registerCsiHandler({prefix:">",final:"q"},c=>this.sendXtVersion(c)),this._parser.registerCsiHandler({intermediates:" ",final:"q"},c=>this.setCursorStyle(c)),this._parser.registerCsiHandler({final:"r"},c=>this.setScrollRegion(c)),this._parser.registerCsiHandler({final:"s"},c=>this.saveCursor(c)),this._parser.registerCsiHandler({final:"t"},c=>this.windowOptions(c)),this._parser.registerCsiHandler({final:"u"},c=>this.restoreCursor(c)),this._parser.registerCsiHandler({intermediates:"'",final:"}"},c=>this.insertColumns(c)),this._parser.registerCsiHandler({intermediates:"'",final:"~"},c=>this.deleteColumns(c)),this._parser.registerCsiHandler({intermediates:'"',final:"q"},c=>this.selectProtected(c)),this._parser.registerCsiHandler({intermediates:"$",final:"p"},c=>this.requestMode(c,!0)),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},c=>this.requestMode(c,!1)),this._parser.registerCsiHandler({prefix:"=",final:"u"},c=>this.kittyKeyboardSet(c)),this._parser.registerCsiHandler({prefix:"?",final:"u"},c=>this.kittyKeyboardQuery(c)),this._parser.registerCsiHandler({prefix:">",final:"u"},c=>this.kittyKeyboardPush(c)),this._parser.registerCsiHandler({prefix:"<",final:"u"},c=>this.kittyKeyboardPop(c)),this._parser.setExecuteHandler("\x07",()=>this.bell()),this._parser.setExecuteHandler(` ++`,()=>this.lineFeed()),this._parser.setExecuteHandler("\v",()=>this.lineFeed()),this._parser.setExecuteHandler("\f",()=>this.lineFeed()),this._parser.setExecuteHandler("\r",()=>this.carriageReturn()),this._parser.setExecuteHandler("\b",()=>this.backspace()),this._parser.setExecuteHandler(" ",()=>this.tab()),this._parser.setExecuteHandler("",()=>this.shiftOut()),this._parser.setExecuteHandler("",()=>this.shiftIn()),this._parser.setExecuteHandler("\x84",()=>this.index()),this._parser.setExecuteHandler("\x85",()=>this.nextLine()),this._parser.setExecuteHandler("\x88",()=>this.tabSet()),this._parser.registerOscHandler(0,new ne(c=>(this.setTitle(c),this.setIconName(c),!0))),this._parser.registerOscHandler(1,new ne(c=>this.setIconName(c))),this._parser.registerOscHandler(2,new ne(c=>this.setTitle(c))),this._parser.registerOscHandler(4,new ne(c=>this.setOrReportIndexedColor(c))),this._parser.registerOscHandler(8,new ne(c=>this.setHyperlink(c))),this._parser.registerOscHandler(10,new ne(c=>this.setOrReportFgColor(c))),this._parser.registerOscHandler(11,new ne(c=>this.setOrReportBgColor(c))),this._parser.registerOscHandler(12,new ne(c=>this.setOrReportCursorColor(c))),this._parser.registerOscHandler(104,new ne(c=>this.restoreIndexedColor(c))),this._parser.registerOscHandler(110,new ne(c=>this.restoreFgColor(c))),this._parser.registerOscHandler(111,new ne(c=>this.restoreBgColor(c))),this._parser.registerOscHandler(112,new ne(c=>this.restoreCursorColor(c))),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(let c in q)this._parser.registerEscHandler({intermediates:"(",final:c},()=>this.selectCharset("("+c)),this._parser.registerEscHandler({intermediates:")",final:c},()=>this.selectCharset(")"+c)),this._parser.registerEscHandler({intermediates:"*",final:c},()=>this.selectCharset("*"+c)),this._parser.registerEscHandler({intermediates:"+",final:c},()=>this.selectCharset("+"+c)),this._parser.registerEscHandler({intermediates:"-",final:c},()=>this.selectCharset("-"+c)),this._parser.registerEscHandler({intermediates:".",final:c},()=>this.selectCharset("."+c)),this._parser.registerEscHandler({intermediates:"/",final:c},()=>this.selectCharset("/"+c));this._parser.registerEscHandler({intermediates:"#",final:"8"},()=>this.screenAlignmentPattern()),this._parser.setErrorHandler(c=>(this._logService.error("Parsing error: ",c),c)),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new ai((c,u)=>this.requestStatusString(c,u)))}getAttrData(){return this._curAttrData}_preserveStack(e,i,r,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=i,this._parseStack.decodedLength=r,this._parseStack.position=s}_logSlowResolvingAsync(e){if(this._logService.logLevel<=3){let i,r=new Promise((s,o)=>{i=setTimeout(()=>o("#SLOW_TIMEOUT"),5e3)});Promise.race([e,r]).then(()=>{i!==void 0&&clearTimeout(i)},s=>{if(i!==void 0&&clearTimeout(i),s!=="#SLOW_TIMEOUT")throw s;console.warn("async parser handler taking longer than 5000 ms")})}}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,i){let r,s=this._activeBuffer.x,o=this._activeBuffer.y,a=0,l=this._parseStack.paused;if(l){if(r=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,i))return this._logSlowResolvingAsync(r),r;s=this._parseStack.cursorStartX,o=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>131072&&(a=this._parseStack.position+131072)}if(this._logService.logLevel<=1&&this._logService.debug(`parsing data ${typeof e=="string"?` "${e}"`:` "${Array.prototype.map.call(e,c=>String.fromCharCode(c)).join("")}"`}`),this._logService.logLevel===0&&this._logService.trace("parsing data (codes)",typeof e=="string"?e.split("").map(c=>c.charCodeAt(0)):e),this._parseBuffer.length131072)for(let c=a;c0&&_.getWidth(this._activeBuffer.x-1)===2&&_.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let p=this._parser.precedingJoinState;for(let v=i;vh){if(d){let A=_,T=this._activeBuffer.x-C;if(this._activeBuffer.x=C,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),_=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),!_)return;for(C>0&&_ instanceof Re&&_.copyCellsFrom(A,T,0,C,!1);T=0;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u);continue}if(c&&(_.insertCells(this._activeBuffer.x,o-C,this._activeBuffer.getNullCell(u)),_.getWidth(h-1)===2&&_.setCellFromCodepoint(h-1,0,1,u)),_.setCellFromCodepoint(this._activeBuffer.x++,s,o,u),o>0)for(;--o;)_.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=p,this._activeBuffer.x0&&_.getWidth(this._activeBuffer.x)===0&&!_.hasContent(this._activeBuffer.x)&&_.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,i){return e.final==="t"&&!e.prefix&&!e.intermediates?this._parser.registerCsiHandler(e,r=>yn(r.params[0],this._optionsService.rawOptions.windowOptions)?i(r):!0):this._parser.registerCsiHandler(e,i)}registerDcsHandler(e,i){return this._parser.registerDcsHandler(e,new ai(i))}registerEscHandler(e,i){return this._parser.registerEscHandler(e,i)}registerOscHandler(e,i){return this._parser.registerOscHandler(e,new ne(i))}registerApcHandler(e,i){return this._parser.registerApcHandler(e,new dr(i))}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(this._activeBuffer.x===0&&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;let 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;let 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,i){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+i):(this._activeBuffer.x=e,this._activeBuffer.y=i),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,i){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+i)}cursorUp(e){let i=this._activeBuffer.y-this._activeBuffer.scrollTop;return i>=0?this._moveCursor(0,-Math.min(i,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){let i=this._activeBuffer.scrollBottom-this._activeBuffer.y;return i>=0?this._moveCursor(0,Math.min(i,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){let i=e.params[0];return i===0?delete this._activeBuffer.tabs[this._activeBuffer.x]:i===3&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let i=e.params[0]||1;for(;i--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let i=e.params[0]||1;for(;i--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){let i=e.params[0];return i===1&&(this._curAttrData.bg|=536870912),(i===2||i===0)&&(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,i,r,s=!1,o=!1){let a=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);a&&(a.replaceCells(i,r,this._activeBuffer.getNullCell(this._eraseAttrData()),o),s&&(a.isWrapped=!1))}_resetBufferLine(e,i=!1){let r=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);r&&(r.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),i),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),r.isWrapped=!1)}eraseInDisplay(e,i=!1){this._restrictCursor(this._bufferService.cols);let r;switch(e.params[0]){case 0:for(r=this._activeBuffer.y,this._dirtyRowTracker.markDirty(r),this._eraseInBufferLine(r++,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,i);r=this._bufferService.cols){let o=this._activeBuffer.lines.get(r+1);o&&(o.isWrapped=!1)}for(;r--;)this._resetBufferLine(r,i);this._dirtyRowTracker.markDirty(0);break;case 2:if(this._optionsService.rawOptions.scrollOnEraseInDisplay){for(r=this._bufferService.rows,this._dirtyRowTracker.markRangeDirty(0,r-1);r--&&!this._activeBuffer.lines.get(this._activeBuffer.ybase+r)?.getTrimmedLength(););for(;r>=0;r--)this._bufferService.scroll(this._eraseAttrData())}else{for(r=this._bufferService.rows,this._dirtyRowTracker.markDirty(r-1);r--;)this._resetBufferLine(r,i);this._dirtyRowTracker.markDirty(0)}break;case 3:let s=this._activeBuffer.lines.length-this._bufferService.rows;s>0&&(this._activeBuffer.lines.trimStart(s),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-s,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-s,0),this._activeBuffer===this._bufferService.buffers.normal&&(this._bufferService.isUserScrolling=!1),this._onScroll.fire(0));break}return!0}eraseInLine(e,i=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,this._activeBuffer.x===0,i);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,i);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,i);break}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let i=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 c=d;for(let u=1;u0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent("\x1B[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent("\x1B[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent("\x1B[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent("\x1B[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent("\x1B[>83;40003;0c")),!0}sendXtVersion(e){return e.params[0]>0||this._coreService.triggerDataEvent(`\x1BP>|xterm.js(${En})\x1B\\`),!0}_is(e){return(this._optionsService.rawOptions.termName+"").startsWith(e)}setMode(e){for(let i=0;i(te[te.NOT_RECOGNIZED=0]="NOT_RECOGNIZED",te[te.SET=1]="SET",te[te.RESET=2]="RESET",te[te.PERMANENTLY_SET=3]="PERMANENTLY_SET",te[te.PERMANENTLY_RESET=4]="PERMANENTLY_RESET"))(r||={});let s=this._coreService.decPrivateModes,{activeProtocol:o,activeEncoding:a}=this._mouseStateService,l=this._coreService,{buffers:h,cols:d}=this._bufferService,{active:c,alt:u}=h,_=this._optionsService.rawOptions,p=(S,C)=>(l.triggerDataEvent(`\x1B[${i?"":"?"}${S};${C}$y`),!0),v=S=>S?1:2,f=e.params[0];return i?f===2?p(f,4):f===4?p(f,v(l.modes.insertMode)):f===12?p(f,3):f===20?p(f,v(_.convertEol)):p(f,0):f===1?p(f,v(s.applicationCursorKeys)):f===3?p(f,_.windowOptions.setWinLines?d===80?2:d===132?1:0:0):f===6?p(f,v(s.origin)):f===7?p(f,v(s.wraparound)):f===8?p(f,3):f===9?p(f,v(o==="X10")):f===12?p(f,v(_.cursorBlink)):f===25?p(f,v(!l.isCursorHidden)):f===45?p(f,v(s.reverseWraparound)):f===66?p(f,v(s.applicationKeypad)):f===67?p(f,4):f===1e3?p(f,v(o==="VT200")):f===1002?p(f,v(o==="DRAG")):f===1003?p(f,v(o==="ANY")):f===1004?p(f,v(s.sendFocus)):f===1005?p(f,4):f===1006?p(f,v(a==="SGR")):f===1015?p(f,4):f===1016?p(f,v(a==="SGR_PIXELS")):f===1048?p(f,1):f===47||f===1047||f===1049?p(f,v(c===u)):f===2004?p(f,v(s.bracketedPasteMode)):f===2026?p(f,v(s.synchronizedOutput)):f===9001&&this._optionsService.rawOptions.vtExtensions?.win32InputMode?p(f,v(s.win32InputMode)):p(f,0)}_updateAttrColor(e,i,r,s,o){return i===2?(e|=50331648,e&=-16777216,e|=fe.fromColorRGB([r,s,o])):i===5&&(e&=-67108864,e|=33554432|r&255),e}_extractColor(e,i,r){let s=[0,0,-1,0,0,0],o=0,a=0;do{if(s[a+o]=e.params[i+a],e.hasSubParams(i+a)){let l=e.getSubParams(i+a),h=0;do s[1]===5&&(o=1),s[a+h+1+o]=l[h];while(++h=2||s[1]===2&&a+o>=5)break;s[1]&&(o=1)}while(++a+i5)&&(e=1),i.extended.underlineStyle=e,i.fg|=268435456,e===0&&(i.fg&=-268435457),i.updateExtended()}_processSGR0(e){e.fg=U.fg,e.bg=U.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(e.length===1&&e.params[0]===0)return this._processSGR0(this._curAttrData),!0;let i=e.length,r,s=this._curAttrData;for(let o=0;o=30&&r<=37?(s.fg&=-67108864,s.fg|=16777216|r-30):r>=40&&r<=47?(s.bg&=-67108864,s.bg|=16777216|r-40):r>=90&&r<=97?(s.fg&=-67108864,s.fg|=16777216|r-90|8):r>=100&&r<=107?(s.bg&=-67108864,s.bg|=16777216|r-100|8):r===0?this._processSGR0(s):r===1?s.fg|=134217728:r===3?s.bg|=67108864:r===4?(s.fg|=268435456,this._processUnderline(e.hasSubParams(o)?e.getSubParams(o)[0]:1,s)):r===5?s.fg|=536870912:r===7?s.fg|=67108864:r===8?s.fg|=1073741824:r===9?s.fg|=2147483648:r===2?s.bg|=134217728:r===21?this._processUnderline(2,s):r===22?(s.fg&=-134217729,s.bg&=-134217729):r===23?s.bg&=-67108865:r===24?(s.fg&=-268435457,this._processUnderline(0,s)):r===25?s.fg&=-536870913:r===27?s.fg&=-67108865:r===28?s.fg&=-1073741825:r===29?s.fg&=2147483647:r===39?(s.fg&=-67108864,s.fg|=U.fg&16777215):r===49?(s.bg&=-67108864,s.bg|=U.bg&16777215):r===38||r===48||r===58?o+=this._extractColor(e,o,s):r===53?s.bg|=1073741824:r===55?s.bg&=-1073741825:r===221&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.fg&=-134217729:r===222&&(this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl??!0)?s.bg&=-134217729:r===59?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):this._logService.debug("Unknown SGR attribute: %d.",r);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent("\x1B[0n");break;case 6:let i=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[${i};${r}R`);break}return!0}deviceStatusPrivate(e){switch(e.params[0]){case 6:let i=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`\x1B[?${i};${r}R`);break;case 15:break;case 25:break;case 26:break;case 53:break;case 996:(this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery??!0)&&this._onRequestColorSchemeQuery.fire();break}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=U.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){let i=e.length===0?1:e.params[0];if(i===0)this._coreService.decPrivateModes.cursorStyle=void 0,this._coreService.decPrivateModes.cursorBlink=void 0;else{switch(i){case 1:case 2:this._coreService.decPrivateModes.cursorStyle="block";break;case 3:case 4:this._coreService.decPrivateModes.cursorStyle="underline";break;case 5:case 6:this._coreService.decPrivateModes.cursorStyle="bar";break}let r=i%2===1;this._coreService.decPrivateModes.cursorBlink=r}return!0}setScrollRegion(e){let i=e.params[0]||1,r;return(e.length<2||(r=e.params[1])>this._bufferService.rows||r===0)&&(r=this._bufferService.rows),r>i&&(this._activeBuffer.scrollTop=i-1,this._activeBuffer.scrollBottom=r-1,this._setCursor(0,0)),!0}windowOptions(e){if(!yn(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;let i=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:i!==2&&this._onRequestWindowsOptionsReport.fire(0);break;case 16:this._onRequestWindowsOptionsReport.fire(1);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`\x1B[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:(i===0||i===2)&&(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),(i===0||i===1)&&(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:(i===0||i===2)&&this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),(i===0||i===1)&&this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop());break}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,this._activeBuffer.savedCharsets=this._charsetService.charsets.slice(),this._activeBuffer.savedGlevel=this._charsetService.glevel,this._activeBuffer.savedOriginMode=this._coreService.decPrivateModes.origin,this._activeBuffer.savedWraparoundMode=this._coreService.decPrivateModes.wraparound,!0}restoreCursor(e){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;for(let i=0;i1;){let s=r.shift(),o=r.shift();if(/^\d+$/.exec(s)){let a=parseInt(s,10);if(wn(a))if(o==="?")i.push({type:0,index:a});else{let l=Es(o);l&&i.push({type:1,index:a,color:l})}}}return i.length&&this._onColor.fire(i),!0}setHyperlink(e){let i=e.indexOf(";");if(i===-1)return!0;let r=e.slice(0,i).trim(),s=e.slice(i+1);return s?this._createHyperlink(r,s):r.trim()?!1:this._finishHyperlink()}_createHyperlink(e,i){this._getCurrentLinkId()&&this._finishHyperlink();let r=e.split(":"),s,o=r.findIndex(a=>a.startsWith("id="));return o!==-1&&(s=r[o].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:i}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,i){let r=e.split(";");for(let s=0;s=this._specialColors.length);++s,++i)if(r[s]==="?")this._onColor.fire([{type:0,index:this._specialColors[i]}]);else{let o=Es(r[s]);o&&this._onColor.fire([{type:1,index:this._specialColors[i],color:o}])}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;let i=[],r=e.split(";");for(let s=0;s=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){let 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=U.clone(),this._eraseAttrDataInternal=U.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=this._curAttrData.bg&67108863,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){let e=new F;e.content=1<<22|69,e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let i=0;i(this._coreService.triggerDataEvent(`\x1B${l}\x1B\\`),!0),s=this._bufferService.buffer,o=this._optionsService.rawOptions,a={block:2,underline:4,bar:6};return r(e==='"q'?`P1$r${this._curAttrData.isProtected()?1:0}"q`:e==='"p'?'P1$r61;1"p':e==="r"?`P1$r${s.scrollTop+1};${s.scrollBottom+1}r`:e==="m"?"P1$r0m":e===" q"?`P1$r${a[o.cursorStyle]-(o.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,i){this._dirtyRowTracker.markRangeDirty(e,i)}kittyKeyboardSet(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=e.params[0]||0,r=e.length>1&&e.params[1]||1,s=this._coreService.kittyKeyboard;switch(r){case 1:s.flags=i;break;case 2:s.flags|=i;break;case 3:s.flags&=~i;break}return!0}kittyKeyboardQuery(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=this._coreService.kittyKeyboard.flags;return this._coreService.triggerDataEvent(`\x1B[?${i}u`),!0}kittyKeyboardPush(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=e.params[0]||0,r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;return o.length>=16&&o.shift(),o.push(r.flags),r.flags=i,!0}kittyKeyboardPop(e){if(!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard)return!0;let i=Math.max(1,e.params[0]||1),r=this._coreService.kittyKeyboard,o=this._bufferService.buffer===this._bufferService.buffers.alt?r.altStack:r.mainStack;for(let a=0;a0;a++)r.flags=o.pop();return o.length===0&&i>0&&(r.flags=0),!0}},ci=class{constructor(t){this._bufferService=t;this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(t){tthis.end&&(this.end=t)}markRangeDirty(t,e){t>e&&(xn=t,t=e,e=xn),tthis.end&&(this.end=e)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};ci=y([m(0,D)],ci);function wn(n){return 0<=n&&n<256}var pr=class extends g{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._innerWriteTimer=this._register(new Ce);this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._register(E(()=>{this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0}))}handleUserInput(){this._didUserInput=!0}flushSync(){if(this._store.isDisposed||this._isSyncWriting)return;this._isSyncWriting=!0;let e,i=!1;for(;e=this._writeBuffer.shift();){i=!0,this._action(e);let r=this._callbacks.shift();r&&r()}this._pendingData=0,this._bufferOffset=2147483647,this._writeBuffer.length=0,this._callbacks.length=0,this._isSyncWriting=!1,i&&this._onWriteParsed.fire()}writeSync(e,i){if(this._store.isDisposed)return;if(i!==void 0&&this._syncCalls>i){this._syncCalls=0;return}if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;this._isSyncWriting=!0;let r;for(;r=this._writeBuffer.shift();){this._action(r);let s=this._callbacks.shift();s&&s()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,i){if(!this._store.isDisposed){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){this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(i),this._innerWrite();return}this._scheduleInnerWrite()}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(i)}}_scheduleInnerWrite(e=0,i=!0){this._store.isDisposed||this._innerWriteTimer.cancelAndSet(()=>this._innerWrite(e,i),0)}_innerWrite(e=0,i=!0){if(this._store.isDisposed)return;let r=e||performance.now();for(;this._writeBuffer.length>this._bufferOffset;){let s=this._writeBuffer[this._bufferOffset],o=this._action(s,i);if(o){let l=h=>{this._store.isDisposed||(performance.now()-r>=12?this._scheduleInnerWrite(0,h):this._innerWrite(r,h))};o.catch(h=>(queueMicrotask(()=>{throw h}),Promise.resolve(!1))).then(l);return}let a=this._callbacks[this._bufferOffset];if(a&&a(),this._bufferOffset++,this._pendingData-=s.length,performance.now()-r>=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),this._scheduleInnerWrite()):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}};var kt=class{constructor(t){this._bufferService=t;this._nextId=1;this._entriesWithId=new Map;this._dataByLinkId=new Map}registerLink(t){let e=this._bufferService.buffer;if(t.id===void 0){let l=e.addMarker(e.ybase+e.y),h={data:t,id:this._nextId++,lines:[l]};return l.onDispose(()=>this._removeMarkerFromLink(h,l)),this._dataByLinkId.set(h.id,h),h.id}let i=t,r=this._getEntryIdKey(i),s=this._entriesWithId.get(r);if(s)return this.addLineToLink(s.id,e.ybase+e.y),s.id;let o=e.addMarker(e.ybase+e.y),a={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[o]};return o.onDispose(()=>this._removeMarkerFromLink(a,o)),this._entriesWithId.set(a.key,a),this._dataByLinkId.set(a.id,a),a.id}addLineToLink(t,e){let i=this._dataByLinkId.get(t);if(i&&i.lines.every(r=>r.line!==e)){let r=this._bufferService.buffer.addMarker(e);i.lines.push(r),r.onDispose(()=>this._removeMarkerFromLink(i,r))}}getLinkData(t){return this._dataByLinkId.get(t)?.data}_getEntryIdKey(t){return`${t.id};;${t.uri}`}_removeMarkerFromLink(t,e){let i=t.lines.indexOf(e);i!==-1&&(t.lines.splice(i,1),t.lines.length===0&&(t.data.id!==void 0&&this._entriesWithId.delete(t.key),this._dataByLinkId.delete(t.id)))}};kt=y([m(0,D)],kt);var Tn=!1,mr=class extends g{constructor(e){super();this._windowsWrappingHeuristics=this._register(new B);this._onBinary=this._register(new b);this.onBinary=this._onBinary.event;this._onData=this._register(new b);this.onData=this._onData.event;this._onLineFeed=this._register(new b);this.onLineFeed=this._onLineFeed.event;this._onRender=this._register(new b);this.onRender=this._onRender.event;this._onResize=this._register(new b);this.onResize=this._onResize.event;this._onWriteParsed=this._register(new b);this.onWriteParsed=this._onWriteParsed.event;this._onScroll=this._register(new b);this._instantiationService=new Zi,this.optionsService=this._register(new ir(e)),this._instantiationService.setService(R,this.optionsService),this._logService=this._register(this._instantiationService.createInstance(wt)),this._instantiationService.setService(_e,this._logService),this._bufferService=this._register(this._instantiationService.createInstance(Dt)),this._instantiationService.setService(D,this._bufferService),this.coreService=this._register(this._instantiationService.createInstance(Lt)),this._instantiationService.setService(Y,this.coreService),this.mouseStateService=this._register(this._instantiationService.createInstance(rr)),this._instantiationService.setService(Me,this.mouseStateService),this.unicodeService=this._register(this._instantiationService.createInstance(me)),this.unicodeService.register(new sr),this._instantiationService.setService(Ws,this.unicodeService),this._charsetService=this._instantiationService.createInstance(nr),this._instantiationService.setService(Hs,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(kt),this._instantiationService.setService(bi,this._oscLinkService),this._inputHandler=this._register(new _r(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.mouseStateService,this.unicodeService)),this._register(j.forward(this._inputHandler.onLineFeed,this._onLineFeed)),this._register(j.forward(this._bufferService.onResize,this._onResize)),this._register(j.forward(this.coreService.onData,this._onData)),this._register(j.forward(this.coreService.onBinary,this._onBinary)),this._register(this.coreService.onRequestScrollToBottom(()=>this.scrollToBottom(!0))),this._register(this.coreService.onUserInput(()=>this._writeBuffer.handleUserInput())),this._register(this.optionsService.onMultipleOptionChange(["windowsPty"],()=>this._handleWindowsPtyOptionChange())),this._register(this._bufferService.onScroll(()=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)})),this._writeBuffer=this._register(new pr((i,r)=>this._inputHandler.parse(i,r))),this._register(j.forward(this._writeBuffer.onWriteParsed,this._onWriteParsed))}get onScroll(){return this._onScrollApi||(this._onScrollApi=this._register(new b),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(let i in e)this.optionsService.options[i]=e[i]}write(e,i){this._writeBuffer.write(e,i)}writeSync(e,i){this._logService.logLevel<=3&&!Tn&&(this._logService.warn("writeSync is unreliable and will be removed soon."),Tn=!0),this._writeBuffer.writeSync(e,i)}input(e,i=!0){this.coreService.triggerDataEvent(e,i)}resize(e,i){isNaN(e)||isNaN(i)||(e=Math.max(e,2),i=Math.max(i,1),this._writeBuffer.flushSync(),this._bufferService.resize(e,i))}scroll(e,i=!1){this._bufferService.scroll(e,i)}scrollLines(e,i){this._bufferService.scrollLines(e,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let i=e-this._bufferService.buffer.ydisp;i!==0&&this.scrollLines(i)}registerEscHandler(e,i){return this._inputHandler.registerEscHandler(e,i)}registerDcsHandler(e,i){return this._inputHandler.registerDcsHandler(e,i)}registerCsiHandler(e,i){return this._inputHandler.registerCsiHandler(e,i)}registerOscHandler(e,i){return this._inputHandler.registerOscHandler(e,i)}registerApcHandler(e,i){return this._inputHandler.registerApcHandler(e,i)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.mouseStateService.reset()}_handleWindowsPtyOptionChange(){let e=!1,i=this.optionsService.rawOptions.windowsPty;i&&i.backend!==void 0&&i.buildNumber!==void 0&&(e=i.backend==="conpty"&&i.buildNumber<21376),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){let e=[];e.push(this.onLineFeed(Ss.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},()=>(Ss(this._bufferService),!1))),this._windowsWrappingHeuristics.value=E(()=>{for(let i of e)i.dispose()})}}};var z=0,br=class{constructor(t,e){this._getKey=t;this._array=[];this._insertedValues=[];this._isFlushingInserted=!1;this._deletedIndices=[];this._isFlushingDeleted=!1;this._flushInsertedTask=new Ct(e),this._flushDeletedTask=new Ct(e)}clear(){this._array.length=0,this._insertedValues.length=0,this._flushInsertedTask.clear(),this._isFlushingInserted=!1,this._deletedIndices.length=0,this._flushDeletedTask.clear(),this._isFlushingDeleted=!1}insert(t){this._flushCleanupDeleted(),this._insertedValues.length===0&&this._flushInsertedTask.enqueue(()=>this._flushInserted()),this._insertedValues.push(t)}_flushInserted(){let t=this._insertedValues.sort((s,o)=>this._getKey(s)-this._getKey(o)),e=0,i=0,r=new Array(this._array.length+this._insertedValues.length);for(let s=0;s=this._array.length||this._getKey(t[e])<=this._getKey(this._array[i])?(r[s]=t[e],e++):r[s]=this._array[i++];this._array=r,this._insertedValues.length=0}_flushCleanupInserted(){!this._isFlushingInserted&&this._insertedValues.length>0&&this._flushInsertedTask.flush()}delete(t){if(this._flushCleanupInserted(),this._array.length===0)return!1;let e=this._getKey(t);return e===void 0?!1:this._deleteAtKey(t,e)?!0:this._deletedIndices.length===0?!1:(this._flushCleanupDeleted(),this._deleteAtKey(t,e))}_deleteAtKey(t,e){if(z=this._search(e),z===-1||this._getKey(this._array[z])!==e)return!1;do if(this._array[z]===t)return this._deletedIndices.length===0&&this._flushDeletedTask.enqueue(()=>this._flushDeleted()),this._deletedIndices.push(z),!0;while(++zs-o),e=0,i=new Array(this._array.length-t.length),r=0;for(let s=0;s0&&this._flushDeletedTask.flush()}*getKeyIterator(t){if(this._flushCleanupInserted(),this._flushCleanupDeleted(),this._array.length!==0&&(z=this._search(t),!(z<0||z>=this._array.length)&&this._getKey(this._array[z])===t))do yield this._array[z];while(++z=this._array.length)&&this._getKey(this._array[z])===t))do e(this._array[z]);while(++z=e;){let r=e+i>>1,s=this._getKey(this._array[r]);if(s>t)i=r-1;else if(s0&&this._getKey(this._array[r-1])===t;)r--;return r}}return e}};var Pt=0,vr=0,Mt=class extends g{constructor(e,i){super();this._logService=e;this._bufferService=i;this._lineCache=this._register(new ys);this._onDecorationRegistered=this._register(new b);this.onDecorationRegistered=this._onDecorationRegistered.event;this._onDecorationRemoved=this._register(new b);this.onDecorationRemoved=this._onDecorationRemoved.event;this._decorations=new br(r=>r?.marker.line,this._logService),this._register(E(()=>this.reset())),this._register(this._bufferService.buffers.onBufferActivate(()=>{this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)})),this._lineCache.attachToBufferLines(this._bufferService.buffer.lines)}get decorations(){return this._decorations.values()}registerDecoration(e){if(e.marker.isDisposed)return;let i=new xs(e);if(i){let r=i.marker.onDispose(()=>i.dispose()),s=i.onDispose(()=>{s.dispose(),i&&(this._decorations.delete(i)&&(this._lineCache.remove(i),this._onDecorationRemoved.fire(i)),r.dispose())});this._decorations.insert(i),this._lineCache.add(i),this._onDecorationRegistered.fire(i)}return i}reset(){for(let e of this._decorations.values())e.dispose();this._decorations.clear(),this._lineCache.clear()}*getDecorationsAtCell(e,i,r){let s=this._lineCache.getDecorationsOnLine(i);if(s)for(let o of s)Pt=o.options.x??0,vr=Pt+(o.options.width??1),e>=Pt&&e=Pt&&ethis._handleBufferLinesTrim(r))),i.add(e.onInsert(r=>this._handleBufferLinesInsert(r))),i.add(e.onDelete(r=>this._handleBufferLinesDelete(r)))}_getDecorationHeight(e){return e.options.height??1}_addToLineBuckets(e){let i=e.marker.line;if(i<0)return;e._indexedStartLine=i;let r=this._getDecorationHeight(e);for(let s=i;s=0&&this._addToLineBuckets(e)}_scheduleLineIndexSync(e){this._lineIndexSyncCallbacks.push(e),this._lineIndexSyncTimer.set(()=>{let i=this._lineIndexSyncCallbacks;this._lineIndexSyncCallbacks=[];for(let r of i)r()})}_handleBufferLinesTrim(e){if(e<=0||!this._decorationsByLine.size)return;let i=new Map;for(let[r,s]of this._decorationsByLine){let o=r-e;o<0||this._mergeLineBucket(i,o,s)}this._decorationsByLine.clear();for(let[r,s]of i)this._decorationsByLine.set(r,s);for(let r of this._decorations)r.marker.isDisposed||(r._indexedStartLine-=e)}_handleBufferLinesInsert(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesInsert(e))}_handleBufferLinesDelete(e){this._scheduleLineIndexSync(()=>this._applyBufferLinesDelete(e))}_mergeLineBucket(e,i,r){let s=e.get(i);if(s)for(let o=0,a=r.length;oi&&(s.push(a),this._removeFromLineBuckets(a))}let o=new Map;for(let[a,l]of this._decorationsByLine){let h=a>=i?a+r:a;this._mergeLineBucket(o,h,l)}this._decorationsByLine.clear();for(let[a,l]of o)this._decorationsByLine.set(a,l);for(let a of this._decorations)a.marker.isDisposed||a._indexedStartLine>=i&&(a._indexedStartLine=a.marker.line);for(let a of s)this._addToLineBuckets(a)}_applyBufferLinesDelete(e){let i=e.index+e.amount,r=new Map;for(let[o,a]of this._decorationsByLine){if(o>=e.index&&o=i?o-e.amount:o;this._mergeLineBucket(r,l,a)}this._decorationsByLine.clear();for(let[o,a]of r)this._decorationsByLine.set(o,a);let s=[];for(let o of this._decorations){if(o.marker.isDisposed)continue;let a=o._indexedStartLine,l=this._getDecorationHeight(o);a>=i?o._indexedStartLine=o.marker.line:ai&&s.push(o)}for(let o of s)this._reindexDecoration(o)}},xs=class extends pe{constructor(e){super();this.options=e;this.onRenderEmitter=this.add(new b);this.onRender=this.onRenderEmitter.event;this._onDispose=this.add(new b);this.onDispose=this._onDispose.event;this._cachedBg=null;this._cachedFg=null;this.marker=e.marker,this._indexedStartLine=e.marker.line,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}get backgroundColorRGB(){return this._cachedBg===null&&(this.options.backgroundColor?this._cachedBg=M.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return this._cachedFg===null&&(this.options.foregroundColor?this._cachedFg=M.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}dispose(){this._onDispose.fire(),super.dispose()}};var xo=1e3,Sr=class{constructor(t,e=xo){this._renderCallback=t;this._debounceThresholdMS=e;this._lastRefreshMs=0;this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0),this._additionalRefreshRequested=!1}refresh(t,e,i){this._rowCount=i,t=t??0,e=e??this._rowCount-1,this._rowStart=this._rowStart!==void 0?Math.min(this._rowStart,t):t,this._rowEnd=this._rowEnd!==void 0?Math.max(this._rowEnd,e):e;let r=performance.now();if(r-this._lastRefreshMs>=this._debounceThresholdMS)this._refreshTimeoutID!==void 0&&(clearTimeout(this._refreshTimeoutID),this._refreshTimeoutID=void 0,this._additionalRefreshRequested=!1),this._lastRefreshMs=r,this._innerRefresh();else if(!this._additionalRefreshRequested){let s=r-this._lastRefreshMs,o=this._debounceThresholdMS-s;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout(()=>{this._lastRefreshMs=performance.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0},o)}}_innerRefresh(){if(this._rowStart===void 0||this._rowEnd===void 0||this._rowCount===void 0)return;let t=Math.max(this._rowStart,0),e=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(t,e)}};var Dn=!1,je=class extends g{constructor(e,i,r,s){super();this._terminal=e;this._coreBrowserService=r;this._renderService=s;this._rowColumns=new WeakMap;this._liveRegionLineCount=0;this._charsToConsume=[];this._charsToAnnounce="";let o=this._coreBrowserService.mainDocument;this._accessibilityContainer=o.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=o.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let a=0;athis._handleBoundaryFocus(a,0),this._bottomBoundaryFocusListener=a=>this._handleBoundaryFocus(a,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=o.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this._register(new Sr(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");Dn?(this._accessibilityContainer.classList.add("debug"),this._rowContainer.classList.add("debug"),this._debugRootContainer=o.createElement("div"),this._debugRootContainer.classList.add("xterm"),this._debugRootContainer.appendChild(o.createTextNode("------start a11y------")),this._debugRootContainer.appendChild(this._accessibilityContainer),this._debugRootContainer.appendChild(o.createTextNode("------end a11y------")),this._terminal.element.insertAdjacentElement("afterend",this._debugRootContainer)):this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this._register(this._terminal.onResize(a=>this._handleResize(a.rows))),this._register(this._terminal.onRender(a=>this._refreshRows(a.start,a.end))),this._register(this._terminal.onScroll(()=>this._refreshRows())),this._register(this._terminal.onA11yChar(a=>this._handleChar(a))),this._register(this._terminal.onLineFeed(()=>this._handleChar(` ++`))),this._register(this._terminal.onA11yTab(a=>this._handleTab(a))),this._register(this._terminal.onKey(a=>this._handleKey(a.key))),this._register(this._terminal.onBlur(()=>this._clearLiveRegion())),this._register(this._renderService.onDimensionsChange(()=>this._refreshRowsDimensions())),this._register(I(o,"selectionchange",()=>this._handleSelectionChange())),this._register(this._coreBrowserService.onDprChange(()=>this._refreshRowsDimensions())),this._refreshRowsDimensions(),this._refreshRows(),this._register(E(()=>{Dn?this._debugRootContainer.remove():this._accessibilityContainer.remove(),this._rowElements.length=0}))}_handleTab(e){for(let i=0;i0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,e===` ++`&&(this._liveRegionLineCount++,this._liveRegionLineCount===21&&(this._liveRegion.textContent=Je.get())))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,i){this._liveRegionDebouncer.refresh(e,i,this._terminal.rows)}_renderRows(e,i){let r=this._terminal.buffer,s=r.lines.length.toString();for(let o=e;o<=i;o++){let a=r.lines.get(r.ydisp+o),l=[],h=a?.translateToString(!0,void 0,void 0,l)||"",d=(r.ydisp+o+1).toString(),c=this._rowElements[o];c&&(h.length===0?(c.textContent="\xA0",this._rowColumns.set(c,[0,1])):(c.textContent=h,this._rowColumns.set(c,l)),c.setAttribute("aria-posinset",d),c.setAttribute("aria-setsize",s),this._alignRowWidth(c))}this._announceCharacters()}_announceCharacters(){this._charsToAnnounce.length!==0&&(this._liveRegion.textContent===Je.get()&&this._clearLiveRegion(),this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,i){let r=e.target,s=this._rowElements[i===0?1:this._rowElements.length-2],o=r.getAttribute("aria-posinset"),a=i===0?"1":`${this._terminal.buffer.lines.length}`;if(o===a||e.relatedTarget!==s)return;let l,h;if(i===0?(l=r,h=this._rowElements.pop(),this._rowContainer.removeChild(h)):(l=this._rowElements.shift(),h=r,this._rowContainer.removeChild(l)),l.removeEventListener("focus",this._topBoundaryFocusListener),h.removeEventListener("focus",this._bottomBoundaryFocusListener),i===0){let d=this._createAccessibilityTreeNode();this._rowElements.unshift(d),this._rowContainer.insertAdjacentElement("afterbegin",d)}else{let d=this._createAccessibilityTreeNode();this._rowElements.push(d),this._rowContainer.appendChild(d)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(i===0?-1:1),this._rowElements[i===0?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(this._rowElements.length===0)return;let e=this._coreBrowserService.mainDocument.getSelection();if(!e)return;if(e.isCollapsed){this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection();return}if(!e.anchorNode||!e.focusNode){console.error("anchorNode and/or focusNode are null");return}let i={node:e.anchorNode,offset:e.anchorOffset},r={node:e.focusNode,offset:e.focusOffset};if((i.node.compareDocumentPosition(r.node)&Node.DOCUMENT_POSITION_PRECEDING||i.node===r.node&&i.offset>r.offset)&&([i,r]=[r,i]),i.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(i={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(i.node))return;let s=this._rowElements.slice(-1)[0];if(r.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(r={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(r.node))return;let o=({node:h,offset:d})=>{let c=h instanceof Text?h.parentNode:h,u=parseInt(c?.getAttribute("aria-posinset"),10)-1;if(isNaN(u))return console.warn("row is invalid. Race condition?"),null;let _=this._rowColumns.get(c);if(!_)return console.warn("columns is null. Race condition?"),null;let p=d<_.length?_[d]:_.slice(-1)[0]+1;return p>=this._terminal.cols&&(++u,p=0),{row:u,column:p}},a=o(i),l=o(r);if(!(!a||!l)){if(a.row>l.row||a.row===l.row&&a.column>=l.column)throw new Error("invalid range");this._terminal.select(a.column,a.row,(l.row-a.row)*this._terminal.cols-a.column+l.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let i=this._rowContainer.children.length;ie;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){let 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){Object.assign(this._accessibilityContainer.style,{width:`${this._renderService.dimensions.css.canvas.width}px`,fontSize:`${this._terminal.options.fontSize}px`}),this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{Ne(this._linkCacheDisposables),this._linkCacheDisposables.length=0,this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()})),this._register(this._bufferService.onResize(()=>{this._clearCurrentLink(),this._wasResized=!0})),this._register(I(this._element,"mouseleave",()=>{this._isMouseOut=!0,this._clearCurrentLink()})),this._register(I(this._element,"mousemove",this._handleMouseMove.bind(this))),this._register(I(this._element,"mousedown",this._handleMouseDown.bind(this))),this._register(I(this._element,"mouseup",this._handleMouseUp.bind(this)))}get currentLink(){return this._currentLink}_handleMouseMove(e){this._lastMouseEvent=e;let i=this._positionFromMouseEvent(e,this._element);if(!i)return;this._isMouseOut=!1;let r=e.composedPath();for(let s=0;s{s?.forEach(o=>{o.link.dispose&&o.link.dispose()})}),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(let[s,o]of this._linkProviderService.linkProviders.entries())i?this._activeProviderReplies?.get(s)&&(r=this._checkLinkProviderResult(s,e,r)):o.provideLinks(e.y,a=>{if(this._isMouseOut)return;let l=a?.map(h=>({link:h}));this._activeProviderReplies?.set(s,l),r=this._checkLinkProviderResult(s,e,r),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)})}_removeIntersectingLinks(e,i){let r=new Set;for(let s=0;se?this._bufferService.cols:l.link.range.end.x;for(let c=h;c<=d;c++){if(r.has(c)){o.splice(a--,1);break}r.add(c)}}}}_checkLinkProviderResult(e,i,r){if(!this._activeProviderReplies)return r;let s=this._activeProviderReplies.get(e),o=!1;for(let a=0;athis._linkAtPosition(l.link,i));a&&(r=!0,this._handleNewLink(a))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!r)for(let a=0;athis._linkAtPosition(h.link,i));if(l){r=!0,this._handleNewLink(l);break}}return r}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;let i=this._positionFromMouseEvent(e,this._element);i&&this._mouseDownLink&&wo(this._mouseDownLink.link,this._currentLink.link)&&this._linkAtPosition(this._currentLink.link,i)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,i){!this._currentLink||!this._lastMouseEvent||(!e||!i||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=i)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,Ne(this._linkCacheDisposables),this._linkCacheDisposables.length=0)}_handleNewLink(e){if(!this._lastMouseEvent)return;let i=this._positionFromMouseEvent(this._lastMouseEvent,this._element);i&&this._linkAtPosition(e.link,i)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:e.link.decorations===void 0?!0:e.link.decorations.underline,pointerCursor:e.link.decorations===void 0?!0: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:r=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==r&&(this._currentLink.state.decorations.pointerCursor=r,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",r))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:r=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==r&&(this._currentLink.state.decorations.underline=r,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,r))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(r=>{if(!this._currentLink)return;let s=r.start===0?0:r.start+1+this._bufferService.buffer.ydisp,o=this._bufferService.buffer.ydisp+1+r.end;if(this._currentLink.link.range.start.y>=s&&this._currentLink.link.range.end.y<=o&&(this._clearCurrentLink(s,o),this._lastMouseEvent)){let a=this._positionFromMouseEvent(this._lastMouseEvent,this._element);a&&this._askForLink(a,!1)}})))}_linkHover(e,i,r){this._currentLink?.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(i,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),i.hover&&i.hover(r,i.text)}_fireUnderlineEvent(e,i){let r=e.range,s=this._bufferService.buffer.ydisp,o=this._createLinkUnderlineEvent(r.start.x-1,r.start.y-s-1,r.end.x,r.end.y-s-1,void 0);(i?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(o)}_linkLeave(e,i,r){this._currentLink?.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(i,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),i.leave&&i.leave(r,i.text)}_linkAtPosition(e,i){let r=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,o=i.y*this._bufferService.cols+i.x;return r<=o&&o<=s}_positionFromMouseEvent(e,i){let r=this._mouseCoordsService.getCoords(e,i,this._bufferService.cols,this._bufferService.rows);if(r)return{x:r[0],y:r[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,i,r,s,o){return{x1:e,y1:i,x2:r,y2:s,cols:this._bufferService.cols,fg:o}}};Bt=y([m(1,Oe),m(2,V),m(3,D),m(4,gi)],Bt);function wo(n,t){return n.text===t.text&&n.range.start.x===t.range.start.x&&n.range.start.y===t.range.start.y&&n.range.end.x===t.range.end.x&&n.range.end.y===t.range.end.y}var gr=class extends mr{constructor(e={}){super(e);this._linkifier=this._register(new B);this.browser=ze;this._keyDownHandled=!1;this._keyDownSeen=!1;this._keyPressHandled=!1;this._unprocessedDeadKey=!1;this._accessibilityManager=this._register(new B);this._onCursorMove=this._register(new b);this.onCursorMove=this._onCursorMove.event;this._onKey=this._register(new b);this.onKey=this._onKey.event;this._onSelectionChange=this._register(new b);this.onSelectionChange=this._onSelectionChange.event;this._onTitleChange=this._register(new b);this.onTitleChange=this._onTitleChange.event;this._onBell=this._register(new b);this.onBell=this._onBell.event;this._onFocus=this._register(new b);this._onBlur=this._register(new b);this._onA11yCharEmitter=this._register(new b);this._onA11yTabEmitter=this._register(new b);this._onWillOpen=this._register(new b);this._onDimensionsChange=this._register(new b);this.onDimensionsChange=this._onDimensionsChange.event;this._setup(),this._decorationService=this._instantiationService.createInstance(Mt),this._instantiationService.setService(ge,this._decorationService),this._keyboardService=this._instantiationService.createInstance(xt),this._instantiationService.setService(Ks,this._keyboardService),this._linkProviderService=this._instantiationService.createInstance(Ki),this._instantiationService.setService(gi,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(tt)),this._register(this._inputHandler.onRequestBell(()=>this._onBell.fire())),this._register(this._inputHandler.onRequestRefreshRows(i=>this.refresh(i?.start??0,i?.end??this.rows-1))),this._register(this._inputHandler.onRequestSendFocus(()=>this._reportFocus())),this._register(this._inputHandler.onRequestReset(()=>this.reset())),this._register(this._inputHandler.onRequestWindowsOptionsReport(i=>this._reportWindowsOptions(i))),this._register(this._inputHandler.onColor(i=>this._handleColorEvent(i))),this._register(j.forward(this._inputHandler.onCursorMove,this._onCursorMove)),this._register(j.forward(this._inputHandler.onTitleChange,this._onTitleChange)),this._register(j.forward(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this._register(j.forward(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this._register(this._bufferService.onResize(i=>this._afterResize(i.cols,i.rows))),this._register(E(()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)}))}get linkifier(){return this._linkifier.value}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}get dimensions(){if(!this._renderService)return;let e=this._renderService.dimensions;return{css:{canvas:{...e.css.canvas},cell:{...e.css.cell}},device:{canvas:{...e.device.canvas},cell:{...e.device.cell},char:{...e.device.char}}}}_handleColorEvent(e){if(this._themeService)for(let i of e){let r,s;switch(i.index){case 256:r="foreground",s="10";break;case 257:r="background",s="11";break;case 258:r="cursor",s="12";break;default:r="ansi",s="4;"+i.index}switch(i.type){case 0:let o=L.toColorRGB(r==="ansi"?this._themeService.colors.ansi[i.index]:this._themeService.colors[r]);this.coreService.triggerDataEvent(`\x1B]${s};${In(o)}\x1B\\`);break;case 1:if(r==="ansi")this._themeService.modifyColors(a=>a.ansi[i.index]=O.toColor(...i.color));else{let a=r;this._themeService.modifyColors(l=>l[a]=O.toColor(...i.color))}break;case 2:this._themeService.restoreColor(i.index);break}}}_reportColorScheme(){if(!this._themeService)return;let e=Z.relativeLuminance(this._themeService.colors.background.rgba>>8),i=Z.relativeLuminance(this._themeService.colors.foreground.rgba>>8),r=e{this.hasSelection()&&Bs(i,this._selectionService)}));let e=i=>Os(i,this.textarea,this.coreService,this.optionsService);this._register(I(this.textarea,"paste",e)),this._register(I(this.element,"paste",e)),ot?this._register(I(this.element,"mousedown",i=>{i.button===2&&Or(i,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})):this._register(I(this.element,"contextmenu",i=>{Or(i,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)})),zt&&this._register(I(this.element,"auxclick",i=>{i.button===1&&Br(i,this.textarea,this.screenElement)}))}_bindKeys(){this._register(I(this.textarea,"keyup",e=>this._keyUp(e),!0)),this._register(I(this.textarea,"keydown",e=>this._keyDown(e),!0)),this._register(I(this.textarea,"keypress",e=>this._keyPress(e),!0)),this._register(I(this.textarea,"compositionstart",()=>{this._syncTextArea(),this._compositionHelper.compositionstart(),this._compositionHelper.updateCompositionElements()})),this._register(I(this.textarea,"compositionupdate",e=>this._compositionHelper.compositionupdate(e))),this._register(I(this.textarea,"compositionend",e=>{this._compositionHelper instanceof Ee?this._compositionHelper.compositionend(e)&&this.textarea.dispatchEvent(new CustomEvent("xterm-composition-transaction-accepted",{bubbles:!0})):this._compositionHelper.compositionend()})),this._register(I(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){this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView);return}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"),this.element.classList.toggle("allow-transparency",this.options.allowTransparency),this._register(this.optionsService.onSpecificOptionChange("allowTransparency",l=>this.element.classList.toggle("allow-transparency",l))),e.appendChild(this.element);let i=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),i.appendChild(this._viewportElement),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._register(I(this.screenElement,"mousemove",l=>this.updateCursorStyle(l))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),i.appendChild(this.screenElement);let r=this.textarea=this._document.createElement("textarea");this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",Ut.get()),$r||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocomplete","off"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._register(this.optionsService.onSpecificOptionChange("disableStdin",()=>r.readOnly=this.optionsService.rawOptions.disableStdin)),this.textarea.readOnly=this.optionsService.rawOptions.disableStdin,this._coreBrowserService=this._register(this._instantiationService.createInstance(Ui,this.textarea,e.ownerDocument.defaultView??window,this._document??(typeof window<"u"?window.document:null))),this._instantiationService.setService(G,this._coreBrowserService),this._register(I(this.textarea,"focus",l=>this._handleTextAreaFocus(l))),this._register(I(this.textarea,"blur",()=>this._handleTextAreaBlur())),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(bt,this._document,this._helperContainer),this._instantiationService.setService(Be,this._charSizeService),this._themeService=this._instantiationService.createInstance(yt),this._instantiationService.setService(ce,this._themeService),this._register(this._inputHandler.onRequestColorSchemeQuery(()=>this._reportColorScheme())),this._register(this._themeService.onChangeColors(()=>{this.coreService.decPrivateModes.colorSchemeUpdates&&this._reportColorScheme()})),this._characterJoinerService=this._instantiationService.createInstance(We),this._instantiationService.setService(Si,this._characterJoinerService),this._renderService=this._register(this._instantiationService.createInstance(It,this.rows,this.screenElement)),this._instantiationService.setService(V,this._renderService),this._register(this._renderService.onRenderedViewportChange(l=>this._onRender.fire(l))),this._register(this._renderService.onDimensionsChange(l=>this._onDimensionsChange.fire({css:{canvas:{...l.css.canvas},cell:{...l.css.cell}},device:{canvas:{...l.device.canvas},cell:{...l.device.cell},char:{...l.device.char}}}))),this.onResize(l=>this._renderService.resize(l.cols,l.rows)),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(Ee,this.textarea,this._compositionView),this._register(E(()=>{this._compositionHelper instanceof Ee&&this._compositionHelper.dispose()})),this._helperContainer.appendChild(this._compositionView),this._mouseCoordsService=this._instantiationService.createInstance(vt),this._instantiationService.setService(Oe,this._mouseCoordsService);let s=this._linkifier.value=this._register(this._instantiationService.createInstance(Bt,this.screenElement));this.element.appendChild(i);try{this._onWillOpen.fire(this.element)}catch(l){this._logService.error("onWillOpen handler threw an exception",l)}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._register(this.onCursorMove(()=>{this._renderService.handleCursorMove(),this._syncTextArea()})),this._register(this.onResize(()=>{this._renderService.handleResize(this.cols,this.rows),this._syncTextArea()})),this._register(this.onBlur(()=>this._renderService.handleBlur())),this._register(this.onFocus(()=>this._renderService.handleFocus())),this._viewport=this._register(this._instantiationService.createInstance(ut,this.element,this.screenElement)),this._register(this._viewport.onRequestScrollLines(l=>{super.scrollLines(l,!1),this.refresh(0,this.rows-1)})),this._selectionService=this._register(this._instantiationService.createInstance(Et,this.element,this.screenElement,s)),this._instantiationService.setService(vi,this._selectionService),this._mouseService=this._instantiationService.createInstance(gt),this._instantiationService.setService(Us,this._mouseService),this._register(this._selectionService.onRequestScrollLines(l=>this.scrollLines(l.amount,l.suppressScrollEvent))),this._register(this._selectionService.onSelectionChange(()=>this._onSelectionChange.fire())),this._register(this._selectionService.onRequestRedraw(l=>this._renderService.handleSelectionChanged(l.start,l.end,l.columnSelectMode))),this._register(this._selectionService.onLinuxMouseSelection(l=>{this.textarea.value=l,this.textarea.focus(),this.textarea.select()})),this._register(j.any(this._onScroll.event,this._inputHandler.onScroll)(()=>{this._selectionService.refresh(),this._viewport?.queueSync()})),this._register(this._instantiationService.createInstance(ft,this.screenElement)),this._register(I(this.element,"mousedown",l=>this._selectionService.handleMouseDown(l))),this.mouseStateService.areMouseEventsActive&&!this.options.mouseEventsRequireAlt?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):(this._selectionService.enable(),this.element.classList.remove("enable-mouse-events")),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(je,this)),this._register(this.optionsService.onSpecificOptionChange("screenReaderMode",l=>this._handleScreenReaderModeOptionChange(l)));let o=this.options.scrollbar?.showScrollbar??!0,a=this.options.scrollbar?.width;o&&a&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(Ge,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("scrollbar",l=>{let h=(l?.showScrollbar??!0)&&!!l?.width;!this._overviewRulerRenderer&&h&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this._register(this._instantiationService.createInstance(Ge,this._viewportElement,this.screenElement)))}),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this._mouseService.bindMouse({element:this.element,screenElement:this.screenElement,document:this._document,handleTouchScroll:l=>this._viewport?.handleTouchScroll(l)},l=>this._register(l),()=>this.focus())}_createRenderer(){return this._instantiationService.createInstance(mt,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}refresh(e,i,r=!1){this._renderService?.refreshRows(e,i,r)}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,i){this._viewport?this._viewport.scrollLines(e):super.scrollLines(e,i),this.refresh(0,this.rows-1)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(e){e&&this._viewport?this._viewport.scrollToLine(this.buffer.ybase,!0):this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){let i=e-this._bufferService.buffer.ydisp;i!==0&&this.scrollLines(i)}paste(e){Mr(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this.mouseStateService.setCustomWheelEventHandler(e)}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");let i=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),i}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:!1}select(e,i,r){this._selectionService.setSelection(e,i,r)}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,i){this._selectionService?.selectLines(e,i)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;let i=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!i&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(!0),!1;!i&&(e.key==="Dead"||e.key==="AltGraph")&&(this._unprocessedDeadKey=!0);let r=this._keyboardService.evaluateKeyDown(e);if(this.updateCursorStyle(e),r.type===3||r.type===2){let o=this.rows-1;return this.scrollLines(r.type===2?-o:o),e.preventDefault(),e.stopPropagation(),!1}if(r.type===1&&this.selectAll(),this._isThirdLevelShift(this.browser,e)||(r.cancel&&(e.preventDefault(),e.stopPropagation()),!r.key)||!this._keyboardService.useKitty&&!this._keyboardService.useWin32InputMode&&e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.key.length===1&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)return!0;if(this._unprocessedDeadKey)return this._unprocessedDeadKey=!1,!0;(r.key===""||r.key==="\r")&&(this.textarea.value="");let s=this._keyboardService.useWin32InputMode&&ws(e);if(this._onKey.fire({key:r.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(r.key,!s),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey)return e.preventDefault(),e.stopPropagation(),!1;this._keyDownHandled=!0}_isThirdLevelShift(e,i){let r=e.isMac&&!this.options.macOptionIsMeta&&i.altKey&&!i.ctrlKey&&!i.metaKey||e.isWindows&&i.altKey&&i.ctrlKey&&!i.metaKey||e.isWindows&&i.getModifierState("AltGraph");return i.type==="keypress"?r:r&&(!i.keyCode||i.keyCode>47)}_keyUp(e){if(this._keyDownSeen=!1,this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return;ws(e)||this.focus();let i=this._keyboardService.evaluateKeyUp(e);if(i?.key){let r=this._keyboardService.useWin32InputMode&&ws(e);this.coreService.triggerDataEvent(i.key,!r)}this.updateCursorStyle(e),this._keyPressHandled=!1}_keyPress(e){let i;if(this._keyPressHandled=!1,this._keyDownHandled||this._customKeyEventHandler&&this._customKeyEventHandler(e)===!1)return!1;if(e.charCode)i=e.charCode;else if(e.which===null||e.which===void 0)i=e.keyCode;else if(e.which!==0&&e.charCode!==0)i=e.which;else return!1;return!i||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)?!1:(i=String.fromCharCode(i),this._onKey.fire({key:i,domEvent:e}),this._showCursor(),this._compositionHelper.keypress?.(i)||this.coreService.triggerDataEvent(i,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,!0)}_inputEvent(e){if(e.data&&e.inputType==="insertText"&&!this.optionsService.rawOptions.screenReaderMode&&this._compositionHelper instanceof Ee&&this._compositionHelper.input(e.data))return!0;if(e.data&&e.inputType==="insertText"&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;let i=e.data;return this.coreService.triggerDataEvent(i,!0),!0}return!1}resize(e,i){if(e===this.cols&&i===this.rows){this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure();return}super.resize(e,i)}_afterResize(e,i){this._charSizeService?.measure()}clear(){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=0;t--)this._addons[t].instance.dispose()}loadAddon(t,e){let i={instance:e,dispose:e.dispose,isDisposed:!1};this._addons.push(i),e.dispose=()=>this._wrappedAddonDispose(i),e.activate(t)}_wrappedAddonDispose(t){if(t.isDisposed)return;let e=-1;for(let i=0;i=this._line.length))return e?(this._line.loadCell(t,e),e):this._line.loadCell(t,new F)}translateToString(t,e,i){return this._line.translateToString(t,e,i)}};var hi=class{constructor(t,e){this._buffer=t;this.type=e}init(t){return this._buffer=t,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(t){let e=this._buffer.lines.get(t);if(e)return new Ir(e)}getNullCell(){return new F}};var Er=class extends g{constructor(e){super();this._core=e;this._onBufferChange=this._register(new b);this.onBufferChange=this._onBufferChange.event;this._normal=new hi(this._core.buffers.normal,"normal"),this._alternate=new hi(this._core.buffers.alt,"alternate"),this._register(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)}};var yr=class{constructor(t){this._core=t}registerCsiHandler(t,e){return this._core.registerCsiHandler(t,i=>e(i.toArray()))}addCsiHandler(t,e){return this.registerCsiHandler(t,e)}registerDcsHandler(t,e){return this._core.registerDcsHandler(t,(i,r)=>e(i,r.toArray()))}addDcsHandler(t,e){return this.registerDcsHandler(t,e)}registerEscHandler(t,e){return this._core.registerEscHandler(t,e)}addEscHandler(t,e){return this.registerEscHandler(t,e)}registerOscHandler(t,e){return this._core.registerOscHandler(t,e)}addOscHandler(t,e){return this.registerOscHandler(t,e)}registerApcHandler(t,e){return this._core.registerApcHandler(t,e)}};var xr=class{constructor(t){this._core=t}register(t){this._core.unicodeService.register(t)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(t){this._core.unicodeService.activeVersion=t}};var To=["cols","rows"],ye=0,Rn=class extends g{constructor(t){super(),this._core=this._register(new gr(t)),this._addonManager=this._register(new Cr),this._publicOptions={...this._core.options};let e=r=>this._core.options[r],i=(r,s)=>{this._checkReadonlyOptions(r),this._core.options[r]=s};for(let r in this._core.options){let s={get:e.bind(this,r),set:i.bind(this,r)};Object.defineProperty(this._publicOptions,r,s)}}_checkReadonlyOptions(t){if(To.includes(t))throw new Error(`Option "${t}" 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 onDimensionsChange(){return this._core.onDimensionsChange}get element(){return this._core.element}get screenElement(){return this._core.screenElement}get parser(){return this._parser??=new yr(this._core)}get unicode(){return this._checkProposedApi(),new xr(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._register(new Er(this._core))}get markers(){return this._core.markers}get modes(){let t=this._core.coreService.decPrivateModes,e="none";switch(this._core.mouseStateService.activeProtocol){case"X10":e="x10";break;case"VT200":e="vt200";break;case"DRAG":e="drag";break;case"ANY":e="any";break}return{applicationCursorKeysMode:t.applicationCursorKeys,applicationKeypadMode:t.applicationKeypad,bracketedPasteMode:t.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:e,originMode:t.origin,reverseWraparoundMode:t.reverseWraparound,sendFocusMode:t.sendFocus,showCursor:!this._core.coreService.isCursorHidden,synchronizedOutputMode:t.synchronizedOutput,win32InputMode:t.win32InputMode,wraparoundMode:t.wraparound}}get dimensions(){return this._core.dimensions}get options(){return this._publicOptions}set options(t){for(let e in t)this._publicOptions[e]=t[e]}blur(){this._core.blur()}focus(){this._core.focus()}input(t,e=!0){this._core.input(t,e)}resize(t,e){this._verifyIntegers(t,e),this._core.resize(t,e)}open(t){this._core.open(t)}attachCustomKeyEventHandler(t){this._core.attachCustomKeyEventHandler(t)}attachCustomWheelEventHandler(t){this._core.attachCustomWheelEventHandler(t)}registerLinkProvider(t){return this._core.registerLinkProvider(t)}registerCharacterJoiner(t){return this._core.registerCharacterJoiner(t)}deregisterCharacterJoiner(t){this._core.deregisterCharacterJoiner(t)}registerMarker(t=0){return this._verifyIntegers(t),this._core.registerMarker(t)}registerDecoration(t){return this._verifyPositiveIntegers(t.x??0,t.width??0,t.height??0),this._core.registerDecoration(t)}hasSelection(){return this._core.hasSelection()}select(t,e,i){this._verifyIntegers(t,e,i),this._core.select(t,e,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(t,e){this._verifyIntegers(t,e),this._core.selectLines(t,e)}dispose(){super.dispose()}scrollLines(t){this._verifyIntegers(t),this._core.scrollLines(t)}scrollPages(t){this._verifyIntegers(t),this._core.scrollPages(t)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(t){this._verifyIntegers(t),this._core.scrollToLine(t)}clear(){this._core.clear()}write(t,e){this._core.write(t,e)}writeln(t,e){this._core.write(t),this._core.write(`\r ++`,e)}paste(t){this._core.paste(t)}refresh(t,e){this._verifyIntegers(t,e),this._core.refresh(t,e)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(t){this._addonManager.loadAddon(this,t)}static get strings(){return{get promptLabel(){return Ut.get()},set promptLabel(t){Ut.set(t)},get tooMuchOutput(){return Je.get()},set tooMuchOutput(t){Je.set(t)}}}_verifyIntegers(...t){for(ye of t)if(ye===1/0||isNaN(ye)||ye%1!==0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...t){for(ye of t)if(ye&&(ye===1/0||isNaN(ye)||ye%1!==0||ye<0))throw new Error("This API only accepts positive integers")}};export{Rn as Terminal}; //# sourceMappingURL=xterm.mjs.map diff --git a/lib/xterm.mjs.map b/lib/xterm.mjs.map -index 008be242620e5d914b4313743a98afbd95449852..63d0881f4d818d9ead7a8c3546fe239ebfcebeba 100644 +index 38c209dfa7c55a2dc4d6e3afd7c04397ca8fdaca..38cf3039bfa35de6f2b0e2ea8d0d64989b05df36 100644 --- a/lib/xterm.mjs.map +++ b/lib/xterm.mjs.map @@ -1,7 +1,7 @@ { "version": 3, -- "sources": ["../src/browser/LocalizableStrings.ts", "../src/browser/Clipboard.ts", "../src/common/input/TextDecoder.ts", "../src/common/buffer/AttributeData.ts", "../src/common/buffer/CellData.ts", "../src/common/services/ServiceRegistry.ts", "../src/common/services/Services.ts", "../src/browser/OscLinkProvider.ts", "../src/browser/services/Services.ts", "../src/common/Lifecycle.ts", "../src/common/Async.ts", "../src/browser/Dom.ts", "../src/browser/scrollable/fastDomNode.ts", "../src/common/Platform.ts", "../src/browser/scrollable/mouseEvent.ts", "../src/browser/scrollable/globalPointerMoveMonitor.ts", "../src/browser/scrollable/widget.ts", "../src/browser/scrollable/scrollbarArrow.ts", "../src/common/Event.ts", "../src/browser/scrollable/scrollable.ts", "../src/browser/scrollable/scrollbarVisibilityController.ts", "../src/browser/scrollable/abstractScrollbar.ts", "../src/browser/scrollable/scrollbarState.ts", "../src/browser/scrollable/horizontalScrollbar.ts", "../src/browser/scrollable/verticalScrollbar.ts", "../src/browser/scrollable/scrollableElement.ts", "../src/browser/Viewport.ts", "../src/browser/decorations/BufferDecorationRenderer.ts", "../src/browser/decorations/ColorZoneStore.ts", "../src/browser/decorations/OverviewRulerRenderer.ts", "../src/browser/input/CompositionHelper.ts", "../src/common/Color.ts", "../src/browser/services/CharacterJoinerService.ts", "../src/browser/renderer/shared/RendererUtils.ts", "../src/browser/renderer/dom/DomRendererRowFactory.ts", "../src/browser/renderer/dom/WidthCache.ts", "../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/browser/renderer/dom/DomRenderer.ts", "../src/browser/services/CharSizeService.ts", "../src/browser/services/CoreBrowserService.ts", "../src/browser/services/LinkProviderService.ts", "../src/browser/input/Mouse.ts", "../src/browser/services/MouseCoordsService.ts", "../src/browser/scrollable/touch.ts", "../src/browser/services/MouseService.ts", "../src/browser/RenderDebouncer.ts", "../src/common/TaskQueue.ts", "../src/browser/services/RenderService.ts", "../src/browser/input/MoveToCell.ts", "../src/browser/selection/SelectionModel.ts", "../src/common/buffer/BufferRange.ts", "../src/browser/services/SelectionService.ts", "../src/common/MultiKeyMap.ts", "../src/browser/ColorContrastCache.ts", "../src/browser/Types.ts", "../src/browser/services/ThemeService.ts", "../src/common/input/Keyboard.ts", "../src/common/input/KittyKeyboard.ts", "../src/common/input/Win32InputMode.ts", "../src/browser/services/KeyboardService.ts", "../src/common/services/InstantiationService.ts", "../src/common/services/LogService.ts", "../src/common/CircularList.ts", "../src/common/StringBuilder.ts", "../src/common/buffer/BufferLine.ts", "../src/common/buffer/BufferLineStringCache.ts", "../src/common/buffer/BufferReflow.ts", "../src/common/buffer/Marker.ts", "../src/common/data/Charsets.ts", "../src/common/buffer/Buffer.ts", "../src/common/buffer/BufferSet.ts", "../src/common/services/BufferService.ts", "../src/common/services/OptionsService.ts", "../src/common/services/CoreService.ts", "../src/common/services/MouseStateService.ts", "../src/common/services/UnicodeService.ts", "../src/common/input/UnicodeV6.ts", "../src/common/services/CharsetService.ts", "../src/common/WindowsMode.ts", "../src/common/parser/Params.ts", "../src/common/parser/OscParser.ts", "../src/common/parser/DcsParser.ts", "../src/common/parser/ApcParser.ts", "../src/common/parser/EscapeSequenceParser.ts", "../src/common/input/XParseColor.ts", "../src/common/Version.ts", "../src/common/InputHandler.ts", "../src/common/input/WriteBuffer.ts", "../src/common/services/OscLinkService.ts", "../src/common/CoreTerminal.ts", "../src/common/SortedList.ts", "../src/common/services/DecorationService.ts", "../src/browser/TimeBasedDebouncer.ts", "../src/browser/AccessibilityManager.ts", "../src/browser/Linkifier.ts", "../src/browser/CoreBrowserTerminal.ts", "../src/common/public/AddonManager.ts", "../src/common/public/BufferLineApiView.ts", "../src/common/public/BufferApiView.ts", "../src/common/public/BufferNamespaceApi.ts", "../src/common/public/ParserApi.ts", "../src/common/public/UnicodeApi.ts", "../src/browser/public/Terminal.ts"], -- "sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (\u241B).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed) {\n return;\n }\n switch (this._listeners.length) {\n case 0: return;\n case 1: {\n const { fn, thisArgs } = this._listeners[0];\n fn.call(thisArgs, event);\n return;\n }\n default: {\n // Snapshot listeners to allow modifications during iteration (2+ listeners)\n const listeners = this._listeners.slice();\n for (const { fn, thisArgs } of listeners) {\n fn.call(thisArgs, event);\n }\n }\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long\n // compositions\n this._compositionView.textContent = `\\u200E${ev.data}\\u200E`;\n this.updateCompositionElements();\n setTimeout(() => {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max( this._compositionPosition.start, end);\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n const currentCompositionSuffix = this._compositionSuffix;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the start position of the new composition to get the string\n // if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, this._compositionPosition.start);\n } else {\n // Keep support for non-composition characters typed immediately after composition end\n // while avoiding re-sending the trailing text that was already present\n // before composition started.\n const value = this._textarea.value;\n const valueEnd = currentCompositionSuffix.length > 0 && value.endsWith(currentCompositionSuffix)\n ? value.length - currentCompositionSuffix.length\n : value.length;\n input = value.substring(currentCompositionPosition.start, Math.max(currentCompositionPosition.start, valueEnd));\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n this._compositionView.style.direction = 'rtl';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n", "import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const ctx: IMouseBindContext = { target, focus, requestedEvents };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n // Ensure document-level listeners are removed on dispose\n register(toDisposable(() => {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }));\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element, document } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec \u00A7 \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" \u2014 i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n\u00B2) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { StringBuilder } from '../StringBuilder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $translateToStringBuilder = new StringBuilder();\n\nexport interface IBufferLineStringCacheEntry {\n value: string | undefined;\n isTrimmed: boolean;\n generation: number;\n}\n\nexport interface IBufferLineStringCache {\n generation: number;\n allocateEntry(): IBufferLineStringCacheEntry;\n touch?(): void;\n}\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n protected _stringCacheEntryRef: WeakRef | undefined;\n public length: number;\n\n constructor(\n protected readonly _stringCache: IBufferLineStringCache,\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._invalidateStringCache();\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n cell.extended = DEFAULT_ATTR_DATA.extended.clone();\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._invalidateStringCache();\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._invalidateStringCache();\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = attrs.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._invalidateStringCache();\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._invalidateStringCache();\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n this._invalidateStringCache();\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._copySparseMapsFrom(line);\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(this._stringCache, 0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n newLine._copySparseMapsFrom(this);\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._invalidateStringCache();\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonicalRequest = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonicalRequest) {\n this._stringCache.touch?.();\n }\n const stringCacheEntry = isCanonicalRequest ? this._getStringCacheEntry(false) : undefined;\n if (isCanonicalRequest && stringCacheEntry?.value !== undefined) {\n if (trimRight) {\n return stringCacheEntry.isTrimmed ? stringCacheEntry.value : stringCacheEntry.value.trimEnd();\n }\n if (!stringCacheEntry.isTrimmed) {\n return stringCacheEntry.value;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n $translateToStringBuilder.reset();\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n $translateToStringBuilder.append(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = $translateToStringBuilder.toString();\n $translateToStringBuilder.reset();\n if (isCanonicalRequest) {\n const cacheEntry = this._getStringCacheEntry(true)!;\n cacheEntry.value = result;\n cacheEntry.isTrimmed = !!trimRight;\n }\n return result;\n }\n\n protected _getStringCacheEntry(createIfNeeded: boolean): IBufferLineStringCacheEntry | undefined {\n const cachedEntry = this._stringCacheEntryRef?.deref();\n if (cachedEntry) {\n if (cachedEntry.generation === this._stringCache.generation) {\n return cachedEntry;\n }\n }\n if (!createIfNeeded) {\n return undefined;\n }\n const cacheEntry = this._stringCache.allocateEntry();\n this._stringCacheEntryRef = new WeakRef(cacheEntry);\n return cacheEntry;\n }\n\n private _invalidateStringCache(): void {\n const cacheEntry = this._getStringCacheEntry(false);\n if (cacheEntry) {\n cacheEntry.value = undefined;\n cacheEntry.isTrimmed = false;\n }\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLineStringCache, IBufferLineStringCacheEntry } from './BufferLine';\nimport { disposableTimeout } from '../Async';\nimport { Disposable, MutableDisposable, toDisposable, type IDisposable } from '../Lifecycle';\n\nconst enum Constants {\n CACHE_TTL_MS = 15000\n}\n\nexport class BufferLineStringCache extends Disposable implements IBufferLineStringCache {\n public generation: number = 0;\n public readonly entries: Set = new Set();\n private readonly _clearTimeout = this._register(new MutableDisposable());\n private _lastAccessTimestamp: number = 0;\n\n constructor() {\n super();\n this._register(toDisposable(() => this.entries.clear()));\n }\n\n public touch(): void {\n this._scheduleClear();\n }\n\n public allocateEntry(): IBufferLineStringCacheEntry {\n const entry: IBufferLineStringCacheEntry = {\n value: undefined,\n isTrimmed: false,\n generation: this.generation\n };\n this.entries.add(entry);\n this._scheduleClear();\n return entry;\n }\n\n public clear(): void {\n this._clearTimeout.clear();\n this._lastAccessTimestamp = 0;\n this.generation++;\n for (const entry of this.entries) {\n entry.value = undefined;\n entry.isTrimmed = false;\n }\n this.entries.clear();\n }\n\n private _scheduleClear(): void {\n this._lastAccessTimestamp = Date.now();\n if (this._clearTimeout.value) {\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS);\n }\n\n private _scheduleClearTimeout(timeoutMs: number): void {\n this._clearTimeout.value = disposableTimeout(() => {\n const elapsed = Date.now() - this._lastAccessTimestamp;\n if (elapsed >= Constants.CACHE_TTL_MS) {\n this.clear();\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS - elapsed);\n }, timeoutMs);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '\u25C6'\n 'a': '\\u2592', // '\u2592'\n 'b': '\\u2409', // '\u2409' (HT)\n 'c': '\\u240c', // '\u240C' (FF)\n 'd': '\\u240d', // '\u240D' (CR)\n 'e': '\\u240a', // '\u240A' (LF)\n 'f': '\\u00b0', // '\u00B0'\n 'g': '\\u00b1', // '\u00B1'\n 'h': '\\u2424', // '\u2424' (NL)\n 'i': '\\u240b', // '\u240B' (VT)\n 'j': '\\u2518', // '\u2518'\n 'k': '\\u2510', // '\u2510'\n 'l': '\\u250c', // '\u250C'\n 'm': '\\u2514', // '\u2514'\n 'n': '\\u253c', // '\u253C'\n 'o': '\\u23ba', // '\u23BA'\n 'p': '\\u23bb', // '\u23BB'\n 'q': '\\u2500', // '\u2500'\n 'r': '\\u23bc', // '\u23BC'\n 's': '\\u23bd', // '\u23BD'\n 't': '\\u251c', // '\u251C'\n 'u': '\\u2524', // '\u2524'\n 'v': '\\u2534', // '\u2534'\n 'w': '\\u252c', // '\u252C'\n 'x': '\\u2502', // '\u2502'\n 'y': '\\u2264', // '\u2264'\n 'z': '\\u2265', // '\u2265'\n '{': '\\u03c0', // '\u03C0'\n '|': '\\u2260', // '\u2260'\n '}': '\\u00a3', // '\u00A3'\n '~': '\\u00b7' // '\u00B7'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '\u00A3'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '\u00A3',\n '@': '\u00BE',\n '[': 'ij',\n '\\\\': '\u00BD',\n ']': '|',\n '{': '\u00A8',\n '|': 'f',\n '}': '\u00BC',\n '~': '\u00B4'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '\u00A3',\n '@': '\u00E0',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00A7',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00A8'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': '\u00E0',\n '[': '\u00E2',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n '`': '\u00F4',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00FB'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '\u00A7',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00DC',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00DF'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00E9',\n '`': '\u00F9',\n '{': '\u00E0',\n '|': '\u00F2',\n '}': '\u00E8',\n '~': '\u00EC'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': '\u00C4',\n '[': '\u00C6',\n '\\\\': '\u00D8',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E4',\n '{': '\u00E6',\n '|': '\u00F8',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00A1',\n '\\\\': '\u00D1',\n ']': '\u00BF',\n '{': '\u00B0',\n '|': '\u00F1',\n '}': '\u00E7'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': '\u00C9',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': '\u00F9',\n '@': '\u00E0',\n '[': '\u00E9',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n\n '_': '\u00E8',\n '`': '\u00F4',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00FB'\n};\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { BufferLineStringCache } from './BufferLineStringCache';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n private readonly _stringCache: BufferLineStringCache;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n this._stringCache = this._register(new BufferLineStringCache());\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._stringCache, this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this._stringCache.clear();\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n this._stringCache.clear();\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.287';\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n", "\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n", "/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n"], -- "mappings": "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Q,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,CACrD,EACMC,GAAiB,CACrB,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EACzD,CAAC,MAAS,KAAO,EAAG,CAAC,MAAS,KAAO,EAAG,CAAC,OAAS,MAAO,EACzD,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EACzD,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EAAG,CAAC,OAAS,MAAO,EACzD,CAAC,OAAS,MAAO,CACnB,EAGIC,EAEJ,SAASC,GAASC,EAAaC,EAA2B,CACxD,IAAIC,EAAM,EACNC,EAAMF,EAAK,OAAS,EACpBG,EACJ,GAAIJ,EAAMC,EAAK,CAAC,EAAE,CAAC,GAAKD,EAAMC,EAAKE,CAAG,EAAE,CAAC,EACvC,MAAO,GAET,KAAOA,GAAOD,GAEZ,GADAE,EAAOF,EAAMC,GAAQ,EACjBH,EAAMC,EAAKG,CAAG,EAAE,CAAC,EACnBF,EAAME,EAAM,UACHJ,EAAMC,EAAKG,CAAG,EAAE,CAAC,EAC1BD,EAAMC,EAAM,MAEZ,OAAO,GAGX,MAAO,EACT,CAEO,IAAMC,GAAN,KAAmD,CAGxD,aAAc,CAFd,KAAgB,QAAU,IAIxB,GAAI,CAACP,EAAO,CACVA,EAAQ,IAAI,WAAW,KAAK,EAC5BA,EAAM,KAAK,CAAC,EACZA,EAAM,CAAC,EAAI,EAEXA,EAAM,KAAK,EAAG,EAAG,EAAE,EACnBA,EAAM,KAAK,EAAG,IAAM,GAAI,EAIxBA,EAAM,KAAK,EAAG,KAAQ,IAAM,EAC5BA,EAAM,IAAM,EAAI,EAChBA,EAAM,IAAM,EAAI,EAChBA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAM,EAAI,EAEhBA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAC5BA,EAAM,KAAK,EAAG,MAAQ,KAAM,EAO5B,QAASQ,EAAI,EAAGA,EAAIV,GAAc,OAAQ,EAAEU,EAC1CR,EAAM,KAAK,EAAGF,GAAcU,CAAC,EAAE,CAAC,EAAGV,GAAcU,CAAC,EAAE,CAAC,EAAI,CAAC,CAE9D,CACF,CAEO,QAAQC,EAA+B,CAC5C,OAAIA,EAAM,GAAW,EACjBA,EAAM,IAAY,EAClBA,EAAM,MAAcT,EAAMS,CAAG,EAC7BR,GAASQ,EAAKV,EAAc,EAAU,EACrCU,GAAO,QAAWA,GAAO,QAAaA,GAAO,QAAWA,GAAO,OAAiB,EAC9E,CACT,CAEO,eAAeC,EAAmBC,EAAyD,CAChG,IAAIC,EAAQ,KAAK,QAAQF,CAAS,EAC9BG,EAAaD,IAAU,GAAKD,IAAc,EAE9C,GAAIE,EAAY,CACd,IAAMC,EAAWC,GAAe,aAAaJ,CAAS,EAClDG,IAAa,EACfD,EAAa,GACJC,EAAWF,IACpBA,EAAQE,EAEZ,CACA,OAAOC,GAAe,oBAAoB,EAAGH,EAAOC,CAAU,CAChE,CACF,ECzIO,IAAMG,GAAN,KAAgD,CAAhD,cAIL,KAAO,OAAiB,EAExB,KAAQ,UAAsC,CAAC,EAE/C,IAAW,UAAqC,CAC9C,OAAO,KAAK,SACd,CAEO,OAAc,CACnB,KAAK,QAAU,OACf,KAAK,UAAY,CAAC,EAClB,KAAK,OAAS,CAChB,CAEO,UAAUC,EAAiB,CAChC,KAAK,OAASA,EACd,KAAK,QAAU,KAAK,UAAUA,CAAC,CACjC,CAEO,YAAYA,EAAWC,EAAqC,CACjE,KAAK,UAAUD,CAAC,EAAIC,EAChB,KAAK,SAAWD,IAClB,KAAK,QAAUC,EAEnB,CACF,EC7BO,SAASC,GAA8BC,EAAqC,CAYjF,IAAMC,EADOD,EAAc,OAAO,MAAM,IAAIA,EAAc,OAAO,MAAQA,EAAc,OAAO,EAAI,CAAC,GAC5E,IAAIA,EAAc,KAAO,CAAC,EAE3CE,EAAWF,EAAc,OAAO,MAAM,IAAIA,EAAc,OAAO,MAAQA,EAAc,OAAO,CAAC,EAC/FE,GAAYD,IACdC,EAAS,UAAaD,EAAS,CAAoB,IAAM,GAAkBA,EAAS,CAAoB,IAAM,GAElH,CCUO,IAAME,GAAN,MAAMC,CAA0B,CAyCrC,YAAmBC,EAAoB,GAAWC,EAA6B,GAAI,CAAhE,eAAAD,EAA+B,wBAAAC,EAChD,GAAIA,EAAqB,IACvB,MAAM,IAAI,MAAM,iDAAiD,EAEnE,KAAK,OAAS,IAAI,WAAWD,CAAS,EACtC,KAAK,OAAS,EACd,KAAK,WAAa,IAAI,WAAWC,CAAkB,EACnD,KAAK,iBAAmB,EACxB,KAAK,cAAgB,IAAI,YAAYD,CAAS,EAC9C,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,YAAc,EACrB,CAnCA,OAAc,UAAUE,EAA6B,CACnD,IAAMC,EAAS,IAAIJ,EACnB,GAAI,CAACG,EAAO,OACV,OAAOC,EAGT,QAASC,EAAK,MAAM,QAAQF,EAAO,CAAC,CAAC,EAAK,EAAI,EAAGE,EAAIF,EAAO,OAAQ,EAAEE,EAAG,CACvE,IAAMC,EAAQH,EAAOE,CAAC,EACtB,GAAI,MAAM,QAAQC,CAAK,EACrB,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQ,EAAEC,EAClCH,EAAO,YAAYE,EAAMC,CAAC,CAAC,OAG7BH,EAAO,SAASE,CAAK,CAEzB,CACA,OAAOF,CACT,CAuBO,OAAgB,CACrB,IAAMI,EAAY,IAAIR,EAAO,KAAK,UAAW,KAAK,kBAAkB,EACpE,OAAAQ,EAAU,OAAO,IAAI,KAAK,MAAM,EAChCA,EAAU,OAAS,KAAK,OACxBA,EAAU,WAAW,IAAI,KAAK,UAAU,EACxCA,EAAU,iBAAmB,KAAK,iBAClCA,EAAU,cAAc,IAAI,KAAK,aAAa,EAC9CA,EAAU,cAAgB,KAAK,cAC/BA,EAAU,iBAAmB,KAAK,iBAClCA,EAAU,YAAc,KAAK,YACtBA,CACT,CAQO,SAAuB,CAC5B,IAAMC,EAAmB,CAAC,EAC1B,QAASJ,EAAI,EAAGA,EAAI,KAAK,OAAQ,EAAEA,EAAG,CACpCI,EAAI,KAAK,KAAK,OAAOJ,CAAC,CAAC,EACvB,IAAMK,EAAQ,KAAK,cAAcL,CAAC,GAAK,EACjCM,EAAM,KAAK,cAAcN,CAAC,EAAI,IAChCM,EAAMD,EAAQ,GAChBD,EAAI,KAAK,MAAM,UAAU,MAAM,KAAK,KAAK,WAAYC,EAAOC,CAAG,CAAC,CAEpE,CACA,OAAOF,CACT,CAKO,OAAc,CACnB,KAAK,OAAS,EACd,KAAK,iBAAmB,EACxB,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,YAAc,EACrB,CAKO,UAAiB,CACtB,KAAK,OAAS,EACd,KAAK,iBAAmB,EACxB,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,YAAc,GACnB,KAAK,cAAc,CAAC,EAAI,EACxB,KAAK,OAAO,CAAC,EAAI,CACnB,CASO,SAASH,EAAqB,CAEnC,GADA,KAAK,YAAc,GACf,KAAK,QAAU,KAAK,UAAW,CACjC,KAAK,cAAgB,GACrB,MACF,CACA,GAAIA,EAAQ,GACV,MAAM,IAAI,MAAM,qCAAqC,EAEvD,KAAK,cAAc,KAAK,MAAM,EAAI,KAAK,kBAAoB,EAAI,KAAK,iBACpE,KAAK,OAAO,KAAK,QAAQ,EAAIA,EAAQ,WAAsB,WAAsBA,CACnF,CASO,YAAYA,EAAqB,CAEtC,GADA,KAAK,YAAc,GACf,EAAC,KAAK,OAGV,IAAI,KAAK,eAAiB,KAAK,kBAAoB,KAAK,mBAAoB,CAC1E,KAAK,iBAAmB,GACxB,MACF,CACA,GAAIA,EAAQ,GACV,MAAM,IAAI,MAAM,qCAAqC,EAEvD,KAAK,WAAW,KAAK,kBAAkB,EAAIA,EAAQ,WAAsB,WAAsBA,EAC/F,KAAK,cAAc,KAAK,OAAS,CAAC,IACpC,CAKO,aAAaM,EAAsB,CACxC,OAAS,KAAK,cAAcA,CAAG,EAAI,MAAS,KAAK,cAAcA,CAAG,GAAK,GAAK,CAC9E,CAOO,aAAaA,EAAgC,CAClD,IAAMF,EAAQ,KAAK,cAAcE,CAAG,GAAK,EACnCD,EAAM,KAAK,cAAcC,CAAG,EAAI,IACtC,OAAID,EAAMD,EAAQ,EACT,KAAK,WAAW,SAASA,EAAOC,CAAG,EAErC,IACT,CAMO,iBAA+C,CACpD,IAAME,EAAsC,CAAC,EAC7C,QAASR,EAAI,EAAGA,EAAI,KAAK,OAAQ,EAAEA,EAAG,CACpC,IAAMK,EAAQ,KAAK,cAAcL,CAAC,GAAK,EACjCM,EAAM,KAAK,cAAcN,CAAC,EAAI,IAChCM,EAAMD,EAAQ,IAChBG,EAAOR,CAAC,EAAI,KAAK,WAAW,MAAMK,EAAOC,CAAG,EAEhD,CACA,OAAOE,CACT,CAMO,SAASP,EAAqB,CACnC,IAAIQ,EACJ,GAAI,KAAK,eACJ,EAAEA,EAAS,KAAK,YAAc,KAAK,iBAAmB,KAAK,SAC1D,KAAK,aAAe,KAAK,iBAE7B,OAGF,IAAMC,EAAQ,KAAK,YAAc,KAAK,WAAa,KAAK,OAClDC,EAAMD,EAAMD,EAAS,CAAC,EAC5BC,EAAMD,EAAS,CAAC,EAAI,CAACE,EAAM,KAAK,IAAIA,EAAM,GAAKV,EAAO,UAAmB,EAAIA,CAC/E,CACF,EC5OA,IAAMW,GAAgC,CAAC,EAE1BC,GAAN,KAAsC,CAAtC,cACL,KAAQ,OAAS,EACjB,KAAQ,QAAUD,GAClB,KAAQ,IAAM,GACd,KAAQ,UAA6C,OAAO,OAAO,IAAI,EACvE,KAAQ,WAAqC,IAAM,CAAE,EACrD,KAAQ,OAA+B,CACrC,OAAQ,GACR,aAAc,EACd,YAAa,EACf,EAEO,gBAAgBE,EAAeC,EAAmC,CACvE,KAAK,UAAUD,CAAK,IAAM,CAAC,EAC3B,IAAME,EAAc,KAAK,UAAUF,CAAK,EACxC,OAAAE,EAAY,KAAKD,CAAO,EACjB,CACL,QAAS,IAAM,CACb,IAAME,EAAeD,EAAY,QAAQD,CAAO,EAC5CE,IAAiB,IACnBD,EAAY,OAAOC,EAAc,CAAC,CAEtC,CACF,CACF,CACO,aAAaH,EAAqB,CACnC,KAAK,UAAUA,CAAK,GAAG,OAAO,KAAK,UAAUA,CAAK,CACxD,CACO,mBAAmBC,EAAuC,CAC/D,KAAK,WAAaA,CACpB,CAEO,SAAgB,CACrB,KAAK,UAAY,OAAO,OAAO,IAAI,EACnC,KAAK,WAAa,IAAM,CAAE,EAC1B,KAAK,QAAUH,EACjB,CAEO,OAAc,CAEnB,GAAI,KAAK,SAAW,EAClB,QAASM,EAAI,KAAK,OAAO,OAAS,KAAK,OAAO,aAAe,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAG,EAAEA,EAClG,KAAK,QAAQA,CAAC,EAAE,IAAI,EAAK,EAG7B,KAAK,OAAO,OAAS,GACrB,KAAK,QAAUN,GACf,KAAK,IAAM,GACX,KAAK,OAAS,CAChB,CAEQ,QAAe,CAErB,GADA,KAAK,QAAU,KAAK,UAAU,KAAK,GAAG,GAAKA,GACvC,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,IAAK,OAAO,MAEjC,SAASM,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,MAAM,CAG5B,CAEQ,KAAKC,EAAmBC,EAAeC,EAAmB,CAChE,GAAI,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,IAAK,MAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,MAEhE,SAASH,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,IAAIC,EAAMC,EAAOC,CAAG,CAG1C,CAEO,OAAc,CAEnB,KAAK,MAAM,EACX,KAAK,OAAS,CAChB,CASO,IAAIF,EAAmBC,EAAeC,EAAmB,CAC9D,GAAI,KAAK,SAAW,EAGpB,IAAI,KAAK,SAAW,EAClB,KAAOD,EAAQC,GAAK,CAClB,IAAME,EAAOJ,EAAKC,GAAO,EACzB,GAAIG,IAAS,GAAM,CACjB,KAAK,OAAS,EACd,KAAK,OAAO,EACZ,KACF,CACA,GAAIA,EAAO,IAAQ,GAAOA,EAAM,CAC9B,KAAK,OAAS,EACd,MACF,CACI,KAAK,MAAQ,KACf,KAAK,IAAM,GAEb,KAAK,IAAM,KAAK,IAAM,GAAKA,EAAO,EACpC,CAEE,KAAK,SAAW,GAAoBF,EAAMD,EAAQ,GACpD,KAAK,KAAKD,EAAMC,EAAOC,CAAG,EAE9B,CAOO,IAAIG,EAAkBC,EAAyB,GAA+B,CACnF,GAAI,KAAK,SAAW,EAIpB,IAAI,KAAK,SAAW,EAQlB,GAJI,KAAK,SAAW,GAClB,KAAK,OAAO,EAGV,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,IAAK,MAAOD,CAAO,MACnC,CACL,IAAIE,EAA4C,GAC5CR,EAAI,KAAK,QAAQ,OAAS,EAC1BS,EAAc,GAOlB,GANI,KAAK,OAAO,SACdT,EAAI,KAAK,OAAO,aAAe,EAC/BQ,EAAgBD,EAChBE,EAAc,KAAK,OAAO,YAC1B,KAAK,OAAO,OAAS,IAEnB,CAACA,GAAeD,IAAkB,GAAO,CAC3C,KAAOR,GAAK,IACVQ,EAAgB,KAAK,QAAQR,CAAC,EAAE,IAAIM,CAAO,EACvCE,IAAkB,IAFTR,IAIN,GAAIQ,aAAyB,QAClC,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeR,EAC3B,KAAK,OAAO,YAAc,GACnBQ,EAGXR,GACF,CAIA,KAAOA,GAAK,EAAGA,IAEb,GADAQ,EAAgB,KAAK,QAAQR,CAAC,EAAE,IAAI,EAAK,EACrCQ,aAAyB,QAC3B,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeR,EAC3B,KAAK,OAAO,YAAc,GACnBQ,CAGb,CAGF,KAAK,QAAUd,GACf,KAAK,IAAM,GACX,KAAK,OAAS,EAChB,CACF,EAMagB,GAAN,MAAMA,EAAkC,CAM7C,YAAoBC,EAAwD,CAAxD,cAAAA,EAHpB,KAAQ,MAAQ,IAAIC,GAAqBF,GAAW,aAAa,EACjE,KAAQ,UAAqB,EAEiD,CAEvE,OAAc,CACnB,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,EACnB,CAEO,IAAIT,EAAmBC,EAAeC,EAAmB,CAC1D,KAAK,WAGL,KAAK,MAAM,OAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,IACnD,KAAK,UAAY,GAErB,CAEO,IAAIG,EAA8C,CACvD,IAAIO,EAAkC,GACtC,GAAI,KAAK,UACPA,EAAM,WACGP,IACTO,EAAM,KAAK,SAAS,KAAK,MAAM,SAAS,CAAC,EACrCA,aAAe,SAGjB,OAAOA,EAAI,KAAKC,IACd,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVA,EACR,EAGL,YAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVD,CACT,CACF,EA1CaH,GACI,cAAgB,IAD1B,IAAMK,GAANL,GCtLP,IAAMM,GAAgC,CAAC,EAE1BC,GAAN,KAAsC,CAAtC,cACL,KAAQ,UAA6C,OAAO,OAAO,IAAI,EACvE,KAAQ,QAAyBD,GACjC,KAAQ,OAAiB,EACzB,KAAQ,WAAqC,IAAM,CAAE,EACrD,KAAQ,OAA+B,CACrC,OAAQ,GACR,aAAc,EACd,YAAa,EACf,EAEO,SAAgB,CACrB,KAAK,UAAY,OAAO,OAAO,IAAI,EACnC,KAAK,WAAa,IAAM,CAAE,EAC1B,KAAK,QAAUA,EACjB,CAEO,gBAAgBE,EAAeC,EAAmC,CACvE,KAAK,UAAUD,CAAK,IAAM,CAAC,EAC3B,IAAME,EAAc,KAAK,UAAUF,CAAK,EACxC,OAAAE,EAAY,KAAKD,CAAO,EACjB,CACL,QAAS,IAAM,CACb,IAAME,EAAeD,EAAY,QAAQD,CAAO,EAC5CE,IAAiB,IACnBD,EAAY,OAAOC,EAAc,CAAC,CAEtC,CACF,CACF,CAEO,aAAaH,EAAqB,CACnC,KAAK,UAAUA,CAAK,GAAG,OAAO,KAAK,UAAUA,CAAK,CACxD,CAEO,mBAAmBC,EAAuC,CAC/D,KAAK,WAAaA,CACpB,CAEO,OAAc,CAEnB,GAAI,KAAK,QAAQ,OACf,QAASG,EAAI,KAAK,OAAO,OAAS,KAAK,OAAO,aAAe,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAG,EAAEA,EAClG,KAAK,QAAQA,CAAC,EAAE,OAAO,EAAK,EAGhC,KAAK,OAAO,OAAS,GACrB,KAAK,QAAUN,GACf,KAAK,OAAS,CAChB,CAEO,KAAKE,EAAeK,EAAuB,CAKhD,GAHA,KAAK,MAAM,EACX,KAAK,OAASL,EACd,KAAK,QAAU,KAAK,UAAUA,CAAK,GAAKF,GACpC,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,OAAQO,CAAM,MAE3C,SAASD,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,KAAKC,CAAM,CAGjC,CAEO,IAAIC,EAAmBC,EAAeC,EAAmB,CAC9D,GAAI,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,MAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,MAEnE,SAASJ,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,IAAIE,EAAMC,EAAOC,CAAG,CAG1C,CAEO,OAAOE,EAAkBC,EAAyB,GAA+B,CACtF,GAAI,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,SAAUD,CAAO,MACzC,CACL,IAAIE,EAA4C,GAC5CR,EAAI,KAAK,QAAQ,OAAS,EAC1BS,EAAc,GAOlB,GANI,KAAK,OAAO,SACdT,EAAI,KAAK,OAAO,aAAe,EAC/BQ,EAAgBD,EAChBE,EAAc,KAAK,OAAO,YAC1B,KAAK,OAAO,OAAS,IAEnB,CAACA,GAAeD,IAAkB,GAAO,CAC3C,KAAOR,GAAK,IACVQ,EAAgB,KAAK,QAAQR,CAAC,EAAE,OAAOM,CAAO,EAC1CE,IAAkB,IAFTR,IAIN,GAAIQ,aAAyB,QAClC,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeR,EAC3B,KAAK,OAAO,YAAc,GACnBQ,EAGXR,GACF,CAEA,KAAOA,GAAK,EAAGA,IAEb,GADAQ,EAAgB,KAAK,QAAQR,CAAC,EAAE,OAAO,EAAK,EACxCQ,aAAyB,QAC3B,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeR,EAC3B,KAAK,OAAO,YAAc,GACnBQ,CAGb,CACA,KAAK,QAAUd,GACf,KAAK,OAAS,CAChB,CACF,EAGMgB,GAAe,IAAIC,GACzBD,GAAa,SAAS,CAAC,EAMhB,IAAME,GAAN,MAAMA,EAAkC,CAO7C,YAAoBC,EAAyE,CAAzE,cAAAA,EAJpB,KAAQ,MAAQ,IAAIC,GAAqBF,GAAW,aAAa,EACjE,KAAQ,QAAmBF,GAC3B,KAAQ,UAAqB,EAEkE,CAExF,KAAKT,EAAuB,CAKjC,KAAK,QAAWA,EAAO,OAAS,GAAKA,EAAO,OAAO,CAAC,EAAKA,EAAO,MAAM,EAAIS,GAC1E,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,EACnB,CAEO,IAAIR,EAAmBC,EAAeC,EAAmB,CAC1D,KAAK,WAGL,KAAK,MAAM,OAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,IACnD,KAAK,UAAY,GAErB,CAEO,OAAOE,EAA8C,CAC1D,IAAIS,EAAkC,GACtC,GAAI,KAAK,UACPA,EAAM,WACGT,IACTS,EAAM,KAAK,SAAS,KAAK,MAAM,SAAS,EAAG,KAAK,OAAO,EACnDA,aAAe,SAGjB,OAAOA,EAAI,KAAKC,IACd,KAAK,QAAUN,GACf,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVM,EACR,EAGL,YAAK,QAAUN,GACf,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVK,CACT,CACF,EAlDaH,GACI,cAAgB,IAD1B,IAAMK,GAANL,GCjIP,IAAMM,GAAgC,CAAC,EAU1BC,GAAN,KAAsC,CAAtC,cACL,KAAQ,UAA6C,OAAO,OAAO,IAAI,EACvE,KAAQ,QAAUD,GAClB,KAAQ,OAAiB,EACzB,KAAQ,WAAqC,IAAM,CAAE,EACrD,KAAQ,OAA+B,CACrC,OAAQ,GACR,aAAc,EACd,YAAa,EACf,EAOO,gBAAgBE,EAAeC,EAAmC,CACvE,KAAK,UAAUD,CAAK,IAAM,CAAC,EAC3B,IAAME,EAAc,KAAK,UAAUF,CAAK,EACxC,OAAAE,EAAY,KAAKD,CAAO,EACjB,CACL,QAAS,IAAM,CACb,IAAME,EAAeD,EAAY,QAAQD,CAAO,EAC5CE,IAAiB,IACnBD,EAAY,OAAOC,EAAc,CAAC,CAEtC,CACF,CACF,CAEO,aAAaH,EAAqB,CACnC,KAAK,UAAUA,CAAK,GAAG,OAAO,KAAK,UAAUA,CAAK,CACxD,CAEO,mBAAmBC,EAAuC,CAC/D,KAAK,WAAaA,CACpB,CAEO,SAAgB,CACrB,KAAK,UAAY,OAAO,OAAO,IAAI,EACnC,KAAK,WAAa,IAAM,CAAE,EAC1B,KAAK,QAAUH,EACjB,CAEO,OAAc,CAEnB,GAAI,KAAK,QAAQ,OACf,QAASM,EAAI,KAAK,OAAO,OAAS,KAAK,OAAO,aAAe,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAG,EAAEA,EAClG,KAAK,QAAQA,CAAC,EAAE,IAAI,EAAK,EAG7B,KAAK,OAAO,OAAS,GACrB,KAAK,QAAUN,GACf,KAAK,OAAS,CAChB,CAEO,MAAME,EAAqB,CAKhC,GAHA,KAAK,MAAM,EACX,KAAK,OAASA,EACd,KAAK,QAAU,KAAK,UAAUA,CAAK,GAAKF,GACpC,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,OAAO,MAEpC,SAASM,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,MAAM,CAG5B,CAEO,IAAIC,EAAmBC,EAAeC,EAAmB,CAC9D,GAAI,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,MAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,MAEnE,SAASH,EAAI,KAAK,QAAQ,OAAS,EAAGA,GAAK,EAAGA,IAC5C,KAAK,QAAQA,CAAC,EAAE,IAAIC,EAAMC,EAAOC,CAAG,CAG1C,CAOO,IAAIE,EAAkBC,EAAyB,GAA+B,CACnF,GAAI,CAAC,KAAK,QAAQ,OAChB,KAAK,WAAW,KAAK,OAAQ,MAAOD,CAAO,MACtC,CACL,IAAIE,EAA4C,GAC5CP,EAAI,KAAK,QAAQ,OAAS,EAC1BQ,EAAc,GAOlB,GANI,KAAK,OAAO,SACdR,EAAI,KAAK,OAAO,aAAe,EAC/BO,EAAgBD,EAChBE,EAAc,KAAK,OAAO,YAC1B,KAAK,OAAO,OAAS,IAEnB,CAACA,GAAeD,IAAkB,GAAO,CAC3C,KAAOP,GAAK,IACVO,EAAgB,KAAK,QAAQP,CAAC,EAAE,IAAIK,CAAO,EACvCE,IAAkB,IAFTP,IAIN,GAAIO,aAAyB,QAClC,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeP,EAC3B,KAAK,OAAO,YAAc,GACnBO,EAGXP,GACF,CAEA,KAAOA,GAAK,EAAGA,IAEb,GADAO,EAAgB,KAAK,QAAQP,CAAC,EAAE,IAAI,EAAK,EACrCO,aAAyB,QAC3B,YAAK,OAAO,OAAS,GACrB,KAAK,OAAO,aAAeP,EAC3B,KAAK,OAAO,YAAc,GACnBO,CAGb,CACA,KAAK,QAAUb,GACf,KAAK,OAAS,CAChB,CACF,EAMae,GAAN,MAAMA,EAAkC,CAM7C,YAAoBC,EAAwD,CAAxD,cAAAA,EAHpB,KAAQ,MAAQ,IAAIC,GAAqBF,GAAW,aAAa,EACjE,KAAQ,UAAqB,EAEiD,CAEvE,OAAc,CACnB,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,EACnB,CAEO,IAAIR,EAAmBC,EAAeC,EAAmB,CAC1D,KAAK,WAGL,KAAK,MAAM,OAAOC,GAAcH,EAAMC,EAAOC,CAAG,CAAC,IACnD,KAAK,UAAY,GAErB,CAEO,IAAIE,EAA8C,CACvD,IAAIO,EAAkC,GACtC,GAAI,KAAK,UACPA,EAAM,WACGP,IACTO,EAAM,KAAK,SAAS,KAAK,MAAM,SAAS,CAAC,EACrCA,aAAe,SAGjB,OAAOA,EAAI,KAAKC,IACd,KAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVA,EACR,EAGL,YAAK,MAAM,MAAM,EACjB,KAAK,UAAY,GACVD,CACT,CACF,EA1CaH,GACI,cAAgB,IAD1B,IAAMK,GAANL,GC3GA,IAAMM,GAAN,KAAsB,CAG3B,YAAYC,EAAgB,CAC1B,KAAK,MAAQ,IAAI,YAAYA,CAAM,CACrC,CAOO,WAAWC,EAAsBC,EAAyB,CAC/D,KAAK,MAAM,KAAKD,GAAU,EAAsCC,CAAI,CACtE,CASO,IAAIC,EAAcC,EAAoBH,EAAsBC,EAAyB,CAC1F,KAAK,MAAME,GAAS,EAAgCD,CAAI,EAAIF,GAAU,EAAsCC,CAC9G,CASO,QAAQG,EAAiBD,EAAoBH,EAAsBC,EAAyB,CACjG,QAASI,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAChC,KAAK,MAAMF,GAAS,EAAgCC,EAAMC,CAAC,CAAC,EAAIL,GAAU,EAAsCC,CAEpH,CACF,EAIMK,GAAsB,IAOfC,IAA0B,UAA6B,CAGlE,IAAMC,EAAyB,IAAIV,GAAgB,IAAI,EAIjDW,EAAY,MAAM,MAAM,KAAM,MADhB,GACiC,CAAC,EAAE,IAAI,CAACC,EAAaL,IAAcA,CAAC,EACnFM,EAAI,CAACC,EAAeC,IAA0BJ,EAAU,MAAMG,EAAOC,CAAG,EAGxEC,EAAaH,EAAE,GAAM,GAAI,EACzBI,EAAcJ,EAAE,EAAM,EAAI,EAChCI,EAAY,KAAK,EAAI,EACrBA,EAAY,KAAK,MAAMA,EAAaJ,EAAE,GAAM,EAAI,CAAC,EAEjD,IAAMK,EAAmBL,MAA8C,EAGvEH,EAAM,cAAiD,EAEvDA,EAAM,QAAQM,OAAsE,EAEpF,QAAWX,KAASa,EAClBR,EAAM,QAAQ,CAAC,GAAM,GAAM,IAAM,GAAI,EAAGL,KAA+C,EACvFK,EAAM,QAAQG,EAAE,IAAM,GAAI,EAAGR,KAA+C,EAC5EK,EAAM,QAAQG,EAAE,IAAM,GAAI,EAAGR,KAA+C,EAC5EK,EAAM,IAAI,IAAML,KAA8C,EAC9DK,EAAM,IAAI,GAAML,MAA6C,EAC7DK,EAAM,IAAI,IAAML,KAAqD,EACrEK,EAAM,QAAQ,CAAC,IAAM,GAAI,EAAGL,KAAqD,EACjFK,EAAM,IAAI,IAAML,OAAgD,EAChEK,EAAM,IAAI,IAAML,MAAgD,EAChEK,EAAM,IAAI,IAAML,MAAgD,EAGlE,OAAAK,EAAM,QAAQO,OAAyE,EACvFP,EAAM,QAAQO,OAAyE,EACvFP,EAAM,IAAI,SAAiE,EAC3EA,EAAM,QAAQO,OAAgF,EAC9FP,EAAM,QAAQO,OAA+E,EAC7FP,EAAM,IAAI,SAAuE,EACjFA,EAAM,QAAQO,OAA+E,EAC7FP,EAAM,IAAI,SAAuE,EACjFA,EAAM,QAAQO,OAAiF,EAC/FP,EAAM,QAAQO,OAA6F,EAC3GP,EAAM,IAAI,SAAqF,EAC/FA,EAAM,QAAQO,OAAmG,EACjHP,EAAM,IAAI,SAA2F,EAErGA,EAAM,IAAI,QAAwE,EAClFA,EAAM,QAAQM,OAAgF,EAC9FN,EAAM,IAAI,SAA0E,EACpFA,EAAM,QAAQ,CAAC,IAAM,GAAM,GAAM,GAAM,CAAI,OAAmE,EAC9GA,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAsE,EAEhGH,EAAM,QAAQ,CAAC,GAAM,EAAI,OAAqE,EAC9FA,EAAM,QAAQM,OAAqF,EACnGN,EAAM,QAAQO,OAAsF,EACpGP,EAAM,IAAI,SAAwE,EAClFA,EAAM,IAAI,SAA+E,EAEzFA,EAAM,IAAI,UAAmE,EAC7EA,EAAM,QAAQO,SAA8E,EAC5FP,EAAM,IAAI,WAAuE,EACjFA,EAAM,QAAQG,EAAE,GAAM,EAAI,SAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,GAAI,UAA6E,EACvGH,EAAM,QAAQG,EAAE,GAAM,GAAI,UAAoF,EAC9GH,EAAM,QAAQO,SAA4F,EAC1GP,EAAM,QAAQG,EAAE,GAAM,EAAI,SAAmF,EAC7GH,EAAM,IAAI,WAAqF,EAC/FA,EAAM,QAAQM,UAA0F,EACxGN,EAAM,QAAQO,SAA0F,EACxGP,EAAM,QAAQG,EAAE,EAAM,EAAI,UAAiF,EAC3GH,EAAM,IAAI,WAAmF,EAC7FA,EAAM,QAAQ,CAAC,GAAM,IAAM,GAAM,EAAI,SAAwE,EAE7GA,EAAM,IAAI,SAAmE,EAC7EA,EAAM,QAAQG,EAAE,GAAM,GAAI,OAAuE,EACjGH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAmE,EAC7FH,EAAM,QAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,OAAqE,EAC1GA,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAmE,EAC7FH,EAAM,QAAQG,EAAE,GAAM,GAAI,OAAuE,EACjGH,EAAM,QAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,OAAqE,EAC1GA,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAsE,EAChGH,EAAM,IAAI,SAAyE,EACnFA,EAAM,QAAQG,EAAE,GAAM,GAAI,OAAkE,EAC5FH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAmF,EAC7GH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,GAAI,OAA8E,EACxGH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAA4E,EAEtGH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,EAAI,OAAyF,EACnHH,EAAM,QAAQG,EAAE,GAAM,GAAI,QAAiF,EAC3GH,EAAM,QAAQG,EAAE,GAAM,EAAI,QAAoE,EAC9FH,EAAM,QAAQG,EAAE,GAAM,EAAI,QAAoE,EAC9FH,EAAM,QAAQ,CAAC,GAAM,GAAM,EAAI,QAAoE,EACnGA,EAAM,QAAQG,EAAE,GAAM,GAAI,QAAoE,EAE9FH,EAAM,IAAI,SAAmE,EAC7EA,EAAM,QAAQO,OAA8E,EAC5FP,EAAM,IAAI,SAAuE,EACjFA,EAAM,QAAQG,EAAE,GAAM,EAAI,QAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,EAAI,QAAmE,EAC7FH,EAAM,QAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,QAAqE,EAC1GA,EAAM,QAAQO,SAAgF,EAC9FP,EAAM,QAAQG,EAAE,GAAM,GAAI,SAAsE,EAChGH,EAAM,QAAQO,SAA8E,EAC5FP,EAAM,IAAI,WAAuE,EACjFA,EAAM,QAAQG,EAAE,GAAM,EAAI,SAAmE,EAC7FH,EAAM,QAAQ,CAAC,GAAM,GAAM,GAAM,EAAI,SAAqE,EAC1GA,EAAM,QAAQG,EAAE,GAAM,EAAI,SAA4E,EACtGH,EAAM,QAAQO,SAA4F,EAC1GP,EAAM,IAAI,WAAqF,EAC/FA,EAAM,QAAQG,EAAE,GAAM,EAAI,SAAmF,EAC7GH,EAAM,QAAQG,EAAE,GAAM,EAAI,SAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,GAAI,UAAmF,EAC7GH,EAAM,QAAQG,EAAE,GAAM,GAAI,UAA4E,EACtGH,EAAM,QAAQG,EAAE,GAAM,GAAI,SAA4E,EACtGH,EAAM,QAAQO,UAA2F,EACzGP,EAAM,QAAQM,UAA0F,EACxGN,EAAM,IAAI,WAAmF,EAC7FA,EAAM,QAAQ,CAAC,GAAM,IAAM,GAAM,EAAI,SAA2E,EAEhHA,EAAM,IAAIF,QAA+E,EACzFE,EAAM,IAAIF,QAAyF,EACnGE,EAAM,IAAIF,QAAwF,EAClGE,EAAM,IAAIF,UAAwF,EAClGE,EAAM,IAAIF,WAAmG,EAC7GE,EAAM,IAAIF,WAAmG,EACtGE,CACT,GAAG,EAiCUS,GAAN,cAAmCC,CAA4C,CAqCpF,YACqBC,EAAgCZ,GACnD,CACA,MAAM,EAFa,kBAAAY,EATrB,KAAU,YAAiC,CACzC,QACA,SAAU,CAAC,EACX,WAAY,EACZ,WAAY,EACZ,SAAU,CACZ,EAOE,KAAK,aAAe,EACpB,KAAK,aAAe,KAAK,aACzB,KAAK,QAAU,IAAIC,GACnB,KAAK,QAAQ,SAAS,CAAC,EACvB,KAAK,SAAW,EAChB,KAAK,mBAAqB,EAG1B,KAAK,gBAAkB,CAACC,EAAMT,EAAOC,IAAc,CAAE,EACrD,KAAK,kBAAqBX,GAAuB,CAAE,EACnD,KAAK,cAAgB,CAACoB,EAAeC,IAA0B,CAAE,EACjE,KAAK,cAAiBD,GAAwB,CAAE,EAChD,KAAK,gBAAmBnB,GAAwCA,EAChE,KAAK,cAAgB,KAAK,gBAC1B,KAAK,iBAAmB,OAAO,OAAO,IAAI,EAC1C,KAAK,oBAAsB,IAAI,MAAM,EAAI,EAAE,KAAK,MAAS,EACzD,KAAK,aAAe,OAAO,OAAO,IAAI,EACtC,KAAK,aAAe,OAAO,OAAO,IAAI,EACtC,KAAK,UAAUqB,EAAa,IAAM,CAChC,KAAK,aAAe,OAAO,OAAO,IAAI,EACtC,KAAK,iBAAmB,OAAO,OAAO,IAAI,EAC1C,KAAK,oBAAsB,IAAI,MAAM,EAAI,EAAE,KAAK,MAAS,EACzD,KAAK,aAAe,OAAO,OAAO,IAAI,CACxC,CAAC,CAAC,EACF,KAAK,WAAa,KAAK,UAAU,IAAIC,EAAW,EAChD,KAAK,WAAa,KAAK,UAAU,IAAIC,EAAW,EAChD,KAAK,WAAa,KAAK,UAAU,IAAIC,EAAW,EAChD,KAAK,cAAgB,KAAK,gBAG1B,KAAK,mBAAmB,CAAE,MAAO,IAAK,EAAG,IAAM,EAAI,CACrD,CAEU,YAAYC,EAAyBC,EAAuB,CAAC,GAAM,GAAI,EAAW,CAC1F,IAAIC,EAAM,EACV,GAAIF,EAAG,OAAQ,CACb,GAAIA,EAAG,OAAO,OAAS,EACrB,MAAM,IAAI,MAAM,mCAAmC,EAGrD,GADAE,EAAMF,EAAG,OAAO,WAAW,CAAC,EACxBE,EAAM,IAAQA,EAAM,GACtB,MAAM,IAAI,MAAM,sCAAsC,CAE1D,CACA,GAAIF,EAAG,cAAe,CACpB,GAAIA,EAAG,cAAc,OAAS,EAC5B,MAAM,IAAI,MAAM,+CAA+C,EAEjE,QAASvB,EAAI,EAAGA,EAAIuB,EAAG,cAAc,OAAQ,EAAEvB,EAAG,CAChD,IAAM0B,EAAeH,EAAG,cAAc,WAAWvB,CAAC,EAClD,GAAI,GAAO0B,GAAgBA,EAAe,GACxC,MAAM,IAAI,MAAM,4CAA4C,EAE9DD,IAAQ,EACRA,GAAOC,CACT,CACF,CACA,GAAIH,EAAG,MAAM,SAAW,EACtB,MAAM,IAAI,MAAM,6BAA6B,EAE/C,IAAMI,EAAYJ,EAAG,MAAM,WAAW,CAAC,EACvC,GAAIC,EAAW,CAAC,EAAIG,GAAaA,EAAYH,EAAW,CAAC,EACvD,MAAM,IAAI,MAAM,0BAA0BA,EAAW,CAAC,CAAC,OAAOA,EAAW,CAAC,CAAC,EAAE,EAE/E,OAAAC,IAAQ,EACRA,GAAOE,EAEAF,CACT,CAEO,cAAcR,EAAuB,CAC1C,IAAMQ,EAAgB,CAAC,EACvB,KAAOR,GACLQ,EAAI,KAAK,OAAO,aAAaR,EAAQ,GAAI,CAAC,EAC1CA,IAAU,EAEZ,OAAOQ,EAAI,QAAQ,EAAE,KAAK,EAAE,CAC9B,CAEO,gBAAgBG,EAAiC,CACtD,KAAK,cAAgBA,CACvB,CACO,mBAA0B,CAC/B,KAAK,cAAgB,KAAK,eAC5B,CAEO,mBAAmBL,EAAyBK,EAAsC,CACvF,IAAMX,EAAQ,KAAK,YAAYM,EAAI,CAAC,GAAM,GAAI,CAAC,EAC/C,KAAK,aAAaN,CAAK,IAAM,CAAC,EAC9B,IAAMY,EAAc,KAAK,aAAaZ,CAAK,EAC3C,OAAAY,EAAY,KAAKD,CAAO,EACjB,CACL,QAAS,IAAM,CACb,IAAME,EAAeD,EAAY,QAAQD,CAAO,EAC5CE,IAAiB,IACnBD,EAAY,OAAOC,EAAc,CAAC,CAEtC,CACF,CACF,CACO,gBAAgBP,EAA+B,CAChD,KAAK,aAAa,KAAK,YAAYA,EAAI,CAAC,GAAM,GAAI,CAAC,CAAC,GAAG,OAAO,KAAK,aAAa,KAAK,YAAYA,EAAI,CAAC,GAAM,GAAI,CAAC,CAAC,CACxH,CACO,sBAAsBK,EAAuC,CAClE,KAAK,cAAgBA,CACvB,CAEO,kBAAkBG,EAAcH,EAAmC,CACxE,IAAM/B,EAAOkC,EAAK,WAAW,CAAC,EAC9B,KAAK,iBAAiBlC,CAAI,EAAI+B,EAC1B/B,EAAO,KAAM,KAAK,oBAAoBA,CAAI,EAAI+B,EACpD,CACO,oBAAoBG,EAAoB,CAC7C,IAAMlC,EAAOkC,EAAK,WAAW,CAAC,EAC1B,KAAK,iBAAiBlC,CAAI,GAAG,OAAO,KAAK,iBAAiBA,CAAI,EAC9DA,EAAO,KAAM,KAAK,oBAAoBA,CAAI,EAAI,OACpD,CACO,0BAA0B+B,EAA2C,CAC1E,KAAK,kBAAoBA,CAC3B,CAEO,mBAAmBL,EAAyBK,EAAsC,CACvF,IAAMX,EAAQ,KAAK,YAAYM,CAAE,EACjC,KAAK,aAAaN,CAAK,IAAM,CAAC,EAC9B,IAAMY,EAAc,KAAK,aAAaZ,CAAK,EAC3C,OAAAY,EAAY,KAAKD,CAAO,EACjB,CACL,QAAS,IAAM,CACb,IAAME,EAAeD,EAAY,QAAQD,CAAO,EAC5CE,IAAiB,IACnBD,EAAY,OAAOC,EAAc,CAAC,CAEtC,CACF,CACF,CACO,gBAAgBP,EAA+B,CAChD,KAAK,aAAa,KAAK,YAAYA,CAAE,CAAC,GAAG,OAAO,KAAK,aAAa,KAAK,YAAYA,CAAE,CAAC,CAC5F,CACO,sBAAsBS,EAA0D,CACrF,KAAK,cAAgBA,CACvB,CAEO,mBAAmBT,EAAyBK,EAAmC,CACpF,OAAO,KAAK,WAAW,gBAAgB,KAAK,YAAYL,CAAE,EAAGK,CAAO,CACtE,CACO,gBAAgBL,EAA+B,CACpD,KAAK,WAAW,aAAa,KAAK,YAAYA,CAAE,CAAC,CACnD,CACO,sBAAsBK,EAAuC,CAClE,KAAK,WAAW,mBAAmBA,CAAO,CAC5C,CAEO,mBAAmBX,EAAeW,EAAmC,CAC1E,OAAO,KAAK,WAAW,gBAAgBX,EAAOW,CAAO,CACvD,CACO,gBAAgBX,EAAqB,CAC1C,KAAK,WAAW,aAAaA,CAAK,CACpC,CACO,sBAAsBW,EAAuC,CAClE,KAAK,WAAW,mBAAmBA,CAAO,CAC5C,CAEO,mBAAmBL,EAAyBK,EAAmC,CACpF,OAAAL,EAAG,OAAS,OACL,KAAK,WAAW,gBAAgB,KAAK,YAAYA,EAAI,CAAC,GAAM,GAAI,CAAC,EAAGK,CAAO,CACpF,CACO,gBAAgBL,EAA+B,CACpDA,EAAG,OAAS,OACZ,KAAK,WAAW,aAAa,KAAK,YAAYA,EAAI,CAAC,GAAM,GAAI,CAAC,CAAC,CACjE,CACO,sBAAsBK,EAAuC,CAClE,KAAK,WAAW,mBAAmBA,CAAO,CAC5C,CAEO,gBAAgBI,EAAyD,CAC9E,KAAK,cAAgBA,CACvB,CACO,mBAA0B,CAC/B,KAAK,cAAgB,KAAK,eAC5B,CAWO,OAAc,CACnB,KAAK,aAAe,KAAK,aACzB,KAAK,WAAW,MAAM,EACtB,KAAK,WAAW,MAAM,EACtB,KAAK,WAAW,MAAM,EACtB,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,KAAK,mBAAqB,EAItB,KAAK,YAAY,QAAU,IAC7B,KAAK,YAAY,MAAQ,EACzB,KAAK,YAAY,SAAW,CAAC,EAEjC,CAKU,eACRlC,EACAmC,EACAC,EACAC,EACAC,EACM,CACN,KAAK,YAAY,MAAQtC,EACzB,KAAK,YAAY,SAAWmC,EAC5B,KAAK,YAAY,WAAaC,EAC9B,KAAK,YAAY,WAAaC,EAC9B,KAAK,YAAY,SAAWC,CAC9B,CA+CO,MAAMpB,EAAmBtB,EAAgB2C,EAAkD,CAChG,IAAIxC,EACAsC,EACA5B,EAAQ,EACR+B,EAGJ,GAAI,KAAK,YAAY,MAGnB,GAAI,KAAK,YAAY,QAAU,EAC7B,KAAK,YAAY,MAAQ,EACzB/B,EAAQ,KAAK,YAAY,SAAW,MAC/B,CACL,GAAI8B,IAAkB,QAAa,KAAK,YAAY,QAAU,EAgB5D,WAAK,YAAY,MAAQ,EACnB,IAAI,MAAM,wEAAwE,EAM1F,IAAMJ,EAAW,KAAK,YAAY,SAC9BC,EAAa,KAAK,YAAY,WAAa,EAC/C,OAAQ,KAAK,YAAY,MAAO,CAC9B,OACE,GAAIG,IAAkB,IAASH,EAAa,IAC1C,KAAOA,GAAc,IACnBI,EAAiBL,EAA8BC,CAAU,EAAE,KAAK,OAAO,EACnEI,IAAkB,IAFAJ,IAIf,GAAII,aAAyB,QAClC,YAAK,YAAY,WAAaJ,EACvBI,EAIb,KAAK,YAAY,SAAW,CAAC,EAC7B,MACF,OACE,GAAID,IAAkB,IAASH,EAAa,IAC1C,KAAOA,GAAc,IACnBI,EAAiBL,EAA8BC,CAAU,EAAE,EACvDI,IAAkB,IAFAJ,IAIf,GAAII,aAAyB,QAClC,YAAK,YAAY,WAAaJ,EACvBI,EAIb,KAAK,YAAY,SAAW,CAAC,EAC7B,MACF,OAGE,GAFAzC,EAAOmB,EAAK,KAAK,YAAY,QAAQ,EACrCsB,EAAgB,KAAK,WAAW,OAAOzC,IAAS,IAAQA,IAAS,GAAMwC,CAAa,EAChFC,EACF,OAAOA,EAELzC,IAAS,KAAM,KAAK,YAAY,YAAc,GAClD,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,MACF,OAGE,GAFAA,EAAOmB,EAAK,KAAK,YAAY,QAAQ,EACrCsB,EAAgB,KAAK,WAAW,IAAIzC,IAAS,IAAQA,IAAS,GAAMwC,CAAa,EAC7EC,EACF,OAAOA,EAELzC,IAAS,KAAM,KAAK,YAAY,YAAc,GAClD,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,MACF,OAGE,GAFAA,EAAOmB,EAAK,KAAK,YAAY,QAAQ,EACrCsB,EAAgB,KAAK,WAAW,IAAIzC,IAAS,IAAQA,IAAS,GAAMwC,CAAa,EAC7EC,EACF,OAAOA,EAELzC,IAAS,KAAM,KAAK,YAAY,YAAc,GAClD,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,KACJ,CAEA,KAAK,YAAY,MAAQ,EACzBU,EAAQ,KAAK,YAAY,SAAW,EACpC,KAAK,mBAAqB,EAC1B,KAAK,aAAe,KAAK,YAAY,WAAa,GACpD,CAMF,QAASP,EAAIO,EAAOP,EAAIN,EAAQ,EAAEM,EAAG,CAInC,GAHAH,EAAOmB,EAAKhB,CAAC,EAGTH,EAAO,IAAQ,KAAK,cAAgB,EAAwB,EAC7D,KAAK,oBAAoBA,CAAI,GAAK,KAAK,mBAAmBA,CAAI,EAC/D,KAAK,mBAAqB,EAC1B,QACF,CAGA,GAAIA,IAAS,IACR,KAAK,aAAe,GACpBG,EAAI,EAAIN,GAAUsB,EAAKhB,EAAI,CAAC,IAAM,GACrC,CACA,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,IAAIuC,EAAIvC,EAAI,EACRwC,EAAKxB,EAAKuB,CAAC,EACXC,GAAM,IAAQA,GAAM,KACtB,KAAK,SAAWA,EAChBD,KAEF,IAAIE,EAAU,GACd,KAAOF,EAAI7C,EAAQ6C,IAEjB,GADAC,EAAKxB,EAAKuB,CAAC,EACPC,GAAM,IAAQA,GAAM,GACtB,KAAK,QAAQ,SAASA,EAAK,EAAE,UACpBA,IAAO,GAChB,KAAK,QAAQ,SAAS,CAAC,UACdA,IAAO,GAChB,KAAK,QAAQ,YAAY,EAAE,UAClBA,GAAM,IAAQA,GAAM,IAAM,CACnC,IAAMP,EAAW,KAAK,aAAa,KAAK,UAAY,EAAIO,CAAE,EACtDE,EAAIT,EAAWA,EAAS,OAAS,EAAI,GACzC,KAAOS,GAAK,IACVJ,EAAgBL,EAASS,CAAC,EAAE,KAAK,OAAO,EACpCJ,IAAkB,IAFTI,IAIN,GAAIJ,aAAyB,QAClC,OAAAH,EAAa,KACb,KAAK,iBAAoCF,EAAUS,EAAGP,EAAYI,CAAC,EAC5DD,EAGPI,EAAI,GACN,KAAK,cAAc,KAAK,UAAY,EAAIF,EAAI,KAAK,OAAO,EAE1D,KAAK,mBAAqB,EAC1BxC,EAAIuC,EACJ,KAAK,aAAe,EACpBE,EAAU,GACV,KACF,KACE,OAGCA,IACHzC,EAAIuC,EAAI,EACR,KAAK,aAAe,GAEtB,QACF,CAOA,OAJAJ,EAAa,KAAK,aAAa,MAC7B,KAAK,cAAgB,GACpBtC,EAAOI,GAAsBJ,EAAOI,GACvC,EACQkC,GAAc,EAAqC,CACzD,OAEE,IAAIQ,EAAI3C,EACF4C,EAAKlD,EAAS,EACpB,KAAOiD,EAAIC,GACN5B,EAAK,EAAE2B,CAAC,GAAK,KAAS3B,EAAK2B,CAAC,GAAK,KAAQ3B,EAAK2B,CAAC,GAAK1C,KACpDe,EAAK,EAAE2B,CAAC,GAAK,KAAS3B,EAAK2B,CAAC,GAAK,KAAQ3B,EAAK2B,CAAC,GAAK1C,KACpDe,EAAK,EAAE2B,CAAC,GAAK,KAAS3B,EAAK2B,CAAC,GAAK,KAAQ3B,EAAK2B,CAAC,GAAK1C,KACpDe,EAAK,EAAE2B,CAAC,GAAK,KAAS3B,EAAK2B,CAAC,GAAK,KAAQ3B,EAAK2B,CAAC,GAAK1C,KACvD,CACF,GAAI0C,GAAKC,EACP,KAAOD,EAAIjD,GAAUsB,EAAK2B,CAAC,GAAK,KAAS3B,EAAK2B,CAAC,GAAK,KAAQ3B,EAAK2B,CAAC,GAAK1C,KACrE0C,IAGJ,KAAK,cAAc3B,EAAMhB,EAAG2C,CAAC,EAC7B3C,EAAI2C,EAAI,EACR,MACF,OACM,KAAK,iBAAiB9C,CAAI,EAAG,KAAK,iBAAiBA,CAAI,EAAE,EACxD,KAAK,kBAAkBA,CAAI,EAChC,KAAK,mBAAqB,EAC1B,MACF,OACE,MACF,OAUE,GAT8B,KAAK,cACjC,CACE,SAAUG,EACV,KAAAH,EACA,aAAc,KAAK,aACnB,QAAS,KAAK,SACd,OAAQ,KAAK,QACb,MAAO,EACT,CAAC,EACQ,MAAO,OAElB,MACF,OAEE,IAAMoC,EAAW,KAAK,aAAa,KAAK,UAAY,EAAIpC,CAAI,EACxD6C,EAAIT,EAAWA,EAAS,OAAS,EAAI,GACzC,KAAOS,GAAK,IAGVJ,EAAgBL,EAASS,CAAC,EAAE,KAAK,OAAO,EACpCJ,IAAkB,IAJTI,IAMN,GAAIJ,aAAyB,QAClC,YAAK,iBAAoCL,EAAUS,EAAGP,EAAYnC,CAAC,EAC5DsC,EAGPI,EAAI,GACN,KAAK,cAAc,KAAK,UAAY,EAAI7C,EAAM,KAAK,OAAO,EAE5D,KAAK,mBAAqB,EAC1B,MACF,OAEE,EACE,QAAQA,EAAM,CACZ,IAAK,IACH,KAAK,QAAQ,SAAS,CAAC,EACvB,MACF,IAAK,IACH,KAAK,QAAQ,YAAY,EAAE,EAC3B,MACF,QACE,KAAK,QAAQ,SAASA,EAAO,EAAE,CACnC,OACO,EAAEG,EAAIN,IAAWG,EAAOmB,EAAKhB,CAAC,GAAK,IAAQH,EAAO,IAC3DG,IACA,MACF,OACE,KAAK,WAAa,EAClB,KAAK,UAAYH,EACjB,MACF,QACE,IAAMgD,EAAc,KAAK,aAAa,KAAK,UAAY,EAAIhD,CAAI,EAC3DiD,EAAKD,EAAcA,EAAY,OAAS,EAAI,GAChD,KAAOC,GAAM,IAGXR,EAAgBO,EAAYC,CAAE,EAAE,EAC5BR,IAAkB,IAJRQ,IAMP,GAAIR,aAAyB,QAClC,YAAK,iBAAoCO,EAAaC,EAAIX,EAAYnC,CAAC,EAChEsC,EAGPQ,EAAK,GACP,KAAK,cAAc,KAAK,UAAY,EAAIjD,CAAI,EAE9C,KAAK,mBAAqB,EAC1B,MACF,QACE,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,MACF,QACE,KAAK,WAAW,KAAK,KAAK,UAAY,EAAIA,EAAM,KAAK,OAAO,EAC5D,MACF,QAGE,QAAS6C,EAAI1C,EAAI,GAAK,EAAE0C,EACtB,GAAIA,GAAKhD,IAAWG,EAAOmB,EAAK0B,CAAC,KAAO,IAAQ7C,IAAS,IAAQA,IAAS,IAASA,EAAO,KAAQA,EAAOI,GAAsB,CAC7H,KAAK,WAAW,IAAIe,EAAMhB,EAAG0C,CAAC,EAC9B1C,EAAI0C,EAAI,EACR,KACF,CAEF,MACF,QAEE,GADAJ,EAAgB,KAAK,WAAW,OAAOzC,IAAS,IAAQA,IAAS,EAAI,EACjEyC,EACF,YAAK,iBAAoC,CAAC,EAAG,EAAGH,EAAYnC,CAAC,EACtDsC,EAELzC,IAAS,KAAMsC,GAAc,GACjC,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,KAAK,mBAAqB,EAC1B,MACF,OACE,KAAK,WAAW,MAAM,EACtB,MACF,OAEE,QAASO,EAAI1C,EAAI,GAAK0C,IACpB,GAAIA,GAAKhD,IAAWG,EAAOmB,EAAK0B,CAAC,GAAK,IAAS7C,EAAO,KAAQA,EAAOI,GAAsB,CACzF,KAAK,WAAW,IAAIe,EAAMhB,EAAG0C,CAAC,EAC9B1C,EAAI0C,EAAI,EACR,KACF,CAEF,MACF,OAEE,GADAJ,EAAgB,KAAK,WAAW,IAAIzC,IAAS,IAAQA,IAAS,EAAI,EAC9DyC,EACF,YAAK,iBAAoC,CAAC,EAAG,EAAGH,EAAYnC,CAAC,EACtDsC,EAELzC,IAAS,KAAMsC,GAAc,GACjC,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,KAAK,mBAAqB,EAC1B,MACF,QACE,KAAK,WAAW,MAAM,KAAK,UAAY,EAAItC,CAAI,EAC/C,MACF,QAGE,QAAS6C,EAAI1C,EAAI,GAAK,EAAE0C,EACtB,GAAI,EAAAA,EAAIhD,IACLsB,EAAK0B,CAAC,GAAK,IAAQ1B,EAAK0B,CAAC,EAAI,KAAU1B,EAAK0B,CAAC,GAAK,GAAQ1B,EAAK0B,CAAC,EAAI,IAAS1B,EAAK0B,CAAC,GAAKzC,KAE3F,MAAK,WAAW,IAAIe,EAAMhB,EAAG0C,CAAC,EAC9B1C,EAAI0C,EAAI,EACR,MAEF,MACF,QAEE,GADAJ,EAAgB,KAAK,WAAW,IAAIzC,IAAS,IAAQA,IAAS,EAAI,EAC9DyC,EACF,YAAK,iBAAoC,CAAC,EAAG,EAAGH,EAAYnC,CAAC,EACtDsC,EAELzC,IAAS,KAAMsC,GAAc,GACjC,KAAK,QAAQ,SAAS,EACtB,KAAK,SAAW,EAChB,KAAK,mBAAqB,EAC1B,KACJ,CACA,KAAK,aAAeA,EAAa,GACnC,CACF,CACF,EC95BA,IAAMY,GAAU,qKAEVC,GAAW,aAaV,SAASC,GAAWC,EAAoD,CAC7E,GAAI,CAACA,EAAM,OAEX,IAAIC,EAAMD,EAAK,YAAY,EAC3B,GAAIC,EAAI,WAAW,MAAM,EAAG,CAE1BA,EAAMA,EAAI,MAAM,CAAC,EACjB,IAAMC,EAAIL,GAAQ,KAAKI,CAAG,EAC1B,GAAIC,EAAG,CACL,IAAMC,EAAOD,EAAE,CAAC,EAAI,GAAKA,EAAE,CAAC,EAAI,IAAMA,EAAE,CAAC,EAAI,KAAO,MACpD,MAAO,CACL,KAAK,MAAM,SAASA,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,EAAE,EAAG,EAAE,EAAIC,EAAO,GAAG,EACnE,KAAK,MAAM,SAASD,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,EAAE,EAAG,EAAE,EAAIC,EAAO,GAAG,EACnE,KAAK,MAAM,SAASD,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,EAAE,EAAG,EAAE,EAAIC,EAAO,GAAG,CACrE,CACF,CACF,SAAWF,EAAI,WAAW,GAAG,IAE3BA,EAAMA,EAAI,MAAM,CAAC,EACbH,GAAS,KAAKG,CAAG,GAAK,CAAC,EAAG,EAAG,EAAG,EAAE,EAAE,SAASA,EAAI,MAAM,GAAG,CAC5D,IAAMG,EAAMH,EAAI,OAAS,EACnBI,EAAmC,CAAC,EAAG,EAAG,CAAC,EACjD,QAASC,EAAI,EAAGA,EAAI,EAAG,EAAEA,EAAG,CAC1B,IAAMC,EAAI,SAASN,EAAI,MAAMG,EAAME,EAAGF,EAAME,EAAIF,CAAG,EAAG,EAAE,EACxDC,EAAOC,CAAC,EAAIF,IAAQ,EAAIG,GAAK,EAAIH,IAAQ,EAAIG,EAAIH,IAAQ,EAAIG,GAAK,EAAIA,GAAK,CAC7E,CACA,OAAOF,CACT,CAMJ,CAGA,SAASG,GAAI,EAAWC,EAAsB,CAC5C,IAAMC,EAAI,EAAE,SAAS,EAAE,EACjBC,EAAKD,EAAE,OAAS,EAAI,IAAMA,EAAIA,EACpC,OAAQD,EAAM,CACZ,IAAK,GACH,OAAOC,EAAE,CAAC,EACZ,IAAK,GACH,OAAOC,EACT,IAAK,IACH,OAAQA,EAAKA,GAAI,MAAM,EAAG,CAAC,EAC7B,QACE,OAAOA,EAAKA,CAChB,CACF,CAKO,SAASC,GAAYC,EAAiCJ,EAAe,GAAY,CACtF,GAAM,CAACK,EAAGC,EAAGC,CAAC,EAAIH,EAClB,MAAO,OAAOL,GAAIM,EAAGL,CAAI,CAAC,IAAID,GAAIO,EAAGN,CAAI,CAAC,IAAID,GAAIQ,EAAGP,CAAI,CAAC,EAC5D,CCvEO,IAAMQ,GAAgB,iBCsB7B,IAAMC,GAAoC,CAAE,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,CAAE,EAsB3F,SAASC,GAAoB,EAAWC,EAA+B,CACrE,GAAI,EAAI,GACN,OAAOA,EAAK,aAAe,GAE7B,OAAQ,EAAG,CACT,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,WACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,YACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,eACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,iBACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,SACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,SACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,WACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,gBACtB,IAAK,GAAG,MAAO,CAAC,CAACA,EAAK,YACtB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,cACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,YACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,eACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,iBACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,oBACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,kBACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,gBACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,mBACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,aACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,YACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,UACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,SACvB,IAAK,IAAI,MAAO,CAAC,CAACA,EAAK,WACzB,CACA,MAAO,EACT,CAQA,IAAIC,GAAQ,EASCC,GAAN,cAA2BC,CAAoC,CAsDpE,YACmBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAiC,IAAIC,GACtD,CACA,MAAM,EAVW,oBAAAT,EACA,qBAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,wBAAAC,EACA,qBAAAC,EACA,aAAAC,EA9DnB,KAAQ,aAA4B,IAAI,YAAY,IAAI,EACxD,KAAQ,eAAgC,IAAIE,GAC5C,KAAQ,aAA4B,IAAIC,GACxC,KAAQ,aAAe,GACvB,KAAQ,UAAY,GAEpB,KAAU,kBAA8B,CAAC,EACzC,KAAU,eAA2B,CAAC,EAEtC,KAAQ,aAA+BC,EAAkB,MAAM,EAE/D,KAAQ,uBAAyCA,EAAkB,MAAM,EAIzE,KAAiB,eAAiB,KAAK,UAAU,IAAIC,CAAe,EACpE,KAAgB,cAAgB,KAAK,eAAe,MACpD,KAAiB,sBAAwB,KAAK,UAAU,IAAIA,CAAqD,EACjH,KAAgB,qBAAuB,KAAK,sBAAsB,MAClE,KAAiB,gBAAkB,KAAK,UAAU,IAAIA,CAAe,EACrE,KAAgB,eAAiB,KAAK,gBAAgB,MACtD,KAAiB,oBAAsB,KAAK,UAAU,IAAIA,CAAe,EACzE,KAAgB,mBAAqB,KAAK,oBAAoB,MAC9D,KAAiB,wBAA0B,KAAK,UAAU,IAAIA,CAAe,EAC7E,KAAgB,uBAAyB,KAAK,wBAAwB,MACtE,KAAiB,+BAAiC,KAAK,UAAU,IAAIA,CAAmC,EACxG,KAAgB,8BAAgC,KAAK,+BAA+B,MAEpF,KAAiB,YAAc,KAAK,UAAU,IAAIA,CAAiB,EACnE,KAAgB,WAAa,KAAK,YAAY,MAC9C,KAAiB,WAAa,KAAK,UAAU,IAAIA,CAAiB,EAClE,KAAgB,UAAY,KAAK,WAAW,MAC5C,KAAiB,cAAgB,KAAK,UAAU,IAAIA,CAAe,EACnE,KAAgB,aAAe,KAAK,cAAc,MAClD,KAAiB,YAAc,KAAK,UAAU,IAAIA,CAAe,EACjE,KAAgB,WAAa,KAAK,YAAY,MAC9C,KAAiB,UAAY,KAAK,UAAU,IAAIA,CAAiB,EACjE,KAAgB,SAAW,KAAK,UAAU,MAC1C,KAAiB,eAAiB,KAAK,UAAU,IAAIA,CAAiB,EACtE,KAAgB,cAAgB,KAAK,eAAe,MACpD,KAAiB,SAAW,KAAK,UAAU,IAAIA,CAAsB,EACrE,KAAgB,QAAU,KAAK,SAAS,MACxC,KAAiB,2BAA6B,KAAK,UAAU,IAAIA,CAAe,EAChF,KAAgB,0BAA4B,KAAK,2BAA2B,MAE5E,KAAQ,YAA2B,CACjC,OAAQ,GACR,aAAc,EACd,aAAc,EACd,cAAe,EACf,SAAU,CACZ,EAo7FA,KAAQ,eAAiB,YAAqF,EAt6F5G,KAAK,UAAU,KAAK,OAAO,EAC3B,KAAK,iBAAmB,IAAIC,GAAgB,KAAK,cAAc,EAG/D,KAAK,cAAgB,KAAK,eAAe,OACzC,KAAK,UAAU,KAAK,eAAe,QAAQ,iBAAiBC,GAAK,KAAK,cAAgBA,EAAE,YAAY,CAAC,EAKrG,KAAK,QAAQ,sBAAsB,CAACC,EAAOC,IAAW,CACpD,KAAK,YAAY,MAAM,qBAAsB,CAAE,WAAY,KAAK,QAAQ,cAAcD,CAAK,EAAG,OAAQC,EAAO,QAAQ,CAAE,CAAC,CAC1H,CAAC,EACD,KAAK,QAAQ,sBAAsBD,GAAS,CAC1C,KAAK,YAAY,MAAM,qBAAsB,CAAE,WAAY,KAAK,QAAQ,cAAcA,CAAK,CAAE,CAAC,CAChG,CAAC,EACD,KAAK,QAAQ,0BAA0BE,GAAQ,CAC7C,KAAK,YAAY,MAAM,yBAA0B,CAAE,KAAAA,CAAK,CAAC,CAC3D,CAAC,EACD,KAAK,QAAQ,sBAAsB,CAACC,EAAYC,EAAQC,IAAS,CAC/D,KAAK,YAAY,MAAM,qBAAsB,CAAE,WAAAF,EAAY,OAAAC,EAAQ,KAAAC,CAAK,CAAC,CAC3E,CAAC,EACD,KAAK,QAAQ,sBAAsB,CAACL,EAAOI,EAAQE,IAAY,CACzDF,IAAW,SACbE,EAAUA,EAAQ,QAAQ,GAE5B,KAAK,YAAY,MAAM,qBAAsB,CAAE,WAAY,KAAK,QAAQ,cAAcN,CAAK,EAAG,OAAAI,EAAQ,QAAAE,CAAQ,CAAC,CACjH,CAAC,EACD,KAAK,QAAQ,sBAAsB,CAACN,EAAOI,EAAQE,IAAY,CAC7D,KAAK,YAAY,MAAM,qBAAsB,CAAE,WAAY,KAAK,QAAQ,cAAcN,CAAK,EAAG,OAAAI,EAAQ,QAAAE,CAAQ,CAAC,CACjH,CAAC,EAKD,KAAK,QAAQ,gBAAgB,CAACD,EAAME,EAAOC,IAAQ,KAAK,MAAMH,EAAME,EAAOC,CAAG,CAAC,EAK/E,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGP,GAAU,KAAK,YAAYA,CAAM,CAAC,EAClF,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACrG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,SAASA,CAAM,CAAC,EAC/E,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,CAAM,CAAC,EACtG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACpF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EACrF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EACrF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,oBAAoBA,CAAM,CAAC,EAC1F,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,mBAAmBA,CAAM,CAAC,EACzF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EACrF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,iBAAiBA,CAAM,CAAC,EACvF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,EAAQ,EAAK,CAAC,EAC5F,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,EAAQ,EAAI,CAAC,EACxG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,EAAQ,EAAK,CAAC,EACzF,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,EAAQ,EAAI,CAAC,EACrG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,CAAM,CAAC,EAClF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,CAAM,CAAC,EAClF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,CAAM,CAAC,EAClF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,SAASA,CAAM,CAAC,EAC/E,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,kBAAkBA,CAAM,CAAC,EACxF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,gBAAgBA,CAAM,CAAC,EACtF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,kBAAkBA,CAAM,CAAC,EACxF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,yBAAyBA,CAAM,CAAC,EAC/F,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,4BAA4BA,CAAM,CAAC,EAClG,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,8BAA8BA,CAAM,CAAC,EACjH,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,gBAAgBA,CAAM,CAAC,EACtF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,kBAAkBA,CAAM,CAAC,EACxF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,SAASA,CAAM,CAAC,EAC/E,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,QAAQA,CAAM,CAAC,EAC9E,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EAClG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,UAAUA,CAAM,CAAC,EAChF,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,iBAAiBA,CAAM,CAAC,EACpG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EACrF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,aAAaA,CAAM,CAAC,EACnF,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,oBAAoBA,CAAM,CAAC,EACvG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,UAAUA,CAAM,CAAC,EACpG,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACjG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,eAAeA,CAAM,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,gBAAgBA,CAAM,CAAC,EACtF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,WAAWA,CAAM,CAAC,EACjF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACpF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACpF,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAM,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAM,MAAO,GAAI,EAAGA,GAAU,KAAK,cAAcA,CAAM,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,gBAAgBA,CAAM,CAAC,EAC1G,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,EAAQ,EAAI,CAAC,EAC5G,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,cAAe,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,YAAYA,EAAQ,EAAK,CAAC,EAG1H,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,iBAAiBA,CAAM,CAAC,EACpG,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,mBAAmBA,CAAM,CAAC,EACtG,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,kBAAkBA,CAAM,CAAC,EACrG,KAAK,QAAQ,mBAAmB,CAAE,OAAQ,IAAK,MAAO,GAAI,EAAGA,GAAU,KAAK,iBAAiBA,CAAM,CAAC,EAKpG,KAAK,QAAQ,yBAA0B,IAAM,KAAK,KAAK,CAAC,EACxD,KAAK,QAAQ;AAAA,EAAyB,IAAM,KAAK,SAAS,CAAC,EAC3D,KAAK,QAAQ,uBAAyB,IAAM,KAAK,SAAS,CAAC,EAC3D,KAAK,QAAQ,uBAAyB,IAAM,KAAK,SAAS,CAAC,EAC3D,KAAK,QAAQ,uBAAyB,IAAM,KAAK,eAAe,CAAC,EACjE,KAAK,QAAQ,uBAAyB,IAAM,KAAK,UAAU,CAAC,EAC5D,KAAK,QAAQ,sBAAyB,IAAM,KAAK,IAAI,CAAC,EACtD,KAAK,QAAQ,sBAAyB,IAAM,KAAK,SAAS,CAAC,EAC3D,KAAK,QAAQ,sBAAyB,IAAM,KAAK,QAAQ,CAAC,EAG1D,KAAK,QAAQ,yBAA0B,IAAM,KAAK,MAAM,CAAC,EACzD,KAAK,QAAQ,yBAA0B,IAAM,KAAK,SAAS,CAAC,EAC5D,KAAK,QAAQ,yBAA0B,IAAM,KAAK,OAAO,CAAC,EAM1D,KAAK,QAAQ,mBAAmB,EAAG,IAAIQ,GAAWJ,IAAU,KAAK,SAASA,CAAI,EAAG,KAAK,YAAYA,CAAI,EAAU,GAAO,CAAC,EAExH,KAAK,QAAQ,mBAAmB,EAAG,IAAII,GAAWJ,GAAQ,KAAK,YAAYA,CAAI,CAAC,CAAC,EAEjF,KAAK,QAAQ,mBAAmB,EAAG,IAAII,GAAWJ,GAAQ,KAAK,SAASA,CAAI,CAAC,CAAC,EAG9E,KAAK,QAAQ,mBAAmB,EAAG,IAAII,GAAWJ,GAAQ,KAAK,wBAAwBA,CAAI,CAAC,CAAC,EAK7F,KAAK,QAAQ,mBAAmB,EAAG,IAAII,GAAWJ,GAAQ,KAAK,aAAaA,CAAI,CAAC,CAAC,EAElF,KAAK,QAAQ,mBAAmB,GAAI,IAAII,GAAWJ,GAAQ,KAAK,mBAAmBA,CAAI,CAAC,CAAC,EAEzF,KAAK,QAAQ,mBAAmB,GAAI,IAAII,GAAWJ,GAAQ,KAAK,mBAAmBA,CAAI,CAAC,CAAC,EAEzF,KAAK,QAAQ,mBAAmB,GAAI,IAAII,GAAWJ,GAAQ,KAAK,uBAAuBA,CAAI,CAAC,CAAC,EAa7F,KAAK,QAAQ,mBAAmB,IAAK,IAAII,GAAWJ,GAAQ,KAAK,oBAAoBA,CAAI,CAAC,CAAC,EAI3F,KAAK,QAAQ,mBAAmB,IAAK,IAAII,GAAWJ,GAAQ,KAAK,eAAeA,CAAI,CAAC,CAAC,EAEtF,KAAK,QAAQ,mBAAmB,IAAK,IAAII,GAAWJ,GAAQ,KAAK,eAAeA,CAAI,CAAC,CAAC,EAEtF,KAAK,QAAQ,mBAAmB,IAAK,IAAII,GAAWJ,GAAQ,KAAK,mBAAmBA,CAAI,CAAC,CAAC,EAY1F,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,WAAW,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,cAAc,CAAC,EAC1E,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,MAAM,CAAC,EAClE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,SAAS,CAAC,EACrE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,OAAO,CAAC,EACnE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,aAAa,CAAC,EACzE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,sBAAsB,CAAC,EAClF,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,kBAAkB,CAAC,EAC9E,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,EACtE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,MAAO,GAAI,EAAG,IAAM,KAAK,UAAU,CAAC,CAAC,EACvE,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAG,IAAM,KAAK,qBAAqB,CAAC,EACrG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAG,IAAM,KAAK,qBAAqB,CAAC,EACrG,QAAWK,KAAQC,EACjB,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOD,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EACzG,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAOA,CAAK,EAAG,IAAM,KAAK,cAAc,IAAMA,CAAI,CAAC,EAE3G,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAG,IAAM,KAAK,uBAAuB,CAAC,EAKvG,KAAK,QAAQ,gBAAiBE,IAC5B,KAAK,YAAY,MAAM,kBAAmBA,CAAK,EACxCA,EACR,EAKD,KAAK,QAAQ,mBAAmB,CAAE,cAAe,IAAK,MAAO,GAAI,EAAG,IAAIC,GAAW,CAACR,EAAMJ,IAAW,KAAK,oBAAoBI,EAAMJ,CAAM,CAAC,CAAC,CAC9I,CA1QO,aAA8B,CAAE,OAAO,KAAK,YAAc,CA+QzD,eAAea,EAAsBC,EAAsBC,EAAuBC,EAAwB,CAChH,KAAK,YAAY,OAAS,GAC1B,KAAK,YAAY,aAAeH,EAChC,KAAK,YAAY,aAAeC,EAChC,KAAK,YAAY,cAAgBC,EACjC,KAAK,YAAY,SAAWC,CAC9B,CAEQ,uBAAuBC,EAA2B,CAExD,GAAI,KAAK,YAAY,UAAY,EAAmB,CAClD,IAAIC,EACEC,EAAc,IAAI,QAAe,CAACC,EAAMC,IAAQ,CACpDH,EAAc,WAAW,IAAMG,EAAI,eAAe,EAAG,GAA0B,CACjF,CAAC,EACD,QAAQ,KAAK,CAACJ,EAAGE,CAAW,CAAC,EAC1B,KAAK,IAAM,CACND,IAAgB,QAClB,aAAaA,CAAW,CAE5B,EAAGI,GAAO,CAIR,GAHIJ,IAAgB,QAClB,aAAaA,CAAW,EAEtBI,IAAQ,gBACV,MAAMA,EAER,QAAQ,KAAK,iDAA0E,CACzF,CAAC,CACL,CACF,CAEQ,mBAA4B,CAClC,OAAO,KAAK,aAAa,SAAS,KACpC,CAeO,MAAMlB,EAA2BmB,EAAkD,CACxF,IAAIC,EACAX,EAAe,KAAK,cAAc,EAClCC,EAAe,KAAK,cAAc,EAClCR,EAAQ,EACNmB,EAAY,KAAK,YAAY,OAEnC,GAAIA,EAAW,CAEb,GAAID,EAAS,KAAK,QAAQ,MAAM,KAAK,aAAc,KAAK,YAAY,cAAeD,CAAa,EAC9F,YAAK,uBAAuBC,CAAM,EAC3BA,EAETX,EAAe,KAAK,YAAY,aAChCC,EAAe,KAAK,YAAY,aAChC,KAAK,YAAY,OAAS,GACtBV,EAAK,OAAS,SAChBE,EAAQ,KAAK,YAAY,SAAW,OAExC,CA2BA,GAxBI,KAAK,YAAY,UAAY,GAC/B,KAAK,YAAY,MAAM,gBAAgB,OAAOF,GAAS,SAAW,KAAKA,CAAI,IAAM,KAAK,MAAM,UAAU,IAAI,KAAKA,EAAMN,GAAK,OAAO,aAAaA,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,EAE7J,KAAK,YAAY,WAAa,GAChC,KAAK,YAAY,MAAM,uBAAwB,OAAOM,GAAS,SAC3DA,EAAK,MAAM,EAAE,EAAE,IAAIN,GAAKA,EAAE,WAAW,CAAC,CAAC,EACvCM,CACJ,EAIE,KAAK,aAAa,OAASA,EAAK,QAC9B,KAAK,aAAa,OAAS,SAC7B,KAAK,aAAe,IAAI,YAAY,KAAK,IAAIA,EAAK,OAAQ,MAAgC,CAAC,GAM1FqB,GACH,KAAK,iBAAiB,WAAW,EAI/BrB,EAAK,OAAS,OAChB,QAASsB,EAAIpB,EAAOoB,EAAItB,EAAK,OAAQsB,GAAK,OAAkC,CAC1E,IAAMnB,EAAMmB,EAAI,OAAmCtB,EAAK,OAASsB,EAAI,OAAmCtB,EAAK,OACvGuB,EAAO,OAAOvB,GAAS,SACzB,KAAK,eAAe,OAAOA,EAAK,UAAUsB,EAAGnB,CAAG,EAAG,KAAK,YAAY,EACpE,KAAK,aAAa,OAAOH,EAAK,SAASsB,EAAGnB,CAAG,EAAG,KAAK,YAAY,EACrE,GAAIiB,EAAS,KAAK,QAAQ,MAAM,KAAK,aAAcG,CAAG,EACpD,YAAK,eAAed,EAAcC,EAAca,EAAKD,CAAC,EACtD,KAAK,uBAAuBF,CAAM,EAC3BA,CAEX,SAEI,CAACC,EAAW,CACd,IAAME,EAAO,OAAOvB,GAAS,SACzB,KAAK,eAAe,OAAOA,EAAM,KAAK,YAAY,EAClD,KAAK,aAAa,OAAOA,EAAM,KAAK,YAAY,EACpD,GAAIoB,EAAS,KAAK,QAAQ,MAAM,KAAK,aAAcG,CAAG,EACpD,YAAK,eAAed,EAAcC,EAAca,EAAK,CAAC,EACtD,KAAK,uBAAuBH,CAAM,EAC3BA,CAEX,EAGE,KAAK,cAAc,IAAMX,GAAgB,KAAK,cAAc,IAAMC,IACpE,KAAK,cAAc,KAAK,EAK1B,IAAMc,EAAc,KAAK,iBAAiB,KAAO,KAAK,eAAe,OAAO,MAAQ,KAAK,eAAe,OAAO,OACzGC,EAAgB,KAAK,iBAAiB,OAAS,KAAK,eAAe,OAAO,MAAQ,KAAK,eAAe,OAAO,OAC/GA,EAAgB,KAAK,eAAe,MACtC,KAAK,sBAAsB,KAAK,CAC9B,MAAO,KAAK,IAAIA,EAAe,KAAK,eAAe,KAAO,CAAC,EAC3D,IAAK,KAAK,IAAID,EAAa,KAAK,eAAe,KAAO,CAAC,CACzD,CAAC,CAEL,CAEO,MAAMxB,EAAmBE,EAAeC,EAAmB,CAChE,IAAIN,EACA6B,EACEC,EAAU,KAAK,gBAAgB,QAC/BC,EAAmB,KAAK,gBAAgB,WAAW,iBACnDC,EAAO,KAAK,eAAe,KAC3BC,EAAiB,KAAK,aAAa,gBAAgB,WACnDC,EAAa,KAAK,aAAa,MAAM,WACrCC,EAAU,KAAK,aACjBC,EAAY,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EAI5F,GAAI,CAACA,EACH,OAGF,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,EAGhD,KAAK,cAAc,GAAK9B,EAAMD,EAAQ,GAAK+B,EAAU,SAAS,KAAK,cAAc,EAAI,CAAC,IAAM,GAC9FA,EAAU,qBAAqB,KAAK,cAAc,EAAI,EAAG,EAAG,EAAGD,CAAO,EAGxE,IAAIE,EAAqB,KAAK,QAAQ,mBACtC,QAASC,EAAMjC,EAAOiC,EAAMhC,EAAK,EAAEgC,EAAK,CAKtC,GAJAtC,EAAOG,EAAKmC,CAAG,EAIXtC,IAAS,IACX,SAMF,GAAIA,EAAO,KAAO8B,EAAS,CACzB,IAAMS,EAAKT,EAAQ,OAAO,aAAa9B,CAAI,CAAC,EACxCuC,IACFvC,EAAOuC,EAAG,WAAW,CAAC,EAE1B,CAEA,IAAMC,EAAc,KAAK,gBAAgB,eAAexC,EAAMqC,CAAkB,EAChFR,EAAUY,GAAe,aAAaD,CAAW,EACjD,IAAME,EAAaD,GAAe,kBAAkBD,CAAW,EACzDG,EAAWD,EAAaD,GAAe,aAAaJ,CAAkB,EAAI,EAChFA,EAAqBG,EAEjBT,GACF,KAAK,YAAY,KAAKa,GAAoB5C,CAAI,CAAC,EAEjD,IAAM6C,EAAS,KAAK,kBAAkB,EAQtC,GAPIA,GACF,KAAK,gBAAgB,cAAcA,EAAQ,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EAMxF,KAAK,cAAc,EAAIhB,EAAUc,EAAWX,GAG9C,GAAIC,EAAgB,CAClB,IAAMa,EAASV,EACXW,EAAS,KAAK,cAAc,EAAIJ,EAgBpC,GAfA,KAAK,cAAc,EAAIA,EACvB,KAAK,cAAc,IACf,KAAK,cAAc,IAAM,KAAK,cAAc,aAAe,GAC7D,KAAK,cAAc,IACnB,KAAK,eAAe,OAAO,KAAK,eAAe,EAAG,EAAI,IAElD,KAAK,cAAc,GAAK,KAAK,eAAe,OAC9C,KAAK,cAAc,EAAI,KAAK,eAAe,KAAO,GAIpD,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EAAG,UAAY,IAG7FP,EAAY,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACpF,CAACA,EACH,OASF,IAPIO,EAAW,GAAKP,aAAqBY,IAGvCZ,EAAU,cAAcU,EACtBC,EAAQ,EAAGJ,EAAU,EAAK,EAGvBI,EAASf,GACdc,EAAO,qBAAqBC,IAAU,EAAG,EAAGZ,CAAO,CAEvD,SACE,KAAK,cAAc,EAAIH,EAAO,EAC1BH,IAAY,EAGd,SASN,GAAIa,GAAc,KAAK,cAAc,EAAG,CACtC,IAAMO,EAASb,EAAU,SAAS,KAAK,cAAc,EAAI,CAAC,EAAI,EAAI,EAIlEA,EAAU,mBAAmB,KAAK,cAAc,EAAIa,EAClDjD,EAAM6B,CAAO,EACf,QAASqB,EAAQrB,EAAUc,EAAU,EAAEO,GAAS,GAC9Cd,EAAU,qBAAqB,KAAK,cAAc,IAAK,EAAG,EAAGD,CAAO,EAEtE,QACF,CAoBA,GAjBID,IAEFE,EAAU,YAAY,KAAK,cAAc,EAAGP,EAAUc,EAAU,KAAK,cAAc,YAAYR,CAAO,CAAC,EAInGC,EAAU,SAASJ,EAAO,CAAC,IAAM,GACnCI,EAAU,qBAAqBJ,EAAO,EAAG,EAAgB,EAAiBG,CAAO,GAKrFC,EAAU,qBAAqB,KAAK,cAAc,IAAKpC,EAAM6B,EAASM,CAAO,EAKzEN,EAAU,EACZ,KAAO,EAAEA,GAEPO,EAAU,qBAAqB,KAAK,cAAc,IAAK,EAAG,EAAGD,CAAO,CAG1E,CAEA,KAAK,QAAQ,mBAAqBE,EAG9B,KAAK,cAAc,EAAIL,GAAQ1B,EAAMD,EAAQ,GAAK+B,EAAU,SAAS,KAAK,cAAc,CAAC,IAAM,GAAK,CAACA,EAAU,WAAW,KAAK,cAAc,CAAC,GAChJA,EAAU,qBAAqB,KAAK,cAAc,EAAG,EAAG,EAAGD,CAAO,EAGpE,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,CACtD,CAKO,mBAAmBgB,EAAyBC,EAAwE,CACzH,OAAID,EAAG,QAAU,KAAO,CAACA,EAAG,QAAU,CAACA,EAAG,cAEjC,KAAK,QAAQ,mBAAmBA,EAAIpD,GACpCsD,GAAoBtD,EAAO,OAAO,CAAC,EAAG,KAAK,gBAAgB,WAAW,aAAa,EAGjFqD,EAASrD,CAAM,EAFb,EAGV,EAEI,KAAK,QAAQ,mBAAmBoD,EAAIC,CAAQ,CACrD,CAKO,mBAAmBD,EAAyBC,EAAqF,CACtI,OAAO,KAAK,QAAQ,mBAAmBD,EAAI,IAAIxC,GAAWyC,CAAQ,CAAC,CACrE,CAKO,mBAAmBD,EAAyBC,EAAyD,CAC1G,OAAO,KAAK,QAAQ,mBAAmBD,EAAIC,CAAQ,CACrD,CAKO,mBAAmBtD,EAAesD,EAAqE,CAC5G,OAAO,KAAK,QAAQ,mBAAmBtD,EAAO,IAAIS,GAAW6C,CAAQ,CAAC,CACxE,CAKO,mBAAmBD,EAAyBC,EAAqE,CACtH,OAAO,KAAK,QAAQ,mBAAmBD,EAAI,IAAIG,GAAWF,CAAQ,CAAC,CACrE,CAUO,MAAgB,CACrB,YAAK,eAAe,KAAK,EAClB,EACT,CAYO,UAAoB,CACzB,YAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,EAChD,KAAK,gBAAgB,WAAW,aAClC,KAAK,cAAc,EAAI,GAEzB,KAAK,cAAc,IACf,KAAK,cAAc,IAAM,KAAK,cAAc,aAAe,GAC7D,KAAK,cAAc,IACnB,KAAK,eAAe,OAAO,KAAK,eAAe,CAAC,GACvC,KAAK,cAAc,GAAK,KAAK,eAAe,KACrD,KAAK,cAAc,EAAI,KAAK,eAAe,KAAO,EAOlD,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EAAG,UAAY,GAGzF,KAAK,cAAc,GAAK,KAAK,eAAe,MAC9C,KAAK,cAAc,IAErB,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,EAEpD,KAAK,YAAY,KAAK,EACf,EACT,CAQO,gBAA0B,CAC/B,YAAK,cAAc,EAAI,EAChB,EACT,CAaO,WAAqB,CAE1B,GAAI,CAAC,KAAK,aAAa,gBAAgB,kBACrC,YAAK,gBAAgB,EACjB,KAAK,cAAc,EAAI,GACzB,KAAK,cAAc,IAEd,GAQT,GAFA,KAAK,gBAAgB,KAAK,eAAe,IAAI,EAEzC,KAAK,cAAc,EAAI,EACzB,KAAK,cAAc,YAUf,KAAK,cAAc,IAAM,GACxB,KAAK,cAAc,EAAI,KAAK,cAAc,WAC1C,KAAK,cAAc,GAAK,KAAK,cAAc,cAC3C,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,GAAG,UAAW,CAC7F,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EAAG,UAAY,GAC3F,KAAK,cAAc,IACnB,KAAK,cAAc,EAAI,KAAK,eAAe,KAAO,EAMlD,IAAMG,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACrFA,EAAK,SAAS,KAAK,cAAc,CAAC,GAAK,CAACA,EAAK,WAAW,KAAK,cAAc,CAAC,GAC9E,KAAK,cAAc,GAKvB,CAEF,YAAK,gBAAgB,EACd,EACT,CAQO,KAAe,CACpB,GAAI,KAAK,cAAc,GAAK,KAAK,eAAe,KAC9C,MAAO,GAET,IAAMC,EAAY,KAAK,cAAc,EACrC,YAAK,cAAc,EAAI,KAAK,cAAc,SAAS,EAC/C,KAAK,gBAAgB,WAAW,kBAClC,KAAK,WAAW,KAAK,KAAK,cAAc,EAAIA,CAAS,EAEhD,EACT,CASO,UAAoB,CACzB,YAAK,gBAAgB,UAAU,CAAC,EACzB,EACT,CASO,SAAmB,CACxB,YAAK,gBAAgB,UAAU,CAAC,EACzB,EACT,CAKQ,gBAAgBC,EAAiB,KAAK,eAAe,KAAO,EAAS,CAC3E,KAAK,cAAc,EAAI,KAAK,IAAIA,EAAQ,KAAK,IAAI,EAAG,KAAK,cAAc,CAAC,CAAC,EACzE,KAAK,cAAc,EAAI,KAAK,aAAa,gBAAgB,OACrD,KAAK,IAAI,KAAK,cAAc,aAAc,KAAK,IAAI,KAAK,cAAc,UAAW,KAAK,cAAc,CAAC,CAAC,EACtG,KAAK,IAAI,KAAK,eAAe,KAAO,EAAG,KAAK,IAAI,EAAG,KAAK,cAAc,CAAC,CAAC,EAC5E,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,CACtD,CAKQ,WAAWC,EAAWC,EAAiB,CAC7C,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,EAChD,KAAK,aAAa,gBAAgB,QACpC,KAAK,cAAc,EAAID,EACvB,KAAK,cAAc,EAAI,KAAK,cAAc,UAAYC,IAEtD,KAAK,cAAc,EAAID,EACvB,KAAK,cAAc,EAAIC,GAEzB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,CACtD,CAKQ,YAAYD,EAAWC,EAAiB,CAG9C,KAAK,gBAAgB,EACrB,KAAK,WAAW,KAAK,cAAc,EAAID,EAAG,KAAK,cAAc,EAAIC,CAAC,CACpE,CASO,SAAS5D,EAA0B,CAExC,IAAM6D,EAAY,KAAK,cAAc,EAAI,KAAK,cAAc,UAC5D,OAAIA,GAAa,EACf,KAAK,YAAY,EAAG,CAAC,KAAK,IAAIA,EAAW7D,EAAO,OAAO,CAAC,GAAK,CAAC,CAAC,EAE/D,KAAK,YAAY,EAAG,EAAEA,EAAO,OAAO,CAAC,GAAK,EAAE,EAEvC,EACT,CASO,WAAWA,EAA0B,CAE1C,IAAM8D,EAAe,KAAK,cAAc,aAAe,KAAK,cAAc,EAC1E,OAAIA,GAAgB,EAClB,KAAK,YAAY,EAAG,KAAK,IAAIA,EAAc9D,EAAO,OAAO,CAAC,GAAK,CAAC,CAAC,EAEjE,KAAK,YAAY,EAAGA,EAAO,OAAO,CAAC,GAAK,CAAC,EAEpC,EACT,CAQO,cAAcA,EAA0B,CAC7C,YAAK,YAAYA,EAAO,OAAO,CAAC,GAAK,EAAG,CAAC,EAClC,EACT,CAQO,eAAeA,EAA0B,CAC9C,YAAK,YAAY,EAAEA,EAAO,OAAO,CAAC,GAAK,GAAI,CAAC,EACrC,EACT,CAUO,eAAeA,EAA0B,CAC9C,YAAK,WAAWA,CAAM,EACtB,KAAK,cAAc,EAAI,EAChB,EACT,CAUO,oBAAoBA,EAA0B,CACnD,YAAK,SAASA,CAAM,EACpB,KAAK,cAAc,EAAI,EAChB,EACT,CAQO,mBAAmBA,EAA0B,CAClD,YAAK,YAAYA,EAAO,OAAO,CAAC,GAAK,GAAK,EAAG,KAAK,cAAc,CAAC,EAC1D,EACT,CAWO,eAAeA,EAA0B,CAC9C,YAAK,WAEFA,EAAO,QAAU,GAAMA,EAAO,OAAO,CAAC,GAAK,GAAK,EAAI,GAEpDA,EAAO,OAAO,CAAC,GAAK,GAAK,CAC5B,EACO,EACT,CASO,gBAAgBA,EAA0B,CAC/C,YAAK,YAAYA,EAAO,OAAO,CAAC,GAAK,GAAK,EAAG,KAAK,cAAc,CAAC,EAC1D,EACT,CAQO,kBAAkBA,EAA0B,CACjD,YAAK,YAAYA,EAAO,OAAO,CAAC,GAAK,EAAG,CAAC,EAClC,EACT,CAQO,gBAAgBA,EAA0B,CAC/C,YAAK,WAAW,KAAK,cAAc,GAAIA,EAAO,OAAO,CAAC,GAAK,GAAK,CAAC,EAC1D,EACT,CASO,kBAAkBA,EAA0B,CACjD,YAAK,YAAY,EAAGA,EAAO,OAAO,CAAC,GAAK,CAAC,EAClC,EACT,CAUO,WAAWA,EAA0B,CAC1C,YAAK,eAAeA,CAAM,EACnB,EACT,CAaO,SAASA,EAA0B,CACxC,IAAM+D,EAAQ/D,EAAO,OAAO,CAAC,EAC7B,OAAI+D,IAAU,EACZ,OAAO,KAAK,cAAc,KAAK,KAAK,cAAc,CAAC,EAC1CA,IAAU,IACnB,KAAK,cAAc,KAAO,CAAC,GAEtB,EACT,CAQO,iBAAiB/D,EAA0B,CAChD,GAAI,KAAK,cAAc,GAAK,KAAK,eAAe,KAC9C,MAAO,GAET,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAChC,KAAO+D,KACL,KAAK,cAAc,EAAI,KAAK,cAAc,SAAS,EAErD,MAAO,EACT,CAOO,kBAAkB/D,EAA0B,CACjD,GAAI,KAAK,cAAc,GAAK,KAAK,eAAe,KAC9C,MAAO,GAET,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAEhC,KAAO+D,KACL,KAAK,cAAc,EAAI,KAAK,cAAc,SAAS,EAErD,MAAO,EACT,CAOO,gBAAgB/D,EAA0B,CAC/C,IAAMiB,EAAIjB,EAAO,OAAO,CAAC,EACzB,OAAIiB,IAAM,IAAG,KAAK,aAAa,IAAM,YACjCA,IAAM,GAAKA,IAAM,KAAG,KAAK,aAAa,IAAM,YACzC,EACT,CAYQ,mBAAmB2C,EAAWtD,EAAeC,EAAayD,EAAqB,GAAOC,EAA0B,GAAa,CACnI,IAAMT,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EACjEJ,IAGLA,EAAK,aACHlD,EACAC,EACA,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,EACpD0D,CACF,EACID,IACFR,EAAK,UAAY,IAErB,CAOQ,iBAAiBI,EAAWK,EAA0B,GAAa,CACzE,IAAMT,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EAClEJ,IACFA,EAAK,KAAK,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,EAAGS,CAAc,EAC/E,KAAK,eAAe,OAAO,aAAa,KAAK,cAAc,MAAQL,CAAC,EACpEJ,EAAK,UAAY,GAErB,CA0BO,eAAexD,EAAiBiE,EAA0B,GAAgB,CAC/E,KAAK,gBAAgB,KAAK,eAAe,IAAI,EAC7C,IAAIC,EACJ,OAAQlE,EAAO,OAAO,CAAC,EAAG,CACxB,IAAK,GAIH,IAHAkE,EAAI,KAAK,cAAc,EACvB,KAAK,iBAAiB,UAAUA,CAAC,EACjC,KAAK,mBAAmBA,IAAK,KAAK,cAAc,EAAG,KAAK,eAAe,KAAM,KAAK,cAAc,IAAM,EAAGD,CAAc,EAChHC,EAAI,KAAK,eAAe,KAAMA,IACnC,KAAK,iBAAiBA,EAAGD,CAAc,EAEzC,KAAK,iBAAiB,UAAUC,CAAC,EACjC,MACF,IAAK,GAKH,GAJAA,EAAI,KAAK,cAAc,EACvB,KAAK,iBAAiB,UAAUA,CAAC,EAEjC,KAAK,mBAAmBA,EAAG,EAAG,KAAK,cAAc,EAAI,EAAG,GAAMD,CAAc,EACxE,KAAK,cAAc,EAAI,GAAK,KAAK,eAAe,KAAM,CAExD,IAAME,EAAW,KAAK,cAAc,MAAM,IAAID,EAAI,CAAC,EAC/CC,IACFA,EAAS,UAAY,GAEzB,CACA,KAAOD,KACL,KAAK,iBAAiBA,EAAGD,CAAc,EAEzC,KAAK,iBAAiB,UAAU,CAAC,EACjC,MACF,IAAK,GACH,GAAI,KAAK,gBAAgB,WAAW,uBAAwB,CAG1D,IAFAC,EAAI,KAAK,eAAe,KACxB,KAAK,iBAAiB,eAAe,EAAGA,EAAI,CAAC,EACtCA,KAED,CADgB,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQA,CAAC,GAC5D,iBAAiB,GAAlC,CAIF,KAAOA,GAAK,EAAGA,IACb,KAAK,eAAe,OAAO,KAAK,eAAe,CAAC,CAEpD,KACK,CAGH,IAFAA,EAAI,KAAK,eAAe,KACxB,KAAK,iBAAiB,UAAUA,EAAI,CAAC,EAC9BA,KACL,KAAK,iBAAiBA,EAAGD,CAAc,EAEzC,KAAK,iBAAiB,UAAU,CAAC,CACnC,CACA,MACF,IAAK,GAEH,IAAMG,EAAiB,KAAK,cAAc,MAAM,OAAS,KAAK,eAAe,KACzEA,EAAiB,IACnB,KAAK,cAAc,MAAM,UAAUA,CAAc,EACjD,KAAK,cAAc,MAAQ,KAAK,IAAI,KAAK,cAAc,MAAQA,EAAgB,CAAC,EAChF,KAAK,cAAc,MAAQ,KAAK,IAAI,KAAK,cAAc,MAAQA,EAAgB,CAAC,EAEhF,KAAK,UAAU,KAAK,CAAC,GAEvB,KACJ,CACA,MAAO,EACT,CAwBO,YAAYpE,EAAiBiE,EAA0B,GAAgB,CAE5E,OADA,KAAK,gBAAgB,KAAK,eAAe,IAAI,EACrCjE,EAAO,OAAO,CAAC,EAAG,CACxB,IAAK,GACH,KAAK,mBAAmB,KAAK,cAAc,EAAG,KAAK,cAAc,EAAG,KAAK,eAAe,KAAM,KAAK,cAAc,IAAM,EAAGiE,CAAc,EACxI,MACF,IAAK,GACH,KAAK,mBAAmB,KAAK,cAAc,EAAG,EAAG,KAAK,cAAc,EAAI,EAAG,GAAOA,CAAc,EAChG,MACF,IAAK,GACH,KAAK,mBAAmB,KAAK,cAAc,EAAG,EAAG,KAAK,eAAe,KAAM,GAAMA,CAAc,EAC/F,KACJ,CACA,YAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,EAC7C,EACT,CAWO,YAAYjE,EAA0B,CAC3C,KAAK,gBAAgB,EACrB,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAEhC,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAGT,IAAMqE,EAAc,KAAK,cAAc,MAAQ,KAAK,cAAc,EAE5DC,EAAyB,KAAK,eAAe,KAAO,EAAI,KAAK,cAAc,aAC3EC,EAAuB,KAAK,eAAe,KAAO,EAAI,KAAK,cAAc,MAAQD,EAAyB,EAChH,KAAOP,KAGL,KAAK,cAAc,MAAM,OAAOQ,EAAuB,EAAG,CAAC,EAC3D,KAAK,cAAc,MAAM,OAAOF,EAAK,EAAG,KAAK,cAAc,aAAa,KAAK,eAAe,CAAC,CAAC,EAGhG,YAAK,iBAAiB,eAAe,KAAK,cAAc,EAAG,KAAK,cAAc,YAAY,EAC1F,KAAK,cAAc,EAAI,EAChB,EACT,CAWO,YAAYrE,EAA0B,CAC3C,KAAK,gBAAgB,EACrB,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAEhC,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAGT,IAAMqE,EAAc,KAAK,cAAc,MAAQ,KAAK,cAAc,EAE9DH,EAGJ,IAFAA,EAAI,KAAK,eAAe,KAAO,EAAI,KAAK,cAAc,aACtDA,EAAI,KAAK,eAAe,KAAO,EAAI,KAAK,cAAc,MAAQA,EACvDH,KAGL,KAAK,cAAc,MAAM,OAAOM,EAAK,CAAC,EACtC,KAAK,cAAc,MAAM,OAAOH,EAAG,EAAG,KAAK,cAAc,aAAa,KAAK,eAAe,CAAC,CAAC,EAG9F,YAAK,iBAAiB,eAAe,KAAK,cAAc,EAAG,KAAK,cAAc,YAAY,EAC1F,KAAK,cAAc,EAAI,EAChB,EACT,CAcO,YAAYlE,EAA0B,CAC3C,KAAK,gBAAgB,EACrB,IAAMwD,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACzF,OAAIA,IACFA,EAAK,YACH,KAAK,cAAc,EACnBxD,EAAO,OAAO,CAAC,GAAK,EACpB,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CACtD,EACA,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,GAE/C,EACT,CAcO,YAAYA,EAA0B,CAC3C,KAAK,gBAAgB,EACrB,IAAMwD,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACzF,OAAIA,IACFA,EAAK,YACH,KAAK,cAAc,EACnBxD,EAAO,OAAO,CAAC,GAAK,EACpB,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CACtD,EACA,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,GAE/C,EACT,CAUO,SAASA,EAA0B,CACxC,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAEhC,KAAO+D,KACL,KAAK,cAAc,MAAM,OAAO,KAAK,cAAc,MAAQ,KAAK,cAAc,UAAW,CAAC,EAC1F,KAAK,cAAc,MAAM,OAAO,KAAK,cAAc,MAAQ,KAAK,cAAc,aAAc,EAAG,KAAK,cAAc,aAAa,KAAK,eAAe,CAAC,CAAC,EAEvJ,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAOO,WAAW/D,EAA0B,CAC1C,IAAI+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAEhC,KAAO+D,KACL,KAAK,cAAc,MAAM,OAAO,KAAK,cAAc,MAAQ,KAAK,cAAc,aAAc,CAAC,EAC7F,KAAK,cAAc,MAAM,OAAO,KAAK,cAAc,MAAQ,KAAK,cAAc,UAAW,EAAG,KAAK,cAAc,aAAapE,CAAiB,CAAC,EAEhJ,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAoBO,WAAWK,EAA0B,CAC1C,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAET,IAAM+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAClC,QAAS4D,EAAI,KAAK,cAAc,UAAWA,GAAK,KAAK,cAAc,aAAc,EAAEA,EAAG,CACpF,IAAMJ,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EACtEJ,EAAK,YAAY,EAAGO,EAAO,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CAAC,EAChFP,EAAK,UAAY,EACnB,CACA,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAqBO,YAAYxD,EAA0B,CAC3C,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAET,IAAM+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAClC,QAAS4D,EAAI,KAAK,cAAc,UAAWA,GAAK,KAAK,cAAc,aAAc,EAAEA,EAAG,CACpF,IAAMJ,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EACtEJ,EAAK,YAAY,EAAGO,EAAO,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CAAC,EAChFP,EAAK,UAAY,EACnB,CACA,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAWO,cAAcxD,EAA0B,CAC7C,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAET,IAAM+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAClC,QAAS4D,EAAI,KAAK,cAAc,UAAWA,GAAK,KAAK,cAAc,aAAc,EAAEA,EAAG,CACpF,IAAMJ,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EACtEJ,EAAK,YAAY,KAAK,cAAc,EAAGO,EAAO,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CAAC,EACnGP,EAAK,UAAY,EACnB,CACA,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAWO,cAAcxD,EAA0B,CAC7C,GAAI,KAAK,cAAc,EAAI,KAAK,cAAc,cAAgB,KAAK,cAAc,EAAI,KAAK,cAAc,UACtG,MAAO,GAET,IAAM+D,EAAQ/D,EAAO,OAAO,CAAC,GAAK,EAClC,QAAS4D,EAAI,KAAK,cAAc,UAAWA,GAAK,KAAK,cAAc,aAAc,EAAEA,EAAG,CACpF,IAAMJ,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQI,CAAC,EACtEJ,EAAK,YAAY,KAAK,cAAc,EAAGO,EAAO,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CAAC,EACnGP,EAAK,UAAY,EACnB,CACA,YAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,EAC3F,EACT,CAUO,WAAWxD,EAA0B,CAC1C,KAAK,gBAAgB,EACrB,IAAMwD,EAAO,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACzF,OAAIA,IACFA,EAAK,aACH,KAAK,cAAc,EACnB,KAAK,cAAc,GAAKxD,EAAO,OAAO,CAAC,GAAK,GAC5C,KAAK,cAAc,YAAY,KAAK,eAAe,CAAC,CACtD,EACA,KAAK,iBAAiB,UAAU,KAAK,cAAc,CAAC,GAE/C,EACT,CA4BO,yBAAyBA,EAA0B,CACxD,IAAMwE,EAAY,KAAK,QAAQ,mBAC/B,GAAI,CAACA,EACH,MAAO,GAGT,IAAMC,EAASzE,EAAO,OAAO,CAAC,GAAK,EAC7B8B,EAAUY,GAAe,aAAa8B,CAAS,EAC/Cb,EAAI,KAAK,cAAc,EAAI7B,EAE3B4C,EADY,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,CAAC,EACvE,UAAUf,CAAC,EAC5BvD,EAAO,IAAI,YAAYsE,EAAK,OAASD,CAAM,EAC7CE,EAAQ,EACZ,QAASC,EAAQ,EAAGA,EAAQF,EAAK,QAAS,CACxC,IAAMlC,EAAKkC,EAAK,YAAYE,CAAK,GAAK,EACtCxE,EAAKuE,GAAO,EAAInC,EAChBoC,GAASpC,EAAK,MAAS,EAAI,CAC7B,CACA,IAAIqC,EAAUF,EACd,QAASjD,EAAI,EAAGA,EAAI+C,EAAQ,EAAE/C,EAC5BtB,EAAK,WAAWyE,EAAS,EAAGF,CAAK,EACjCE,GAAWF,EAEb,YAAK,MAAMvE,EAAM,EAAGyE,CAAO,EACpB,EACT,CA2BO,4BAA4B7E,EAA0B,CAC3D,OAAIA,EAAO,OAAO,CAAC,EAAI,IAGnB,KAAK,IAAI,OAAO,GAAK,KAAK,IAAI,cAAc,GAAK,KAAK,IAAI,QAAQ,EACpE,KAAK,aAAa,iBAAiB,YAAiB,EAC3C,KAAK,IAAI,OAAO,GACzB,KAAK,aAAa,iBAAiB,UAAe,GAE7C,EACT,CA0BO,8BAA8BA,EAA0B,CAC7D,OAAIA,EAAO,OAAO,CAAC,EAAI,IAMnB,KAAK,IAAI,OAAO,EAClB,KAAK,aAAa,iBAAiB,gBAAqB,EAC/C,KAAK,IAAI,cAAc,EAChC,KAAK,aAAa,iBAAiB,gBAAqB,EAC/C,KAAK,IAAI,OAAO,EAGzB,KAAK,aAAa,iBAAiBA,EAAO,OAAO,CAAC,EAAI,GAAG,EAChD,KAAK,IAAI,QAAQ,GAC1B,KAAK,aAAa,iBAAiB,mBAAwB,GAEtD,EACT,CAUO,cAAcA,EAA0B,CAC7C,OAAIA,EAAO,OAAO,CAAC,EAAI,GAGvB,KAAK,aAAa,iBAAiB,mBAAwB8E,EAAa,SAAc,EAC/E,EACT,CAMQ,IAAIC,EAAuB,CACjC,OAAQ,KAAK,gBAAgB,WAAW,SAAW,IAAI,WAAWA,CAAI,CACxE,CAmBO,QAAQ/E,EAA0B,CACvC,QAAS0B,EAAI,EAAGA,EAAI1B,EAAO,OAAQ0B,IACjC,OAAQ1B,EAAO,OAAO0B,CAAC,EAAG,CACxB,IAAK,GACH,KAAK,aAAa,MAAM,WAAa,GACrC,MACF,IAAK,IACH,KAAK,gBAAgB,QAAQ,WAAa,GAC1C,KACJ,CAEF,MAAO,EACT,CAoHO,eAAe1B,EAA0B,CAC9C,QAAS0B,EAAI,EAAGA,EAAI1B,EAAO,OAAQ0B,IACjC,OAAQ1B,EAAO,OAAO0B,CAAC,EAAG,CACxB,IAAK,GACH,KAAK,aAAa,gBAAgB,sBAAwB,GAC1D,MACF,IAAK,GACH,KAAK,gBAAgB,YAAY,EAAGsD,EAAe,EACnD,KAAK,gBAAgB,YAAY,EAAGA,EAAe,EACnD,KAAK,gBAAgB,YAAY,EAAGA,EAAe,EACnD,KAAK,gBAAgB,YAAY,EAAGA,EAAe,EAEnD,MACF,IAAK,GAMC,KAAK,gBAAgB,WAAW,cAAc,cAChD,KAAK,eAAe,OAAO,IAAK,KAAK,eAAe,IAAI,EACxD,KAAK,gBAAgB,KAAK,GAE5B,MACF,IAAK,GACH,KAAK,aAAa,gBAAgB,OAAS,GAC3C,KAAK,WAAW,EAAG,CAAC,EACpB,MACF,IAAK,GACH,KAAK,aAAa,gBAAgB,WAAa,GAC/C,MACF,IAAK,IACC,KAAK,gBAAgB,WAAW,QAAQ,sBAC1C,KAAK,gBAAgB,QAAQ,YAAc,IAE7C,MACF,IAAK,IACH,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,MACF,IAAK,IACH,KAAK,YAAY,MAAM,2CAA2C,EAClE,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,KAAK,wBAAwB,KAAK,EAClC,MACF,IAAK,GAEH,KAAK,mBAAmB,eAAiB,MACzC,MACF,IAAK,KAEH,KAAK,mBAAmB,eAAiB,QACzC,MACF,IAAK,MACH,KAAK,mBAAmB,eAAiB,OACzC,MACF,IAAK,MAGH,KAAK,mBAAmB,eAAiB,MACzC,MACF,IAAK,MAGH,KAAK,aAAa,gBAAgB,UAAY,GAC9C,KAAK,oBAAoB,KAAK,EAC9B,MACF,IAAK,MACH,KAAK,YAAY,MAAM,uCAAuC,EAC9D,MACF,IAAK,MACH,KAAK,mBAAmB,eAAiB,MACzC,MACF,IAAK,MACH,KAAK,YAAY,MAAM,uCAAuC,EAC9D,MACF,IAAK,MACH,KAAK,mBAAmB,eAAiB,aACzC,MACF,IAAK,IACH,KAAK,aAAa,eAAiB,GACnC,MACF,IAAK,MACH,KAAK,WAAW,EAChB,MACF,IAAK,MACH,KAAK,WAAW,EAElB,IAAK,IACL,IAAK,MAEH,GAAI,KAAK,gBAAgB,WAAW,cAAc,cAAe,CAC/D,IAAMrE,EAAQ,KAAK,aAAa,cAChCA,EAAM,UAAYA,EAAM,MACxBA,EAAM,MAAQA,EAAM,QACtB,CACA,KAAK,eAAe,QAAQ,kBAAkB,KAAK,eAAe,CAAC,EACnE,KAAK,aAAa,oBAAsB,GACxC,KAAK,sBAAsB,KAAK,MAAS,EACzC,KAAK,wBAAwB,KAAK,EAClC,MACF,IAAK,MACH,KAAK,aAAa,gBAAgB,mBAAqB,GACvD,MACF,IAAK,MACH,KAAK,aAAa,gBAAgB,mBAAqB,GACvD,MACF,IAAK,OACC,KAAK,gBAAgB,WAAW,cAAc,kBAAoB,MACpE,KAAK,aAAa,gBAAgB,mBAAqB,IAEzD,MACF,IAAK,MACC,KAAK,gBAAgB,WAAW,cAAc,iBAChD,KAAK,aAAa,gBAAgB,eAAiB,IAErD,KACJ,CAEF,MAAO,EACT,CAuBO,UAAUX,EAA0B,CACzC,QAAS0B,EAAI,EAAGA,EAAI1B,EAAO,OAAQ0B,IACjC,OAAQ1B,EAAO,OAAO0B,CAAC,EAAG,CACxB,IAAK,GACH,KAAK,aAAa,MAAM,WAAa,GACrC,MACF,IAAK,IACH,KAAK,gBAAgB,QAAQ,WAAa,GAC1C,KACJ,CAEF,MAAO,EACT,CAgHO,iBAAiB1B,EAA0B,CAChD,QAAS0B,EAAI,EAAGA,EAAI1B,EAAO,OAAQ0B,IACjC,OAAQ1B,EAAO,OAAO0B,CAAC,EAAG,CACxB,IAAK,GACH,KAAK,aAAa,gBAAgB,sBAAwB,GAC1D,MACF,IAAK,GAMC,KAAK,gBAAgB,WAAW,cAAc,cAChD,KAAK,eAAe,OAAO,GAAI,KAAK,eAAe,IAAI,EACvD,KAAK,gBAAgB,KAAK,GAE5B,MACF,IAAK,GACH,KAAK,aAAa,gBAAgB,OAAS,GAC3C,KAAK,WAAW,EAAG,CAAC,EACpB,MACF,IAAK,GACH,KAAK,aAAa,gBAAgB,WAAa,GAC/C,MACF,IAAK,IACC,KAAK,gBAAgB,WAAW,QAAQ,sBAC1C,KAAK,gBAAgB,QAAQ,YAAc,IAE7C,MACF,IAAK,IACH,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,MACF,IAAK,IACH,KAAK,YAAY,MAAM,kCAAkC,EACzD,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,KAAK,wBAAwB,KAAK,EAClC,MACF,IAAK,GACL,IAAK,KACL,IAAK,MACL,IAAK,MACH,KAAK,mBAAmB,eAAiB,OACzC,MACF,IAAK,MACH,KAAK,aAAa,gBAAgB,UAAY,GAC9C,MACF,IAAK,MACH,KAAK,YAAY,MAAM,uCAAuC,EAC9D,MACF,IAAK,MACH,KAAK,mBAAmB,eAAiB,UACzC,MACF,IAAK,MACH,KAAK,YAAY,MAAM,uCAAuC,EAC9D,MACF,IAAK,MACH,KAAK,mBAAmB,eAAiB,UACzC,MACF,IAAK,IACH,KAAK,aAAa,eAAiB,GACnC,MACF,IAAK,MACH,KAAK,cAAc,EACnB,MACF,IAAK,MAEL,IAAK,IACL,IAAK,MAEH,GAAI,KAAK,gBAAgB,WAAW,cAAc,cAAe,CAC/D,IAAMf,EAAQ,KAAK,aAAa,cAChCA,EAAM,SAAWA,EAAM,MACvBA,EAAM,MAAQA,EAAM,SACtB,CAEA,KAAK,eAAe,QAAQ,qBAAqB,EAC7CX,EAAO,OAAO0B,CAAC,IAAM,MACvB,KAAK,cAAc,EAErB,KAAK,aAAa,oBAAsB,GACxC,KAAK,sBAAsB,KAAK,MAAS,EACzC,KAAK,wBAAwB,KAAK,EAClC,MACF,IAAK,MACH,KAAK,aAAa,gBAAgB,mBAAqB,GACvD,MACF,IAAK,MACH,KAAK,aAAa,gBAAgB,mBAAqB,GACvD,KAAK,sBAAsB,KAAK,MAAS,EACzC,MACF,IAAK,OACC,KAAK,gBAAgB,WAAW,cAAc,kBAAoB,MACpE,KAAK,aAAa,gBAAgB,mBAAqB,IAEzD,MACF,IAAK,MACC,KAAK,gBAAgB,WAAW,cAAc,iBAChD,KAAK,aAAa,gBAAgB,eAAiB,IAErD,KACJ,CAEF,MAAO,EACT,CAmCO,YAAY1B,EAAiBiF,EAAwB,CAE1D,IAAWC,QACTA,MAAA,eAAiB,GAAjB,iBACAA,MAAA,IAAM,GAAN,MACAA,MAAA,MAAQ,GAAR,QACAA,MAAA,gBAAkB,GAAlB,kBACAA,MAAA,kBAAoB,GAApB,sBALSA,IAAA,IASX,IAAMC,EAAK,KAAK,aAAa,gBACvB,CAAE,eAAgBC,EAAe,eAAgBC,CAAc,EAAI,KAAK,mBACxEC,EAAK,KAAK,aACV,CAAE,QAAAC,EAAS,KAAAtD,CAAK,EAAI,KAAK,eACzB,CAAE,OAAAuD,EAAQ,IAAAC,CAAI,EAAIF,EAClBG,EAAO,KAAK,gBAAgB,WAE5BC,EAAI,CAACC,EAAWC,KACpBP,EAAG,iBAAiB,QAAaL,EAAO,GAAK,GAAG,GAAGW,CAAC,IAAIC,CAAC,IAAI,EACtD,IAEHC,EAAOC,GAAsBA,EAAQ,EAAQ,EAE7C9E,EAAIjB,EAAO,OAAO,CAAC,EAEzB,OAAIiF,EACEhE,IAAM,EAAU0E,EAAE1E,EAAG,CAAmB,EACxCA,IAAM,EAAU0E,EAAE1E,EAAG6E,EAAIR,EAAG,MAAM,UAAU,CAAC,EAC7CrE,IAAM,GAAW0E,EAAE1E,EAAG,CAAiB,EACvCA,IAAM,GAAW0E,EAAE1E,EAAG6E,EAAIJ,EAAK,UAAU,CAAC,EACvCC,EAAE1E,EAAG,CAAgB,EAG1BA,IAAM,EAAU0E,EAAE1E,EAAG6E,EAAIX,EAAG,qBAAqB,CAAC,EAClDlE,IAAM,EAAU0E,EAAE1E,EAAGyE,EAAK,cAAc,YAAezD,IAAS,GAAK,EAAUA,IAAS,IAAM,EAAQ,EAAoB,CAAgB,EAC1IhB,IAAM,EAAU0E,EAAE1E,EAAG6E,EAAIX,EAAG,MAAM,CAAC,EACnClE,IAAM,EAAU0E,EAAE1E,EAAG6E,EAAIX,EAAG,UAAU,CAAC,EACvClE,IAAM,EAAU0E,EAAE1E,EAAG,CAAiB,EACtCA,IAAM,EAAU0E,EAAE1E,EAAG6E,EAAIV,IAAkB,KAAK,CAAC,EACjDnE,IAAM,GAAW0E,EAAE1E,EAAG6E,EAAIJ,EAAK,WAAW,CAAC,EAC3CzE,IAAM,GAAW0E,EAAE1E,EAAG6E,EAAI,CAACR,EAAG,cAAc,CAAC,EAC7CrE,IAAM,GAAW0E,EAAE1E,EAAG6E,EAAIX,EAAG,iBAAiB,CAAC,EAC/ClE,IAAM,GAAW0E,EAAE1E,EAAG6E,EAAIX,EAAG,iBAAiB,CAAC,EAC/ClE,IAAM,GAAW0E,EAAE1E,EAAG,CAAmB,EACzCA,IAAM,IAAa0E,EAAE1E,EAAG6E,EAAIV,IAAkB,OAAO,CAAC,EACtDnE,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIV,IAAkB,MAAM,CAAC,EACrDnE,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIV,IAAkB,KAAK,CAAC,EACpDnE,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIX,EAAG,SAAS,CAAC,EACzClE,IAAM,KAAa0E,EAAE1E,EAAG,CAAmB,EAC3CA,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIT,IAAkB,KAAK,CAAC,EACpDpE,IAAM,KAAa0E,EAAE1E,EAAG,CAAmB,EAC3CA,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIT,IAAkB,YAAY,CAAC,EAC3DpE,IAAM,KAAa0E,EAAE1E,EAAG,CAAK,EAC7BA,IAAM,IAAMA,IAAM,MAAQA,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIN,IAAWC,CAAG,CAAC,EACrExE,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIX,EAAG,kBAAkB,CAAC,EAClDlE,IAAM,KAAa0E,EAAE1E,EAAG6E,EAAIX,EAAG,kBAAkB,CAAC,EAClDlE,IAAM,MAAa,KAAK,gBAAgB,WAAW,cAAc,eAAiB0E,EAAE1E,EAAG6E,EAAIX,EAAG,cAAc,CAAC,EAC1GQ,EAAE1E,EAAG,CAAgB,CAC9B,CAKQ,iBAAiB+E,EAAeC,EAAcC,EAAYC,EAAYC,EAAoB,CAChG,OAAIH,IAAS,GACXD,GAAS,SACTA,GAAS,UACTA,GAASK,GAAc,aAAa,CAACH,EAAIC,EAAIC,CAAE,CAAC,GACvCH,IAAS,IAClBD,GAAS,UACTA,GAAS,SAAsBE,EAAK,KAE/BF,CACT,CAMQ,cAAchG,EAAiBuC,EAAa+D,EAA8B,CAKhF,IAAMC,EAAO,CAAC,EAAG,EAAG,GAAI,EAAG,EAAG,CAAC,EAG3BC,EAAS,EAGTC,EAAU,EAEd,EAAG,CAED,GADAF,EAAKE,EAAUD,CAAM,EAAIxG,EAAO,OAAOuC,EAAMkE,CAAO,EAChDzG,EAAO,aAAauC,EAAMkE,CAAO,EAAG,CACtC,IAAMC,EAAY1G,EAAO,aAAauC,EAAMkE,CAAO,EAC/C/E,EAAI,EACR,GACM6E,EAAK,CAAC,IAAM,IACdC,EAAS,GAEXD,EAAKE,EAAU/E,EAAI,EAAI8E,CAAM,EAAIE,EAAUhF,CAAC,QACrC,EAAEA,EAAIgF,EAAU,QAAUhF,EAAI+E,EAAU,EAAID,EAASD,EAAK,QACnE,KACF,CAEA,GAAKA,EAAK,CAAC,IAAM,GAAKE,EAAUD,GAAU,GACpCD,EAAK,CAAC,IAAM,GAAKE,EAAUD,GAAU,EACzC,MAGED,EAAK,CAAC,IACRC,EAAS,EAEb,OAAS,EAAEC,EAAUlE,EAAMvC,EAAO,QAAUyG,EAAUD,EAASD,EAAK,QAGpE,QAAS7E,EAAI,EAAGA,EAAI6E,EAAK,OAAQ,EAAE7E,EAC7B6E,EAAK7E,CAAC,IAAM,KACd6E,EAAK7E,CAAC,EAAI,GAKd,OAAQ6E,EAAK,CAAC,EAAG,CACf,IAAK,IACHD,EAAK,GAAK,KAAK,iBAAiBA,EAAK,GAAIC,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC3E,MACF,IAAK,IACHD,EAAK,GAAK,KAAK,iBAAiBA,EAAK,GAAIC,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC3E,MACF,IAAK,IACHD,EAAK,SAAWA,EAAK,SAAS,MAAM,EACpCA,EAAK,SAAS,eAAiB,KAAK,iBAAiBA,EAAK,SAAS,eAAgBC,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CACzH,CAEA,OAAOE,CACT,CAWQ,kBAAkBE,EAAeL,EAA4B,CAGnEA,EAAK,SAAWA,EAAK,SAAS,MAAM,GAGhC,CAAC,CAACK,GAASA,EAAQ,KACrBA,EAAQ,GAEVL,EAAK,SAAS,eAAiBK,EAC/BL,EAAK,IAAM,UAGPK,IAAU,IACZL,EAAK,IAAM,YAIbA,EAAK,eAAe,CACtB,CAEQ,aAAaA,EAA4B,CAC/CA,EAAK,GAAK3G,EAAkB,GAC5B2G,EAAK,GAAK3G,EAAkB,GAC5B2G,EAAK,SAAWA,EAAK,SAAS,MAAM,EAGpCA,EAAK,SAAS,eAAiB,EAC/BA,EAAK,SAAS,gBAAkB,UAChCA,EAAK,eAAe,CACtB,CAqFO,eAAetG,EAA0B,CAE9C,GAAIA,EAAO,SAAW,GAAKA,EAAO,OAAO,CAAC,IAAM,EAC9C,YAAK,aAAa,KAAK,YAAY,EAC5B,GAGT,IAAM4G,EAAI5G,EAAO,OACbiB,EACEqF,EAAO,KAAK,aAElB,QAAS5E,EAAI,EAAGA,EAAIkF,EAAGlF,IACrBT,EAAIjB,EAAO,OAAO0B,CAAC,EACfT,GAAK,IAAMA,GAAK,IAElBqF,EAAK,IAAM,UACXA,EAAK,IAAM,SAAqBrF,EAAI,IAC3BA,GAAK,IAAMA,GAAK,IAEzBqF,EAAK,IAAM,UACXA,EAAK,IAAM,SAAqBrF,EAAI,IAC3BA,GAAK,IAAMA,GAAK,IAEzBqF,EAAK,IAAM,UACXA,EAAK,IAAM,SAAqBrF,EAAI,GAAM,GACjCA,GAAK,KAAOA,GAAK,KAE1BqF,EAAK,IAAM,UACXA,EAAK,IAAM,SAAqBrF,EAAI,IAAO,GAClCA,IAAM,EAEf,KAAK,aAAaqF,CAAI,EACbrF,IAAM,EAEfqF,EAAK,IAAM,UACFrF,IAAM,EAEfqF,EAAK,IAAM,SACFrF,IAAM,GAEfqF,EAAK,IAAM,UACX,KAAK,kBAAkBtG,EAAO,aAAa0B,CAAC,EAAI1B,EAAO,aAAa0B,CAAC,EAAG,CAAC,IAA2B4E,CAAI,GAC/FrF,IAAM,EAEfqF,EAAK,IAAM,UACFrF,IAAM,EAGfqF,EAAK,IAAM,SACFrF,IAAM,EAEfqF,EAAK,IAAM,WACFrF,IAAM,EAEfqF,EAAK,IAAM,WACFrF,IAAM,EAEfqF,EAAK,IAAM,UACFrF,IAAM,GAEf,KAAK,oBAAyCqF,CAAI,EACzCrF,IAAM,IAEfqF,EAAK,IAAM,WACXA,EAAK,IAAM,YACFrF,IAAM,GAEfqF,EAAK,IAAM,UACFrF,IAAM,IAEfqF,EAAK,IAAM,WACX,KAAK,oBAAuCA,CAAI,GACvCrF,IAAM,GAEfqF,EAAK,IAAM,WACFrF,IAAM,GAEfqF,EAAK,IAAM,UACFrF,IAAM,GAEfqF,EAAK,IAAM,YACFrF,IAAM,GAEfqF,EAAK,IAAM,WACFrF,IAAM,IAEfqF,EAAK,IAAM,UACXA,EAAK,IAAM3G,EAAkB,GAAK,UACzBsB,IAAM,IAEfqF,EAAK,IAAM,UACXA,EAAK,IAAM3G,EAAkB,GAAK,UACzBsB,IAAM,IAAMA,IAAM,IAAMA,IAAM,GAEvCS,GAAK,KAAK,cAAc1B,EAAQ0B,EAAG4E,CAAI,EAC9BrF,IAAM,GAEfqF,EAAK,IAAM,WACFrF,IAAM,GAEfqF,EAAK,IAAM,YACFrF,IAAM,MAAQ,KAAK,gBAAgB,WAAW,cAAc,0BAA4B,IAEjGqF,EAAK,IAAM,WACFrF,IAAM,MAAQ,KAAK,gBAAgB,WAAW,cAAc,0BAA4B,IAEjGqF,EAAK,IAAM,WACFrF,IAAM,IACfqF,EAAK,SAAWA,EAAK,SAAS,MAAM,EACpCA,EAAK,SAAS,eAAiB,GAC/BA,EAAK,eAAe,GAEpB,KAAK,YAAY,MAAM,6BAA8BrF,CAAC,EAG1D,MAAO,EACT,CA2BO,aAAajB,EAA0B,CAC5C,OAAQA,EAAO,OAAO,CAAC,EAAG,CACxB,IAAK,GAEH,KAAK,aAAa,0BAA+B,EACjD,MACF,IAAK,GAEH,IAAM4D,EAAI,KAAK,cAAc,EAAI,EAC3BD,EAAI,KAAK,cAAc,EAAI,EACjC,KAAK,aAAa,iBAAiB,QAAaC,CAAC,IAAID,CAAC,GAAG,EACzD,KACJ,CACA,MAAO,EACT,CAGO,oBAAoB3D,EAA0B,CAGnD,OAAQA,EAAO,OAAO,CAAC,EAAG,CACxB,IAAK,GAEH,IAAM4D,EAAI,KAAK,cAAc,EAAI,EAC3BD,EAAI,KAAK,cAAc,EAAI,EACjC,KAAK,aAAa,iBAAiB,SAAcC,CAAC,IAAID,CAAC,GAAG,EAC1D,MACF,IAAK,IAGH,MACF,IAAK,IAGH,MACF,IAAK,IAGH,MACF,IAAK,IAGH,MACF,IAAK,MAEC,KAAK,gBAAgB,WAAW,cAAc,kBAAoB,KACpE,KAAK,2BAA2B,KAAK,EAEvC,KACJ,CACA,MAAO,EACT,CAsBO,UAAU3D,EAA0B,CACzC,YAAK,aAAa,eAAiB,GACnC,KAAK,wBAAwB,KAAK,EAClC,KAAK,cAAc,UAAY,EAC/B,KAAK,cAAc,aAAe,KAAK,eAAe,KAAO,EAC7D,KAAK,aAAeL,EAAkB,MAAM,EAC5C,KAAK,aAAa,MAAM,EACxB,KAAK,gBAAgB,MAAM,EAG3B,KAAK,cAAc,OAAS,EAC5B,KAAK,cAAc,OAAS,KAAK,cAAc,MAC/C,KAAK,cAAc,iBAAiB,GAAK,KAAK,aAAa,GAC3D,KAAK,cAAc,iBAAiB,GAAK,KAAK,aAAa,GAC3D,KAAK,cAAc,aAAe,KAAK,gBAAgB,QAGvD,KAAK,aAAa,gBAAgB,OAAS,GACpC,EACT,CAsBO,eAAeK,EAA0B,CAC9C,IAAM+D,EAAQ/D,EAAO,SAAW,EAAI,EAAIA,EAAO,OAAO,CAAC,EACvD,GAAI+D,IAAU,EACZ,KAAK,aAAa,gBAAgB,YAAc,OAChD,KAAK,aAAa,gBAAgB,YAAc,WAC3C,CACL,OAAQA,EAAO,CACb,IAAK,GACL,IAAK,GACH,KAAK,aAAa,gBAAgB,YAAc,QAChD,MACF,IAAK,GACL,IAAK,GACH,KAAK,aAAa,gBAAgB,YAAc,YAChD,MACF,IAAK,GACL,IAAK,GACH,KAAK,aAAa,gBAAgB,YAAc,MAChD,KACJ,CACA,IAAM8C,EAAa9C,EAAQ,IAAM,EACjC,KAAK,aAAa,gBAAgB,YAAc8C,CAClD,CACA,MAAO,EACT,CASO,gBAAgB7G,EAA0B,CAC/C,IAAM8G,EAAM9G,EAAO,OAAO,CAAC,GAAK,EAC5B+G,EAEJ,OAAI/G,EAAO,OAAS,IAAM+G,EAAS/G,EAAO,OAAO,CAAC,GAAK,KAAK,eAAe,MAAQ+G,IAAW,KAC5FA,EAAS,KAAK,eAAe,MAG3BA,EAASD,IACX,KAAK,cAAc,UAAYA,EAAM,EACrC,KAAK,cAAc,aAAeC,EAAS,EAC3C,KAAK,WAAW,EAAG,CAAC,GAEf,EACT,CAgCO,cAAc/G,EAA0B,CAC7C,GAAI,CAACsD,GAAoBtD,EAAO,OAAO,CAAC,EAAG,KAAK,gBAAgB,WAAW,aAAa,EACtF,MAAO,GAET,IAAMgH,EAAUhH,EAAO,OAAS,EAAKA,EAAO,OAAO,CAAC,EAAI,EACxD,OAAQA,EAAO,OAAO,CAAC,EAAG,CACxB,IAAK,IACCgH,IAAW,GACb,KAAK,+BAA+B,KAAK,CAA4C,EAEvF,MACF,IAAK,IACH,KAAK,+BAA+B,KAAK,CAA6C,EACtF,MACF,IAAK,IACC,KAAK,gBACP,KAAK,aAAa,iBAAiB,UAAe,KAAK,eAAe,IAAI,IAAI,KAAK,eAAe,IAAI,GAAG,EAE3G,MACF,IAAK,KACCA,IAAW,GAAKA,IAAW,KAC7B,KAAK,kBAAkB,KAAK,KAAK,YAAY,EACzC,KAAK,kBAAkB,OAAS,IAClC,KAAK,kBAAkB,MAAM,IAG7BA,IAAW,GAAKA,IAAW,KAC7B,KAAK,eAAe,KAAK,KAAK,SAAS,EACnC,KAAK,eAAe,OAAS,IAC/B,KAAK,eAAe,MAAM,GAG9B,MACF,IAAK,KACCA,IAAW,GAAKA,IAAW,IACzB,KAAK,kBAAkB,QACzB,KAAK,SAAS,KAAK,kBAAkB,IAAI,CAAE,GAG3CA,IAAW,GAAKA,IAAW,IACzB,KAAK,eAAe,QACtB,KAAK,YAAY,KAAK,eAAe,IAAI,CAAE,EAG/C,KACJ,CACA,MAAO,EACT,CAWO,WAAWhH,EAA2B,CAC3C,YAAK,cAAc,OAAS,KAAK,cAAc,EAC/C,KAAK,cAAc,OAAS,KAAK,cAAc,MAAQ,KAAK,cAAc,EAC1E,KAAK,cAAc,iBAAiB,GAAK,KAAK,aAAa,GAC3D,KAAK,cAAc,iBAAiB,GAAK,KAAK,aAAa,GAC3D,KAAK,cAAc,aAAe,KAAK,gBAAgB,QACvD,KAAK,cAAc,cAAgB,KAAK,gBAAgB,SAAS,MAAM,EACvE,KAAK,cAAc,YAAc,KAAK,gBAAgB,OACtD,KAAK,cAAc,gBAAkB,KAAK,aAAa,gBAAgB,OACvE,KAAK,cAAc,oBAAsB,KAAK,aAAa,gBAAgB,WACpE,EACT,CAWO,cAAcA,EAA2B,CAC9C,KAAK,cAAc,EAAI,KAAK,cAAc,QAAU,EACpD,KAAK,cAAc,EAAI,KAAK,IAAI,KAAK,cAAc,OAAS,KAAK,cAAc,MAAO,CAAC,EACvF,KAAK,aAAa,GAAK,KAAK,cAAc,iBAAiB,GAC3D,KAAK,aAAa,GAAK,KAAK,cAAc,iBAAiB,GAC3D,QAAS0B,EAAI,EAAGA,EAAI,KAAK,cAAc,cAAc,OAAQA,IAC3D,KAAK,gBAAgB,YAAYA,EAAG,KAAK,cAAc,cAAcA,CAAC,CAAC,EAEzE,YAAK,gBAAgB,UAAU,KAAK,cAAc,WAAW,EAC7D,KAAK,aAAa,gBAAgB,OAAS,KAAK,cAAc,gBAC9D,KAAK,aAAa,gBAAgB,WAAa,KAAK,cAAc,oBAClE,KAAK,gBAAgB,EACd,EACT,CAaO,SAAStB,EAAuB,CACrC,YAAK,aAAeA,EACpB,KAAK,eAAe,KAAKA,CAAI,EACtB,EACT,CAMO,YAAYA,EAAuB,CACxC,YAAK,UAAYA,EACV,EACT,CAWO,wBAAwBA,EAAuB,CACpD,IAAM6G,EAAqB,CAAC,EACtBC,EAAQ9G,EAAK,MAAM,GAAG,EAC5B,KAAO8G,EAAM,OAAS,GAAG,CACvB,IAAMC,EAAMD,EAAM,MAAM,EAClBE,EAAOF,EAAM,MAAM,EACzB,GAAI,QAAQ,KAAKC,CAAG,EAAG,CACrB,IAAME,EAAQ,SAASF,EAAK,EAAE,EAC9B,GAAIG,GAAkBD,CAAK,EACzB,GAAID,IAAS,IACXH,EAAM,KAAK,CAAE,OAA+B,MAAAI,CAAM,CAAC,MAC9C,CACL,IAAMrB,EAAQuB,GAAWH,CAAI,EACzBpB,GACFiB,EAAM,KAAK,CAAE,OAA4B,MAAAI,EAAO,MAAArB,CAAM,CAAC,CAE3D,CAEJ,CACF,CACA,OAAIiB,EAAM,QACR,KAAK,SAAS,KAAKA,CAAK,EAEnB,EACT,CAmBO,aAAa7G,EAAuB,CAEzC,IAAM+G,EAAM/G,EAAK,QAAQ,GAAG,EAC5B,GAAI+G,IAAQ,GAEV,MAAO,GAET,IAAM/D,EAAKhD,EAAK,MAAM,EAAG+G,CAAG,EAAE,KAAK,EAC7BK,EAAMpH,EAAK,MAAM+G,EAAM,CAAC,EAC9B,OAAIK,EACK,KAAK,iBAAiBpE,EAAIoE,CAAG,EAElCpE,EAAG,KAAK,EACH,GAEF,KAAK,iBAAiB,CAC/B,CAEQ,iBAAiBpD,EAAgBwH,EAAsB,CAEzD,KAAK,kBAAkB,GACzB,KAAK,iBAAiB,EAExB,IAAMC,EAAezH,EAAO,MAAM,GAAG,EACjCoD,EACEsE,EAAeD,EAAa,UAAU3H,GAAKA,EAAE,WAAW,KAAK,CAAC,EACpE,OAAI4H,IAAiB,KACnBtE,EAAKqE,EAAaC,CAAY,EAAE,MAAM,CAAC,GAAK,QAE9C,KAAK,aAAa,SAAW,KAAK,aAAa,SAAS,MAAM,EAC9D,KAAK,aAAa,SAAS,MAAQ,KAAK,gBAAgB,aAAa,CAAE,GAAAtE,EAAI,IAAAoE,CAAI,CAAC,EAChF,KAAK,aAAa,eAAe,EAC1B,EACT,CAEQ,kBAA4B,CAClC,YAAK,aAAa,SAAW,KAAK,aAAa,SAAS,MAAM,EAC9D,KAAK,aAAa,SAAS,MAAQ,EACnC,KAAK,aAAa,eAAe,EAC1B,EACT,CAUQ,yBAAyBpH,EAAc8C,EAAyB,CACtE,IAAMgE,EAAQ9G,EAAK,MAAM,GAAG,EAC5B,QAASsB,EAAI,EAAGA,EAAIwF,EAAM,QACpB,EAAAhE,GAAU,KAAK,eAAe,QADF,EAAExB,EAAG,EAAEwB,EAEvC,GAAIgE,EAAMxF,CAAC,IAAM,IACf,KAAK,SAAS,KAAK,CAAC,CAAE,OAA+B,MAAO,KAAK,eAAewB,CAAM,CAAE,CAAC,CAAC,MACrF,CACL,IAAM8C,EAAQuB,GAAWL,EAAMxF,CAAC,CAAC,EAC7BsE,GACF,KAAK,SAAS,KAAK,CAAC,CAAE,OAA4B,MAAO,KAAK,eAAe9C,CAAM,EAAG,MAAA8C,CAAM,CAAC,CAAC,CAElG,CAEF,MAAO,EACT,CAwBO,mBAAmB5F,EAAuB,CAC/C,OAAO,KAAK,yBAAyBA,EAAM,CAAC,CAC9C,CAOO,mBAAmBA,EAAuB,CAC/C,OAAO,KAAK,yBAAyBA,EAAM,CAAC,CAC9C,CAOO,uBAAuBA,EAAuB,CACnD,OAAO,KAAK,yBAAyBA,EAAM,CAAC,CAC9C,CAUO,oBAAoBA,EAAuB,CAChD,GAAI,CAACA,EACH,YAAK,SAAS,KAAK,CAAC,CAAE,MAA+B,CAAC,CAAC,EAChD,GAET,IAAM6G,EAAqB,CAAC,EACtBC,EAAQ9G,EAAK,MAAM,GAAG,EAC5B,QAASsB,EAAI,EAAGA,EAAIwF,EAAM,OAAQ,EAAExF,EAClC,GAAI,QAAQ,KAAKwF,EAAMxF,CAAC,CAAC,EAAG,CAC1B,IAAM2F,EAAQ,SAASH,EAAMxF,CAAC,EAAG,EAAE,EAC/B4F,GAAkBD,CAAK,GACzBJ,EAAM,KAAK,CAAE,OAAgC,MAAAI,CAAM,CAAC,CAExD,CAEF,OAAIJ,EAAM,QACR,KAAK,SAAS,KAAKA,CAAK,EAEnB,EACT,CAOO,eAAe7G,EAAuB,CAC3C,YAAK,SAAS,KAAK,CAAC,CAAE,OAAgC,SAAoC,CAAC,CAAC,EACrF,EACT,CAOO,eAAeA,EAAuB,CAC3C,YAAK,SAAS,KAAK,CAAC,CAAE,OAAgC,SAAoC,CAAC,CAAC,EACrF,EACT,CAOO,mBAAmBA,EAAuB,CAC/C,YAAK,SAAS,KAAK,CAAC,CAAE,OAAgC,SAAgC,CAAC,CAAC,EACjF,EACT,CAWO,UAAoB,CACzB,YAAK,cAAc,EAAI,EACvB,KAAK,MAAM,EACJ,EACT,CAOO,uBAAiC,CACtC,YAAK,YAAY,MAAM,2CAA2C,EAClE,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,KAAK,wBAAwB,KAAK,EAC3B,EACT,CAOO,mBAA6B,CAClC,YAAK,YAAY,MAAM,kCAAkC,EACzD,KAAK,aAAa,gBAAgB,kBAAoB,GACtD,KAAK,wBAAwB,KAAK,EAC3B,EACT,CAQO,sBAAgC,CACrC,YAAK,gBAAgB,UAAU,CAAC,EAChC,KAAK,gBAAgB,YAAY,EAAG4E,EAAe,EAC5C,EACT,CAkBO,cAAc2C,EAAiC,CACpD,OAAIA,EAAe,SAAW,GAC5B,KAAK,qBAAqB,EACnB,KAELA,EAAe,CAAC,IAAM,KAG1B,KAAK,gBAAgB,YAAYC,GAAOD,EAAe,CAAC,CAAC,EAAGjH,EAASiH,EAAe,CAAC,CAAC,GAAK3C,EAAe,EACnG,GACT,CAWO,OAAiB,CACtB,YAAK,gBAAgB,EACrB,KAAK,cAAc,IACf,KAAK,cAAc,IAAM,KAAK,cAAc,aAAe,GAC7D,KAAK,cAAc,IACnB,KAAK,eAAe,OAAO,KAAK,eAAe,CAAC,GACvC,KAAK,cAAc,GAAK,KAAK,eAAe,OACrD,KAAK,cAAc,EAAI,KAAK,eAAe,KAAO,GAEpD,KAAK,gBAAgB,EACd,EACT,CAYO,QAAkB,CACvB,YAAK,cAAc,KAAK,KAAK,cAAc,CAAC,EAAI,GACzC,EACT,CAWO,cAAwB,CAE7B,GADA,KAAK,gBAAgB,EACjB,KAAK,cAAc,IAAM,KAAK,cAAc,UAAW,CAIzD,IAAM6C,EAAqB,KAAK,cAAc,aAAe,KAAK,cAAc,UAChF,KAAK,cAAc,MAAM,cAAc,KAAK,cAAc,MAAQ,KAAK,cAAc,EAAGA,EAAoB,CAAC,EAC7G,KAAK,cAAc,MAAM,IAAI,KAAK,cAAc,MAAQ,KAAK,cAAc,EAAG,KAAK,cAAc,aAAa,KAAK,eAAe,CAAC,CAAC,EACpI,KAAK,iBAAiB,eAAe,KAAK,cAAc,UAAW,KAAK,cAAc,YAAY,CACpG,MACE,KAAK,cAAc,IACnB,KAAK,gBAAgB,EAEvB,MAAO,EACT,CASO,WAAqB,CAC1B,YAAK,QAAQ,MAAM,EACnB,KAAK,gBAAgB,KAAK,EACnB,EACT,CAEO,OAAc,CACnB,KAAK,aAAelI,EAAkB,MAAM,EAC5C,KAAK,uBAAyBA,EAAkB,MAAM,CACxD,CAKQ,gBAAiC,CACvC,YAAK,uBAAuB,IAAM,UAClC,KAAK,uBAAuB,IAAM,KAAK,aAAa,GAAK,SAClD,KAAK,sBACd,CAYO,UAAUmI,EAAwB,CACvC,YAAK,gBAAgB,UAAUA,CAAK,EAC7B,EACT,CAUO,wBAAkC,CAEvC,IAAMC,EAAO,IAAIC,EACjBD,EAAK,QAAU,GAAK,GAAsB,GAC1CA,EAAK,GAAK,KAAK,aAAa,GAC5BA,EAAK,GAAK,KAAK,aAAa,GAG5B,KAAK,WAAW,EAAG,CAAC,EACpB,QAASE,EAAU,EAAGA,EAAU,KAAK,eAAe,KAAM,EAAEA,EAAS,CACnE,IAAM5D,EAAM,KAAK,cAAc,MAAQ,KAAK,cAAc,EAAI4D,EACxDzE,EAAO,KAAK,cAAc,MAAM,IAAIa,CAAG,EACzCb,IACFA,EAAK,KAAKuE,CAAI,EACdvE,EAAK,UAAY,GAErB,CACA,YAAK,iBAAiB,aAAa,EACnC,KAAK,WAAW,EAAG,CAAC,EACb,EACT,CA6BO,oBAAoBpD,EAAcJ,EAA0B,CACjE,IAAM2F,EAAKuC,IACT,KAAK,aAAa,iBAAiB,OAAYA,CAAC,QAAa,EACtD,IAIHC,EAAI,KAAK,eAAe,OACxBzC,EAAO,KAAK,gBAAgB,WAC5B0C,EAAoC,CAAE,MAAS,EAAG,UAAa,EAAG,IAAO,CAAE,EAEjF,OAA0BzC,EAAtBvF,IAAS,KAAe,OAAO,KAAK,aAAa,YAAY,EAAI,EAAI,CAAC,KACtEA,IAAS,KAAe,aACxBA,IAAS,IAAc,OAAO+H,EAAE,UAAY,CAAC,IAAIA,EAAE,aAAe,CAAC,IAEnE/H,IAAS,IAAc,SACvBA,IAAS,KAAe,OAAOgI,EAAO1C,EAAK,WAAW,GAAKA,EAAK,YAAc,EAAI,EAAE,KAC/E,MANqE,CAOhF,CAEO,eAAe2C,EAAYC,EAAkB,CAClD,KAAK,iBAAiB,eAAeD,EAAIC,CAAE,CAC7C,CAWO,iBAAiBtI,EAA0B,CAChD,GAAI,CAAC,KAAK,gBAAgB,WAAW,cAAc,cACjD,MAAO,GAET,IAAMuI,EAAQvI,EAAO,OAAO,CAAC,GAAK,EAC5BiG,EAAOjG,EAAO,OAAS,GAAKA,EAAO,OAAO,CAAC,GAAK,EAChDW,EAAQ,KAAK,aAAa,cAEhC,OAAQsF,EAAM,CACZ,IAAK,GACHtF,EAAM,MAAQ4H,EACd,MACF,IAAK,GACH5H,EAAM,OAAS4H,EACf,MACF,IAAK,GACH5H,EAAM,OAAS,CAAC4H,EAChB,KACJ,CACA,MAAO,EACT,CASO,mBAAmBvI,EAA0B,CAClD,GAAI,CAAC,KAAK,gBAAgB,WAAW,cAAc,cACjD,MAAO,GAET,IAAMuI,EAAQ,KAAK,aAAa,cAAc,MAC9C,YAAK,aAAa,iBAAiB,SAAcA,CAAK,GAAG,EAClD,EACT,CAQO,kBAAkBvI,EAA0B,CACjD,GAAI,CAAC,KAAK,gBAAgB,WAAW,cAAc,cACjD,MAAO,GAET,IAAMuI,EAAQvI,EAAO,OAAO,CAAC,GAAK,EAC5BW,EAAQ,KAAK,aAAa,cAE1B6H,EADQ,KAAK,eAAe,SAAW,KAAK,eAAe,QAAQ,IACnD7H,EAAM,SAAWA,EAAM,UAG7C,OAAI6H,EAAM,QAAU,IAClBA,EAAM,MAAM,EAIdA,EAAM,KAAK7H,EAAM,KAAK,EACtBA,EAAM,MAAQ4H,EACP,EACT,CAQO,iBAAiBvI,EAA0B,CAChD,GAAI,CAAC,KAAK,gBAAgB,WAAW,cAAc,cACjD,MAAO,GAET,IAAMyI,EAAQ,KAAK,IAAI,EAAGzI,EAAO,OAAO,CAAC,GAAK,CAAC,EACzCW,EAAQ,KAAK,aAAa,cAE1B6H,EADQ,KAAK,eAAe,SAAW,KAAK,eAAe,QAAQ,IACnD7H,EAAM,SAAWA,EAAM,UAG7C,QAASe,EAAI,EAAGA,EAAI+G,GAASD,EAAM,OAAS,EAAG9G,IAC7Cf,EAAM,MAAQ6H,EAAM,IAAI,EAG1B,OAAIA,EAAM,SAAW,GAAKC,EAAQ,IAChC9H,EAAM,MAAQ,GAET,EACT,CAGF,EAYMd,GAAN,KAAkD,CAIhD,YACmCd,EACjC,CADiC,oBAAAA,EAEjC,KAAK,WAAW,CAClB,CAEO,YAAmB,CACxB,KAAK,MAAQ,KAAK,eAAe,OAAO,EACxC,KAAK,IAAM,KAAK,eAAe,OAAO,CACxC,CAEO,UAAU6E,EAAiB,CAC5BA,EAAI,KAAK,MACX,KAAK,MAAQA,EACJA,EAAI,KAAK,MAClB,KAAK,IAAMA,EAEf,CAEO,eAAeyE,EAAYC,EAAkB,CAC9CD,EAAKC,IACP1J,GAAQyJ,EACRA,EAAKC,EACLA,EAAK1J,IAEHyJ,EAAK,KAAK,QACZ,KAAK,MAAQA,GAEXC,EAAK,KAAK,MACZ,KAAK,IAAMA,EAEf,CAEO,cAAqB,CAC1B,KAAK,eAAe,EAAG,KAAK,eAAe,KAAO,CAAC,CACrD,CACF,EAxCMzI,GAAN6I,EAAA,CAKKC,EAAA,EAAAC,IALC/I,IA0CC,SAASyH,GAAkBvB,EAAoC,CACpE,MAAO,IAAKA,GAASA,EAAQ,GAC/B,CC1kHO,IAAM8C,GAAN,cAA0BC,CAAW,CAa1C,YAAoBC,EAA0F,CAC5G,MAAM,EADY,aAAAA,EAZpB,KAAQ,aAAwC,CAAC,EACjD,KAAQ,WAA2C,CAAC,EACpD,KAAQ,aAAe,EACvB,KAAQ,cAAgB,EACxB,KAAQ,eAAiB,GACzB,KAAQ,WAAa,EACrB,KAAQ,cAAgB,GAExB,KAAiB,iBAAmB,KAAK,UAAU,IAAIC,EAAc,EACrE,KAAiB,eAAiB,KAAK,UAAU,IAAIC,CAAe,EACpE,KAAgB,cAAgB,KAAK,eAAe,MAIlD,KAAK,UAAUC,EAAa,IAAM,CAChC,KAAK,aAAa,OAAS,EAC3B,KAAK,WAAW,OAAS,EACzB,KAAK,aAAe,EACpB,KAAK,cAAgB,CACvB,CAAC,CAAC,CACJ,CAEO,iBAAwB,CAC7B,KAAK,cAAgB,EACvB,CAUO,WAAkB,CAKvB,GAJI,KAAK,OAAO,YAIZ,KAAK,eACP,OAEF,KAAK,eAAiB,GAGtB,IAAIC,EACAC,EAAa,GACjB,KAAOD,EAAQ,KAAK,aAAa,MAAM,GAAG,CACxCC,EAAa,GACb,KAAK,QAAQD,CAAK,EAClB,IAAME,EAAK,KAAK,WAAW,MAAM,EAC7BA,GAAIA,EAAG,CACb,CAGA,KAAK,aAAe,EACpB,KAAK,cAAgB,WACrB,KAAK,aAAa,OAAS,EAC3B,KAAK,WAAW,OAAS,EAEzB,KAAK,eAAiB,GAClBD,GACF,KAAK,eAAe,KAAK,CAE7B,CAKO,UAAUE,EAA2BC,EAAmC,CAC7E,GAAI,KAAK,OAAO,WACd,OAKF,GAAIA,IAAuB,QAAa,KAAK,WAAaA,EAAoB,CAG5E,KAAK,WAAa,EAClB,MACF,CASA,GAPA,KAAK,cAAgBD,EAAK,OAC1B,KAAK,aAAa,KAAKA,CAAI,EAC3B,KAAK,WAAW,KAAK,MAAS,EAG9B,KAAK,aAED,KAAK,eACP,OAEF,KAAK,eAAiB,GAMtB,IAAIH,EACJ,KAAOA,EAAQ,KAAK,aAAa,MAAM,GAAG,CACxC,KAAK,QAAQA,CAAK,EAClB,IAAME,EAAK,KAAK,WAAW,MAAM,EAC7BA,GAAIA,EAAG,CACb,CAGA,KAAK,aAAe,EACpB,KAAK,cAAgB,WAGrB,KAAK,eAAiB,GACtB,KAAK,WAAa,CACpB,CAEO,MAAMC,EAA2BE,EAA6B,CACnE,GAAI,MAAK,OAAO,WAGhB,IAAI,KAAK,aAAe,IACtB,MAAM,IAAI,MAAM,6DAA6D,EAI/E,GAAI,CAAC,KAAK,aAAa,OAAQ,CAM7B,GALA,KAAK,cAAgB,EAKjB,KAAK,cAAe,CACtB,KAAK,cAAgB,GACrB,KAAK,cAAgBF,EAAK,OAC1B,KAAK,aAAa,KAAKA,CAAI,EAC3B,KAAK,WAAW,KAAKE,CAAQ,EAC7B,KAAK,YAAY,EACjB,MACF,CAEA,KAAK,oBAAoB,CAC3B,CAEA,KAAK,cAAgBF,EAAK,OAC1B,KAAK,aAAa,KAAKA,CAAI,EAC3B,KAAK,WAAW,KAAKE,CAAQ,EAC/B,CA8BQ,oBAAoBC,EAAmB,EAAGC,EAAyB,GAAY,CACjF,KAAK,OAAO,YAGhB,KAAK,iBAAiB,aAAa,IAAM,KAAK,YAAYD,EAAUC,CAAa,EAAG,CAAC,CACvF,CAEU,YAAYD,EAAmB,EAAGC,EAAyB,GAAY,CAC/E,GAAI,KAAK,OAAO,WACd,OAEF,IAAMC,EAAYF,GAAY,YAAY,IAAI,EAC9C,KAAO,KAAK,aAAa,OAAS,KAAK,eAAe,CACpD,IAAMH,EAAO,KAAK,aAAa,KAAK,aAAa,EAC3CM,EAAS,KAAK,QAAQN,EAAMI,CAAa,EAC/C,GAAIE,EAAQ,CAwBV,IAAMC,EAAsCC,GAAe,CACrD,KAAK,OAAO,aAGZ,YAAY,IAAI,EAAIH,GAAa,GACnC,KAAK,oBAAoB,EAAGG,CAAC,EAE7B,KAAK,YAAYH,EAAWG,CAAC,EAEjC,EAuBAF,EAAO,MAAMG,IACX,eAAe,IAAM,CAAC,MAAMA,CAAI,CAAC,EAC1B,QAAQ,QAAQ,EAAK,EAC7B,EAAE,KAAKF,CAAY,EACpB,MACF,CAEA,IAAMR,EAAK,KAAK,WAAW,KAAK,aAAa,EAK7C,GAJIA,GAAIA,EAAG,EACX,KAAK,gBACL,KAAK,cAAgBC,EAAK,OAEtB,YAAY,IAAI,EAAIK,GAAa,GACnC,KAEJ,CACI,KAAK,aAAa,OAAS,KAAK,eAG9B,KAAK,cAAgB,KACvB,KAAK,aAAe,KAAK,aAAa,MAAM,KAAK,aAAa,EAC9D,KAAK,WAAa,KAAK,WAAW,MAAM,KAAK,aAAa,EAC1D,KAAK,cAAgB,GAEvB,KAAK,oBAAoB,IAEzB,KAAK,aAAa,OAAS,EAC3B,KAAK,WAAW,OAAS,EACzB,KAAK,aAAe,EACpB,KAAK,cAAgB,GAEvB,KAAK,eAAe,KAAK,CAC3B,CACF,ECnTO,IAAMK,GAAN,KAAgD,CAiBrD,YACmCC,EACjC,CADiC,oBAAAA,EAfnC,KAAQ,QAAU,EAKlB,KAAQ,eAAmD,IAAI,IAO/D,KAAQ,cAAsE,IAAI,GAKlF,CAEO,aAAaC,EAA4B,CAC9C,IAAMC,EAAS,KAAK,eAAe,OAGnC,GAAID,EAAK,KAAO,OAAW,CACzB,IAAME,EAASD,EAAO,UAAUA,EAAO,MAAQA,EAAO,CAAC,EACjDE,EAA2B,CAC/B,KAAAH,EACA,GAAI,KAAK,UACT,MAAO,CAACE,CAAM,CAChB,EACA,OAAAA,EAAO,UAAU,IAAM,KAAK,sBAAsBC,EAAOD,CAAM,CAAC,EAChE,KAAK,cAAc,IAAIC,EAAM,GAAIA,CAAK,EAC/BA,EAAM,EACf,CAGA,IAAMC,EAAWJ,EACXK,EAAM,KAAK,eAAeD,CAAQ,EAClCE,EAAQ,KAAK,eAAe,IAAID,CAAG,EACzC,GAAIC,EACF,YAAK,cAAcA,EAAM,GAAIL,EAAO,MAAQA,EAAO,CAAC,EAC7CK,EAAM,GAIf,IAAMJ,EAASD,EAAO,UAAUA,EAAO,MAAQA,EAAO,CAAC,EACjDE,EAA6B,CACjC,GAAI,KAAK,UACT,IAAK,KAAK,eAAeC,CAAQ,EACjC,KAAMA,EACN,MAAO,CAACF,CAAM,CAChB,EACA,OAAAA,EAAO,UAAU,IAAM,KAAK,sBAAsBC,EAAOD,CAAM,CAAC,EAChE,KAAK,eAAe,IAAIC,EAAM,IAAKA,CAAK,EACxC,KAAK,cAAc,IAAIA,EAAM,GAAIA,CAAK,EAC/BA,EAAM,EACf,CAEO,cAAcI,EAAgBC,EAAiB,CACpD,IAAML,EAAQ,KAAK,cAAc,IAAII,CAAM,EAC3C,GAAKJ,GAGDA,EAAM,MAAM,MAAMM,GAAKA,EAAE,OAASD,CAAC,EAAG,CACxC,IAAMN,EAAS,KAAK,eAAe,OAAO,UAAUM,CAAC,EACrDL,EAAM,MAAM,KAAKD,CAAM,EACvBA,EAAO,UAAU,IAAM,KAAK,sBAAsBC,EAAOD,CAAM,CAAC,CAClE,CACF,CAEO,YAAYK,EAA0C,CAC3D,OAAO,KAAK,cAAc,IAAIA,CAAM,GAAG,IACzC,CAEQ,eAAeG,EAA0C,CAC/D,MAAO,GAAGA,EAAS,EAAE,KAAKA,EAAS,GAAG,EACxC,CAEQ,sBAAsBP,EAAgDD,EAAuB,CACnG,IAAMS,EAAQR,EAAM,MAAM,QAAQD,CAAM,EACpCS,IAAU,KAGdR,EAAM,MAAM,OAAOQ,EAAO,CAAC,EACvBR,EAAM,MAAM,SAAW,IACrBA,EAAM,KAAK,KAAO,QACpB,KAAK,eAAe,OAAQA,EAA8B,GAAG,EAE/D,KAAK,cAAc,OAAOA,EAAM,EAAE,GAEtC,CACF,EA9FaL,GAANc,EAAA,CAkBFC,EAAA,EAAAC,IAlBQhB,ICoCb,IAAIiB,GAA2B,GAgBTC,GAAf,cAAoCC,CAAoC,CAuD7E,YACEC,EACA,CACA,MAAM,EA5CR,KAAQ,2BAA6B,KAAK,UAAU,IAAIC,CAAmB,EAE3E,KAAiB,UAAY,KAAK,UAAU,IAAIC,CAAiB,EACjE,KAAgB,SAAW,KAAK,UAAU,MAC1C,KAAiB,QAAU,KAAK,UAAU,IAAIA,CAAiB,EAC/D,KAAgB,OAAS,KAAK,QAAQ,MACtC,KAAU,YAAc,KAAK,UAAU,IAAIA,CAAe,EAC1D,KAAgB,WAAa,KAAK,YAAY,MAC9C,KAAmB,UAAY,KAAK,UAAU,IAAIA,CAAyC,EAC3F,KAAgB,SAAW,KAAK,UAAU,MAC1C,KAAiB,UAAY,KAAK,UAAU,IAAIA,CAAyC,EACzF,KAAgB,SAAW,KAAK,UAAU,MAC1C,KAAmB,eAAiB,KAAK,UAAU,IAAIA,CAAe,EACtE,KAAgB,cAAgB,KAAK,eAAe,MAOpD,KAAU,UAAY,KAAK,UAAU,IAAIA,CAAuB,EA2B9D,KAAK,sBAAwB,IAAIC,GACjC,KAAK,eAAiB,KAAK,UAAU,IAAIC,GAAeJ,CAAO,CAAC,EAChE,KAAK,sBAAsB,WAAWK,EAAiB,KAAK,cAAc,EAC1E,KAAK,YAAc,KAAK,UAAU,KAAK,sBAAsB,eAAeC,EAAU,CAAC,EACvF,KAAK,sBAAsB,WAAWC,GAAa,KAAK,WAAW,EACnE,KAAK,eAAiB,KAAK,UAAU,KAAK,sBAAsB,eAAeC,EAAa,CAAC,EAC7F,KAAK,sBAAsB,WAAWC,EAAgB,KAAK,cAAc,EACzE,KAAK,YAAc,KAAK,UAAU,KAAK,sBAAsB,eAAeC,EAAW,CAAC,EACxF,KAAK,sBAAsB,WAAWC,EAAc,KAAK,WAAW,EACpE,KAAK,kBAAoB,KAAK,UAAU,KAAK,sBAAsB,eAAeC,EAAiB,CAAC,EACpG,KAAK,sBAAsB,WAAWC,GAAoB,KAAK,iBAAiB,EAChF,KAAK,eAAiB,KAAK,UAAU,KAAK,sBAAsB,eAAeC,EAAc,CAAC,EAC9F,KAAK,eAAe,SAAS,IAAIC,EAAW,EAC5C,KAAK,sBAAsB,WAAWC,GAAiB,KAAK,cAAc,EAC1E,KAAK,gBAAkB,KAAK,sBAAsB,eAAeC,EAAc,EAC/E,KAAK,sBAAsB,WAAWC,GAAiB,KAAK,eAAe,EAC3E,KAAK,gBAAkB,KAAK,sBAAsB,eAAeC,EAAc,EAC/E,KAAK,sBAAsB,WAAWC,GAAiB,KAAK,eAAe,EAI3E,KAAK,cAAgB,KAAK,UAAU,IAAIC,GAAa,KAAK,eAAgB,KAAK,gBAAiB,KAAK,YAAa,KAAK,YAAa,KAAK,eAAgB,KAAK,gBAAiB,KAAK,kBAAmB,KAAK,cAAc,CAAC,EAC3N,KAAK,UAAUC,EAAW,QAAQ,KAAK,cAAc,WAAY,KAAK,WAAW,CAAC,EAGlF,KAAK,UAAUA,EAAW,QAAQ,KAAK,eAAe,SAAU,KAAK,SAAS,CAAC,EAC/E,KAAK,UAAUA,EAAW,QAAQ,KAAK,YAAY,OAAQ,KAAK,OAAO,CAAC,EACxE,KAAK,UAAUA,EAAW,QAAQ,KAAK,YAAY,SAAU,KAAK,SAAS,CAAC,EAC5E,KAAK,UAAU,KAAK,YAAY,wBAAwB,IAAM,KAAK,eAAe,EAAI,CAAC,CAAC,EACxF,KAAK,UAAU,KAAK,YAAY,YAAY,IAAO,KAAK,aAAa,gBAAgB,CAAC,CAAC,EACvF,KAAK,UAAU,KAAK,eAAe,uBAAuB,CAAC,YAAY,EAAG,IAAM,KAAK,8BAA8B,CAAC,CAAC,EACrH,KAAK,UAAU,KAAK,eAAe,SAAS,IAAM,CAChD,KAAK,UAAU,KAAK,CAAE,SAAU,KAAK,eAAe,OAAO,KAAM,CAAC,EAClE,KAAK,cAAc,eAAe,KAAK,eAAe,OAAO,UAAW,KAAK,eAAe,OAAO,YAAY,CACjH,CAAC,CAAC,EAEF,KAAK,aAAe,KAAK,UAAU,IAAIC,GAAY,CAACC,EAAMC,IAAkB,KAAK,cAAc,MAAMD,EAAMC,CAAa,CAAC,CAAC,EAC1H,KAAK,UAAUH,EAAW,QAAQ,KAAK,aAAa,cAAe,KAAK,cAAc,CAAC,CACzF,CAhEA,IAAW,UAA2B,CACpC,OAAK,KAAK,eACR,KAAK,aAAe,KAAK,UAAU,IAAIpB,CAAiB,EACxD,KAAK,UAAU,MAAMwB,GAAM,CACzB,KAAK,cAAc,KAAKA,EAAG,QAAQ,CACrC,CAAC,GAEI,KAAK,aAAa,KAC3B,CAEA,IAAW,MAAe,CAAE,OAAO,KAAK,eAAe,IAAM,CAC7D,IAAW,MAAe,CAAE,OAAO,KAAK,eAAe,IAAM,CAC7D,IAAW,SAAsB,CAAE,OAAO,KAAK,eAAe,OAAS,CACvE,IAAW,SAAsC,CAAE,OAAO,KAAK,eAAe,OAAS,CACvF,IAAW,QAAQ1B,EAA2B,CAC5C,QAAW2B,KAAO3B,EAChB,KAAK,eAAe,QAAQ2B,CAAG,EAAI3B,EAAQ2B,CAAG,CAElD,CAgDO,MAAMH,EAA2BI,EAA6B,CACnE,KAAK,aAAa,MAAMJ,EAAMI,CAAQ,CACxC,CAWO,UAAUJ,EAA2BK,EAAmC,CACzE,KAAK,YAAY,UAAY,GAAqB,CAAChC,KACrD,KAAK,YAAY,KAAK,mDAAmD,EACzEA,GAA2B,IAE7B,KAAK,aAAa,UAAU2B,EAAMK,CAAkB,CACtD,CAEO,MAAML,EAAcM,EAAwB,GAAY,CAC7D,KAAK,YAAY,iBAAiBN,EAAMM,CAAY,CACtD,CAEO,OAAOC,EAAWC,EAAiB,CACpC,MAAMD,CAAC,GAAK,MAAMC,CAAC,IAIvBD,EAAI,KAAK,IAAIA,GAAsC,EACnDC,EAAI,KAAK,IAAIA,GAAsC,EAInD,KAAK,aAAa,UAAU,EAE5B,KAAK,eAAe,OAAOD,EAAGC,CAAC,EACjC,CAOO,OAAOC,EAA2BC,EAAqB,GAAa,CACzE,KAAK,eAAe,OAAOD,EAAWC,CAAS,CACjD,CASO,YAAYC,EAAcC,EAAqC,CACpE,KAAK,eAAe,YAAYD,EAAMC,CAAmB,CAC3D,CAEO,YAAYC,EAAyB,CAC1C,KAAK,YAAYA,GAAa,KAAK,KAAO,EAAE,CAC9C,CAEO,aAAoB,CACzB,KAAK,YAAY,CAAC,KAAK,eAAe,OAAO,KAAK,CACpD,CAEO,eAAeC,EAAqC,CACzD,KAAK,YAAY,KAAK,eAAe,OAAO,MAAQ,KAAK,eAAe,OAAO,KAAK,CACtF,CAEO,aAAaC,EAAoB,CACtC,IAAMC,EAAeD,EAAO,KAAK,eAAe,OAAO,MACnDC,IAAiB,GACnB,KAAK,YAAYA,CAAY,CAEjC,CAGO,mBAAmBC,EAAyBb,EAAyD,CAC1G,OAAO,KAAK,cAAc,mBAAmBa,EAAIb,CAAQ,CAC3D,CAGO,mBAAmBa,EAAyBb,EAAqF,CACtI,OAAO,KAAK,cAAc,mBAAmBa,EAAIb,CAAQ,CAC3D,CAGO,mBAAmBa,EAAyBb,EAAwE,CACzH,OAAO,KAAK,cAAc,mBAAmBa,EAAIb,CAAQ,CAC3D,CAGO,mBAAmBc,EAAed,EAAqE,CAC5G,OAAO,KAAK,cAAc,mBAAmBc,EAAOd,CAAQ,CAC9D,CAGO,mBAAmBa,EAAyBb,EAAqE,CACtH,OAAO,KAAK,cAAc,mBAAmBa,EAAIb,CAAQ,CAC3D,CAEU,QAAe,CACvB,KAAK,8BAA8B,CACrC,CAEO,OAAc,CACnB,KAAK,cAAc,MAAM,EACzB,KAAK,eAAe,MAAM,EAC1B,KAAK,gBAAgB,MAAM,EAC3B,KAAK,YAAY,MAAM,EACvB,KAAK,kBAAkB,MAAM,CAC/B,CAGQ,+BAAsC,CAC5C,IAAIe,EAAQ,GACNC,EAAa,KAAK,eAAe,WAAW,WAC9CA,GAAcA,EAAW,UAAY,QAAaA,EAAW,cAAgB,SAC/ED,EAAWC,EAAW,UAAY,UAAYA,EAAW,YAAc,OAErED,EACF,KAAK,iCAAiC,EAEtC,KAAK,2BAA2B,MAAM,CAE1C,CAEU,kCAAyC,CACjD,GAAI,CAAC,KAAK,2BAA2B,MAAO,CAC1C,IAAME,EAA6B,CAAC,EACpCA,EAAY,KAAK,KAAK,WAAWC,GAA8B,KAAK,KAAM,KAAK,cAAc,CAAC,CAAC,EAC/FD,EAAY,KAAK,KAAK,mBAAmB,CAAE,MAAO,GAAI,EAAG,KACvDC,GAA8B,KAAK,cAAc,EAC1C,GACR,CAAC,EACF,KAAK,2BAA2B,MAAQC,EAAa,IAAM,CACzD,QAAWC,KAAKH,EACdG,EAAE,QAAQ,CAEd,CAAC,CACH,CACF,CACF,ECzSA,IAAIC,EAAI,EAQKC,GAAN,KAAoB,CAWzB,YACmBC,EACjBC,EACA,CAFiB,aAAAD,EAXnB,KAAQ,OAAc,CAAC,EAEvB,KAAiB,gBAAuB,CAAC,EAEzC,KAAQ,oBAAsB,GAE9B,KAAiB,gBAA4B,CAAC,EAE9C,KAAQ,mBAAqB,GAM3B,KAAK,mBAAqB,IAAIE,GAAcD,CAAU,EACtD,KAAK,kBAAoB,IAAIC,GAAcD,CAAU,CACvD,CAEO,OAAc,CACnB,KAAK,OAAO,OAAS,EACrB,KAAK,gBAAgB,OAAS,EAC9B,KAAK,mBAAmB,MAAM,EAC9B,KAAK,oBAAsB,GAC3B,KAAK,gBAAgB,OAAS,EAC9B,KAAK,kBAAkB,MAAM,EAC7B,KAAK,mBAAqB,EAC5B,CAEO,OAAOE,EAAgB,CAC5B,KAAK,qBAAqB,EACtB,KAAK,gBAAgB,SAAW,GAClC,KAAK,mBAAmB,QAAQ,IAAM,KAAK,eAAe,CAAC,EAE7D,KAAK,gBAAgB,KAAKA,CAAK,CACjC,CAEQ,gBAAuB,CAC7B,IAAMC,EAAoB,KAAK,gBAAgB,KAAK,CAACC,EAAGC,IAAM,KAAK,QAAQD,CAAC,EAAI,KAAK,QAAQC,CAAC,CAAC,EAC3FC,EAAyB,EACzBC,EAAa,EAEXC,EAAW,IAAI,MAAM,KAAK,OAAO,OAAS,KAAK,gBAAgB,MAAM,EAE3E,QAASC,EAAgB,EAAGA,EAAgBD,EAAS,OAAQC,IACvDF,GAAc,KAAK,OAAO,QAAU,KAAK,QAAQJ,EAAkBG,CAAsB,CAAC,GAAK,KAAK,QAAQ,KAAK,OAAOC,CAAU,CAAC,GACrIC,EAASC,CAAa,EAAIN,EAAkBG,CAAsB,EAClEA,KAEAE,EAASC,CAAa,EAAI,KAAK,OAAOF,GAAY,EAItD,KAAK,OAASC,EACd,KAAK,gBAAgB,OAAS,CAChC,CAEQ,uBAA8B,CAChC,CAAC,KAAK,qBAAuB,KAAK,gBAAgB,OAAS,GAC7D,KAAK,mBAAmB,MAAM,CAElC,CAEO,OAAON,EAAmB,CAE/B,GADA,KAAK,sBAAsB,EACvB,KAAK,OAAO,SAAW,EACzB,MAAO,GAET,IAAMQ,EAAM,KAAK,QAAQR,CAAK,EAQ9B,GAPIQ,IAAQ,SAGZb,EAAI,KAAK,QAAQa,CAAG,EAChBb,IAAM,KAGN,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,EACnC,MAAO,GAET,EACE,IAAI,KAAK,OAAOb,CAAC,IAAMK,EACrB,OAAI,KAAK,gBAAgB,SAAW,GAClC,KAAK,kBAAkB,QAAQ,IAAM,KAAK,cAAc,CAAC,EAE3D,KAAK,gBAAgB,KAAKL,CAAC,EACpB,SAEF,EAAEA,EAAI,KAAK,OAAO,QAAU,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,GACtE,MAAO,EACT,CAEQ,eAAsB,CAC5B,KAAK,mBAAqB,GAC1B,IAAMC,EAAuB,KAAK,gBAAgB,KAAK,CAACP,EAAGC,IAAMD,EAAIC,CAAC,EAClEO,EAA4B,EAC1BJ,EAAW,IAAI,MAAM,KAAK,OAAO,OAASG,EAAqB,MAAM,EACvEF,EAAgB,EACpB,QAASZ,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAClCc,EAAqBC,CAAyB,IAAMf,EACtDe,IAEAJ,EAASC,GAAe,EAAI,KAAK,OAAOZ,CAAC,EAG7C,KAAK,OAASW,EACd,KAAK,gBAAgB,OAAS,EAC9B,KAAK,mBAAqB,EAC5B,CAEQ,sBAA6B,CAC/B,CAAC,KAAK,oBAAsB,KAAK,gBAAgB,OAAS,GAC5D,KAAK,kBAAkB,MAAM,CAEjC,CAEA,CAAQ,eAAeE,EAAkC,CAGvD,GAFA,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EACtB,KAAK,OAAO,SAAW,IAG3Bb,EAAI,KAAK,QAAQa,CAAG,EAChB,EAAAb,EAAI,GAAKA,GAAK,KAAK,OAAO,SAG1B,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,GAGrC,GACE,MAAM,KAAK,OAAOb,CAAC,QACZ,EAAEA,EAAI,KAAK,OAAO,QAAU,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,EACxE,CAEO,aAAaA,EAAaG,EAAoC,CAGnE,GAFA,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EACtB,KAAK,OAAO,SAAW,IAG3BhB,EAAI,KAAK,QAAQa,CAAG,EAChB,EAAAb,EAAI,GAAKA,GAAK,KAAK,OAAO,SAG1B,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,GAGrC,GACEG,EAAS,KAAK,OAAOhB,CAAC,CAAC,QAChB,EAAEA,EAAI,KAAK,OAAO,QAAU,KAAK,QAAQ,KAAK,OAAOA,CAAC,CAAC,IAAMa,EACxE,CAEO,QAA8B,CACnC,YAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAEnB,CAAC,GAAG,KAAK,MAAM,EAAE,OAAO,CACjC,CAEQ,QAAQA,EAAqB,CACnC,IAAII,EAAM,EACNC,EAAM,KAAK,OAAO,OAAS,EAC/B,KAAOA,GAAOD,GAAK,CACjB,IAAIE,EAAOF,EAAMC,GAAQ,EACnBE,EAAS,KAAK,QAAQ,KAAK,OAAOD,CAAG,CAAC,EAC5C,GAAIC,EAASP,EACXK,EAAMC,EAAM,UACHC,EAASP,EAClBI,EAAME,EAAM,MACP,CAEL,KAAOA,EAAM,GAAK,KAAK,QAAQ,KAAK,OAAOA,EAAM,CAAC,CAAC,IAAMN,GACvDM,IAEF,OAAOA,CACT,CACF,CAGA,OAAOF,CACT,CACF,ECrLA,IAAII,GAAQ,EACRC,GAAQ,EAECC,GAAN,cAAgCC,CAAyC,CAmB9E,YACgCC,EACGC,EACjC,CACA,MAAM,EAHwB,iBAAAD,EACG,oBAAAC,EAXnC,KAAiB,WAAa,KAAK,UAAU,IAAIC,EAAqB,EAEtE,KAAiB,wBAA0B,KAAK,UAAU,IAAIC,CAA8B,EAC5F,KAAgB,uBAAyB,KAAK,wBAAwB,MACtE,KAAiB,qBAAuB,KAAK,UAAU,IAAIA,CAA8B,EACzF,KAAgB,oBAAsB,KAAK,qBAAqB,MAU9D,KAAK,aAAe,IAAIC,GAAWC,GAAKA,GAAG,OAAO,KAAM,KAAK,WAAW,EAExE,KAAK,UAAUC,EAAa,IAAM,KAAK,MAAM,CAAC,CAAC,EAC/C,KAAK,UAAU,KAAK,eAAe,QAAQ,iBAAiB,IAAM,CAChE,KAAK,WAAW,oBAAoB,KAAK,eAAe,OAAO,KAAK,CACtE,CAAC,CAAC,EACF,KAAK,WAAW,oBAAoB,KAAK,eAAe,OAAO,KAAK,CACtE,CAfA,IAAW,aAAqD,CAAE,OAAO,KAAK,aAAa,OAAO,CAAG,CAiB9F,mBAAmBC,EAAsD,CAC9E,GAAIA,EAAQ,OAAO,WACjB,OAEF,IAAMC,EAAa,IAAIC,GAAWF,CAAO,EACzC,GAAIC,EAAY,CACd,IAAME,EAAgBF,EAAW,OAAO,UAAU,IAAMA,EAAW,QAAQ,CAAC,EACtEG,EAAWH,EAAW,UAAU,IAAM,CAC1CG,EAAS,QAAQ,EACbH,IACE,KAAK,aAAa,OAAOA,CAAU,IACrC,KAAK,WAAW,OAAOA,CAAU,EACjC,KAAK,qBAAqB,KAAKA,CAAU,GAE3CE,EAAc,QAAQ,EAE1B,CAAC,EACD,KAAK,aAAa,OAAOF,CAAU,EACnC,KAAK,WAAW,IAAIA,CAAU,EAC9B,KAAK,wBAAwB,KAAKA,CAAU,CAC9C,CACA,OAAOA,CACT,CAEO,OAAc,CACnB,QAAWI,KAAK,KAAK,aAAa,OAAO,EACvCA,EAAE,QAAQ,EAEZ,KAAK,aAAa,MAAM,EACxB,KAAK,WAAW,MAAM,CACxB,CAEA,CAAQ,qBAAqBC,EAAWC,EAAcC,EAAiE,CACrH,IAAMC,EAAS,KAAK,WAAW,qBAAqBF,CAAI,EACxD,GAAKE,EAGL,QAAWJ,KAAKI,EACdpB,GAAQgB,EAAE,QAAQ,GAAK,EACvBf,GAAQD,IAASgB,EAAE,QAAQ,OAAS,GAChCC,GAAKjB,IAASiB,EAAIhB,KAAU,CAACkB,IAAUH,EAAE,QAAQ,OAAS,YAAcG,KAC1E,MAAMH,EAGZ,CAEO,wBAAwBC,EAAWC,EAAcC,EAAqCE,EAA2D,CACtJ,IAAMD,EAAS,KAAK,WAAW,qBAAqBF,CAAI,EACxD,GAAKE,EAGL,QAAWJ,KAAKI,EACdpB,GAAQgB,EAAE,QAAQ,GAAK,EACvBf,GAAQD,IAASgB,EAAE,QAAQ,OAAS,GAChCC,GAAKjB,IAASiB,EAAIhB,KAAU,CAACkB,IAAUH,EAAE,QAAQ,OAAS,YAAcG,IAC1EE,EAASL,CAAC,CAGhB,CACF,EA7Fad,GAANoB,EAAA,CAoBFC,EAAA,EAAAC,IACAD,EAAA,EAAAE,IArBQvB,IAsGN,IAAMI,GAAN,cAAkCH,CAAW,CAA7C,kCACL,KAAiB,mBAAyD,IAAI,IAC9E,KAAiB,aAAe,IAAI,IACpC,KAAiB,qBAAuB,KAAK,UAAU,IAAIuB,CAAoC,EAC/F,KAAiB,oBAAsB,KAAK,UAAU,IAAIC,EAAgB,EAC1E,KAAQ,wBAA0C,CAAC,EAE5C,OAAc,CACnB,KAAK,wBAAwB,OAAS,EACtC,KAAK,oBAAoB,OAAO,EAChC,KAAK,mBAAmB,MAAM,EAC9B,KAAK,aAAa,MAAM,CAC1B,CAEO,IAAIf,EAAuC,CAChD,KAAK,aAAa,IAAIA,CAAU,EAChC,KAAK,kBAAkBA,CAAU,CACnC,CAEO,OAAOA,EAAuC,CACnD,KAAK,aAAa,OAAOA,CAAU,EACnC,KAAK,uBAAuBA,CAAU,CACxC,CAEO,qBAAqBM,EAA8D,CACxF,OAAO,KAAK,mBAAmB,IAAIA,CAAI,CACzC,CAEO,oBAAoBU,EAAqC,CAC9D,IAAMC,EAAQ,IAAIC,GAClB,KAAK,qBAAqB,MAAQD,EAClCA,EAAM,IAAID,EAAM,OAAOG,GAAU,KAAK,uBAAuBA,CAAM,CAAC,CAAC,EACrEF,EAAM,IAAID,EAAM,SAASI,GAAS,KAAK,yBAAyBA,CAAK,CAAC,CAAC,EACvEH,EAAM,IAAID,EAAM,SAASI,GAAS,KAAK,yBAAyBA,CAAK,CAAC,CAAC,CACzE,CAEQ,qBAAqBpB,EAAyC,CACpE,OAAOA,EAAW,QAAQ,QAAU,CACtC,CAEQ,kBAAkBA,EAAuC,CAC/D,IAAMqB,EAAQrB,EAAW,OAAO,KAChC,GAAIqB,EAAQ,EACV,OAEFrB,EAAW,kBAAoBqB,EAC/B,IAAMC,EAAS,KAAK,qBAAqBtB,CAAU,EACnD,QAASM,EAAOe,EAAOf,EAAOe,EAAQC,EAAQhB,IAAQ,CACpD,IAAIE,EAAS,KAAK,mBAAmB,IAAIF,CAAI,EACxCE,IACHA,EAAS,CAAC,EACV,KAAK,mBAAmB,IAAIF,EAAME,CAAM,GAE1CA,EAAO,KAAKR,CAAU,CACxB,CACF,CAEQ,uBAAuBA,EAAuC,CACpE,IAAMqB,EAAQrB,EAAW,kBACnBsB,EAAS,KAAK,qBAAqBtB,CAAU,EACnD,QAASM,EAAOe,EAAOf,EAAOe,EAAQC,EAAQhB,IAAQ,CACpD,IAAME,EAAS,KAAK,mBAAmB,IAAIF,CAAI,EAC/C,GAAI,CAACE,EACH,SAEF,IAAMe,EAAQf,EAAO,QAAQR,CAAU,EACnCuB,IAAU,IACZf,EAAO,OAAOe,EAAO,CAAC,EAEpBf,EAAO,SAAW,GACpB,KAAK,mBAAmB,OAAOF,CAAI,CAEvC,CACF,CAEQ,mBAAmBN,EAAuC,CAChE,KAAK,uBAAuBA,CAAU,EAClC,CAACA,EAAW,OAAO,YAAcA,EAAW,OAAO,MAAQ,GAC7D,KAAK,kBAAkBA,CAAU,CAErC,CAGQ,uBAAuBS,EAA4B,CACzD,KAAK,wBAAwB,KAAKA,CAAQ,EAC1C,KAAK,oBAAoB,IAAI,IAAM,CACjC,IAAMe,EAAY,KAAK,wBACvB,KAAK,wBAA0B,CAAC,EAChC,QAAWC,KAAMD,EACfC,EAAG,CAEP,CAAC,CACH,CAEQ,uBAAuBN,EAAsB,CACnD,GAAIA,GAAU,EACZ,OAEF,IAAMO,EAAS,IAAI,IACnB,OAAW,CAACpB,EAAME,CAAM,IAAK,KAAK,mBAAoB,CACpD,IAAMmB,EAAUrB,EAAOa,EACnBQ,EAAU,GAGd,KAAK,iBAAiBD,EAAQC,EAASnB,CAAM,CAC/C,CACA,KAAK,mBAAmB,MAAM,EAC9B,OAAW,CAACF,EAAME,CAAM,IAAKkB,EAC3B,KAAK,mBAAmB,IAAIpB,EAAME,CAAM,EAE1C,QAAWJ,KAAK,KAAK,aACdA,EAAE,OAAO,aACZA,EAAE,mBAAqBe,EAG7B,CAEQ,yBAAyBC,EAA2B,CAC1D,KAAK,uBAAuB,IAAM,KAAK,wBAAwBA,CAAK,CAAC,CACvE,CAEQ,yBAAyBA,EAA2B,CAC1D,KAAK,uBAAuB,IAAM,KAAK,wBAAwBA,CAAK,CAAC,CACvE,CAEQ,iBAAiBM,EAA4CpB,EAAcE,EAAqC,CACtH,IAAMoB,EAAWF,EAAO,IAAIpB,CAAI,EAChC,GAAIsB,EACF,QAASC,EAAI,EAAGC,EAAMtB,EAAO,OAAQqB,EAAIC,EAAKD,IAC5CD,EAAS,KAAKpB,EAAOqB,CAAC,CAAC,OAGzBH,EAAO,IAAIpB,EAAME,EAAO,MAAM,CAAC,CAEnC,CAMQ,wBAAwBY,EAA2B,CACzD,GAAM,CAAE,MAAAG,EAAO,OAAAJ,CAAO,EAAIC,EACpBW,EAAsC,CAAC,EAC7C,QAAW3B,KAAK,KAAK,aAAc,CACjC,GAAIA,EAAE,OAAO,WACX,SAEF,IAAMiB,EAAQjB,EAAE,kBACZiB,EAAQE,GAASF,EAAQ,KAAK,qBAAqBjB,CAAC,EAAImB,IAC1DQ,EAAa,KAAK3B,CAAC,EACnB,KAAK,uBAAuBA,CAAC,EAEjC,CACA,IAAMsB,EAAS,IAAI,IACnB,OAAW,CAACpB,EAAME,CAAM,IAAK,KAAK,mBAAoB,CACpD,IAAMmB,EAAUrB,GAAQiB,EAAQjB,EAAOa,EAASb,EAChD,KAAK,iBAAiBoB,EAAQC,EAASnB,CAAM,CAC/C,CACA,KAAK,mBAAmB,MAAM,EAC9B,OAAW,CAACF,EAAME,CAAM,IAAKkB,EAC3B,KAAK,mBAAmB,IAAIpB,EAAME,CAAM,EAE1C,QAAWJ,KAAK,KAAK,aACfA,EAAE,OAAO,YAGTA,EAAE,mBAAqBmB,IACzBnB,EAAE,kBAAoBA,EAAE,OAAO,MAGnC,QAAWA,KAAK2B,EACd,KAAK,kBAAkB3B,CAAC,CAE5B,CAMQ,wBAAwBgB,EAA2B,CACzD,IAAMY,EAAYZ,EAAM,MAAQA,EAAM,OAChCM,EAAS,IAAI,IACnB,OAAW,CAACpB,EAAME,CAAM,IAAK,KAAK,mBAAoB,CACpD,GAAIF,GAAQc,EAAM,OAASd,EAAO0B,EAChC,SAEF,IAAML,EAAUrB,GAAQ0B,EAAY1B,EAAOc,EAAM,OAASd,EAC1D,KAAK,iBAAiBoB,EAAQC,EAASnB,CAAM,CAC/C,CACA,KAAK,mBAAmB,MAAM,EAC9B,OAAW,CAACF,EAAME,CAAM,IAAKkB,EAC3B,KAAK,mBAAmB,IAAIpB,EAAME,CAAM,EAE1C,IAAMyB,EAAmC,CAAC,EAC1C,QAAW7B,KAAK,KAAK,aAAc,CACjC,GAAIA,EAAE,OAAO,WACX,SAEF,IAAMiB,EAAQjB,EAAE,kBACVkB,EAAS,KAAK,qBAAqBlB,CAAC,EACtCiB,GAASW,EACX5B,EAAE,kBAAoBA,EAAE,OAAO,KACtBiB,EAAQD,EAAM,OAASC,EAAQC,EAASU,GACjDC,EAAU,KAAK7B,CAAC,CAEpB,CACA,QAAWA,KAAK6B,EACd,KAAK,mBAAmB7B,CAAC,CAE7B,CACF,EAEMH,GAAN,cAAyBiB,EAA+C,CAoCtE,YACkBnB,EAChB,CACA,MAAM,EAFU,aAAAA,EA9BlB,KAAgB,gBAAkB,KAAK,IAAI,IAAIJ,CAAsB,EACrE,KAAgB,SAAW,KAAK,gBAAgB,MAChD,KAAiB,WAAa,KAAK,IAAI,IAAIA,CAAe,EAC1D,KAAgB,UAAY,KAAK,WAAW,MAE5C,KAAQ,UAAuC,KAY/C,KAAQ,UAAuC,KAgB7C,KAAK,OAASI,EAAQ,OACtB,KAAK,kBAAoBA,EAAQ,OAAO,KACpC,KAAK,QAAQ,sBAAwB,CAAC,KAAK,QAAQ,qBAAqB,WAC1E,KAAK,QAAQ,qBAAqB,SAAW,OAEjD,CAhCA,IAAW,oBAAyC,CAClD,OAAI,KAAK,YAAc,OACjB,KAAK,QAAQ,gBACf,KAAK,UAAYmC,EAAI,QAAQ,KAAK,QAAQ,eAAe,EAEzD,KAAK,UAAY,QAGd,KAAK,SACd,CAGA,IAAW,oBAAyC,CAClD,OAAI,KAAK,YAAc,OACjB,KAAK,QAAQ,gBACf,KAAK,UAAYA,EAAI,QAAQ,KAAK,QAAQ,eAAe,EAEzD,KAAK,UAAY,QAGd,KAAK,SACd,CAagB,SAAgB,CAC9B,KAAK,WAAW,KAAK,EACrB,MAAM,QAAQ,CAChB,CACF,ECzXA,IAAMC,GAA+B,IAKxBC,GAAN,KAAqD,CAY1D,YACUC,EACSC,EAAuBH,GACxC,CAFQ,qBAAAE,EACS,0BAAAC,EARnB,KAAQ,eAAiB,EAEzB,KAAQ,4BAA8B,EAQtC,CAEO,SAAgB,CACjB,KAAK,oBACP,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,QAE3B,KAAK,4BAA8B,EACrC,CAEO,QAAQC,EAA8BC,EAA4BC,EAAwB,CAC/F,KAAK,UAAYA,EAEjBF,EAAWA,GAAY,EACvBC,EAASA,GAAU,KAAK,UAAY,EAEpC,KAAK,UAAY,KAAK,YAAc,OAAY,KAAK,IAAI,KAAK,UAAWD,CAAQ,EAAIA,EACrF,KAAK,QAAU,KAAK,UAAY,OAAY,KAAK,IAAI,KAAK,QAASC,CAAM,EAAIA,EAI7E,IAAME,EAA6B,YAAY,IAAI,EACnD,GAAIA,EAAqB,KAAK,gBAAkB,KAAK,qBAE/C,KAAK,oBAAsB,SAC7B,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,OACzB,KAAK,4BAA8B,IAErC,KAAK,eAAiBA,EACtB,KAAK,cAAc,UACV,CAAC,KAAK,4BAA6B,CAE5C,IAAMC,EAAUD,EAAqB,KAAK,eACpCE,EAAkC,KAAK,qBAAuBD,EACpE,KAAK,4BAA8B,GAEnC,KAAK,kBAAoB,OAAO,WAAW,IAAM,CAC/C,KAAK,eAAiB,YAAY,IAAI,EACtC,KAAK,cAAc,EACnB,KAAK,4BAA8B,GACnC,KAAK,kBAAoB,MAC3B,EAAGC,CAA+B,CACpC,CACF,CAEQ,eAAsB,CAE5B,GAAI,KAAK,YAAc,QAAa,KAAK,UAAY,QAAa,KAAK,YAAc,OACnF,OAIF,IAAMC,EAAQ,KAAK,IAAI,KAAK,UAAW,CAAC,EAClCC,EAAM,KAAK,IAAI,KAAK,QAAS,KAAK,UAAY,CAAC,EAGrD,KAAK,UAAY,OACjB,KAAK,QAAU,OAGf,KAAK,gBAAgBD,EAAOC,CAAG,CACjC,CACF,EClEA,IAAMC,GAAQ,GAEDC,GAAN,cAAmCC,CAAW,CA4BnD,YACmBC,EACMC,EACeC,EACLC,EACjC,CACA,MAAM,EALW,eAAAH,EAEqB,yBAAAE,EACL,oBAAAC,EA1BnC,KAAQ,YAA8C,IAAI,QAG1D,KAAQ,qBAA+B,EAevC,KAAQ,gBAA4B,CAAC,EAErC,KAAQ,iBAA2B,GASjC,IAAMC,EAAM,KAAK,oBAAoB,aACrC,KAAK,wBAA0BA,EAAI,cAAc,KAAK,EACtD,KAAK,wBAAwB,UAAU,IAAI,qBAAqB,EAEhE,KAAK,cAAgBA,EAAI,cAAc,KAAK,EAC5C,KAAK,cAAc,aAAa,OAAQ,MAAM,EAC9C,KAAK,cAAc,UAAU,IAAI,0BAA0B,EAC3D,KAAK,aAAe,CAAC,EACrB,QAASC,EAAI,EAAGA,EAAI,KAAK,UAAU,KAAMA,IACvC,KAAK,aAAaA,CAAC,EAAI,KAAK,6BAA6B,EACzD,KAAK,cAAc,YAAY,KAAK,aAAaA,CAAC,CAAC,EAgBrD,GAbA,KAAK,0BAA4BC,GAAK,KAAK,qBAAqBA,EAAG,CAAoB,EACvF,KAAK,6BAA+BA,GAAK,KAAK,qBAAqBA,EAAG,CAAuB,EAC7F,KAAK,aAAa,CAAC,EAAE,iBAAiB,QAAS,KAAK,yBAAyB,EAC7E,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAAE,iBAAiB,QAAS,KAAK,4BAA4B,EAE3G,KAAK,wBAAwB,YAAY,KAAK,aAAa,EAE3D,KAAK,YAAcF,EAAI,cAAc,KAAK,EAC1C,KAAK,YAAY,UAAU,IAAI,aAAa,EAC5C,KAAK,YAAY,aAAa,YAAa,WAAW,EACtD,KAAK,wBAAwB,YAAY,KAAK,WAAW,EACzD,KAAK,qBAAuB,KAAK,UAAU,IAAIG,GAAmB,KAAK,YAAY,KAAK,IAAI,CAAC,CAAC,EAE1F,CAAC,KAAK,UAAU,QAClB,MAAM,IAAI,MAAM,kDAAkD,EAGhEV,IACF,KAAK,wBAAwB,UAAU,IAAI,OAAO,EAClD,KAAK,cAAc,UAAU,IAAI,OAAO,EAGxC,KAAK,oBAAsBO,EAAI,cAAc,KAAK,EAClD,KAAK,oBAAoB,UAAU,IAAI,OAAO,EAE9C,KAAK,oBAAoB,YAAYA,EAAI,eAAe,wBAAwB,CAAC,EACjF,KAAK,oBAAoB,YAAY,KAAK,uBAAuB,EACjE,KAAK,oBAAoB,YAAYA,EAAI,eAAe,sBAAsB,CAAC,EAE/E,KAAK,UAAU,QAAQ,sBAAsB,WAAY,KAAK,mBAAmB,GAEjF,KAAK,UAAU,QAAQ,sBAAsB,aAAc,KAAK,uBAAuB,EAGzF,KAAK,UAAU,KAAK,UAAU,SAASE,GAAK,KAAK,cAAcA,EAAE,IAAI,CAAC,CAAC,EACvE,KAAK,UAAU,KAAK,UAAU,SAASA,GAAK,KAAK,aAAaA,EAAE,MAAOA,EAAE,GAAG,CAAC,CAAC,EAC9E,KAAK,UAAU,KAAK,UAAU,SAAS,IAAM,KAAK,aAAa,CAAC,CAAC,EAEjE,KAAK,UAAU,KAAK,UAAU,WAAWE,GAAQ,KAAK,YAAYA,CAAI,CAAC,CAAC,EACxE,KAAK,UAAU,KAAK,UAAU,WAAW,IAAM,KAAK,YAAY;AAAA,CAAI,CAAC,CAAC,EACtE,KAAK,UAAU,KAAK,UAAU,UAAUC,GAAc,KAAK,WAAWA,CAAU,CAAC,CAAC,EAClF,KAAK,UAAU,KAAK,UAAU,MAAMH,GAAK,KAAK,WAAWA,EAAE,GAAG,CAAC,CAAC,EAChE,KAAK,UAAU,KAAK,UAAU,OAAO,IAAM,KAAK,iBAAiB,CAAC,CAAC,EACnE,KAAK,UAAU,KAAK,eAAe,mBAAmB,IAAM,KAAK,uBAAuB,CAAC,CAAC,EAC1F,KAAK,UAAUI,EAAsBN,EAAK,kBAAmB,IAAM,KAAK,uBAAuB,CAAC,CAAC,EACjG,KAAK,UAAU,KAAK,oBAAoB,YAAY,IAAM,KAAK,uBAAuB,CAAC,CAAC,EAExF,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,UAAUO,EAAa,IAAM,CAC5Bd,GACF,KAAK,oBAAqB,OAAO,EAEjC,KAAK,wBAAwB,OAAO,EAEtC,KAAK,aAAa,OAAS,CAC7B,CAAC,CAAC,CACJ,CAEQ,WAAWY,EAA0B,CAC3C,QAASJ,EAAI,EAAGA,EAAII,EAAYJ,IAC9B,KAAK,YAAY,GAAG,CAExB,CAEQ,YAAYG,EAAoB,CAClC,KAAK,qBAAuB,KAC1B,KAAK,gBAAgB,OAAS,EAEZ,KAAK,gBAAgB,MAAM,IAC3BA,IAClB,KAAK,kBAAoBA,GAG3B,KAAK,kBAAoBA,EAGvBA,IAAS;AAAA,IACX,KAAK,uBACD,KAAK,uBAAyB,KAChC,KAAK,YAAY,YAAsBI,GAAc,IAAI,IAIjE,CAEQ,kBAAyB,CAC/B,KAAK,YAAY,YAAc,GAC/B,KAAK,qBAAuB,CAC9B,CAEQ,WAAWC,EAAuB,CACxC,KAAK,iBAAiB,EAEjB,eAAe,KAAKA,CAAO,GAC9B,KAAK,gBAAgB,KAAKA,CAAO,CAErC,CAEQ,aAAaC,EAAgBC,EAAoB,CACvD,KAAK,qBAAqB,QAAQD,EAAOC,EAAK,KAAK,UAAU,IAAI,CACnE,CAEQ,YAAYD,EAAeC,EAAmB,CACpD,IAAMC,EAAkB,KAAK,UAAU,OACjCC,EAAUD,EAAO,MAAM,OAAO,SAAS,EAC7C,QAASX,EAAIS,EAAOT,GAAKU,EAAKV,IAAK,CACjC,IAAMa,EAAOF,EAAO,MAAM,IAAIA,EAAO,MAAQX,CAAC,EACxCc,EAAoB,CAAC,EACrBC,EAAWF,GAAM,kBAAkB,GAAM,OAAW,OAAWC,CAAO,GAAK,GAC3EE,GAAYL,EAAO,MAAQX,EAAI,GAAG,SAAS,EAC3CiB,EAAU,KAAK,aAAajB,CAAC,EAC/BiB,IACEF,EAAS,SAAW,GACtBE,EAAQ,YAAc,OACtB,KAAK,YAAY,IAAIA,EAAS,CAAC,EAAG,CAAC,CAAC,IAEpCA,EAAQ,YAAcF,EACtB,KAAK,YAAY,IAAIE,EAASH,CAAO,GAEvCG,EAAQ,aAAa,gBAAiBD,CAAQ,EAC9CC,EAAQ,aAAa,eAAgBL,CAAO,EAC5C,KAAK,eAAeK,CAAO,EAE/B,CACA,KAAK,oBAAoB,CAC3B,CAEQ,qBAA4B,CAC9B,KAAK,iBAAiB,SAAW,IAGjC,KAAK,YAAY,cAAwBV,GAAc,IAAI,GAC7D,KAAK,iBAAiB,EAExB,KAAK,YAAY,aAAe,KAAK,iBACrC,KAAK,iBAAmB,GAC1B,CAEQ,qBAAqB,EAAeW,EAAkC,CAC5E,IAAMC,EAAkB,EAAE,OACpBC,EAAwB,KAAK,aAAaF,IAAa,EAAuB,EAAI,KAAK,aAAa,OAAS,CAAC,EAG9GF,EAAWG,EAAgB,aAAa,eAAe,EACvDE,EAAaH,IAAa,EAAuB,IAAM,GAAG,KAAK,UAAU,OAAO,MAAM,MAAM,GAOlG,GANIF,IAAaK,GAMb,EAAE,gBAAkBD,EACtB,OAIF,IAAIE,EACAC,EAgBJ,GAfIL,IAAa,GACfI,EAAqBH,EACrBI,EAAwB,KAAK,aAAa,IAAI,EAC9C,KAAK,cAAc,YAAYA,CAAqB,IAEpDD,EAAqB,KAAK,aAAa,MAAM,EAC7CC,EAAwBJ,EACxB,KAAK,cAAc,YAAYG,CAAkB,GAInDA,EAAmB,oBAAoB,QAAS,KAAK,yBAAyB,EAC9EC,EAAsB,oBAAoB,QAAS,KAAK,4BAA4B,EAGhFL,IAAa,EAAsB,CACrC,IAAMM,EAAa,KAAK,6BAA6B,EACrD,KAAK,aAAa,QAAQA,CAAU,EACpC,KAAK,cAAc,sBAAsB,aAAcA,CAAU,CACnE,KAAO,CACL,IAAMA,EAAa,KAAK,6BAA6B,EACrD,KAAK,aAAa,KAAKA,CAAU,EACjC,KAAK,cAAc,YAAYA,CAAU,CAC3C,CAGA,KAAK,aAAa,CAAC,EAAE,iBAAiB,QAAS,KAAK,yBAAyB,EAC7E,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAAE,iBAAiB,QAAS,KAAK,4BAA4B,EAG3G,KAAK,UAAU,YAAYN,IAAa,EAAuB,GAAK,CAAC,EAGrE,KAAK,aAAaA,IAAa,EAAuB,EAAI,KAAK,aAAa,OAAS,CAAC,EAAE,MAAM,EAG9F,EAAE,eAAe,EACjB,EAAE,yBAAyB,CAC7B,CAEQ,wBAA+B,CACrC,GAAI,KAAK,aAAa,SAAW,EAC/B,OAGF,IAAMO,EAAY,KAAK,oBAAoB,aAAa,aAAa,EACrE,GAAI,CAACA,EACH,OAGF,GAAIA,EAAU,YAAa,CAIrB,KAAK,cAAc,SAASA,EAAU,UAAU,GAClD,KAAK,UAAU,eAAe,EAEhC,MACF,CAEA,GAAI,CAACA,EAAU,YAAc,CAACA,EAAU,UAAW,CACjD,QAAQ,MAAM,sCAAsC,EACpD,MACF,CAGA,IAAIC,EAAQ,CAAE,KAAMD,EAAU,WAAY,OAAQA,EAAU,YAAa,EACrEf,EAAM,CAAE,KAAMe,EAAU,UAAW,OAAQA,EAAU,WAAY,EASrE,IARKC,EAAM,KAAK,wBAAwBhB,EAAI,IAAI,EAAI,KAAK,6BAAiCgB,EAAM,OAAShB,EAAI,MAAQgB,EAAM,OAAShB,EAAI,UACtI,CAACgB,EAAOhB,CAAG,EAAI,CAACA,EAAKgB,CAAK,GAIxBA,EAAM,KAAK,wBAAwB,KAAK,aAAa,CAAC,CAAC,GAAK,KAAK,+BAAiC,KAAK,+BACzGA,EAAQ,CAAE,KAAM,KAAK,aAAa,CAAC,EAAE,WAAW,CAAC,EAAG,OAAQ,CAAE,GAE5D,CAAC,KAAK,cAAc,SAASA,EAAM,IAAI,EAEzC,OAEF,IAAMC,EAAiB,KAAK,aAAa,MAAM,EAAE,EAAE,CAAC,EAOpD,GANIjB,EAAI,KAAK,wBAAwBiB,CAAc,GAAK,KAAK,+BAAiC,KAAK,+BACjGjB,EAAM,CACJ,KAAMiB,EACN,OAAQA,EAAe,aAAa,QAAU,CAChD,GAEE,CAAC,KAAK,cAAc,SAASjB,EAAI,IAAI,EAEvC,OAGF,IAAMkB,EAAc,CAAC,CAAE,KAAAC,EAAM,OAAAC,CAAO,IAA0D,CAE5F,IAAMC,EAAkBF,aAAgB,KAAOA,EAAK,WAAaA,EAC7DG,EAAM,SAASD,GAAY,aAAa,eAAe,EAAG,EAAE,EAAI,EACpE,GAAI,MAAMC,CAAG,EACX,eAAQ,KAAK,iCAAiC,EACvC,KAGT,IAAMlB,EAAU,KAAK,YAAY,IAAIiB,CAAU,EAC/C,GAAI,CAACjB,EACH,eAAQ,KAAK,kCAAkC,EACxC,KAGT,IAAImB,EAASH,EAAShB,EAAQ,OAASA,EAAQgB,CAAM,EAAIhB,EAAQ,MAAM,EAAE,EAAE,CAAC,EAAI,EAChF,OAAImB,GAAU,KAAK,UAAU,OAC3B,EAAED,EACFC,EAAS,GAEJ,CACL,IAAAD,EACA,OAAAC,CACF,CACF,EAEMC,EAAiBN,EAAYF,CAAK,EAClCS,EAAeP,EAAYlB,CAAG,EAEpC,GAAI,GAACwB,GAAkB,CAACC,GAIxB,IAAID,EAAe,IAAMC,EAAa,KAAQD,EAAe,MAAQC,EAAa,KAAOD,EAAe,QAAUC,EAAa,OAE7H,MAAM,IAAI,MAAM,eAAe,EAGjC,KAAK,UAAU,OACbD,EAAe,OACfA,EAAe,KACdC,EAAa,IAAMD,EAAe,KAAO,KAAK,UAAU,KAAOA,EAAe,OAASC,EAAa,MACvG,EACF,CAEQ,cAAcC,EAAoB,CAExC,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAAE,oBAAoB,QAAS,KAAK,4BAA4B,EAG9G,QAASpC,EAAI,KAAK,cAAc,SAAS,OAAQA,EAAI,KAAK,UAAU,KAAMA,IACxE,KAAK,aAAaA,CAAC,EAAI,KAAK,6BAA6B,EACzD,KAAK,cAAc,YAAY,KAAK,aAAaA,CAAC,CAAC,EAGrD,KAAO,KAAK,aAAa,OAASoC,GAChC,KAAK,cAAc,YAAY,KAAK,aAAa,IAAI,CAAE,EAIzD,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAAE,iBAAiB,QAAS,KAAK,4BAA4B,EAE3G,KAAK,uBAAuB,CAC9B,CAEQ,8BAA4C,CAClD,IAAMnB,EAAU,KAAK,oBAAoB,aAAa,cAAc,KAAK,EACzE,OAAAA,EAAQ,aAAa,OAAQ,UAAU,EACvCA,EAAQ,SAAW,GACnB,KAAK,sBAAsBA,CAAO,EAC3BA,CACT,CAEQ,wBAA+B,CACrC,GAAK,KAAK,eAAe,WAAW,IAAI,KAAK,OAG7C,QAAO,OAAO,KAAK,wBAAwB,MAAO,CAChD,MAAO,GAAG,KAAK,eAAe,WAAW,IAAI,OAAO,KAAK,KACzD,SAAU,GAAG,KAAK,UAAU,QAAQ,QAAQ,IAC9C,CAAC,EACG,KAAK,aAAa,SAAW,KAAK,UAAU,MAC9C,KAAK,cAAc,KAAK,UAAU,IAAI,EAExC,QAASjB,EAAI,EAAGA,EAAI,KAAK,UAAU,KAAMA,IACvC,KAAK,sBAAsB,KAAK,aAAaA,CAAC,CAAC,EAC/C,KAAK,eAAe,KAAK,aAAaA,CAAC,CAAC,EAE5C,CAEQ,sBAAsBiB,EAA4B,CACxDA,EAAQ,MAAM,OAAS,GAAG,KAAK,eAAe,WAAW,IAAI,KAAK,MAAM,IAC1E,CAWQ,eAAeA,EAA4B,CACjDA,EAAQ,MAAM,UAAY,GAC1B,IAAMoB,EAAQpB,EAAQ,sBAAsB,EAAE,MACxCqB,EAAa,KAAK,YAAY,IAAIrB,CAAO,GAAG,MAAM,EAAE,IAAI,CAAC,EAC/D,GAAI,CAACqB,EACH,OAEF,IAAMC,EAAcD,EAAa,KAAK,eAAe,WAAW,IAAI,KAAK,MACzErB,EAAQ,MAAM,UAAY,UAAUsB,EAAcF,CAAK,GACzD,CACF,EA5Za5C,GAAN+C,EAAA,CA8BFC,EAAA,EAAAC,IACAD,EAAA,EAAAE,GACAF,EAAA,EAAAG,IAhCQnD,ICdN,IAAMoD,GAAN,cAAwBC,CAAkC,CAiB/D,YACmBC,EACqBC,EACLC,EACAC,EACMC,EACvC,CACA,MAAM,EANW,cAAAJ,EACqB,yBAAAC,EACL,oBAAAC,EACA,oBAAAC,EACM,0BAAAC,EAjBzC,KAAQ,sBAAuC,CAAC,EAEhD,KAAQ,YAAuB,GAC/B,KAAQ,YAAuB,GAE/B,KAAQ,YAAsB,GAE9B,KAAiB,qBAAuB,KAAK,UAAU,IAAIC,CAA0B,EACrF,KAAgB,oBAAsB,KAAK,qBAAqB,MAChE,KAAiB,qBAAuB,KAAK,UAAU,IAAIA,CAA0B,EACrF,KAAgB,oBAAsB,KAAK,qBAAqB,MAU9D,KAAK,UAAUC,EAAa,IAAM,CAChCC,GAAQ,KAAK,qBAAqB,EAClC,KAAK,sBAAsB,OAAS,EACpC,KAAK,gBAAkB,OAEvB,KAAK,wBAAwB,MAAM,CACrC,CAAC,CAAC,EAEF,KAAK,UAAU,KAAK,eAAe,SAAS,IAAM,CAChD,KAAK,kBAAkB,EACvB,KAAK,YAAc,EACrB,CAAC,CAAC,EACF,KAAK,UAAUC,EAAsB,KAAK,SAAU,aAAc,IAAM,CACtE,KAAK,YAAc,GACnB,KAAK,kBAAkB,CACzB,CAAC,CAAC,EACF,KAAK,UAAUA,EAAsB,KAAK,SAAU,YAAa,KAAK,iBAAiB,KAAK,IAAI,CAAC,CAAC,EAClG,KAAK,UAAUA,EAAsB,KAAK,SAAU,YAAa,KAAK,iBAAiB,KAAK,IAAI,CAAC,CAAC,EAClG,KAAK,UAAUA,EAAsB,KAAK,SAAU,UAAW,KAAK,eAAe,KAAK,IAAI,CAAC,CAAC,CAChG,CA3CA,IAAW,aAA0C,CAAE,OAAO,KAAK,YAAc,CA6CzE,iBAAiBC,EAAyB,CAChD,KAAK,gBAAkBA,EAEvB,IAAMC,EAAW,KAAK,wBAAwBD,EAAO,KAAK,QAAQ,EAClE,GAAI,CAACC,EACH,OAEF,KAAK,YAAc,GAGnB,IAAMC,EAAeF,EAAM,aAAa,EACxC,QAASG,EAAI,EAAGA,EAAID,EAAa,OAAQC,IAAK,CAC5C,IAAMC,EAASF,EAAaC,CAAC,EAE7B,GAAIC,EAAO,UAAU,SAAS,OAAO,EACnC,MAGF,GAAIA,EAAO,UAAU,SAAS,aAAa,EACzC,MAEJ,EAEI,CAAC,KAAK,iBAAoBH,EAAS,IAAM,KAAK,gBAAgB,GAAKA,EAAS,IAAM,KAAK,gBAAgB,KACzG,KAAK,aAAaA,CAAQ,EAC1B,KAAK,gBAAkBA,EAE3B,CAEQ,aAAaA,EAAqC,CAIxD,GAAI,KAAK,cAAgBA,EAAS,GAAK,KAAK,YAAa,CACvD,KAAK,kBAAkB,EACvB,KAAK,YAAYA,EAAU,EAAK,EAChC,KAAK,YAAc,GACnB,MACF,CAGgC,KAAK,cAAgB,KAAK,gBAAgB,KAAK,aAAa,KAAMA,CAAQ,IAExG,KAAK,kBAAkB,EACvB,KAAK,YAAYA,EAAU,EAAI,EAEnC,CAEQ,YAAYA,EAA+BI,EAA6B,EAC1E,CAAC,KAAK,wBAA0B,CAACA,KACnC,KAAK,wBAAwB,QAAQC,GAAS,CAC5CA,GAAO,QAAQC,GAAiB,CAC1BA,EAAc,KAAK,SACrBA,EAAc,KAAK,QAAQ,CAE/B,CAAC,CACH,CAAC,EACD,KAAK,uBAAyB,IAAI,IAClC,KAAK,YAAcN,EAAS,GAE9B,IAAIO,EAAe,GAGnB,OAAW,CAACL,EAAGM,CAAY,IAAK,KAAK,qBAAqB,cAAc,QAAQ,EAC1EJ,EACoB,KAAK,wBAAwB,IAAIF,CAAC,IAOtDK,EAAe,KAAK,yBAAyBL,EAAGF,EAAUO,CAAY,GAGxEC,EAAa,aAAaR,EAAS,EAAIS,GAA+B,CACpE,GAAI,KAAK,YACP,OAEF,IAAMC,EAA+CD,GAAO,IAAIE,IAAU,CAAE,KAAAA,CAAK,EAAE,EACnF,KAAK,wBAAwB,IAAIT,EAAGQ,CAAc,EAClDH,EAAe,KAAK,yBAAyBL,EAAGF,EAAUO,CAAY,EAIlE,KAAK,wBAAwB,OAAS,KAAK,qBAAqB,cAAc,QAChF,KAAK,yBAAyBP,EAAS,EAAG,KAAK,sBAAsB,CAEzE,CAAC,CAGP,CAEQ,yBAAyBY,EAAWC,EAA0D,CACpG,IAAMC,EAAgB,IAAI,IAC1B,QAASZ,EAAI,EAAGA,EAAIW,EAAQ,KAAMX,IAAK,CACrC,IAAMa,EAAgBF,EAAQ,IAAIX,CAAC,EACnC,GAAKa,EAGL,QAASb,EAAI,EAAGA,EAAIa,EAAc,OAAQb,IAAK,CAC7C,IAAMI,EAAgBS,EAAcb,CAAC,EAC/Bc,EAASV,EAAc,KAAK,MAAM,MAAM,EAAIM,EAAI,EAAIN,EAAc,KAAK,MAAM,MAAM,EACnFW,EAAOX,EAAc,KAAK,MAAM,IAAI,EAAIM,EAAI,KAAK,eAAe,KAAON,EAAc,KAAK,MAAM,IAAI,EAC1G,QAASY,EAAIF,EAAQE,GAAKD,EAAMC,IAAK,CACnC,GAAIJ,EAAc,IAAII,CAAC,EAAG,CACxBH,EAAc,OAAOb,IAAK,CAAC,EAC3B,KACF,CACAY,EAAc,IAAII,CAAC,CACrB,CACF,CACF,CACF,CAEQ,yBAAyBC,EAAenB,EAA+BO,EAAgC,CAC7G,GAAI,CAAC,KAAK,uBACR,OAAOA,EAGT,IAAME,EAAQ,KAAK,uBAAuB,IAAIU,CAAK,EAG/CC,EAAgB,GACpB,QAASC,EAAI,EAAGA,EAAIF,EAAOE,KACrB,CAAC,KAAK,uBAAuB,IAAIA,CAAC,GAAK,KAAK,uBAAuB,IAAIA,CAAC,KAC1ED,EAAgB,IAMpB,GAAI,CAACA,GAAiBX,EAAO,CAC3B,IAAMa,EAAiBb,EAAM,KAAKE,GAAQ,KAAK,gBAAgBA,EAAK,KAAMX,CAAQ,CAAC,EAC/EsB,IACFf,EAAe,GACf,KAAK,eAAee,CAAc,EAEtC,CAGA,GAAI,KAAK,uBAAuB,OAAS,KAAK,qBAAqB,cAAc,QAAU,CAACf,EAE1F,QAASc,EAAI,EAAGA,EAAI,KAAK,uBAAuB,KAAMA,IAAK,CACzD,IAAME,EAAc,KAAK,uBAAuB,IAAIF,CAAC,GAAG,KAAKV,GAAQ,KAAK,gBAAgBA,EAAK,KAAMX,CAAQ,CAAC,EAC9G,GAAIuB,EAAa,CACfhB,EAAe,GACf,KAAK,eAAegB,CAAW,EAC/B,KACF,CACF,CAGF,OAAOhB,CACT,CAEQ,kBAAyB,CAC/B,KAAK,eAAiB,KAAK,YAC7B,CAEQ,eAAeR,EAAyB,CAC9C,GAAI,CAAC,KAAK,aACR,OAGF,IAAMC,EAAW,KAAK,wBAAwBD,EAAO,KAAK,QAAQ,EAC7DC,GAID,KAAK,gBAAkBwB,GAAW,KAAK,eAAe,KAAM,KAAK,aAAa,IAAI,GAAK,KAAK,gBAAgB,KAAK,aAAa,KAAMxB,CAAQ,GAC9I,KAAK,aAAa,KAAK,SAASD,EAAO,KAAK,aAAa,KAAK,IAAI,CAEtE,CAEQ,kBAAkB0B,EAAmBC,EAAuB,CAC9D,CAAC,KAAK,cAAgB,CAAC,KAAK,kBAK5B,CAACD,GAAY,CAACC,GAAW,KAAK,aAAa,KAAK,MAAM,MAAM,GAAKD,GAAY,KAAK,aAAa,KAAK,MAAM,IAAI,GAAKC,KACrH,KAAK,WAAW,KAAK,SAAU,KAAK,aAAa,KAAM,KAAK,eAAe,EAC3E,KAAK,aAAe,OACpB7B,GAAQ,KAAK,qBAAqB,EAClC,KAAK,sBAAsB,OAAS,EAExC,CAEQ,eAAeS,EAAqC,CAC1D,GAAI,CAAC,KAAK,gBACR,OAGF,IAAMN,EAAW,KAAK,wBAAwB,KAAK,gBAAiB,KAAK,QAAQ,EAE5EA,GAKD,KAAK,gBAAgBM,EAAc,KAAMN,CAAQ,IACnD,KAAK,aAAeM,EACpB,KAAK,aAAa,MAAQ,CACxB,YAAa,CACX,UAAWA,EAAc,KAAK,cAAgB,OAAY,GAAOA,EAAc,KAAK,YAAY,UAChG,cAAeA,EAAc,KAAK,cAAgB,OAAY,GAAOA,EAAc,KAAK,YAAY,aACtG,EACA,UAAW,EACb,EACA,KAAK,WAAW,KAAK,SAAUA,EAAc,KAAM,KAAK,eAAe,EAGvEA,EAAc,KAAK,YAAc,CAAC,EAClC,OAAO,iBAAiBA,EAAc,KAAK,YAAa,CACtD,cAAe,CACb,IAAK,IAAM,KAAK,cAAc,OAAO,YAAY,cACjD,IAAKqB,GAAK,CACJ,KAAK,cAAc,OAAS,KAAK,aAAa,MAAM,YAAY,gBAAkBA,IACpF,KAAK,aAAa,MAAM,YAAY,cAAgBA,EAChD,KAAK,aAAa,MAAM,WAC1B,KAAK,SAAS,UAAU,OAAO,uBAAwBA,CAAC,EAG9D,CACF,EACA,UAAW,CACT,IAAK,IAAM,KAAK,cAAc,OAAO,YAAY,UACjD,IAAKA,GAAK,CACJ,KAAK,cAAc,OAAS,KAAK,cAAc,OAAO,YAAY,YAAcA,IAClF,KAAK,aAAa,MAAM,YAAY,UAAYA,EAC5C,KAAK,aAAa,MAAM,WAC1B,KAAK,oBAAoBrB,EAAc,KAAMqB,CAAC,EAGpD,CACF,CACF,CAAC,EAID,KAAK,sBAAsB,KAAK,KAAK,eAAe,yBAAyBC,GAAK,CAEhF,GAAI,CAAC,KAAK,aACR,OAIF,IAAMC,EAAQD,EAAE,QAAU,EAAI,EAAIA,EAAE,MAAQ,EAAI,KAAK,eAAe,OAAO,MACrEE,EAAM,KAAK,eAAe,OAAO,MAAQ,EAAIF,EAAE,IAErD,GAAI,KAAK,aAAa,KAAK,MAAM,MAAM,GAAKC,GAAS,KAAK,aAAa,KAAK,MAAM,IAAI,GAAKC,IACzF,KAAK,kBAAkBD,EAAOC,CAAG,EAC7B,KAAK,iBAAiB,CAExB,IAAM9B,EAAW,KAAK,wBAAwB,KAAK,gBAAiB,KAAK,QAAQ,EAC7EA,GACF,KAAK,YAAYA,EAAU,EAAK,CAEpC,CAEJ,CAAC,CAAC,EAEN,CAEU,WAAW+B,EAAsBpB,EAAaZ,EAAyB,CAC3E,KAAK,cAAc,QACrB,KAAK,aAAa,MAAM,UAAY,GAChC,KAAK,aAAa,MAAM,YAAY,WACtC,KAAK,oBAAoBY,EAAM,EAAI,EAEjC,KAAK,aAAa,MAAM,YAAY,eACtCoB,EAAQ,UAAU,IAAI,sBAAsB,GAI5CpB,EAAK,OACPA,EAAK,MAAMZ,EAAOY,EAAK,IAAI,CAE/B,CAEQ,oBAAoBA,EAAaqB,EAA0B,CACjE,IAAMC,EAAQtB,EAAK,MACbuB,EAAe,KAAK,eAAe,OAAO,MAC1CnC,EAAQ,KAAK,0BAA0BkC,EAAM,MAAM,EAAI,EAAGA,EAAM,MAAM,EAAIC,EAAe,EAAGD,EAAM,IAAI,EAAGA,EAAM,IAAI,EAAIC,EAAe,EAAG,MAAS,GACxIF,EAAY,KAAK,qBAAuB,KAAK,sBACrD,KAAKjC,CAAK,CACpB,CAEU,WAAWgC,EAAsBpB,EAAaZ,EAAyB,CAC3E,KAAK,cAAc,QACrB,KAAK,aAAa,MAAM,UAAY,GAChC,KAAK,aAAa,MAAM,YAAY,WACtC,KAAK,oBAAoBY,EAAM,EAAK,EAElC,KAAK,aAAa,MAAM,YAAY,eACtCoB,EAAQ,UAAU,OAAO,sBAAsB,GAI/CpB,EAAK,OACPA,EAAK,MAAMZ,EAAOY,EAAK,IAAI,CAE/B,CAOQ,gBAAgBA,EAAaX,EAAwC,CAC3E,IAAMmC,EAAQxB,EAAK,MAAM,MAAM,EAAI,KAAK,eAAe,KAAOA,EAAK,MAAM,MAAM,EACzEyB,EAAQzB,EAAK,MAAM,IAAI,EAAI,KAAK,eAAe,KAAOA,EAAK,MAAM,IAAI,EACrE0B,EAAUrC,EAAS,EAAI,KAAK,eAAe,KAAOA,EAAS,EACjE,OAAQmC,GAASE,GAAWA,GAAWD,CACzC,CAMQ,wBAAwBrC,EAAmBgC,EAAuD,CACxG,IAAMO,EAAS,KAAK,oBAAoB,UAAUvC,EAAOgC,EAAS,KAAK,eAAe,KAAM,KAAK,eAAe,IAAI,EACpH,GAAKO,EAIL,MAAO,CAAE,EAAGA,EAAO,CAAC,EAAG,EAAGA,EAAO,CAAC,EAAI,KAAK,eAAe,OAAO,KAAM,CACzE,CAEQ,0BAA0BC,EAAYC,EAAYC,EAAYC,EAAYC,EAAyC,CACzH,MAAO,CAAE,GAAAJ,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,EAAI,KAAM,KAAK,eAAe,KAAM,GAAAC,CAAG,CAC9D,CACF,EA3XavD,GAANwD,EAAA,CAmBFC,EAAA,EAAAC,IACAD,EAAA,EAAAE,GACAF,EAAA,EAAAG,GACAH,EAAA,EAAAI,KAtBQ7D,IA6Xb,SAASoC,GAAW0B,EAAUC,EAAmB,CAC/C,OACED,EAAE,OAASC,EAAE,MACbD,EAAE,MAAM,MAAM,IAAMC,EAAE,MAAM,MAAM,GAClCD,EAAE,MAAM,MAAM,IAAMC,EAAE,MAAM,MAAM,GAClCD,EAAE,MAAM,IAAI,IAAMC,EAAE,MAAM,IAAI,GAC9BD,EAAE,MAAM,IAAI,IAAMC,EAAE,MAAM,IAAI,CAElC,CCpVO,IAAMC,GAAN,cAAkCC,EAAkC,CA0GzE,YACEC,EAAqC,CAAC,EACtC,CACA,MAAMA,CAAO,EAnGf,KAAiB,WAA6C,KAAK,UAAU,IAAIC,CAAmB,EAKpG,KAAO,QAAoBC,GAwB3B,KAAQ,gBAA2B,GAMnC,KAAQ,aAAwB,GAOhC,KAAQ,iBAA4B,GAOpC,KAAQ,oBAA+B,GAGvC,KAAQ,sBAAiE,KAAK,UAAU,IAAID,CAAmB,EAE/G,KAAiB,cAAgB,KAAK,UAAU,IAAIE,CAAe,EACnE,KAAgB,aAAe,KAAK,cAAc,MAClD,KAAiB,OAAS,KAAK,UAAU,IAAIA,CAAmD,EAChG,KAAgB,MAAQ,KAAK,OAAO,MACpC,KAAiB,mBAAqB,KAAK,UAAU,IAAIA,CAAe,EACxE,KAAgB,kBAAoB,KAAK,mBAAmB,MAC5D,KAAiB,eAAiB,KAAK,UAAU,IAAIA,CAAiB,EACtE,KAAgB,cAAgB,KAAK,eAAe,MACpD,KAAiB,QAAU,KAAK,UAAU,IAAIA,CAAe,EAC7D,KAAgB,OAAS,KAAK,QAAQ,MAEtC,KAAQ,SAAW,KAAK,UAAU,IAAIA,CAAe,EAErD,KAAQ,QAAU,KAAK,UAAU,IAAIA,CAAe,EAEpD,KAAQ,mBAAqB,KAAK,UAAU,IAAIA,CAAiB,EAEjE,KAAQ,kBAAoB,KAAK,UAAU,IAAIA,CAAiB,EAEhE,KAAQ,YAAc,KAAK,UAAU,IAAIA,CAAsB,EAE/D,KAAiB,oBAAsB,KAAK,UAAU,IAAIA,CAA+B,EACzF,KAAgB,mBAAqB,KAAK,oBAAoB,MAyB5D,KAAK,OAAO,EAEZ,KAAK,mBAAqB,KAAK,sBAAsB,eAAeC,EAAiB,EACrF,KAAK,sBAAsB,WAAWC,GAAoB,KAAK,kBAAkB,EACjF,KAAK,iBAAmB,KAAK,sBAAsB,eAAeC,EAAe,EACjF,KAAK,sBAAsB,WAAWC,GAAkB,KAAK,gBAAgB,EAC7E,KAAK,qBAAuB,KAAK,sBAAsB,eAAeC,EAAmB,EACzF,KAAK,sBAAsB,WAAWC,GAAsB,KAAK,oBAAoB,EACrF,KAAK,qBAAqB,qBAAqB,KAAK,sBAAsB,eAAeC,EAAe,CAAC,EAGzG,KAAK,UAAU,KAAK,cAAc,cAAc,IAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,EAC1E,KAAK,UAAU,KAAK,cAAc,qBAAsBC,GAAM,KAAK,QAAQA,GAAG,OAAS,EAAGA,GAAG,KAAQ,KAAK,KAAO,CAAE,CAAC,CAAC,EACrH,KAAK,UAAU,KAAK,cAAc,mBAAmB,IAAM,KAAK,aAAa,CAAC,CAAC,EAC/E,KAAK,UAAU,KAAK,cAAc,eAAe,IAAM,KAAK,MAAM,CAAC,CAAC,EACpE,KAAK,UAAU,KAAK,cAAc,8BAA8BC,GAAQ,KAAK,sBAAsBA,CAAI,CAAC,CAAC,EACzG,KAAK,UAAU,KAAK,cAAc,QAASC,GAAU,KAAK,kBAAkBA,CAAK,CAAC,CAAC,EACnF,KAAK,UAAUC,EAAW,QAAQ,KAAK,cAAc,aAAc,KAAK,aAAa,CAAC,EACtF,KAAK,UAAUA,EAAW,QAAQ,KAAK,cAAc,cAAe,KAAK,cAAc,CAAC,EACxF,KAAK,UAAUA,EAAW,QAAQ,KAAK,cAAc,WAAY,KAAK,kBAAkB,CAAC,EACzF,KAAK,UAAUA,EAAW,QAAQ,KAAK,cAAc,UAAW,KAAK,iBAAiB,CAAC,EAGvF,KAAK,UAAU,KAAK,eAAe,SAASH,GAAK,KAAK,aAAaA,EAAE,KAAMA,EAAE,IAAI,CAAC,CAAC,EAEnF,KAAK,UAAUI,EAAa,IAAM,CAChC,KAAK,uBAAyB,OAC9B,KAAK,SAAS,YAAY,YAAY,KAAK,OAAO,CACpD,CAAC,CAAC,CACJ,CAjIA,IAAW,WAAqC,CAAE,OAAO,KAAK,WAAW,KAAO,CAiEhF,IAAW,SAAwB,CAAE,OAAO,KAAK,SAAS,KAAO,CAEjE,IAAW,QAAuB,CAAE,OAAO,KAAK,QAAQ,KAAO,CAE/D,IAAW,YAA6B,CAAE,OAAO,KAAK,mBAAmB,KAAO,CAEhF,IAAW,WAA4B,CAAE,OAAO,KAAK,kBAAkB,KAAO,CAE9E,IAAW,YAAkC,CAAE,OAAO,KAAK,YAAY,KAAO,CAI9E,IAAW,YAA+C,CACxD,GAAI,CAAC,KAAK,eACR,OAEF,IAAMC,EAAa,KAAK,eAAe,WACvC,MAAO,CACL,IAAK,CACH,OAAQ,CAAE,GAAGA,EAAW,IAAI,MAAO,EACnC,KAAM,CAAE,GAAGA,EAAW,IAAI,IAAK,CACjC,EACA,OAAQ,CACN,OAAQ,CAAE,GAAGA,EAAW,OAAO,MAAO,EACtC,KAAM,CAAE,GAAGA,EAAW,OAAO,IAAK,EAClC,KAAM,CAAE,GAAGA,EAAW,OAAO,IAAK,CACpC,CACF,CACF,CA4CQ,kBAAkBH,EAA0B,CAClD,GAAK,KAAK,cACV,QAAWI,KAAOJ,EAAO,CACvB,IAAIK,EACAC,EACJ,OAAQF,EAAI,MAAO,CACjB,SACEC,EAAM,aACNC,EAAQ,KACR,MACF,SACED,EAAM,aACNC,EAAQ,KACR,MACF,SACED,EAAM,SACNC,EAAQ,KACR,MACF,QAEED,EAAM,OACNC,EAAQ,KAAOF,EAAI,KACvB,CACA,OAAQA,EAAI,KAAM,CAChB,OACE,IAAMG,EAAWC,EAAM,WAAWH,IAAQ,OACtC,KAAK,cAAc,OAAO,KAAKD,EAAI,KAAK,EACxC,KAAK,cAAc,OAAOC,CAAG,CAAC,EAClC,KAAK,YAAY,iBAAiB,QAAaC,CAAK,IAAIG,GAAYF,CAAQ,CAAC,QAAiB,EAC9F,MACF,OACE,GAAIF,IAAQ,OACV,KAAK,cAAc,aAAaK,GAAUA,EAAO,KAAKN,EAAI,KAAK,EAAIO,EAAS,QAAQ,GAAGP,EAAI,KAAK,CAAC,MAC5F,CACL,IAAMQ,EAAcP,EACpB,KAAK,cAAc,aAAaK,GAAUA,EAAOE,CAAW,EAAID,EAAS,QAAQ,GAAGP,EAAI,KAAK,CAAC,CAChG,CACA,MACF,OACE,KAAK,cAAc,aAAaA,EAAI,KAAK,EACzC,KACJ,CACF,CACF,CAOQ,oBAA2B,CACjC,GAAI,CAAC,KAAK,cAAe,OACzB,IAAMS,EAAcC,EAAI,kBAAkB,KAAK,cAAc,OAAO,WAAW,MAAQ,CAAC,EAClFC,EAAcD,EAAI,kBAAkB,KAAK,cAAc,OAAO,WAAW,MAAQ,CAAC,EAElFE,EAAkBH,EAAcE,EAAc,EAAI,EACxD,KAAK,YAAY,iBAAiB,aAAkBC,CAAe,GAAG,CACxE,CAEU,QAAe,CACvB,MAAM,OAAO,EAEb,KAAK,uBAAyB,MAChC,CAKA,IAAW,QAAkB,CAC3B,OAAO,KAAK,QAAQ,MACtB,CAKO,OAAc,CACf,KAAK,UACP,KAAK,SAAS,MAAM,CAAE,cAAe,EAAK,CAAC,CAE/C,CAEQ,oCAAoCC,EAAsB,CAC5DA,EACE,CAAC,KAAK,sBAAsB,OAAS,KAAK,iBAC5C,KAAK,sBAAsB,MAAQ,KAAK,sBAAsB,eAAeC,GAAsB,IAAI,GAGzG,KAAK,sBAAsB,MAAM,CAErC,CAKQ,qBAAqBC,EAAsB,CAC7C,KAAK,YAAY,gBAAgB,WACnC,KAAK,YAAY,iBAAiB,QAAa,EAEjD,KAAK,QAAS,UAAU,IAAI,OAAO,EACnC,KAAK,YAAY,EACjB,KAAK,SAAS,KAAK,CACrB,CAMO,MAAa,CAClB,OAAO,KAAK,UAAU,KAAK,CAC7B,CAKQ,qBAA4B,CAGlC,KAAK,SAAU,MAAQ,GACvB,KAAK,QAAQ,KAAK,OAAO,EAAG,KAAK,OAAO,CAAC,EACrC,KAAK,YAAY,gBAAgB,WACnC,KAAK,YAAY,iBAAiB,QAAa,EAEjD,KAAK,QAAS,UAAU,OAAO,OAAO,EACtC,KAAK,QAAQ,KAAK,CACpB,CAEQ,eAAsB,CAC5B,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,OAAO,oBAAsB,KAAK,mBAAoB,aAAe,CAAC,KAAK,eACrG,OAEF,IAAMC,EAAU,KAAK,OAAO,MAAQ,KAAK,OAAO,EAC1CC,EAAa,KAAK,OAAO,MAAM,IAAID,CAAO,EAChD,GAAI,CAACC,EACH,OAEF,IAAMC,EAAU,KAAK,IAAI,KAAK,OAAO,EAAG,KAAK,KAAO,CAAC,EAC/CC,EAAa,KAAK,eAAe,WAAW,IAAI,KAAK,OACrDC,EAAQH,EAAW,SAASC,CAAO,EACnCG,EAAY,KAAK,eAAe,WAAW,IAAI,KAAK,MAAQD,EAC5DE,EAAY,KAAK,OAAO,EAAI,KAAK,eAAe,WAAW,IAAI,KAAK,OACpEC,EAAaL,EAAU,KAAK,eAAe,WAAW,IAAI,KAAK,MAIrE,KAAK,SAAS,MAAM,KAAOK,EAAa,KACxC,KAAK,SAAS,MAAM,IAAMD,EAAY,KACtC,KAAK,SAAS,MAAM,MAAQD,EAAY,KACxC,KAAK,SAAS,MAAM,OAASF,EAAa,KAC1C,KAAK,SAAS,MAAM,WAAaA,EAAa,KAC9C,KAAK,SAAS,MAAM,OAAS,IAC/B,CAKQ,aAAoB,CAC1B,KAAK,UAAU,EAGf,KAAK,UAAUK,EAAsB,KAAK,QAAU,OAAS5B,GAA0B,CAGhF,KAAK,aAAa,GAGvB6B,GAAY7B,EAAO,KAAK,iBAAkB,CAC5C,CAAC,CAAC,EACF,IAAM8B,EAAuB9B,GAAgC+B,GAAiB/B,EAAO,KAAK,SAAW,KAAK,YAAa,KAAK,cAAc,EAC1I,KAAK,UAAU4B,EAAsB,KAAK,SAAW,QAASE,CAAmB,CAAC,EAClF,KAAK,UAAUF,EAAsB,KAAK,QAAU,QAASE,CAAmB,CAAC,EAGrEE,GAEV,KAAK,UAAUJ,EAAsB,KAAK,QAAU,YAAc5B,GAAsB,CAClFA,EAAM,SAAW,GACnBiC,GAAkBjC,EAAO,KAAK,SAAW,KAAK,cAAgB,KAAK,kBAAoB,KAAK,QAAQ,qBAAqB,CAE7H,CAAC,CAAC,EAEF,KAAK,UAAU4B,EAAsB,KAAK,QAAU,cAAgB5B,GAAsB,CACxFiC,GAAkBjC,EAAO,KAAK,SAAW,KAAK,cAAgB,KAAK,kBAAoB,KAAK,QAAQ,qBAAqB,CAC3H,CAAC,CAAC,EAMQkC,IAGV,KAAK,UAAUN,EAAsB,KAAK,QAAU,WAAa5B,GAAsB,CACjFA,EAAM,SAAW,GACnBmC,GAA6BnC,EAAO,KAAK,SAAW,KAAK,aAAc,CAE3E,CAAC,CAAC,CAEN,CAKQ,WAAkB,CACxB,KAAK,UAAU4B,EAAsB,KAAK,SAAW,QAAUT,GAAsB,KAAK,OAAOA,CAAE,EAAG,EAAI,CAAC,EAC3G,KAAK,UAAUS,EAAsB,KAAK,SAAW,UAAYT,GAAsB,KAAK,SAASA,CAAE,EAAG,EAAI,CAAC,EAC/G,KAAK,UAAUS,EAAsB,KAAK,SAAW,WAAaT,GAAsB,KAAK,UAAUA,CAAE,EAAG,EAAI,CAAC,EACjH,KAAK,UAAUS,EAAsB,KAAK,SAAW,mBAAoB,IAAM,CAM7E,KAAK,cAAc,EACnB,KAAK,mBAAoB,iBAAiB,EAC1C,KAAK,mBAAoB,0BAA0B,CACrD,CAAC,CAAC,EACF,KAAK,UAAUA,EAAsB,KAAK,SAAW,oBAAsB,GAAwB,KAAK,mBAAoB,kBAAkB,CAAC,CAAC,CAAC,EACjJ,KAAK,UAAUA,EAAsB,KAAK,SAAW,iBAAkB,IAAM,KAAK,mBAAoB,eAAe,CAAC,CAAC,EACvH,KAAK,UAAUA,EAAsB,KAAK,SAAW,QAAUT,GAAmB,KAAK,YAAYA,CAAE,EAAG,EAAI,CAAC,EAC7G,KAAK,UAAU,KAAK,SAAS,IAAM,KAAK,mBAAoB,0BAA0B,CAAC,CAAC,CAC1F,CAOO,KAAKiB,EAA2B,CACrC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,qCAAqC,EAQvD,GALKA,EAAO,aACV,KAAK,YAAY,MAAM,yEAAyE,EAI9F,KAAK,SAAS,cAAc,aAAe,KAAK,oBAAqB,CAEnE,KAAK,QAAQ,cAAc,cAAgB,KAAK,oBAAoB,SACtE,KAAK,oBAAoB,OAAS,KAAK,QAAQ,cAAc,aAE/D,MACF,CAEA,KAAK,UAAYA,EAAO,cACpB,KAAK,QAAQ,kBAAoB,KAAK,QAAQ,4BAA4B,WAC5E,KAAK,UAAY,KAAK,eAAe,WAAW,kBAIlD,KAAK,QAAU,KAAK,UAAU,cAAc,KAAK,EACjD,KAAK,QAAQ,IAAM,MACnB,KAAK,QAAQ,UAAU,IAAI,UAAU,EACrC,KAAK,QAAQ,UAAU,IAAI,OAAO,EAClC,KAAK,QAAQ,UAAU,OAAO,qBAAsB,KAAK,QAAQ,iBAAiB,EAClF,KAAK,UAAU,KAAK,eAAe,uBAAuB,oBAAqBnB,GAAS,KAAK,QAAS,UAAU,OAAO,qBAAsBA,CAAK,CAAC,CAAC,EACpJmB,EAAO,YAAY,KAAK,OAAO,EAI/B,IAAMC,EAAW,KAAK,UAAU,uBAAuB,EACvD,KAAK,iBAAmB,KAAK,UAAU,cAAc,KAAK,EAC1D,KAAK,iBAAiB,UAAU,IAAI,gBAAgB,EACpDA,EAAS,YAAY,KAAK,gBAAgB,EAE1C,KAAK,cAAgB,KAAK,UAAU,cAAc,KAAK,EACvD,KAAK,cAAc,UAAU,IAAI,cAAc,EAC/C,KAAK,UAAUT,EAAsB,KAAK,cAAe,YAAcT,GAAmB,KAAK,kBAAkBA,CAAE,CAAC,CAAC,EAGrH,KAAK,iBAAmB,KAAK,UAAU,cAAc,KAAK,EAC1D,KAAK,iBAAiB,UAAU,IAAI,eAAe,EACnD,KAAK,cAAc,YAAY,KAAK,gBAAgB,EACpDkB,EAAS,YAAY,KAAK,aAAa,EAEvC,IAAMC,EAAW,KAAK,SAAW,KAAK,UAAU,cAAc,UAAU,EACxE,KAAK,SAAS,UAAU,IAAI,uBAAuB,EACnD,KAAK,SAAS,aAAa,aAAsBC,GAAY,IAAI,CAAC,EACrDC,IAGX,KAAK,SAAS,aAAa,iBAAkB,OAAO,EAEtD,KAAK,SAAS,aAAa,cAAe,KAAK,EAC/C,KAAK,SAAS,aAAa,iBAAkB,KAAK,EAClD,KAAK,SAAS,aAAa,aAAc,OAAO,EAChD,KAAK,SAAS,SAAW,EACzB,KAAK,UAAU,KAAK,eAAe,uBAAuB,eAAgB,IAAMF,EAAS,SAAW,KAAK,eAAe,WAAW,YAAY,CAAC,EAChJ,KAAK,SAAS,SAAW,KAAK,eAAe,WAAW,aAIxD,KAAK,oBAAsB,KAAK,UAAU,KAAK,sBAAsB,eAAeG,GAClF,KAAK,SACLL,EAAO,cAAc,aAAe,OAEpC,KAAK,YAAe,OAAO,OAAW,IAAe,OAAO,SAAW,KACzE,CAAC,EACD,KAAK,sBAAsB,WAAWM,EAAqB,KAAK,mBAAmB,EAEnF,KAAK,UAAUd,EAAsB,KAAK,SAAU,QAAUT,GAAmB,KAAK,qBAAqBA,CAAE,CAAC,CAAC,EAC/G,KAAK,UAAUS,EAAsB,KAAK,SAAU,OAAQ,IAAM,KAAK,oBAAoB,CAAC,CAAC,EAC7F,KAAK,iBAAiB,YAAY,KAAK,QAAQ,EAE/C,KAAK,iBAAmB,KAAK,sBAAsB,eAAee,GAAiB,KAAK,UAAW,KAAK,gBAAgB,EACxH,KAAK,sBAAsB,WAAWC,GAAkB,KAAK,gBAAgB,EAE7E,KAAK,cAAgB,KAAK,sBAAsB,eAAeC,EAAY,EAC3E,KAAK,sBAAsB,WAAWC,GAAe,KAAK,aAAa,EAGvE,KAAK,UAAU,KAAK,cAAc,0BAA0B,IAAM,KAAK,mBAAmB,CAAC,CAAC,EAG5F,KAAK,UAAU,KAAK,cAAc,eAAe,IAAM,CACjD,KAAK,YAAY,gBAAgB,oBACnC,KAAK,mBAAmB,CAE5B,CAAC,CAAC,EAEF,KAAK,wBAA0B,KAAK,sBAAsB,eAAeC,EAAsB,EAC/F,KAAK,sBAAsB,WAAWC,GAAyB,KAAK,uBAAuB,EAE3F,KAAK,eAAiB,KAAK,UAAU,KAAK,sBAAsB,eAAeC,GAAe,KAAK,KAAM,KAAK,aAAa,CAAC,EAC5H,KAAK,sBAAsB,WAAWC,EAAgB,KAAK,cAAc,EACzE,KAAK,UAAU,KAAK,eAAe,yBAAyBpD,GAAK,KAAK,UAAU,KAAKA,CAAC,CAAC,CAAC,EACxF,KAAK,UAAU,KAAK,eAAe,mBAAmBA,GAAK,KAAK,oBAAoB,KAAK,CACvF,IAAK,CACH,OAAQ,CAAE,GAAGA,EAAE,IAAI,MAAO,EAC1B,KAAM,CAAE,GAAGA,EAAE,IAAI,IAAK,CACxB,EACA,OAAQ,CACN,OAAQ,CAAE,GAAGA,EAAE,OAAO,MAAO,EAC7B,KAAM,CAAE,GAAGA,EAAE,OAAO,IAAK,EACzB,KAAM,CAAE,GAAGA,EAAE,OAAO,IAAK,CAC3B,CACF,CAAC,CAAC,CAAC,EACH,KAAK,SAASA,GAAK,KAAK,eAAgB,OAAOA,EAAE,KAAMA,EAAE,IAAI,CAAC,EAE9D,KAAK,iBAAmB,KAAK,UAAU,cAAc,KAAK,EAC1D,KAAK,iBAAiB,UAAU,IAAI,kBAAkB,EACtD,KAAK,mBAAqB,KAAK,sBAAsB,eAAeqD,GAAmB,KAAK,SAAU,KAAK,gBAAgB,EAC3H,KAAK,iBAAiB,YAAY,KAAK,gBAAgB,EAEvD,KAAK,oBAAsB,KAAK,sBAAsB,eAAeC,EAAkB,EACvF,KAAK,sBAAsB,WAAWC,GAAqB,KAAK,mBAAmB,EAEnF,IAAMC,EAAY,KAAK,WAAW,MAAQ,KAAK,UAAU,KAAK,sBAAsB,eAAeC,GAAW,KAAK,aAAa,CAAC,EAGjI,KAAK,QAAQ,YAAYlB,CAAQ,EAEjC,GAAI,CACF,KAAK,YAAY,KAAK,KAAK,OAAO,CACpC,OAASvC,EAAG,CACV,KAAK,YAAY,MAAM,wCAAyCA,CAAC,CACnE,CACK,KAAK,eAAe,YAAY,GACnC,KAAK,eAAe,YAAY,KAAK,gBAAgB,CAAC,EAGxD,KAAK,UAAU,KAAK,aAAa,IAAM,CACrC,KAAK,eAAgB,iBAAiB,EACtC,KAAK,cAAc,CACrB,CAAC,CAAC,EACF,KAAK,UAAU,KAAK,SAAS,IAAM,CACjC,KAAK,eAAgB,aAAa,KAAK,KAAM,KAAK,IAAI,EACtD,KAAK,cAAc,CACrB,CAAC,CAAC,EACF,KAAK,UAAU,KAAK,OAAO,IAAM,KAAK,eAAgB,WAAW,CAAC,CAAC,EACnE,KAAK,UAAU,KAAK,QAAQ,IAAM,KAAK,eAAgB,YAAY,CAAC,CAAC,EAErE,KAAK,UAAY,KAAK,UAAU,KAAK,sBAAsB,eAAe0D,GAAU,KAAK,QAAS,KAAK,aAAa,CAAC,EACrH,KAAK,UAAU,KAAK,UAAU,qBAAqB1D,GAAK,CACtD,MAAM,YAAYA,EAAG,EAAK,EAC1B,KAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,CAC/B,CAAC,CAAC,EAEF,KAAK,kBAAoB,KAAK,UAAU,KAAK,sBAAsB,eAAe2D,GAChF,KAAK,QACL,KAAK,cACLH,CACF,CAAC,EACD,KAAK,sBAAsB,WAAWI,GAAmB,KAAK,iBAAiB,EAC/E,KAAK,cAAgB,KAAK,sBAAsB,eAAeC,EAAY,EAC3E,KAAK,sBAAsB,WAAWC,GAAe,KAAK,aAAa,EACvE,KAAK,UAAU,KAAK,kBAAkB,qBAAqB9D,GAAK,KAAK,YAAYA,EAAE,OAAQA,EAAE,mBAAmB,CAAC,CAAC,EAClH,KAAK,UAAU,KAAK,kBAAkB,kBAAkB,IAAM,KAAK,mBAAmB,KAAK,CAAC,CAAC,EAC7F,KAAK,UAAU,KAAK,kBAAkB,gBAAgBA,GAAK,KAAK,eAAgB,uBAAuBA,EAAE,MAAOA,EAAE,IAAKA,EAAE,gBAAgB,CAAC,CAAC,EAC3I,KAAK,UAAU,KAAK,kBAAkB,sBAAsB+D,GAAQ,CAIlE,KAAK,SAAU,MAAQA,EACvB,KAAK,SAAU,MAAM,EACrB,KAAK,SAAU,OAAO,CACxB,CAAC,CAAC,EACF,KAAK,UAAU5D,EAAW,IACxB,KAAK,UAAU,MACf,KAAK,cAAc,QACrB,EAAE,IAAM,CACN,KAAK,kBAAmB,QAAQ,EAChC,KAAK,WAAW,UAAU,CAC5B,CAAC,CAAC,EAEF,KAAK,UAAU,KAAK,sBAAsB,eAAe6D,GAA0B,KAAK,aAAa,CAAC,EACtG,KAAK,UAAUlC,EAAsB,KAAK,QAAS,YAAc9B,GAAkB,KAAK,kBAAmB,gBAAgBA,CAAC,CAAC,CAAC,EAG1H,KAAK,kBAAkB,sBAAwB,CAAC,KAAK,QAAQ,uBAC/D,KAAK,kBAAkB,QAAQ,EAC/B,KAAK,QAAQ,UAAU,yBAA4C,IAEnE,KAAK,kBAAkB,OAAO,EAC9B,KAAK,QAAQ,UAAU,4BAA+C,GAGpE,KAAK,QAAQ,mBAGf,KAAK,sBAAsB,MAAQ,KAAK,sBAAsB,eAAeoB,GAAsB,IAAI,GAEzG,KAAK,UAAU,KAAK,eAAe,uBAAuB,mBAAoBpB,GAAK,KAAK,oCAAoCA,CAAC,CAAC,CAAC,EAE/H,IAAMiE,EAAgB,KAAK,QAAQ,WAAW,eAAiB,GACzDC,EAAqB,KAAK,QAAQ,WAAW,MAC/CD,GAAiBC,IACnB,KAAK,uBAAyB,KAAK,UAAU,KAAK,sBAAsB,eAAeC,GAAuB,KAAK,iBAAkB,KAAK,aAAa,CAAC,GAE1J,KAAK,eAAe,uBAAuB,YAAahD,GAAS,CAC/D,IAAMiD,GAAcjD,GAAO,eAAiB,KAAS,CAAC,CAACA,GAAO,MAC1D,CAAC,KAAK,wBAA0BiD,GAAc,KAAK,kBAAoB,KAAK,gBAC9E,KAAK,uBAAyB,KAAK,UAAU,KAAK,sBAAsB,eAAeD,GAAuB,KAAK,iBAAkB,KAAK,aAAa,CAAC,EAE5J,CAAC,EAED,KAAK,iBAAiB,QAAQ,EAG9B,KAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,EAG7B,KAAK,YAAY,EAIjB,KAAK,cAAc,UAAU,CAC3B,QAAS,KAAK,QACd,cAAe,KAAK,cACpB,SAAU,KAAK,UACf,kBAAmBE,GAAU,KAAK,WAAW,kBAAkBA,CAAM,CACvE,EAAGC,GAAc,KAAK,UAAUA,CAAU,EAAG,IAAM,KAAK,MAAM,CAAC,CACjE,CAEQ,iBAA6B,CACnC,OAAO,KAAK,sBAAsB,eAAeC,GAAa,KAAM,KAAK,UAAY,KAAK,QAAU,KAAK,cAAgB,KAAK,iBAAmB,KAAK,iBAAmB,KAAK,SAAU,CAC1L,CAQO,QAAQC,EAAeC,EAAaC,EAAgB,GAAa,CACtE,KAAK,gBAAgB,YAAYF,EAAOC,EAAKC,CAAI,CACnD,CAKO,kBAAkBrD,EAAsC,CACzD,KAAK,mBAAmB,mBAAmBA,CAAE,EAC/C,KAAK,QAAS,UAAU,IAAI,eAAe,EAE3C,KAAK,QAAS,UAAU,OAAO,eAAe,CAElD,CAKQ,aAAoB,CACrB,KAAK,YAAY,sBACpB,KAAK,YAAY,oBAAsB,GACvC,KAAK,QAAQ,KAAK,OAAO,EAAG,KAAK,OAAO,CAAC,EAE7C,CAEO,YAAYsD,EAAcC,EAAqC,CAEhE,KAAK,UACP,KAAK,UAAU,YAAYD,CAAI,EAE/B,MAAM,YAAYA,EAAMC,CAAmB,EAE7C,KAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,CAC/B,CAEO,YAAYC,EAAyB,CAC1C,KAAK,YAAYA,GAAa,KAAK,KAAO,EAAE,CAC9C,CAEO,aAAoB,CACzB,KAAK,YAAY,CAAC,KAAK,eAAe,OAAO,KAAK,CACpD,CAEO,eAAeC,EAAqC,CACrDA,GAAuB,KAAK,UAC9B,KAAK,UAAU,aAAa,KAAK,OAAO,MAAO,EAAI,EAEnD,KAAK,YAAY,KAAK,eAAe,OAAO,MAAQ,KAAK,eAAe,OAAO,KAAK,CAExF,CAEO,aAAaC,EAAoB,CACtC,IAAMC,EAAeD,EAAO,KAAK,eAAe,OAAO,MACnDC,IAAiB,GACnB,KAAK,YAAYA,CAAY,CAEjC,CAEO,MAAMC,EAAoB,CAC/BC,GAAMD,EAAM,KAAK,SAAW,KAAK,YAAa,KAAK,cAAc,CACnE,CAEO,4BAA4BE,EAAoD,CACrF,KAAK,uBAAyBA,CAChC,CAEO,8BAA8BC,EAAwD,CAC3F,KAAK,kBAAkB,2BAA2BA,CAAuB,CAC3E,CAEO,qBAAqBC,EAA0C,CACpE,OAAO,KAAK,qBAAqB,qBAAqBA,CAAY,CACpE,CAEO,wBAAwBC,EAAyC,CACtE,GAAI,CAAC,KAAK,wBACR,MAAM,IAAI,MAAM,+BAA+B,EAEjD,IAAMC,EAAW,KAAK,wBAAwB,SAASD,CAAO,EAC9D,YAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,EACtBC,CACT,CAEO,0BAA0BA,EAAwB,CACvD,GAAI,CAAC,KAAK,wBACR,MAAM,IAAI,MAAM,+BAA+B,EAE7C,KAAK,wBAAwB,WAAWA,CAAQ,GAClD,KAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,CAEjC,CAEA,IAAW,SAAqB,CAC9B,OAAO,KAAK,OAAO,OACrB,CAEO,eAAeC,EAAgC,CACpD,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO,MAAQ,KAAK,OAAO,EAAIA,CAAa,CAChF,CAEO,mBAAmBC,EAAgE,CACxF,OAAO,KAAK,mBAAmB,mBAAmBA,CAAiB,CACrE,CAKO,cAAwB,CAC7B,OAAO,KAAK,kBAAoB,KAAK,kBAAkB,aAAe,EACxE,CAQO,OAAOC,EAAgBC,EAAaC,EAAsB,CAC/D,KAAK,kBAAmB,aAAaF,EAAQC,EAAKC,CAAM,CAC1D,CAMO,cAAuB,CAC5B,OAAO,KAAK,kBAAoB,KAAK,kBAAkB,cAAgB,EACzE,CAEO,sBAAiD,CACtD,GAAI,GAAC,KAAK,mBAAqB,CAAC,KAAK,kBAAkB,cAIvD,MAAO,CACL,MAAO,CACL,EAAG,KAAK,kBAAkB,eAAgB,CAAC,EAC3C,EAAG,KAAK,kBAAkB,eAAgB,CAAC,CAC7C,EACA,IAAK,CACH,EAAG,KAAK,kBAAkB,aAAc,CAAC,EACzC,EAAG,KAAK,kBAAkB,aAAc,CAAC,CAC3C,CACF,CACF,CAKO,gBAAuB,CAC5B,KAAK,mBAAmB,eAAe,CACzC,CAKO,WAAkB,CACvB,KAAK,mBAAmB,UAAU,CACpC,CAEO,YAAYpB,EAAeC,EAAmB,CACnD,KAAK,mBAAmB,YAAYD,EAAOC,CAAG,CAChD,CAOU,SAASvE,EAA2C,CAI5D,GAHA,KAAK,gBAAkB,GACvB,KAAK,aAAe,GAEhB,KAAK,wBAA0B,KAAK,uBAAuBA,CAAK,IAAM,GACxE,MAAO,GAIT,IAAM2F,EAA0B,KAAK,QAAQ,OAAS,KAAK,QAAQ,iBAAmB3F,EAAM,OAE5F,GAAI,CAAC2F,GAA2B,CAAC,KAAK,mBAAoB,QAAQ3F,CAAK,EACrE,OAAI,KAAK,QAAQ,mBAAqB,KAAK,OAAO,QAAU,KAAK,OAAO,OACtE,KAAK,eAAe,EAAI,EAEnB,GAGL,CAAC2F,IAA4B3F,EAAM,MAAQ,QAAUA,EAAM,MAAQ,cACrE,KAAK,oBAAsB,IAG7B,IAAM4F,EAAS,KAAK,iBAAiB,gBAAgB5F,CAAK,EAI1D,GAFA,KAAK,kBAAkBA,CAAK,EAExB4F,EAAO,OAAS,GAAgCA,EAAO,OAAS,EAA4B,CAC9F,IAAMC,EAAc,KAAK,KAAO,EAChC,YAAK,YAAYD,EAAO,OAAS,EAA6B,CAACC,EAAcA,CAAW,EACxF7F,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACf,EACT,CAuBA,GArBI4F,EAAO,OAAS,GAClB,KAAK,UAAU,EAGb,KAAK,mBAAmB,KAAK,QAAS5F,CAAK,IAI3C4F,EAAO,SAET5F,EAAM,eAAe,EACrBA,EAAM,gBAAgB,GAGpB,CAAC4F,EAAO,MAOR,CAAC,KAAK,iBAAiB,UAAY,CAAC,KAAK,iBAAiB,mBAAqB5F,EAAM,KAAO,CAACA,EAAM,SAAW,CAACA,EAAM,QAAU,CAACA,EAAM,SAAWA,EAAM,IAAI,SAAW,GACpKA,EAAM,IAAI,WAAW,CAAC,GAAK,IAAMA,EAAM,IAAI,WAAW,CAAC,GAAK,GAC9D,MAAO,GAIX,GAAI,KAAK,oBACP,YAAK,oBAAsB,GACpB,IAML4F,EAAO,MAAQ,KAAUA,EAAO,MAAQ,QAC1C,KAAK,SAAU,MAAQ,IAGzB,IAAME,EAAkB,KAAK,iBAAiB,mBAAqBC,GAAwB/F,CAAK,EAShG,GARA,KAAK,OAAO,KAAK,CAAE,IAAK4F,EAAO,IAAK,SAAU5F,CAAM,CAAC,EACrD,KAAK,YAAY,EACjB,KAAK,YAAY,iBAAiB4F,EAAO,IAAK,CAACE,CAAe,EAM1D,CAAC,KAAK,eAAe,WAAW,kBAAoB9F,EAAM,QAAUA,EAAM,QAC5E,OAAAA,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACf,GAGT,KAAK,gBAAkB,EACzB,CAEQ,mBAAmBgG,EAAmB7E,EAA4B,CACxE,IAAM8E,EACHD,EAAQ,OAAS,CAAC,KAAK,QAAQ,iBAAmB7E,EAAG,QAAU,CAACA,EAAG,SAAW,CAACA,EAAG,SAClF6E,EAAQ,WAAa7E,EAAG,QAAUA,EAAG,SAAW,CAACA,EAAG,SACpD6E,EAAQ,WAAa7E,EAAG,iBAAiB,UAAU,EAEtD,OAAIA,EAAG,OAAS,WACP8E,EAIFA,IAAkB,CAAC9E,EAAG,SAAWA,EAAG,QAAU,GACvD,CAEU,OAAOA,EAAyB,CAGxC,GAFA,KAAK,aAAe,GAEhB,KAAK,wBAA0B,KAAK,uBAAuBA,CAAE,IAAM,GACrE,OAGG4E,GAAwB5E,CAAE,GAC7B,KAAK,MAAM,EAIb,IAAMyE,EAAS,KAAK,iBAAiB,cAAczE,CAAE,EACrD,GAAIyE,GAAQ,IAAK,CACf,IAAME,EAAkB,KAAK,iBAAiB,mBAAqBC,GAAwB5E,CAAE,EAC7F,KAAK,YAAY,iBAAiByE,EAAO,IAAK,CAACE,CAAe,CAChE,CAEA,KAAK,kBAAkB3E,CAAE,EACzB,KAAK,iBAAmB,EAC1B,CAQU,UAAUA,EAA4B,CAC9C,IAAI+E,EAQJ,GANA,KAAK,iBAAmB,GAEpB,KAAK,iBAIL,KAAK,wBAA0B,KAAK,uBAAuB/E,CAAE,IAAM,GACrE,MAAO,GAGT,GAAIA,EAAG,SACL+E,EAAM/E,EAAG,iBACAA,EAAG,QAAU,MAAQA,EAAG,QAAU,OAC3C+E,EAAM/E,EAAG,gBACAA,EAAG,QAAU,GAAKA,EAAG,WAAa,EAC3C+E,EAAM/E,EAAG,UAET,OAAO,GAGT,MAAI,CAAC+E,IACF/E,EAAG,QAAUA,EAAG,SAAWA,EAAG,UAAY,CAAC,KAAK,mBAAmB,KAAK,QAASA,CAAE,EAE7E,IAGT+E,EAAM,OAAO,aAAaA,CAAG,EAE7B,KAAK,OAAO,KAAK,CAAE,IAAAA,EAAK,SAAU/E,CAAG,CAAC,EACtC,KAAK,YAAY,EACjB,KAAK,YAAY,iBAAiB+E,EAAK,EAAI,EAE3C,KAAK,iBAAmB,GAIxB,KAAK,oBAAsB,GAEpB,GACT,CAQU,YAAY/E,EAAyB,CAI7C,GAAIA,EAAG,MAAQA,EAAG,YAAc,eAAiB,CAACA,EAAG,UAAY,CAAC,KAAK,eAAiB,CAAC,KAAK,eAAe,WAAW,iBAAkB,CACxI,GAAI,KAAK,iBACP,MAAO,GAKT,KAAK,oBAAsB,GAE3B,IAAM0C,EAAO1C,EAAG,KAChB,YAAK,YAAY,iBAAiB0C,EAAM,EAAI,EACrC,EACT,CAEA,MAAO,EACT,CAQO,OAAOsC,EAAWC,EAAiB,CACxC,GAAID,IAAM,KAAK,MAAQC,IAAM,KAAK,KAAM,CAElC,KAAK,kBAAoB,CAAC,KAAK,iBAAiB,cAClD,KAAK,iBAAiB,QAAQ,EAEhC,MACF,CAEA,MAAM,OAAOD,EAAGC,CAAC,CACnB,CAEQ,aAAaD,EAAWC,EAAiB,CAC/C,KAAK,kBAAkB,QAAQ,CACjC,CAKO,OAAc,CACnB,KAAK,OAAO,gBAAgB,EAC5B,KAAK,OAAO,MAAM,IAAI,EAAG,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,MAAQ,KAAK,OAAO,CAAC,CAAE,EAClF,KAAK,OAAO,MAAM,OAAS,EAC3B,KAAK,OAAO,MAAQ,EACpB,KAAK,OAAO,MAAQ,EACpB,KAAK,OAAO,EAAI,EAChB,QAASC,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC7B,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,aAAaC,CAAiB,CAAC,EAIpE,KAAK,UAAU,KAAK,CAAE,SAAU,KAAK,OAAO,KAAM,CAAC,EACnD,KAAK,QAAQ,EAAG,KAAK,KAAO,CAAC,CAC/B,CAUO,OAAc,CAKnB,KAAK,QAAQ,KAAO,KAAK,KACzB,KAAK,QAAQ,KAAO,KAAK,KACzB,IAAMrB,EAAwB,KAAK,uBAEnC,KAAK,OAAO,EACZ,MAAM,MAAM,EACZ,KAAK,eAAe,MAAM,EAC1B,KAAK,mBAAmB,MAAM,EAC9B,KAAK,mBAAmB,MAAM,EAG9B,KAAK,uBAAyBA,EAG9B,KAAK,QAAQ,EAAG,KAAK,KAAO,EAAG,EAAI,CACrC,CAEO,mBAA0B,CAC/B,KAAK,gBAAgB,kBAAkB,CACzC,CAEQ,cAAqB,CACvB,KAAK,SAAS,UAAU,SAAS,OAAO,EAC1C,KAAK,YAAY,iBAAiB,QAAa,EAE/C,KAAK,YAAY,iBAAiB,QAAa,CAEnD,CAEQ,sBAAsBlF,EAAsC,CAClE,GAAK,KAAK,eAIV,OAAQA,EAAM,CACZ,OACE,IAAMwG,EAAc,KAAK,eAAe,WAAW,IAAI,OAAO,MAAM,QAAQ,CAAC,EACvEC,EAAe,KAAK,eAAe,WAAW,IAAI,OAAO,OAAO,QAAQ,CAAC,EAC/E,KAAK,YAAY,iBAAiB,UAAeA,CAAY,IAAID,CAAW,GAAG,EAC/E,MACF,OACE,IAAM9E,EAAY,KAAK,eAAe,WAAW,IAAI,KAAK,MAAM,QAAQ,CAAC,EACnEF,EAAa,KAAK,eAAe,WAAW,IAAI,KAAK,OAAO,QAAQ,CAAC,EAC3E,KAAK,YAAY,iBAAiB,UAAeA,CAAU,IAAIE,CAAS,GAAG,EAC3E,KACJ,CACF,CAEF,EAMA,SAASsE,GAAwB5E,EAA4B,CAC3D,OAAOA,EAAG,UAAY,IACpBA,EAAG,UAAY,IACfA,EAAG,UAAY,IACfA,EAAG,UAAY,IACfA,EAAG,UAAY,IACfA,EAAG,UAAY,IACfA,EAAG,UAAY,KACfA,EAAG,MAAQ,MACf,CChoCO,IAAMsF,GAAN,KAA0C,CAA1C,cACL,KAAU,QAA0B,CAAC,EAE9B,SAAgB,CACrB,QAAS,EAAI,KAAK,QAAQ,OAAS,EAAG,GAAK,EAAG,IAC5C,KAAK,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAErC,CAEO,UAAUC,EAAoBC,EAAgC,CACnE,IAAMC,EAA4B,CAChC,SAAAD,EACA,QAASA,EAAS,QAClB,WAAY,EACd,EACA,KAAK,QAAQ,KAAKC,CAAW,EAC7BD,EAAS,QAAU,IAAM,KAAK,qBAAqBC,CAAW,EAC9DD,EAAS,SAASD,CAAe,CACnC,CAEQ,qBAAqBE,EAAiC,CAC5D,GAAIA,EAAY,WAEd,OAEF,IAAIC,EAAQ,GACZ,QAASC,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACvC,GAAI,KAAK,QAAQA,CAAC,IAAMF,EAAa,CACnCC,EAAQC,EACR,KACF,CAEF,GAAID,IAAU,GACZ,MAAM,IAAI,MAAM,qDAAqD,EAEvED,EAAY,WAAa,GACzBA,EAAY,QAAQ,MAAMA,EAAY,QAAQ,EAC9C,KAAK,QAAQ,OAAOC,EAAO,CAAC,CAC9B,CACF,EC3CO,IAAME,GAAN,KAAkD,CACvD,YAAoBC,EAAoB,CAApB,WAAAA,CAAsB,CAE1C,IAAW,WAAqB,CAAE,OAAO,KAAK,MAAM,SAAW,CAC/D,IAAW,QAAiB,CAAE,OAAO,KAAK,MAAM,MAAQ,CACjD,QAAQC,EAAWC,EAAmD,CAC3E,GAAI,EAAAD,EAAI,GAAKA,GAAK,KAAK,MAAM,QAI7B,OAAIC,GACF,KAAK,MAAM,SAASD,EAAGC,CAA4B,EAC5CA,GAEF,KAAK,MAAM,SAASD,EAAG,IAAIE,CAAU,CAC9C,CACO,kBAAkBC,EAAqBC,EAAsBC,EAA4B,CAC9F,OAAO,KAAK,MAAM,kBAAkBF,EAAWC,EAAaC,CAAS,CACvE,CACF,EClBO,IAAMC,GAAN,KAA0C,CAC/C,YACUC,EACQC,EAChB,CAFQ,aAAAD,EACQ,UAAAC,CACd,CAEG,KAAKC,EAAgC,CAC1C,YAAK,QAAUA,EACR,IACT,CAEA,IAAW,SAAkB,CAAE,OAAO,KAAK,QAAQ,CAAG,CACtD,IAAW,SAAkB,CAAE,OAAO,KAAK,QAAQ,CAAG,CACtD,IAAW,WAAoB,CAAE,OAAO,KAAK,QAAQ,KAAO,CAC5D,IAAW,OAAgB,CAAE,OAAO,KAAK,QAAQ,KAAO,CACxD,IAAW,QAAiB,CAAE,OAAO,KAAK,QAAQ,MAAM,MAAQ,CACzD,QAAQC,EAAuC,CACpD,IAAMC,EAAO,KAAK,QAAQ,MAAM,IAAID,CAAC,EACrC,GAAKC,EAGL,OAAO,IAAIC,GAAkBD,CAAI,CACnC,CACO,aAA8B,CAAE,OAAO,IAAIE,CAAY,CAChE,ECvBO,IAAMC,GAAN,cAAiCC,CAA0C,CAOhF,YAAoBC,EAAsB,CACxC,MAAM,EADY,WAAAA,EAHpB,KAAiB,gBAAkB,KAAK,UAAU,IAAIC,CAAqB,EAC3E,KAAgB,eAAiB,KAAK,gBAAgB,MAIpD,KAAK,QAAU,IAAIC,GAAc,KAAK,MAAM,QAAQ,OAAQ,QAAQ,EACpE,KAAK,WAAa,IAAIA,GAAc,KAAK,MAAM,QAAQ,IAAK,WAAW,EACvE,KAAK,UAAU,KAAK,MAAM,QAAQ,iBAAiB,IAAM,KAAK,gBAAgB,KAAK,KAAK,MAAM,CAAC,CAAC,CAClG,CACA,IAAW,QAAqB,CAC9B,GAAI,KAAK,MAAM,QAAQ,SAAW,KAAK,MAAM,QAAQ,OAAU,OAAO,KAAK,OAC3E,GAAI,KAAK,MAAM,QAAQ,SAAW,KAAK,MAAM,QAAQ,IAAO,OAAO,KAAK,UACxE,MAAM,IAAI,MAAM,+CAA+C,CACjE,CACA,IAAW,QAAqB,CAC9B,OAAO,KAAK,QAAQ,KAAK,KAAK,MAAM,QAAQ,MAAM,CACpD,CACA,IAAW,WAAwB,CACjC,OAAO,KAAK,WAAW,KAAK,KAAK,MAAM,QAAQ,GAAG,CACpD,CACF,EC1BO,IAAMC,GAAN,KAAmC,CACxC,YAAoBC,EAAsB,CAAtB,WAAAA,CAAwB,CAErC,mBAAmBC,EAAyBC,EAAsF,CACvI,OAAO,KAAK,MAAM,mBAAmBD,EAAKE,GAAoBD,EAASC,EAAO,QAAQ,CAAC,CAAC,CAC1F,CACO,cAAcF,EAAyBC,EAAsF,CAClI,OAAO,KAAK,mBAAmBD,EAAIC,CAAQ,CAC7C,CACO,mBAAmBD,EAAyBC,EAAmG,CACpJ,OAAO,KAAK,MAAM,mBAAmBD,EAAI,CAACG,EAAcD,IAAoBD,EAASE,EAAMD,EAAO,QAAQ,CAAC,CAAC,CAC9G,CACO,cAAcF,EAAyBC,EAAmG,CAC/I,OAAO,KAAK,mBAAmBD,EAAIC,CAAQ,CAC7C,CACO,mBAAmBD,EAAyBI,EAAwD,CACzG,OAAO,KAAK,MAAM,mBAAmBJ,EAAII,CAAO,CAClD,CACO,cAAcJ,EAAyBI,EAAwD,CACpG,OAAO,KAAK,mBAAmBJ,EAAII,CAAO,CAC5C,CACO,mBAAmBC,EAAeJ,EAAqE,CAC5G,OAAO,KAAK,MAAM,mBAAmBI,EAAOJ,CAAQ,CACtD,CACO,cAAcI,EAAeJ,EAAqE,CACvG,OAAO,KAAK,mBAAmBI,EAAOJ,CAAQ,CAChD,CACO,mBAAmBD,EAAyBC,EAAqE,CACtH,OAAO,KAAK,MAAM,mBAAmBD,EAAIC,CAAQ,CACnD,CACF,EC/BO,IAAMK,GAAN,KAA6C,CAClD,YAAoBC,EAAsB,CAAtB,WAAAA,CAAwB,CAErC,SAASC,EAAyC,CACvD,KAAK,MAAM,eAAe,SAASA,CAAQ,CAC7C,CAEA,IAAW,UAAqB,CAC9B,OAAO,KAAK,MAAM,eAAe,QACnC,CAEA,IAAW,eAAwB,CACjC,OAAO,KAAK,MAAM,eAAe,aACnC,CAEA,IAAW,cAAcC,EAAiB,CACxC,KAAK,MAAM,eAAe,cAAgBA,CAC5C,CACF,ECNA,IAAMC,GAA2B,CAAC,OAAQ,MAAM,EAE5CC,GAAS,EAEAC,GAAN,cAAuBC,CAAmC,CAO/D,YAAYC,EAAuD,CACjE,MAAM,EAEN,KAAK,MAAQ,KAAK,UAAU,IAAIC,GAAaD,CAAO,CAAC,EACrD,KAAK,cAAgB,KAAK,UAAU,IAAIE,EAAc,EAEtD,KAAK,eAAiB,CAAE,GAAI,KAAK,MAAM,OAAQ,EAC/C,IAAMC,EAAUC,GACP,KAAK,MAAM,QAAQA,CAAQ,EAE9BC,EAAS,CAACD,EAAkBE,IAAqB,CACrD,KAAK,sBAAsBF,CAAQ,EACnC,KAAK,MAAM,QAAQA,CAAQ,EAAIE,CACjC,EAEA,QAAWF,KAAY,KAAK,MAAM,QAAS,CACzC,IAAMG,EAAO,CACX,IAAKJ,EAAO,KAAK,KAAMC,CAAQ,EAC/B,IAAKC,EAAO,KAAK,KAAMD,CAAQ,CACjC,EACA,OAAO,eAAe,KAAK,eAAgBA,EAAUG,CAAI,CAC3D,CACF,CAEQ,sBAAsBH,EAAwB,CAIpD,GAAIR,GAAyB,SAASQ,CAAQ,EAC5C,MAAM,IAAI,MAAM,WAAWA,CAAQ,sCAAsC,CAE7E,CAEQ,mBAA0B,CAChC,GAAI,CAAC,KAAK,MAAM,eAAe,WAAW,iBACxC,MAAM,IAAI,MAAM,sEAAsE,CAE1F,CAEA,IAAW,QAAuB,CAAE,OAAO,KAAK,MAAM,MAAQ,CAC9D,IAAW,UAA2B,CAAE,OAAO,KAAK,MAAM,QAAU,CACpE,IAAW,cAA6B,CAAE,OAAO,KAAK,MAAM,YAAc,CAC1E,IAAW,QAAyB,CAAE,OAAO,KAAK,MAAM,MAAQ,CAChE,IAAW,OAA0D,CAAE,OAAO,KAAK,MAAM,KAAO,CAChG,IAAW,YAA2B,CAAE,OAAO,KAAK,MAAM,UAAY,CACtE,IAAW,UAAmD,CAAE,OAAO,KAAK,MAAM,QAAU,CAC5F,IAAW,UAAmD,CAAE,OAAO,KAAK,MAAM,QAAU,CAC5F,IAAW,UAA2B,CAAE,OAAO,KAAK,MAAM,QAAU,CACpE,IAAW,mBAAkC,CAAE,OAAO,KAAK,MAAM,iBAAmB,CACpF,IAAW,eAAgC,CAAE,OAAO,KAAK,MAAM,aAAe,CAC9E,IAAW,eAA8B,CAAE,OAAO,KAAK,MAAM,aAAe,CAC5E,IAAW,oBAAgD,CAAE,OAAO,KAAK,MAAM,kBAAoB,CAEnG,IAAW,SAAmC,CAAE,OAAO,KAAK,MAAM,OAAS,CAC3E,IAAW,eAAyC,CAAE,OAAO,KAAK,MAAM,aAAe,CACvF,IAAW,QAAkB,CAC3B,OAAO,KAAK,UAAY,IAAII,GAAU,KAAK,KAAK,CAClD,CACA,IAAW,SAA4B,CACrC,YAAK,kBAAkB,EAChB,IAAIC,GAAW,KAAK,KAAK,CAClC,CACA,IAAW,UAA4C,CAAE,OAAO,KAAK,MAAM,QAAU,CACrF,IAAW,MAAe,CAAE,OAAO,KAAK,MAAM,IAAM,CACpD,IAAW,MAAe,CAAE,OAAO,KAAK,MAAM,IAAM,CACpD,IAAW,QAA8B,CACvC,OAAO,KAAK,UAAY,KAAK,UAAU,IAAIC,GAAmB,KAAK,KAAK,CAAC,CAC3E,CACA,IAAW,SAAkC,CAC3C,OAAO,KAAK,MAAM,OACpB,CACA,IAAW,OAAgB,CACzB,IAAMC,EAAI,KAAK,MAAM,YAAY,gBAC7BC,EAA+D,OACnE,OAAQ,KAAK,MAAM,kBAAkB,eAAgB,CACnD,IAAK,MAAOA,EAAoB,MAAO,MACvC,IAAK,QAASA,EAAoB,QAAS,MAC3C,IAAK,OAAQA,EAAoB,OAAQ,MACzC,IAAK,MAAOA,EAAoB,MAAO,KACzC,CACA,MAAO,CACL,0BAA2BD,EAAE,sBAC7B,sBAAuBA,EAAE,kBACzB,mBAAoBA,EAAE,mBACtB,WAAY,KAAK,MAAM,YAAY,MAAM,WACzC,kBAAmBC,EACnB,WAAYD,EAAE,OACd,sBAAuBA,EAAE,kBACzB,cAAeA,EAAE,UACjB,WAAY,CAAC,KAAK,MAAM,YAAY,eACpC,uBAAwBA,EAAE,mBAC1B,eAAgBA,EAAE,eAClB,eAAgBA,EAAE,UACpB,CACF,CACA,IAAW,YAA4C,CACrD,OAAO,KAAK,MAAM,UACpB,CACA,IAAW,SAAsC,CAC/C,OAAO,KAAK,cACd,CACA,IAAW,QAAQX,EAA2B,CAC5C,QAAWI,KAAYJ,EACrB,KAAK,eAAeI,CAAQ,EAAIJ,EAAQI,CAAQ,CAEpD,CACO,MAAa,CAClB,KAAK,MAAM,KAAK,CAClB,CACO,OAAc,CACnB,KAAK,MAAM,MAAM,CACnB,CACO,MAAMS,EAAcC,EAAwB,GAAY,CAC7D,KAAK,MAAM,MAAMD,EAAMC,CAAY,CACrC,CACO,OAAOC,EAAiBC,EAAoB,CACjD,KAAK,gBAAgBD,EAASC,CAAI,EAClC,KAAK,MAAM,OAAOD,EAASC,CAAI,CACjC,CACO,KAAKC,EAA2B,CACrC,KAAK,MAAM,KAAKA,CAAM,CACxB,CACO,4BAA4BC,EAAgE,CACjG,KAAK,MAAM,4BAA4BA,CAAqB,CAC9D,CACO,8BAA8BC,EAA+D,CAClG,KAAK,MAAM,8BAA8BA,CAAuB,CAClE,CACO,qBAAqBC,EAA0C,CACpE,OAAO,KAAK,MAAM,qBAAqBA,CAAY,CACrD,CACO,wBAAwBC,EAAuD,CACpF,OAAO,KAAK,MAAM,wBAAwBA,CAAO,CACnD,CACO,0BAA0BC,EAAwB,CACvD,KAAK,MAAM,0BAA0BA,CAAQ,CAC/C,CACO,eAAeC,EAAwB,EAAY,CACxD,YAAK,gBAAgBA,CAAa,EAC3B,KAAK,MAAM,eAAeA,CAAa,CAChD,CACO,mBAAmBC,EAAgE,CACxF,YAAK,wBAAwBA,EAAkB,GAAK,EAAGA,EAAkB,OAAS,EAAGA,EAAkB,QAAU,CAAC,EAC3G,KAAK,MAAM,mBAAmBA,CAAiB,CACxD,CACO,cAAwB,CAC7B,OAAO,KAAK,MAAM,aAAa,CACjC,CACO,OAAOC,EAAgBC,EAAaC,EAAsB,CAC/D,KAAK,gBAAgBF,EAAQC,EAAKC,CAAM,EACxC,KAAK,MAAM,OAAOF,EAAQC,EAAKC,CAAM,CACvC,CACO,cAAuB,CAC5B,OAAO,KAAK,MAAM,aAAa,CACjC,CACO,sBAAiD,CACtD,OAAO,KAAK,MAAM,qBAAqB,CACzC,CACO,gBAAuB,CAC5B,KAAK,MAAM,eAAe,CAC5B,CACO,WAAkB,CACvB,KAAK,MAAM,UAAU,CACvB,CACO,YAAYC,EAAeC,EAAmB,CACnD,KAAK,gBAAgBD,EAAOC,CAAG,EAC/B,KAAK,MAAM,YAAYD,EAAOC,CAAG,CACnC,CACO,SAAgB,CACrB,MAAM,QAAQ,CAChB,CACO,YAAYC,EAAsB,CACvC,KAAK,gBAAgBA,CAAM,EAC3B,KAAK,MAAM,YAAYA,CAAM,CAC/B,CACO,YAAYC,EAAyB,CAC1C,KAAK,gBAAgBA,CAAS,EAC9B,KAAK,MAAM,YAAYA,CAAS,CAClC,CACO,aAAoB,CACzB,KAAK,MAAM,YAAY,CACzB,CACO,gBAAuB,CAC5B,KAAK,MAAM,eAAe,CAC5B,CACO,aAAaC,EAAoB,CACtC,KAAK,gBAAgBA,CAAI,EACzB,KAAK,MAAM,aAAaA,CAAI,CAC9B,CACO,OAAc,CACnB,KAAK,MAAM,MAAM,CACnB,CACO,MAAMnB,EAA2BoB,EAA6B,CACnE,KAAK,MAAM,MAAMpB,EAAMoB,CAAQ,CACjC,CACO,QAAQpB,EAA2BoB,EAA6B,CACrE,KAAK,MAAM,MAAMpB,CAAI,EACrB,KAAK,MAAM,MAAM;AAAA,EAAQoB,CAAQ,CACnC,CACO,MAAMpB,EAAoB,CAC/B,KAAK,MAAM,MAAMA,CAAI,CACvB,CACO,QAAQe,EAAeC,EAAmB,CAC/C,KAAK,gBAAgBD,EAAOC,CAAG,EAC/B,KAAK,MAAM,QAAQD,EAAOC,CAAG,CAC/B,CACO,OAAc,CACnB,KAAK,MAAM,MAAM,CACnB,CACO,mBAA0B,CAC/B,KAAK,MAAM,kBAAkB,CAC/B,CACO,UAAUK,EAA6B,CAC5C,KAAK,cAAc,UAAU,KAAMA,CAAK,CAC1C,CACA,WAAkB,SAA+B,CAE/C,MAAO,CACL,IAAI,aAAsB,CAAE,OAAeC,GAAY,IAAI,CAAG,EAC9D,IAAI,YAAY7B,EAAe,CAAU6B,GAAY,IAAI7B,CAAK,CAAG,EACjE,IAAI,eAAwB,CAAE,OAAe8B,GAAc,IAAI,CAAG,EAClE,IAAI,cAAc9B,EAAe,CAAU8B,GAAc,IAAI9B,CAAK,CAAG,CACvE,CACF,CAEQ,mBAAmB+B,EAAwB,CACjD,IAAKxC,MAAUwC,EACb,GAAIxC,KAAW,KAAY,MAAMA,EAAM,GAAKA,GAAS,IAAM,EACzD,MAAM,IAAI,MAAM,gCAAgC,CAGtD,CAEQ,2BAA2BwC,EAAwB,CACzD,IAAKxC,MAAUwC,EACb,GAAIxC,KAAWA,KAAW,KAAY,MAAMA,EAAM,GAAKA,GAAS,IAAM,GAAKA,GAAS,GAClF,MAAM,IAAI,MAAM,yCAAyC,CAG/D,CACF", -- "names": ["promptLabelInternal", "promptLabel", "value", "tooMuchOutputInternal", "tooMuchOutput", "prepareTextForTerminal", "text", "bracketTextForPaste", "bracketedPasteMode", "copyHandler", "ev", "selectionService", "handlePasteEvent", "textarea", "coreService", "optionsService", "paste", "moveTextAreaUnderMouseCursor", "screenElement", "pos", "left", "top", "rightClickHandler", "shouldSelectWord", "stringFromCodePoint", "codePoint", "utf32ToString", "data", "start", "end", "result", "i", "codepoint", "StringToUtf32", "input", "target", "length", "size", "startPos", "second", "code", "Utf8ToUtf32", "byte1", "byte2", "byte3", "byte4", "discardInterim", "cp", "pos", "tmp", "type", "missing", "fourStop", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "serviceRegistry", "getServiceDependencies", "ctor", "createDecorator", "id", "decorator", "target", "key", "index", "storeServiceDependency", "IBufferService", "createDecorator", "IMouseStateService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "OscLinkProvider", "_bufferService", "_optionsService", "_oscLinkService", "CellData", "y", "callback", "line", "result", "linkHandler", "cell", "lineLength", "currentLinkId", "currentStart", "finishLink", "x", "text", "endX", "range", "ignoreLink", "parsed", "e", "defaultActivate", "startX", "linkId", "startY", "finalStartX", "endY", "finalEndX", "previousLine", "previousLineLength", "previousStartX", "currentLine", "currentLineLength", "nextLine", "nextLineLength", "nextEndX", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "IOscLinkService", "uri", "newWindow", "ICharSizeService", "createDecorator", "ICoreBrowserService", "IMouseCoordsService", "IMouseService", "IRenderService", "ISelectionService", "ICharacterJoinerService", "IThemeService", "ILinkProviderService", "IKeyboardService", "toDisposable", "fn", "dispose", "arg", "d", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "disposableTimeout", "handler", "timeout", "store", "timer", "disposable", "toDisposable", "TimeoutTimer", "runner", "MicrotaskTimer", "IntervalTimer", "interval", "context", "handle", "getWindow", "e", "candidateNode", "candidateEvent", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "addStandardDisposableListener", "useCapture", "eventType", "getDomNodePagePosition", "domNode", "bb", "win", "AnimationFrameQueueItem", "_runner", "priority", "a", "b", "animationFrameState", "getAnimationFrameState", "targetWindow", "state", "animationFrameRunner", "scheduleAtNextAnimationFrame", "runner", "item", "WindowIntervalTimer", "IntervalTimer", "interval", "FastDomNode", "domNode", "_width", "width", "numberAsPixels", "_height", "height", "_top", "top", "_left", "left", "_bottom", "bottom", "_right", "right", "className", "shouldHaveIt", "position", "layerHint", "contain", "name", "value", "Platform_exports", "__export", "getSafariVersion", "getZoomFactor", "isChrome", "isChromeOS", "isFirefox", "isLegacyEdge", "isLinux", "isMac", "isNode", "isSafari", "isWindows", "userAgent", "platform", "_targetWindow", "majorVersion", "sameOriginWindowChainCache", "getParentWindowIfSameOrigin", "w", "location", "parentLocation", "IframeUtils", "targetWindow", "windowChainCache", "parent", "childWindow", "ancestorWindow", "top", "left", "windowChain", "windowChainEl", "windowInChain", "boundingRect", "StandardMouseEvent", "iframeOffsets", "StandardWheelEvent", "e", "deltaX", "deltaY", "shouldFactorDPR", "isChrome", "chromeVersionMatch", "e1", "e2", "devicePixelRatio", "ev", "isFirefox", "isMac", "isSafari", "isWindows", "GlobalPointerMoveMonitor", "DisposableStore", "invokeStopCallback", "onStopCallback", "initialElement", "pointerId", "initialButtons", "pointerMoveCallback", "eventSource", "toDisposable", "getWindow", "addDisposableListener", "eventType", "e", "Widget", "Disposable", "domNode", "listener", "addDisposableListener", "eventType", "e", "StandardMouseEvent", "getWindow", "ScrollbarArrow", "Widget", "opts", "arrowSize", "GlobalPointerMoveMonitor", "addStandardDisposableListener", "eventType", "e", "WindowIntervalTimer", "TimeoutTimer", "scheduleRepeater", "getWindow", "pointerMoveData", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "fn", "listeners", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "ScrollState", "_ScrollState", "_forceIntegerValues", "width", "scrollWidth", "scrollLeft", "height", "scrollHeight", "scrollTop", "other", "update", "useRawScrollPositions", "previous", "inSmoothScrolling", "widthChanged", "scrollWidthChanged", "scrollLeftChanged", "heightChanged", "scrollHeightChanged", "scrollTopChanged", "Scrollable", "Disposable", "options", "Emitter", "smoothScrollDuration", "scrollPosition", "dimensions", "newState", "reuseAnimation", "validTarget", "newSmoothScrolling", "SmoothScrollingOperation", "oldState", "SmoothScrollingUpdate", "isDone", "createEaseOutCubic", "from", "to", "delta", "completion", "easeOutCubic", "createComposed", "a", "b", "cut", "_SmoothScrollingOperation", "startTime", "duration", "viewportSize", "stop1", "stop2", "state", "now", "newScrollLeft", "newScrollTop", "easeInCubic", "t", "ScrollbarVisibilityController", "Disposable", "visibility", "visibleClassName", "invisibleClassName", "TimeoutTimer", "rawShouldBeVisible", "shouldBeVisible", "isNeeded", "domNode", "withFadeAway", "POINTER_DRAG_RESET_DISTANCE", "AbstractScrollbar", "Widget", "opts", "ScrollbarVisibilityController", "GlobalPointerMoveMonitor", "FastDomNode", "addDisposableListener", "eventType", "arrow", "ScrollbarArrow", "top", "left", "width", "height", "e", "visibleSize", "elementScrollSize", "elementScrollPosition", "domTop", "sliderStart", "sliderStop", "pointerPos", "offsetX", "offsetY", "domNodePosition", "getDomNodePagePosition", "offset", "initialPointerPosition", "initialPointerOrthogonalPosition", "initialScrollbarState", "pointerMoveData", "pointerOrthogonalPosition", "pointerOrthogonalDelta", "isWindows", "pointerDelta", "_desiredScrollPosition", "desiredScrollPosition", "scrollbarSize", "ScrollbarState", "_ScrollbarState", "arrowSize", "scrollbarSize", "oppositeScrollbarSize", "visibleSize", "scrollSize", "scrollPosition", "iVisibleSize", "iScrollSize", "iScrollPosition", "iArrowSize", "computedAvailableSize", "computedRepresentableSize", "computedIsNeeded", "computedSliderSize", "computedSliderRatio", "computedSliderPosition", "r", "offset", "desiredSliderPosition", "correctedOffset", "desiredScrollPosition", "delta", "HorizontalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "e", "offsetX", "offsetY", "size", "target", "VerticalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "hasArrows", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "offsetX", "offsetY", "size", "target", "delta", "currentPosition", "showArrows", "display", "arrow", "arrowSize", "MouseWheelClassifierItem", "timestamp", "deltaX", "deltaY", "_MouseWheelClassifier", "remainingInfluence", "score", "iteration", "index", "influence", "e", "isChrome", "targetWindow", "getWindow", "pageZoomFactor", "getZoomFactor", "previousItem", "item", "absDeltaX", "absDeltaY", "absPreviousDeltaX", "absPreviousDeltaY", "minDeltaX", "minDeltaY", "maxDeltaX", "maxDeltaY", "value", "MouseWheelClassifier", "SmoothScrollableElement", "Widget", "element", "options", "scrollable", "Emitter", "resolvedScrollable", "ownsScrollable", "Scrollable", "callback", "scheduleAtNextAnimationFrame", "resolveOptions", "scrollbarHost", "mouseWheelEvent", "VerticalScrollbar", "HorizontalScrollbar", "FastDomNode", "TimeoutTimer", "dispose", "dimensions", "update", "newClassName", "isMac", "newOptions", "browserEvent", "StandardWheelEvent", "shouldListen", "onMouseWheel", "addDisposableListener", "eventType", "classifier", "didScroll", "shiftConvert", "futureScrollPosition", "desiredScrollPosition", "deltaScrollTop", "desiredScrollTop", "deltaScrollLeft", "desiredScrollLeft", "consumeMouseWheel", "scrollState", "enableTop", "enableLeft", "leftClassName", "topClassName", "topLeftClassName", "opts", "result", "Viewport", "Disposable", "element", "screenElement", "_bufferService", "coreBrowserService", "_coreService", "mouseStateService", "themeService", "_optionsService", "_renderService", "Emitter", "scrollable", "Scrollable", "cb", "scheduleAtNextAnimationFrame", "SmoothScrollableElement", "type", "EventUtils", "toDisposable", "e", "disp", "pos", "line", "disableSmoothScroll", "showScrollbar", "showArrows", "verticalScrollbarSize", "ydisp", "newRow", "diff", "translationY", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "ICoreService", "IMouseStateService", "IThemeService", "IOptionsService", "IRenderService", "BufferDecorationRenderer", "Disposable", "_screenElement", "_bufferService", "_coreBrowserService", "_decorationService", "_renderService", "decoration", "toDisposable", "element", "x", "line", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "IDecorationService", "IRenderService", "ColorZoneStore", "decoration", "z", "padding", "zone", "line", "position", "drawHeight", "drawWidth", "drawX", "OverviewRulerRenderer", "Disposable", "_viewportElement", "_screenElement", "_bufferService", "_decorationService", "_renderService", "_optionsService", "_themeService", "_coreBrowserService", "ColorZoneStore", "toDisposable", "ctx", "scrollbar", "outerWidth", "innerWidth", "pixelsPerLine", "nonFullHeight", "cssCanvasHeight", "deviceCanvasHeight", "decoration", "zones", "zone", "updateCanvasDimensions", "updateAnchor", "__decorateClass", "__decorateParam", "IBufferService", "IDecorationService", "IRenderService", "IOptionsService", "IThemeService", "ICoreBrowserService", "CompositionHelper", "_textarea", "_compositionView", "_bufferService", "_optionsService", "_coreService", "_renderService", "start", "end", "ev", "waitForPropagation", "currentCompositionPosition", "currentCompositionSuffix", "input", "value", "valueEnd", "oldValue", "newValue", "diff", "dontRecurse", "cursorX", "cellHeight", "cursorTop", "cursorLeft", "maxWidth", "compositionViewBounds", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "ICoreService", "IRenderService", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "g", "b", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "JoinedCellData", "AttributeData", "firstCell", "chars", "width", "value", "CharacterJoinerService", "_bufferService", "CellData", "handler", "joiner", "joinerId", "i", "row", "line", "ranges", "lineStr", "trimmedLength", "rangeStartColumn", "currentStringIndex", "rangeStartStringIndex", "rangeAttrFG", "rangeAttrBG", "x", "joinedRanges", "startIndex", "endIndex", "lineData", "startCol", "text", "allJoinedRanges", "error", "joinerRanges", "j", "currentRangeIndex", "currentRangeStarted", "currentRange", "length", "newRange", "inRange", "range", "__decorateClass", "__decorateParam", "IBufferService", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isBoxOrBlockGlyph", "codepoint", "treatGlyphAsBackgroundColor", "codepoint", "isPowerlineGlyph", "isBoxOrBlockGlyph", "createRenderDimensions", "createDimension", "DomRendererRowFactory", "_document", "_characterJoinerService", "_optionsService", "_coreBrowserService", "_coreService", "_decorationService", "_themeService", "CellData", "start", "end", "columnSelectMode", "lineData", "row", "isCursorRow", "cursorStyle", "cursorInactiveStyle", "cursorX", "cursorBlink", "blinkOn", "cellWidth", "widthCache", "linkStart", "linkEnd", "rowInfo", "elements", "joinedRanges", "colors", "lineLength", "charElement", "cellAmount", "text", "i", "oldBg", "oldFg", "oldExt", "oldLinkHover", "oldSpacing", "oldIsInSelection", "spacing", "skipJoinedCheckUntilX", "classes", "hasHover", "x", "width", "isJoined", "isValidJoinRange", "lastCharX", "cell", "range", "firstSelectionState", "JoinedCellData", "isInSelection", "isCursorCell", "isLinkHover", "isDecorated", "d", "chars", "AttributeData", "fg", "fgColorMode", "bg", "bgColorMode", "isInverse", "temp", "temp2", "bgOverride", "fgOverride", "isTop", "resolvedBg", "channels", "color", "element", "treatGlyphAsBackgroundColor", "cache", "adjustedColor", "ratio", "style", "y", "__decorateClass", "__decorateParam", "ICharacterJoinerService", "IOptionsService", "ICoreBrowserService", "ICoreService", "IDecorationService", "IThemeService", "WidthCache", "canvasFactory", "WidthCacheFontVariantCanvas", "font", "fontSize", "weight", "weightBold", "c", "bold", "italic", "cp", "width", "key", "variant", "throwIfFalsy", "fontFamily", "fontWeight", "fontStyle", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "nextTerminalId", "DomRenderer", "Disposable", "_terminal", "_document", "_element", "_screenElement", "_viewportElement", "_helperContainer", "_linkifier2", "instantiationService", "_charSizeService", "_optionsService", "_bufferService", "_coreService", "_coreBrowserService", "_themeService", "createSelectionRenderModel", "Emitter", "createRenderDimensions", "e", "DomRendererRowFactory", "CursorBlinkStateManager", "addDisposableListener", "toDisposable", "TextBlinkStateManager", "WidthCache", "dpr", "element", "styles", "colors", "color", "blinkAnimationUnderlineId", "blinkAnimationBarId", "blinkAnimationBlockId", "i", "c", "spacing", "cols", "rows", "row", "isVisible", "start", "end", "columnSelectMode", "oldViewportStart", "oldViewportEnd", "newViewportStart", "newViewportEnd", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "documentFragment", "isXFlipped", "startCol", "endCol", "middleRowsCount", "finalEndCol", "renderStartRow", "renderEndRow", "cursorViewportRow", "colStart", "colEnd", "rowCount", "left", "width", "buffer", "cursorAbsoluteY", "cursorX", "cursorBlink", "cursorStyle", "cursorInactiveStyle", "rowInfo", "y", "rowElement", "lineData", "x", "x2", "y2", "enabled", "maxY", "bufferline", "hasBlinkingCells", "__decorateClass", "__decorateParam", "IInstantiationService", "ICharSizeService", "IOptionsService", "IBufferService", "ICoreService", "ICoreBrowserService", "IThemeService", "_rowContainer", "CharSizeService", "Disposable", "document", "parentElement", "_optionsService", "Emitter", "TextMetricsMeasureStrategy", "DomMeasureStrategy", "result", "__decorateClass", "__decorateParam", "IOptionsService", "BaseMeasureStategy", "Disposable", "width", "height", "DomMeasureStrategy", "_document", "_parentElement", "_optionsService", "TextMetricsMeasureStrategy", "a", "metrics", "CoreBrowserService", "Disposable", "_textarea", "_window", "mainDocument", "Emitter", "ScreenDprMonitor", "w", "EventUtils", "addDisposableListener", "value", "_parentWindow", "MutableDisposable", "toDisposable", "parentWindow", "LinkProviderService", "Disposable", "toDisposable", "linkProvider", "providerIndex", "getCoordsRelativeToElement", "window", "event", "element", "rect", "elementStyle", "leftPadding", "topPadding", "getCoords", "colCount", "rowCount", "hasValidCharSize", "cssCellWidth", "cssCellHeight", "isSelection", "coords", "MouseCoordsService", "_charSizeService", "_renderService", "event", "element", "colCount", "rowCount", "isSelection", "getCoords", "getWindow", "coords", "getCoordsRelativeToElement", "__decorateClass", "__decorateParam", "ICharSizeService", "IRenderService", "mainWindow", "tail", "array", "n", "memoize", "_target", "key", "descriptor", "fnKey", "fn", "memoizeKey", "descriptorAny", "args", "_LinkedListNode", "element", "LinkedListNode", "LinkedList", "atTheEnd", "newNode", "oldLast", "oldFirst", "didRemove", "node", "anchor", "EventType", "_Gesture", "Disposable", "targetWindow", "addDisposableListener", "e", "remove", "toDisposable", "timestamp", "i", "len", "touch", "evt", "activeTouchCount", "data", "holdTime", "finalX", "finalY", "deltaT", "deltaX", "deltaY", "dispatchTo", "t", "type", "initialTarget", "event", "currentTime", "setTapCount", "ignoreTarget", "targets", "target", "depth", "now", "a", "b", "t1", "vX", "dirX", "x", "vY", "dirY", "y", "scheduleAtNextAnimationFrame", "deltaPosX", "deltaPosY", "stopped", "d", "__decorateClass", "Gesture", "MouseService", "_renderService", "_mouseCoordsService", "_mouseStateService", "_coreService", "_bufferService", "_optionsService", "_selectionService", "_logService", "_coreBrowserService", "target", "register", "focus", "element", "document", "requestedEvents", "ctx", "eventListeners", "ev", "AltMouseCursorController", "events", "toDisposable", "addDisposableListener", "Gesture", "EventType", "e", "pos", "but", "action", "deltaY", "stripAltFromReport", "sequence", "cellHeight", "lines", "i", "amount", "dpr", "targetWheelEventPixels", "report", "e1", "e2", "pixels", "__decorateClass", "__decorateParam", "IRenderService", "IMouseCoordsService", "IMouseStateService", "ICoreService", "IBufferService", "IOptionsService", "ISelectionService", "ILogService", "ICoreBrowserService", "_element", "_document", "_isActive", "MutableDisposable", "store", "DisposableStore", "syncFromModifier", "targetWindow", "altHeld", "RenderDebouncer", "_renderCallback", "_coreBrowserService", "callback", "rowStart", "rowEnd", "rowCount", "start", "end", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "DebouncedIdleTask", "RenderService", "Disposable", "_rowCount", "screenElement", "_optionsService", "_logService", "_charSizeService", "_coreService", "decorationService", "bufferService", "_coreBrowserService", "themeService", "MutableDisposable", "Emitter", "DebouncedIdleTask", "RenderDebouncer", "start", "end", "SynchronizedOutputHandler", "toDisposable", "w", "observer", "e", "entry", "sync", "isRedrawOnly", "buffered", "cols", "rows", "renderer", "callback", "columnSelectMode", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "ICharSizeService", "ICoreService", "IDecorationService", "IBufferService", "ICoreBrowserService", "IThemeService", "_onTimeout", "result", "moveToCellSequence", "targetX", "targetY", "bufferService", "applicationCursor", "startX", "startY", "resetStartingRow", "moveToRequestedRow", "moveToRequestedCol", "direction", "repeat", "sequence", "rowDifference", "cellsToMove", "colsFromRowEnd", "colsFromRowBeginning", "currX", "bufferLine", "wrappedRowsForRow", "startRow", "endRow", "rowsToMove", "wrappedRowsCount", "verticalDirection", "horizontalDirection", "wrappedRows", "i", "currentRow", "rowCount", "line", "lineWraps", "startCol", "endCol", "forward", "currentCol", "bufferStr", "mod", "count", "str", "rpt", "SelectionModel", "_bufferService", "startPlusLength", "start", "end", "amount", "getRangeLength", "range", "bufferCols", "NON_BREAKING_SPACE_CHAR", "ALL_NON_BREAKING_SPACE_REGEX", "SelectionService", "Disposable", "_element", "_screenElement", "_linkifier", "_bufferService", "_coreService", "_mouseCoordsService", "_optionsService", "_mouseStateService", "_renderService", "_coreBrowserService", "MutableDisposable", "CellData", "Emitter", "event", "amount", "e", "SelectionModel", "toDisposable", "start", "end", "buffer", "result", "startCol", "endCol", "i", "lineText", "startRowEndCol", "bufferLine", "line", "ALL_NON_BREAKING_SPACE_REGEX", "isWindows", "isLinuxMouseSelection", "isLinux", "coords", "x", "y", "allowWhitespaceOnlySelection", "range", "getRangeLength", "offset", "getCoordsRelativeToElement", "terminalHeight", "isMac", "hadSelection", "previousSelectionEnd", "timeElapsed", "coordinates", "sequence", "moveToCellSequence", "hasSelection", "charIndex", "length", "col", "row", "ev", "followWrappedLinesAbove", "followWrappedLinesBelow", "startIndex", "endIndex", "charOffset", "leftWideCharCount", "rightWideCharCount", "leftLongCharOffset", "rightLongCharOffset", "previousBufferLine", "previousLineWordPosition", "nextBufferLine", "nextLineWordPosition", "wordPosition", "endRow", "cell", "wrappedRange", "__decorateClass", "__decorateParam", "IBufferService", "ICoreService", "IMouseCoordsService", "IOptionsService", "IMouseStateService", "IRenderService", "ICoreBrowserService", "TwoKeyMap", "first", "second", "value", "ColorContrastCache", "TwoKeyMap", "bg", "fg", "value", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "DEFAULT_FOREGROUND", "css", "DEFAULT_BACKGROUND", "DEFAULT_CURSOR", "DEFAULT_CURSOR_ACCENT", "DEFAULT_SELECTION", "DEFAULT_OVERVIEW_RULER_BORDER", "ThemeService", "Disposable", "_optionsService", "ColorContrastCache", "Emitter", "color", "DEFAULT_ANSI_COLORS", "theme", "colors", "parseColor", "NULL_COLOR", "colorCount", "i", "slot", "callback", "__decorateClass", "__decorateParam", "IOptionsService", "cssString", "fallback", "KEYCODE_KEY_MAPPINGS", "evaluateKeyboardEvent", "ev", "applicationCursorMode", "isMac", "macOptionIsMeta", "result", "modifiers", "key", "keyCode", "keyString", "KittyKeyboard", "ev", "suffix", "mods", "macOptionAsAlt", "numpadCode", "modifierCode", "funcCode", "digit", "code", "letter", "modifiers", "eventType", "reportEventTypes", "needsEventType", "seq", "number", "keyCode", "flags", "isFunc", "isMod", "reportAlternateKeys", "shiftedKey", "textCode", "result", "csiLetter", "ss3Letter", "tildeCode", "specialKey", "legacyByte", "Win32InputMode", "ev", "vk", "controlChar", "codePoint", "state", "isKeyDown", "sc", "uc", "kd", "cs", "KeyboardService", "_coreService", "_optionsService", "Win32InputMode", "KittyKeyboard", "event", "kittyFlags", "isMac", "evaluateKeyboardEvent", "__decorateClass", "__decorateParam", "ICoreService", "IOptionsService", "ServiceCollection", "entries", "id", "service", "instance", "result", "callback", "key", "value", "InstantiationService", "IInstantiationService", "ctor", "args", "serviceDependencies", "getServiceDependencies", "a", "b", "serviceArgs", "dependency", "firstServiceArgPos", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "optionalParams", "i", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "CircularList", "Disposable", "_maxLength", "Emitter", "newMaxLength", "newArray", "i", "newLength", "index", "value", "start", "deleteCount", "items", "countToTrim", "count", "offset", "expandListBy", "StringBuilder", "chunk", "LimitedStringBuilder", "_limit", "DEFAULT_ATTR_DATA", "AttributeData", "$startIndex", "$workCell", "CellData", "$translateToStringBuilder", "StringBuilder", "BufferLine", "_BufferLine", "_stringCache", "cols", "fillCellData", "isWrapped", "cell", "i", "index", "content", "cp", "stringFromCodePoint", "value", "codePoint", "width", "attrs", "pos", "n", "start", "end", "respectProtect", "uint32Cells", "data", "keys", "key", "extKeys", "line", "newLine", "src", "srcCol", "destCol", "length", "applyInReverse", "srcData", "trimRight", "startCol", "endCol", "outColumns", "isCanonicalRequest", "stringCacheEntry", "chars", "result", "cacheEntry", "createIfNeeded", "cachedEntry", "srcStart", "BufferLineStringCache", "Disposable", "MutableDisposable", "toDisposable", "entry", "timeoutMs", "disposableTimeout", "elapsed", "reflowLargerGetLinesToRemove", "lines", "oldCols", "newCols", "bufferAbsoluteY", "nullCell", "reflowCursorLine", "toRemove", "y", "i", "nextLine", "wrappedLines", "destLineIndex", "destCol", "getWrappedLineTrimmedLength", "srcLineIndex", "srcCol", "srcTrimmedTineLength", "srcRemainingCells", "destRemainingCells", "cellsToCopy", "countToRemove", "reflowLargerCreateNewLayout", "layout", "nextToRemoveIndex", "nextToRemoveStart", "countRemovedSoFar", "reflowLargerApplyNewLayout", "newLayout", "newLayoutLines", "reflowSmallerGetNewLineLengths", "newLineLengths", "cellsNeeded", "srcLine", "cellsAvailable", "oldTrimmedLength", "endsWithWide", "lineLength", "cols", "endsInNull", "followingLineStartsWithWide", "_Marker", "line", "Emitter", "dispose", "disposable", "Marker", "CHARSETS", "DEFAULT_CHARSET", "MAX_BUFFER_SIZE", "Buffer", "Disposable", "_hasScrollback", "_optionsService", "_bufferService", "_logService", "DEFAULT_ATTR_DATA", "DEFAULT_CHARSET", "CellData", "CircularList", "IdleTaskQueue", "toDisposable", "BufferLineStringCache", "attr", "ExtendedAttrs", "isWrapped", "BufferLine", "relativeY", "rows", "correctBufferLength", "fillAttr", "i", "newCols", "newRows", "nullCell", "dirtyMemoryLines", "newMaxLength", "addToY", "y", "amountToTrim", "maxY", "normalRun", "counted", "windowsPty", "reflowCursorLine", "toRemove", "reflowLargerGetLinesToRemove", "newLayoutResult", "reflowLargerCreateNewLayout", "reflowLargerApplyNewLayout", "countRemoved", "viewportAdjustments", "toInsert", "countToInsert", "nextLine", "wrappedLines", "absoluteY", "lastLineLength", "destLineLengths", "reflowSmallerGetNewLineLengths", "linesToAdd", "trimmedLines", "newLines", "newLine", "destLineIndex", "destCol", "srcLineIndex", "srcCol", "cellsToCopy", "wrappedLinesIndex", "getWrappedLineTrimmedLength", "insertEvents", "originalLines", "originalLinesLength", "originalLineIndex", "nextToInsertIndex", "nextToInsert", "countInsertedSoFar", "nextI", "insertCountEmitted", "lineIndex", "trimRight", "startCol", "endCol", "line", "first", "last", "x", "marker", "Marker", "amount", "event", "BufferSet", "Disposable", "_optionsService", "_bufferService", "_logService", "MutableDisposable", "Emitter", "Buffer", "fillAttr", "newCols", "newRows", "i", "BufferService", "Disposable", "optionsService", "logService", "Emitter", "BufferSet", "e", "cols", "rows", "colsChanged", "rowsChanged", "eraseAttr", "isWrapped", "buffer", "newLine", "topRow", "bottomRow", "willBufferBeTrimmed", "scrollRegionHeight", "disp", "suppressScrollEvent", "oldYdisp", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "DEFAULT_OPTIONS", "isMac", "FONT_WEIGHT_OPTIONS", "OptionsService", "Disposable", "options", "Emitter", "defaultOptions", "key", "newValue", "e", "toDisposable", "listener", "eventKey", "keys", "getter", "propName", "setter", "value", "desc", "isCursorStyle", "DEFAULT_MODES", "DEFAULT_DEC_PRIVATE_MODES", "DEFAULT_KITTY_KEYBOARD_STATE", "CoreService", "Disposable", "_bufferService", "_logService", "_optionsService", "Emitter", "data", "wasUserInput", "buffer", "e", "__decorateClass", "__decorateParam", "IBufferService", "ILogService", "IOptionsService", "DEFAULT_PROTOCOLS", "e", "eventCode", "e", "isSGR", "code", "S", "DEFAULT_ENCODINGS", "params", "final", "MouseStateService", "Disposable", "Emitter", "name", "DEFAULT_PROTOCOLS", "protocol", "encoding", "customWheelEventHandler", "ev", "UnicodeService", "_UnicodeService", "Emitter", "value", "state", "width", "shouldJoin", "version", "provider", "num", "s", "result", "precedingInfo", "length", "i", "code", "second", "currentInfo", "chWidth", "codepoint", "preceding", "BMP_COMBINING", "HIGH_COMBINING", "table", "bisearch", "ucs", "data", "min", "max", "mid", "UnicodeV6", "r", "num", "codepoint", "preceding", "width", "shouldJoin", "oldWidth", "UnicodeService", "CharsetService", "g", "charset", "updateWindowsModeWrappedState", "bufferService", "lastChar", "nextLine", "Params", "_Params", "maxLength", "maxSubParamsLength", "values", "params", "i", "value", "k", "newParams", "res", "start", "end", "idx", "result", "length", "store", "cur", "EMPTY_HANDLERS", "OscParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "code", "success", "promiseResult", "handlerResult", "fallThrough", "_OscHandler", "_handler", "LimitedStringBuilder", "ret", "res", "OscHandler", "EMPTY_HANDLERS", "DcsParser", "ident", "handler", "handlerList", "handlerIndex", "j", "params", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "EMPTY_PARAMS", "Params", "_DcsHandler", "_handler", "LimitedStringBuilder", "ret", "res", "DcsHandler", "EMPTY_HANDLERS", "ApcParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "_ApcHandler", "_handler", "LimitedStringBuilder", "ret", "res", "ApcHandler", "TransitionTable", "length", "action", "next", "code", "state", "codes", "i", "NON_ASCII_PRINTABLE", "VT500_TRANSITION_TABLE", "table", "blueprint", "unused", "r", "start", "end", "PRINTABLES", "EXECUTABLES", "states", "EscapeSequenceParser", "Disposable", "_transitions", "Params", "data", "ident", "params", "toDisposable", "OscParser", "DcsParser", "ApcParser", "id", "finalRange", "res", "intermediate", "finalCode", "handler", "handlerList", "handlerIndex", "flag", "callback", "handlers", "handlerPos", "transition", "chunkPos", "promiseResult", "handlerResult", "k", "ch", "csiDone", "j", "c", "l4", "handlersEsc", "jj", "RGB_REX", "HASH_REX", "parseColor", "data", "low", "m", "base", "adv", "result", "i", "c", "pad", "bits", "s", "s2", "toRgbString", "color", "r", "g", "b", "XTERM_VERSION", "GLEVEL", "paramToWindowOption", "opts", "$temp", "InputHandler", "Disposable", "_bufferService", "_charsetService", "_coreService", "_logService", "_optionsService", "_oscLinkService", "_mouseStateService", "_unicodeService", "_parser", "EscapeSequenceParser", "StringToUtf32", "Utf8ToUtf32", "DEFAULT_ATTR_DATA", "Emitter", "DirtyRowTracker", "e", "ident", "params", "code", "identifier", "action", "data", "payload", "start", "end", "OscHandler", "flag", "CHARSETS", "state", "DcsHandler", "cursorStartX", "cursorStartY", "decodedLength", "position", "p", "slowTimeout", "slowPromise", "_res", "rej", "err", "promiseResult", "result", "wasPaused", "i", "len", "viewportEnd", "viewportStart", "chWidth", "charset", "screenReaderMode", "cols", "wraparoundMode", "insertMode", "curAttr", "bufferRow", "precedingJoinState", "pos", "ch", "currentInfo", "UnicodeService", "shouldJoin", "oldWidth", "stringFromCodePoint", "linkId", "oldRow", "oldCol", "BufferLine", "offset", "delta", "id", "callback", "paramToWindowOption", "ApcHandler", "line", "originalX", "maxCol", "x", "y", "diffToTop", "diffToBottom", "param", "clearWrap", "respectProtect", "j", "nextLine", "scrollBackSize", "row", "scrollBottomRowsOffset", "scrollBottomAbsolute", "joinState", "length", "text", "idata", "itext", "tlength", "XTERM_VERSION", "term", "DEFAULT_CHARSET", "ansi", "V", "dm", "mouseProtocol", "mouseEncoding", "cs", "buffers", "active", "alt", "opts", "f", "m", "v", "b2v", "value", "color", "mode", "c1", "c2", "c3", "AttributeData", "attr", "accu", "cSpace", "advance", "subparams", "style", "l", "isBlinking", "top", "bottom", "second", "event", "slots", "idx", "spec", "index", "isValidColorIndex", "parseColor", "uri", "parsedParams", "idParamIndex", "collectAndFlag", "GLEVEL", "scrollRegionHeight", "level", "cell", "CellData", "yOffset", "s", "b", "STYLES", "y1", "y2", "flags", "stack", "count", "__decorateClass", "__decorateParam", "IBufferService", "WriteBuffer", "Disposable", "_action", "TimeoutTimer", "Emitter", "toDisposable", "chunk", "didProcess", "cb", "data", "maxSubsequentCalls", "callback", "lastTime", "promiseResult", "startTime", "result", "continuation", "r", "err", "OscLinkService", "_bufferService", "data", "buffer", "marker", "entry", "castData", "key", "match", "linkId", "y", "e", "linkData", "index", "__decorateClass", "__decorateParam", "IBufferService", "hasWriteSyncWarnHappened", "CoreTerminal", "Disposable", "options", "MutableDisposable", "Emitter", "InstantiationService", "OptionsService", "IOptionsService", "LogService", "ILogService", "BufferService", "IBufferService", "CoreService", "ICoreService", "MouseStateService", "IMouseStateService", "UnicodeService", "UnicodeV6", "IUnicodeService", "CharsetService", "ICharsetService", "OscLinkService", "IOscLinkService", "InputHandler", "EventUtils", "WriteBuffer", "data", "promiseResult", "ev", "key", "callback", "maxSubsequentCalls", "wasUserInput", "x", "y", "eraseAttr", "isWrapped", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "id", "ident", "value", "windowsPty", "disposables", "updateWindowsModeWrappedState", "toDisposable", "d", "i", "SortedList", "_getKey", "logService", "IdleTaskQueue", "value", "sortedAddedValues", "a", "b", "sortedAddedValuesIndex", "arrayIndex", "newArray", "newArrayIndex", "key", "sortedDeletedIndices", "sortedDeletedIndicesIndex", "callback", "min", "max", "mid", "midKey", "$xmin", "$xmax", "DecorationService", "Disposable", "_logService", "_bufferService", "DecorationLineCache", "Emitter", "SortedList", "e", "toDisposable", "options", "decoration", "Decoration", "markerDispose", "listener", "d", "x", "line", "layer", "bucket", "callback", "__decorateClass", "__decorateParam", "ILogService", "IBufferService", "MutableDisposable", "MicrotaskTimer", "lines", "store", "DisposableStore", "amount", "event", "start", "height", "index", "callbacks", "cb", "newMap", "newLine", "existing", "i", "len", "spanCrossers", "deleteEnd", "toReindex", "css", "RENDER_DEBOUNCE_THRESHOLD_MS", "TimeBasedDebouncer", "_renderCallback", "_debounceThresholdMS", "rowStart", "rowEnd", "rowCount", "refreshRequestTime", "elapsed", "waitPeriodBeforeTrailingRefresh", "start", "end", "DEBUG", "AccessibilityManager", "Disposable", "_terminal", "instantiationService", "_coreBrowserService", "_renderService", "doc", "i", "e", "TimeBasedDebouncer", "char", "spaceCount", "addDisposableListener", "toDisposable", "tooMuchOutput", "keyChar", "start", "end", "buffer", "setSize", "line", "columns", "lineData", "posInSet", "element", "position", "boundaryElement", "beforeBoundaryElement", "lastRowPos", "topBoundaryElement", "bottomBoundaryElement", "newElement", "selection", "begin", "lastRowElement", "toRowColumn", "node", "offset", "rowElement", "row", "column", "beginRowColumn", "endRowColumn", "rows", "width", "lastColumn", "targetWidth", "__decorateClass", "__decorateParam", "IInstantiationService", "ICoreBrowserService", "IRenderService", "Linkifier", "Disposable", "_element", "_mouseCoordsService", "_renderService", "_bufferService", "_linkProviderService", "Emitter", "toDisposable", "dispose", "addDisposableListener", "event", "position", "composedPath", "i", "target", "useLineCache", "reply", "linkWithState", "linkProvided", "linkProvider", "links", "linksWithState", "link", "y", "replies", "occupiedCells", "providerReply", "startX", "endX", "x", "index", "hasLinkBefore", "j", "linkAtPosition", "currentLink", "linkEquals", "startRow", "endRow", "v", "e", "start", "end", "element", "showEvent", "range", "scrollOffset", "lower", "upper", "current", "coords", "x1", "y1", "x2", "y2", "fg", "__decorateClass", "__decorateParam", "IMouseCoordsService", "IRenderService", "IBufferService", "ILinkProviderService", "a", "b", "CoreBrowserTerminal", "CoreTerminal", "options", "MutableDisposable", "Platform_exports", "Emitter", "DecorationService", "IDecorationService", "KeyboardService", "IKeyboardService", "LinkProviderService", "ILinkProviderService", "OscLinkProvider", "e", "type", "event", "EventUtils", "toDisposable", "dimensions", "req", "acc", "ident", "colorRgb", "color", "toRgbString", "colors", "channels", "narrowedAcc", "bgLuminance", "rgb", "fgLuminance", "colorSchemeMode", "value", "AccessibilityManager", "ev", "cursorY", "bufferLine", "cursorX", "cellHeight", "width", "cellWidth", "cursorTop", "cursorLeft", "addDisposableListener", "copyHandler", "pasteHandlerWrapper", "handlePasteEvent", "isFirefox", "rightClickHandler", "isLinux", "moveTextAreaUnderMouseCursor", "parent", "fragment", "textarea", "promptLabel", "isChromeOS", "CoreBrowserService", "ICoreBrowserService", "CharSizeService", "ICharSizeService", "ThemeService", "IThemeService", "CharacterJoinerService", "ICharacterJoinerService", "RenderService", "IRenderService", "CompositionHelper", "MouseCoordsService", "IMouseCoordsService", "linkifier", "Linkifier", "Viewport", "SelectionService", "ISelectionService", "MouseService", "IMouseService", "text", "BufferDecorationRenderer", "showScrollbar", "overviewRulerWidth", "OverviewRulerRenderer", "shouldShow", "amount", "disposable", "DomRenderer", "start", "end", "sync", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "data", "paste", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "shouldIgnoreComposition", "result", "scrollCount", "wasModifierOnly", "wasModifierKeyOnlyEvent", "browser", "thirdLevelKey", "key", "x", "y", "i", "DEFAULT_ATTR_DATA", "canvasWidth", "canvasHeight", "AddonManager", "terminal", "instance", "loadedAddon", "index", "i", "BufferLineApiView", "_line", "x", "cell", "CellData", "trimRight", "startColumn", "endColumn", "BufferApiView", "_buffer", "type", "buffer", "y", "line", "BufferLineApiView", "CellData", "BufferNamespaceApi", "Disposable", "_core", "Emitter", "BufferApiView", "ParserApi", "_core", "id", "callback", "params", "data", "handler", "ident", "UnicodeApi", "_core", "provider", "version", "CONSTRUCTOR_ONLY_OPTIONS", "$value", "Terminal", "Disposable", "options", "CoreBrowserTerminal", "AddonManager", "getter", "propName", "setter", "value", "desc", "ParserApi", "UnicodeApi", "BufferNamespaceApi", "m", "mouseTrackingMode", "data", "wasUserInput", "columns", "rows", "parent", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "start", "end", "amount", "pageCount", "line", "callback", "addon", "promptLabel", "tooMuchOutput", "values"] -+ "sources": ["../src/browser/LocalizableStrings.ts", "../src/browser/Clipboard.ts", "../src/common/input/TextDecoder.ts", "../src/common/buffer/AttributeData.ts", "../src/common/buffer/CellData.ts", "../src/common/services/ServiceRegistry.ts", "../src/common/services/Services.ts", "../src/browser/OscLinkProvider.ts", "../src/browser/services/Services.ts", "../src/common/Lifecycle.ts", "../src/common/Async.ts", "../src/browser/Dom.ts", "../src/browser/scrollable/fastDomNode.ts", "../src/common/Platform.ts", "../src/browser/scrollable/mouseEvent.ts", "../src/browser/scrollable/globalPointerMoveMonitor.ts", "../src/browser/scrollable/widget.ts", "../src/browser/scrollable/scrollbarArrow.ts", "../src/common/Event.ts", "../src/browser/scrollable/scrollable.ts", "../src/browser/scrollable/scrollbarVisibilityController.ts", "../src/browser/scrollable/abstractScrollbar.ts", "../src/browser/scrollable/scrollbarState.ts", "../src/browser/scrollable/horizontalScrollbar.ts", "../src/browser/scrollable/verticalScrollbar.ts", "../src/browser/scrollable/scrollableElement.ts", "../src/browser/Viewport.ts", "../src/browser/decorations/BufferDecorationRenderer.ts", "../src/browser/decorations/ColorZoneStore.ts", "../src/browser/decorations/OverviewRulerRenderer.ts", "../src/common/Color.ts", "../src/browser/input/CompositionHelper.ts", "../src/browser/services/CharacterJoinerService.ts", "../src/browser/renderer/shared/RendererUtils.ts", "../src/browser/renderer/dom/DomRendererRowFactory.ts", "../src/browser/renderer/dom/WidthCache.ts", "../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/browser/renderer/dom/DomRenderer.ts", "../src/browser/services/CharSizeService.ts", "../src/browser/services/CoreBrowserService.ts", "../src/browser/services/LinkProviderService.ts", "../src/browser/input/Mouse.ts", "../src/browser/services/MouseCoordsService.ts", "../src/browser/scrollable/touch.ts", "../src/browser/services/MouseService.ts", "../src/browser/RenderDebouncer.ts", "../src/common/TaskQueue.ts", "../src/browser/services/RenderService.ts", "../src/browser/input/MoveToCell.ts", "../src/browser/selection/SelectionModel.ts", "../src/common/buffer/BufferRange.ts", "../src/browser/services/SelectionService.ts", "../src/common/MultiKeyMap.ts", "../src/browser/ColorContrastCache.ts", "../src/browser/Types.ts", "../src/browser/services/ThemeService.ts", "../src/common/input/Keyboard.ts", "../src/common/input/KittyKeyboard.ts", "../src/common/input/Win32InputMode.ts", "../src/browser/services/KeyboardService.ts", "../src/common/services/InstantiationService.ts", "../src/common/services/LogService.ts", "../src/common/CircularList.ts", "../src/common/StringBuilder.ts", "../src/common/buffer/BufferLine.ts", "../src/common/buffer/BufferLineStringCache.ts", "../src/common/buffer/BufferReflow.ts", "../src/common/buffer/Marker.ts", "../src/common/data/Charsets.ts", "../src/common/buffer/Buffer.ts", "../src/common/buffer/BufferSet.ts", "../src/common/services/BufferService.ts", "../src/common/services/OptionsService.ts", "../src/common/services/CoreService.ts", "../src/common/services/MouseStateService.ts", "../src/common/services/UnicodeService.ts", "../src/common/input/UnicodeV6.ts", "../src/common/services/CharsetService.ts", "../src/common/WindowsMode.ts", "../src/common/parser/Params.ts", "../src/common/parser/OscParser.ts", "../src/common/parser/DcsParser.ts", "../src/common/parser/ApcParser.ts", "../src/common/parser/EscapeSequenceParser.ts", "../src/common/input/XParseColor.ts", "../src/common/Version.ts", "../src/common/InputHandler.ts", "../src/common/input/WriteBuffer.ts", "../src/common/services/OscLinkService.ts", "../src/common/CoreTerminal.ts", "../src/common/SortedList.ts", "../src/common/services/DecorationService.ts", "../src/browser/TimeBasedDebouncer.ts", "../src/browser/AccessibilityManager.ts", "../src/browser/Linkifier.ts", "../src/browser/CoreBrowserTerminal.ts", "../src/common/public/AddonManager.ts", "../src/common/public/BufferLineApiView.ts", "../src/common/public/BufferApiView.ts", "../src/common/public/BufferNamespaceApi.ts", "../src/common/public/ParserApi.ts", "../src/common/public/UnicodeApi.ts", "../src/browser/public/Terminal.ts"], -+ "sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (\u241B).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed) {\n return;\n }\n switch (this._listeners.length) {\n case 0: return;\n case 1: {\n const { fn, thisArgs } = this._listeners[0];\n fn.call(thisArgs, event);\n return;\n }\n default: {\n // Snapshot listeners to allow modifications during iteration (2+ listeners)\n const listeners = this._listeners.slice();\n for (const { fn, thisArgs } of listeners) {\n fn.call(thisArgs, event);\n }\n }\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService, IThemeService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { color } from '../../common/Color';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\ninterface IPendingComposition {\n transactionId: number;\n finalizerTimer?: ReturnType;\n lifecycleSettled: boolean;\n sessionEnded: boolean;\n position: IPosition;\n suffix: string;\n dataAlreadySent: string;\n compositionData: string;\n endData: string;\n inputData: string;\n keypressData: string;\n keypressMayOverlapComposition: boolean;\n expectsPostCompositionInput: boolean;\n nextCompositionStart?: number;\n}\n\nconst XTERM_COMPOSITION_SESSION_START_EVENT = 'xterm-composition-session-start';\nconst XTERM_COMPOSITION_SESSION_END_EVENT = 'xterm-composition-session-end';\nconst XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT =\n 'xterm-composition-transaction-accepted';\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n public get hasPendingCompositionFinalization(): boolean {\n return this._pendingComposition !== undefined;\n }\n public get _isSendingComposition(): boolean {\n return this.hasPendingCompositionFinalization;\n }\n public get _pendingKeypressData(): string {\n return this._pendingComposition?.keypressData ?? '';\n }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n private _pendingComposition?: IPendingComposition;\n\n private _isAwaitingCompositionEnd: boolean;\n\n private _compositionInputData: string;\n\n private _lastCompositionData: string;\n\n private _compositionStartValue: string;\n\n private _compositionStartSelection: IPosition;\n\n private _compositionHasObservedProgress: boolean;\n\n private _canceledKey?: Pick;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n /**\n * Whether the IME consumed the last keydown and still owes the commit it produced. Nothing is\n * forwarded for such a keydown, so the commit is claimed by whichever observes it first.\n */\n private _imeKeydownAwaitingCommit: boolean;\n\n /**\n * Identifies the composition transaction that owns deferred work.\n */\n private _compositionTransactionId: number;\n\n /**\n * Timers that still own deferred composition state.\n */\n private _compositionTimers: Set>;\n\n private _compositionPositionTimer?: ReturnType;\n\n private _compositionViewTimer?: ReturnType;\n\n private _compositionEndTimer?: ReturnType;\n\n /** The preedit's own span, used to anchor the native candidate window. */\n private _compositionPreedit?: HTMLElement;\n\n /** The rendered row tail, set only while the cursor sits mid-line. */\n private _compositionRemainder?: HTMLElement;\n\n /** The insertion caret painted above the renderer cursor the composition view covers. */\n private _compositionCaret?: HTMLElement;\n\n /** The last preedit rendered, so a row repaint can re-render without a composition event. */\n private _compositionViewData?: string;\n\n // Keep the six-argument form callable: upstream's own CompositionHelper.test.ts constructs\n // this class directly, and `.npmignore` strips src/**/*.test.ts from the published tarball, so\n // the shipped patch has no hunk that could update that call. Dropping this overload fails the\n // upstream build with TS2554. The theme service is therefore optional, and every color read\n // below keeps the stock fallback that path needs.\n constructor(\n textarea: HTMLTextAreaElement,\n compositionView: HTMLElement,\n bufferService: IBufferService,\n optionsService: IOptionsService,\n coreService: ICoreService,\n renderService: IRenderService\n );\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService,\n @IThemeService private readonly _themeService?: IThemeService\n ) {\n this._isComposing = false;\n this._isAwaitingCompositionEnd = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionStartValue = '';\n this._compositionStartSelection = { start: 0, end: 0 };\n this._compositionHasObservedProgress = false;\n this._compositionTransactionId = 0;\n this._compositionTimers = new Set();\n this._imeKeydownAwaitingCommit = false;\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = undefined;\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = undefined;\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionStartValue = this._textarea.value;\n this._compositionStartSelection = { start, end };\n this._compositionHasObservedProgress = false;\n // A real session owns everything it commits, so no keydown is left owing one.\n this._imeKeydownAwaitingCommit = false;\n if (this._pendingComposition) {\n this._pendingComposition.nextCompositionStart = this._compositionPosition.start;\n }\n this._compositionTransactionId++;\n this._isComposing = true;\n this._isAwaitingCompositionEnd = true;\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._resetCompositionView();\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionView.classList.add('active');\n this._dispatchCompositionSessionEvent(new CustomEvent(XTERM_COMPOSITION_SESSION_START_EVENT, {\n bubbles: true,\n detail: { id: this._compositionTransactionId }\n }));\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n if (ev.data && !this._isComposing) {\n this.compositionstart();\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (ev.data?.length > 0) {\n this._lastCompositionData = ev.data;\n }\n this._renderCompositionView(ev.data ?? '');\n // Some IMEs resume without compositionstart; keep that inferred transaction visible until\n // compositionend settles it. An empty update hides the overlay without ending the transaction.\n this._compositionView.classList.toggle('active', Boolean(ev.data));\n this.updateCompositionElements();\n const transactionId = this._compositionTransactionId;\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = this._defer(() => {\n if (this._isComposing && this._compositionTransactionId === transactionId) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n });\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(ev?: Pick): boolean {\n if (!this._isAwaitingCompositionEnd) {\n return false;\n }\n if (!this._isComposing) {\n const pending = this._pendingComposition;\n if (pending?.transactionId === this._compositionTransactionId) {\n pending.endData = ev?.data ?? '';\n this._updatePostCompositionInputExpectation(pending);\n }\n return false;\n }\n const endData = ev?.data ?? '';\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n const pending = this._pendingComposition;\n if (pending && pending.transactionId !== this._compositionTransactionId) {\n this._sendPendingComposition(pending);\n }\n this._deferCompositionEnd(endData);\n return false;\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n return true;\n }\n\n public blur(): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._isComposing) {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n this._finalizeComposition(false);\n }\n }\n\n public dispose(): void {\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n for (const timer of this._compositionTimers) {\n clearTimeout(timer);\n }\n this._compositionTimers.clear();\n this._compositionPositionTimer = undefined;\n this._compositionViewTimer = undefined;\n this._compositionEndTimer = undefined;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionTransactionId++;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._canceledKey?.code === ev.code && this._canceledKey.timeStamp === ev.timeStamp) {\n this._canceledKey = undefined;\n return false;\n }\n if (ev.key === 'Escape' && (this._isComposing || this.hasPendingCompositionFinalization)) {\n this._canceledKey = { code: ev.code, timeStamp: ev.timeStamp };\n this._cancelComposition();\n return false;\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n // A key the IME swallows can also empty the preedit \u2014 backspacing over the last radical of a\n // Cangjie composition \u2014 and some IMEs report that with no composition event at all.\n this._deferPreeditResync(this._composedRegionLength() > 0);\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n // Nothing is forwarded for a keydown the IME consumed, so it is left owing its commit; any\n // other keydown either forwards its own text or produces none, and clears the debt.\n this._imeKeydownAwaitingCommit = ev.keyCode === 229;\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Defers keypress text while a composition finalizer is pending so all input is emitted once\n * after reconciliation with the final textarea candidate.\n */\n public keypress(text: string): boolean {\n const pending = this._pendingComposition;\n if (!pending) {\n return false;\n }\n if (pending.keypressMayOverlapComposition) {\n pending.keypressData += text;\n return true;\n }\n if (pending.expectsPostCompositionInput && pending.keypressData.length === 0) {\n pending.keypressData = text;\n return true;\n }\n this._sendPendingComposition(pending);\n return false;\n }\n\n public input(text: string): boolean {\n if (this._isComposing) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n this._compositionInputData += text;\n return true;\n }\n const pending = this._pendingComposition;\n if (!pending) {\n return this._claimImeKeydownCommit(text);\n }\n if (pending.expectsPostCompositionInput) {\n pending.inputData += text;\n pending.expectsPostCompositionInput = false;\n this._sendPendingComposition(pending);\n return true;\n }\n const repeatsPendingTextareaInput =\n text.length > 0 &&\n this._getPendingTextareaInput(pending) === text &&\n this._getPendingTextareaInput(pending, true) === text;\n this._sendPendingComposition(pending);\n if (!repeatsPendingTextareaInput) {\n this._coreService.triggerDataEvent(text, true);\n }\n return true;\n }\n\n /**\n * Settles the commit a keydown the IME consumed still owes. That commit normally arrives as the\n * deferred textarea diff, but an asynchronous IME can deliver it after the diff has already run\n * and found the textarea unchanged, and with the key still down the terminal drops the input\n * event instead (#12099). Whichever path sees the commit first sends it and cancels the other, so\n * an IME that commits before the diff runs still sends once.\n */\n private _claimImeKeydownCommit(text: string): boolean {\n if (!this._imeKeydownAwaitingCommit) {\n return false;\n }\n this._imeKeydownAwaitingCommit = false;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n this._coreService.triggerDataEvent(text, true);\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean, endData: string = ''): void {\n const wasComposing = this._isComposing;\n this._compositionView.classList.remove('active');\n // Cleared, not just hidden: a rendered tail left in the view is stale DOM the next composition\n // would have to correct before its own first update lands.\n this._resetCompositionView();\n this._isComposing = false;\n if (waitForPropagation && !wasComposing) {\n return;\n }\n\n if (!waitForPropagation) {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition, true);\n }\n if (wasComposing) {\n const input = this._getCompositionInput(\n this._compositionPosition.start + this._dataAlreadySent.length,\n this._compositionSuffix\n );\n this._sendCompositionInput(this._compositionTransactionId, input);\n }\n } else {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition);\n }\n const pending: IPendingComposition = {\n transactionId: this._compositionTransactionId,\n lifecycleSettled: false,\n sessionEnded: false,\n position: {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n },\n suffix: this._compositionSuffix,\n dataAlreadySent: this._dataAlreadySent,\n compositionData: this._lastCompositionData,\n endData,\n inputData: this._compositionInputData,\n keypressData: '',\n keypressMayOverlapComposition:\n this._lastCompositionData.length === 0 && endData.length === 0,\n expectsPostCompositionInput: false\n };\n this._updatePostCompositionInputExpectation(pending);\n this._pendingComposition = pending;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n pending.finalizerTimer = this._defer(() => {\n pending.finalizerTimer = undefined;\n if (this._compositionTransactionId === pending.transactionId) {\n this._isAwaitingCompositionEnd = false;\n }\n if (this._pendingComposition === pending) {\n this._sendPendingComposition(pending, true);\n }\n });\n }\n }\n\n private _sendPendingComposition(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): void {\n this._cancelPendingFinalizer(pending);\n if (this._pendingComposition === pending) {\n this._pendingComposition = undefined;\n }\n const textareaInput = this._getPendingTextareaInput(pending, includeFollowingInput);\n const observedInput = this._removeAlreadySentData(\n pending.inputData || pending.keypressData,\n pending.dataAlreadySent\n );\n // Why: with no textarea, end, input, or keypress evidence the composition\n // was cancelled (e.g. Backspace over the whole preedit); stale\n // compositionupdate data must not be replayed as committed text.\n const input = this._mergeTextObservations(\n textareaInput || pending.endData || (observedInput ? pending.compositionData : ''),\n observedInput,\n pending.keypressMayOverlapComposition\n );\n this._sendCompositionInput(pending.transactionId, input, !pending.sessionEnded);\n this._settlePendingComposition(pending);\n }\n\n private _cancelPendingFinalizer(pending: IPendingComposition): void {\n if (pending.finalizerTimer === undefined) {\n return;\n }\n clearTimeout(pending.finalizerTimer);\n this._compositionTimers.delete(pending.finalizerTimer);\n pending.finalizerTimer = undefined;\n }\n\n private _settlePendingComposition(pending: IPendingComposition): void {\n if (pending.lifecycleSettled) {\n return;\n }\n pending.lifecycleSettled = true;\n this._dispatchCompositionTransactionSettled();\n }\n\n private _mergeTextObservations(\n candidate: string,\n observed: string,\n findShortestOrder: boolean\n ): string {\n if (!observed || candidate.includes(observed)) {\n return candidate;\n }\n if (!candidate || observed.includes(candidate)) {\n return observed;\n }\n if (findShortestOrder) {\n let candidateFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n candidateFirstOverlap > 0 &&\n !candidate.endsWith(observed.substring(0, candidateFirstOverlap))\n ) {\n candidateFirstOverlap--;\n }\n let observedFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n observedFirstOverlap > 0 &&\n !observed.endsWith(candidate.substring(0, observedFirstOverlap))\n ) {\n observedFirstOverlap--;\n }\n return candidateFirstOverlap > observedFirstOverlap\n ? candidate + observed.substring(candidateFirstOverlap)\n : observed + candidate.substring(observedFirstOverlap);\n }\n let overlap = Math.min(candidate.length, observed.length);\n while (overlap > 0 && !candidate.endsWith(observed.substring(0, overlap))) {\n overlap--;\n }\n return candidate + observed.substring(overlap);\n }\n\n private _updatePostCompositionInputExpectation(pending: IPendingComposition): void {\n pending.expectsPostCompositionInput =\n (pending.endData.length > 0 || pending.compositionData.length > 0) &&\n pending.inputData.length === 0 &&\n this._getPendingTextareaInput(pending).length === 0;\n }\n\n private _getPendingTextareaInput(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): string {\n const value = this._textarea.value;\n const start = pending.position.start + pending.dataAlreadySent.length;\n if (pending.nextCompositionStart !== undefined) {\n return value.substring(start, Math.max(start, pending.nextCompositionStart));\n }\n const suffixEnd =\n pending.suffix.length > 0 && value.endsWith(pending.suffix)\n ? value.length - pending.suffix.length\n : value.length;\n const compositionLength = (pending.endData || pending.compositionData).length;\n const observedEnd = includeFollowingInput\n ? suffixEnd\n : Math.max(pending.position.end, start + compositionLength);\n return value.substring(start, Math.max(start, Math.min(suffixEnd, observedEnd)));\n }\n\n private _getCompositionInput(start: number, suffix: string): string {\n const value = this._textarea.value;\n const valueEnd =\n suffix.length > 0 && value.endsWith(suffix) ? value.length - suffix.length : value.length;\n return value.substring(start, Math.max(start, valueEnd));\n }\n\n private _removeAlreadySentData(input: string, dataAlreadySent: string): string {\n if (dataAlreadySent.length === 0) {\n return input;\n }\n if (input.startsWith(dataAlreadySent)) {\n return input.substring(dataAlreadySent.length);\n }\n return dataAlreadySent.includes(input) ? '' : input;\n }\n\n private _cancelComposition(): void {\n const pending = this._pendingComposition;\n if (\n pending &&\n this._isComposing &&\n pending.transactionId !== this._compositionTransactionId\n ) {\n this._sendPendingComposition(pending);\n }\n const transactionId = this._isComposing\n ? this._compositionTransactionId\n : this._pendingComposition?.transactionId ?? 0;\n const settlesPending = pending !== undefined && this._pendingComposition === pending;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n this._textarea.value =\n this._textarea.value.substring(0, this._compositionPosition.start) + this._compositionSuffix;\n this._sendCompositionInput(transactionId, '');\n if (settlesPending && pending) {\n this._settlePendingComposition(pending);\n }\n }\n\n private _sendCompositionInput(\n transactionId: number,\n input: string,\n dispatchSessionEnd: boolean = true\n ): void {\n let prevented = false;\n if (dispatchSessionEnd) {\n const event = new CustomEvent(XTERM_COMPOSITION_SESSION_END_EVENT, {\n bubbles: true,\n cancelable: true,\n detail: { id: transactionId, data: input }\n });\n this._dispatchCompositionSessionEvent(event);\n prevented = event.defaultPrevented;\n }\n if (input.length > 0 && !prevented) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n\n private _endPendingCompositionSession(pending: IPendingComposition): void {\n if (pending.sessionEnded) {\n return;\n }\n pending.sessionEnded = true;\n const input =\n this._getPendingTextareaInput(pending) ||\n pending.endData ||\n pending.compositionData;\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_SESSION_END_EVENT,\n {\n bubbles: true,\n cancelable: true,\n detail: {\n id: pending.transactionId,\n data: input,\n dataPendingReconciliation: true\n }\n }\n ));\n }\n\n private _dispatchCompositionSessionEvent(event: CustomEvent): void {\n if (typeof this._textarea.dispatchEvent === 'function') {\n this._textarea.dispatchEvent(event);\n }\n }\n\n private _dispatchCompositionTransactionSettled(): void {\n this._dispatchCompositionSessionEvent(new CustomEvent(\n 'xterm-composition-transaction-settled',\n { bubbles: true }\n ));\n }\n\n private _deferCompositionEnd(endData: string): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n const transactionId = this._compositionTransactionId;\n const timer = this._defer(() => {\n if (\n this._compositionEndTimer !== timer ||\n !this._isComposing ||\n this._compositionTransactionId !== transactionId ||\n !this._compositionEndBelongsToCurrentTransaction(endData)\n ) {\n return;\n }\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT,\n { bubbles: true }\n ));\n const pending = this._pendingComposition;\n if (pending?.transactionId === transactionId) {\n this._sendPendingComposition(pending, true);\n }\n });\n this._compositionEndTimer = timer;\n }\n\n /** How much of the textarea the IME currently owns; 0 means there is no preedit left. */\n private _composedRegionLength(): number {\n const end = this._textarea.value.length - this._compositionSuffix.length;\n return Math.max(0, end - this._compositionPosition.start);\n }\n\n /**\n * Re-derives the preedit from the textarea once the key that changed it has settled, and treats\n * a composition emptied that way as cancelled. Mirrors how native terminals clear a preedit on\n * the empty-marked-text state instead of on a specific key.\n */\n private _deferPreeditResync(hadPreedit: boolean): void {\n if (!hadPreedit || !this._isComposing) {\n return;\n }\n const transactionId = this._compositionTransactionId;\n this._defer(() => {\n if (\n this._isComposing &&\n this._compositionTransactionId === transactionId &&\n this._composedRegionLength() === 0\n ) {\n this._cancelComposition();\n }\n });\n }\n\n private _hasCompositionProgress(): boolean {\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n return this._compositionHasObservedProgress || (\n this._textarea.value !== this._compositionStartValue ||\n start !== this._compositionStartSelection.start ||\n end !== this._compositionStartSelection.end\n );\n }\n\n private _compositionEndBelongsToCurrentTransaction(endData: string): boolean {\n return (\n this._hasCompositionProgress() ||\n (endData.length > 0 && endData === this._lastCompositionData)\n );\n }\n\n private _defer(callback: () => void): ReturnType {\n const timer = setTimeout(() => {\n this._compositionTimers.delete(timer);\n callback();\n }, 0);\n this._compositionTimers.add(timer);\n return timer;\n }\n\n private _cancelDeferredTimer(timer?: ReturnType): void {\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n this._compositionTimers.delete(timer);\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n if (newValue !== oldValue) {\n this._imeKeydownAwaitingCommit = false;\n }\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Renders the preedit into the view and, when the cursor sits mid-line, the rest of the row\n * after it, so a composition reads as inserted text pushing the tail right rather than an opaque\n * box hiding the character under the cursor. Nothing reaches the pty while composing, so those\n * cells still hold their characters; only what the overlay shows changes.\n */\n private _renderCompositionView(data: string, rowRemainder = this._getRowRemainderText()): void {\n if (!data) {\n this._resetCompositionView();\n return;\n }\n // Keep DOM order LTR so the insertion caret follows the preedit.\n const preeditText = `\u200E${data}\u200E`;\n this._compositionViewData = data;\n const doc = this._compositionView.ownerDocument;\n const preedit = doc.createElement('span');\n preedit.className = 'xterm-composition-preedit';\n // Underlined so the composing text stays distinguishable from the tail it pushed right.\n preedit.style.flexShrink = '0';\n preedit.style.textDecoration = 'underline';\n preedit.textContent = preeditText;\n const caret = doc.createElement('span');\n caret.className = 'xterm-composition-caret';\n caret.setAttribute('aria-hidden', 'true');\n const children = [preedit, caret];\n let remainder: HTMLElement | undefined;\n if (rowRemainder) {\n remainder = doc.createElement('span');\n remainder.className = 'xterm-composition-remainder';\n // Why: the view is nowrap, which collapses runs of spaces, so committed padding would draw\n // its trailing glyph cells to the left of where the grid has them.\n remainder.style.whiteSpace = 'pre';\n remainder.textContent = rowRemainder;\n children.push(remainder);\n }\n this._compositionView.replaceChildren(...children);\n this._compositionPreedit = preedit;\n this._compositionCaret = caret;\n this._compositionRemainder = remainder;\n this._styleCompositionCaret();\n }\n\n /** The committed row text from the cursor rightwards \u2014 what a mid-line preedit would cover. */\n private _getRowRemainderText(): string {\n const buffer = this._bufferService.buffer;\n if (!buffer.isCursorInViewport) {\n return '';\n }\n const line = buffer.lines.get(buffer.ybase + buffer.y);\n // The explicit end column keeps this off the line string cache, whose self-renewing\n // idle-clear timer the composition path must not arm.\n return line\n ? line.translateToString(true, Math.min(buffer.x, this._bufferService.cols - 1), line.length)\n : '';\n }\n\n private _styleCompositionCaret(): void {\n const caret = this._compositionCaret;\n if (!caret) {\n return;\n }\n const width = Math.max(1, this._optionsService.rawOptions.cursorWidth);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const colors = this._themeService?.colors;\n const cursor = colors && (\n color.ensureContrastRatio(colors.background, colors.cursor, 3) ?? colors.cursor\n );\n caret.style.backgroundColor = cursor?.css ?? '#FFF';\n caret.style.display = 'inline-block';\n caret.style.flexShrink = '0';\n caret.style.height = cellHeight + 'px';\n caret.style.marginLeft = -width + 'px';\n caret.style.verticalAlign = 'top';\n caret.style.width = width + 'px';\n }\n\n private _resetCompositionView(): void {\n this._compositionView.textContent = '';\n this._compositionPreedit = undefined;\n this._compositionRemainder = undefined;\n this._compositionCaret = undefined;\n this._compositionViewData = '';\n this._compositionView.style.display = '';\n this._compositionView.style.justifyContent = '';\n }\n\n /**\n * The theme background with any alpha dropped. The view masks the cells it draws over, so a\n * see-through background would re-expose the very characters the rendered tail stands in for.\n */\n private _opaqueViewBackground(): string {\n const background = this._themeService?.colors.background;\n return background ? color.opaque(background).css : '#000';\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n // Empty updates hide the overlay without ending the inferred transaction.\n if (!this._compositionView.classList.contains('active')) {\n return;\n }\n\n // A TUI can repaint the row under an open composition (spinners, streamed output), and this\n // already runs on every render \u2014 so keep the rendered tail current with the buffer. A string\n // compare adds no layout read.\n const rowRemainder = this._getRowRemainderText();\n if (\n this._compositionViewData &&\n rowRemainder !== (this._compositionRemainder?.textContent ?? '')\n ) {\n this._renderCompositionView(this._compositionViewData, rowRemainder);\n }\n this._styleCompositionCaret();\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n const anchorBounds =\n (this._compositionPreedit ?? this._compositionView).getBoundingClientRect();\n const anchorLeft = cursorLeft + Math.min(0, maxWidth - anchorBounds.width);\n const showsRemainder =\n Boolean(this._compositionRemainder) && anchorBounds.width < maxWidth;\n if (this._compositionRemainder) {\n this._compositionRemainder.style.display = showsRemainder ? '' : 'none';\n }\n // End alignment keeps the caret visible when the preedit consumes the remaining width.\n this._compositionView.style.direction = 'ltr';\n this._compositionView.style.display = showsRemainder ? '' : 'flex';\n this._compositionView.style.justifyContent = showsRemainder ? '' : 'flex-end';\n // Themed rather than the stock #000/#FFF, so the pushed tail reads as ordinary terminal text\n // and light themes keep contrast.\n this._compositionView.style.background = this._opaqueViewBackground();\n this._compositionView.style.color = this._themeService?.colors.foreground.css ?? '#FFF';\n // Sized and placed to match the preedit, not the whole view, so the candidate window\n // anchors to the composing text rather than the end of the rendered tail. The clamp has to\n // be applied here and not only in Orca's terminal-ime-candidate-anchor.ts, because\n // CoreBrowserTerminal calls this from onRender as well as from composition events, and a\n // render can land after the last composition event that module can hear.\n this._textarea.style.left = anchorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(anchorBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(anchorBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = anchorBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = this._defer(() => this.updateCompositionElements(true));\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n", "import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const ctx: IMouseBindContext = { target, focus, requestedEvents };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n // Ensure document-level listeners are removed on dispose\n register(toDisposable(() => {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }));\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (ctx.requestedEvents.mouseup) {\n ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element, document } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n if (requestedEvents.mouseup) {\n document.removeEventListener('mouseup', requestedEvents.mouseup);\n }\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n if (requestedEvents.mousedrag) {\n document.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): boolean | void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n keypress?(text: string): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec \u00A7 \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" \u2014 i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n\u00B2) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { StringBuilder } from '../StringBuilder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $translateToStringBuilder = new StringBuilder();\n\nexport interface IBufferLineStringCacheEntry {\n value: string | undefined;\n isTrimmed: boolean;\n generation: number;\n}\n\nexport interface IBufferLineStringCache {\n generation: number;\n allocateEntry(): IBufferLineStringCacheEntry;\n touch?(): void;\n}\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n protected _stringCacheEntryRef: WeakRef | undefined;\n public length: number;\n\n constructor(\n protected readonly _stringCache: IBufferLineStringCache,\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._invalidateStringCache();\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n cell.extended = DEFAULT_ATTR_DATA.extended.clone();\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._invalidateStringCache();\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._invalidateStringCache();\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = attrs.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._invalidateStringCache();\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._invalidateStringCache();\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._invalidateStringCache();\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._invalidateStringCache();\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n this._invalidateStringCache();\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._copySparseMapsFrom(line);\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(this._stringCache, 0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n newLine._copySparseMapsFrom(this);\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._invalidateStringCache();\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonicalRequest = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonicalRequest) {\n this._stringCache.touch?.();\n }\n const stringCacheEntry = isCanonicalRequest ? this._getStringCacheEntry(false) : undefined;\n if (isCanonicalRequest && stringCacheEntry?.value !== undefined) {\n if (trimRight) {\n return stringCacheEntry.isTrimmed ? stringCacheEntry.value : stringCacheEntry.value.trimEnd();\n }\n if (!stringCacheEntry.isTrimmed) {\n return stringCacheEntry.value;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n $translateToStringBuilder.reset();\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n $translateToStringBuilder.append(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = $translateToStringBuilder.toString();\n $translateToStringBuilder.reset();\n if (isCanonicalRequest) {\n const cacheEntry = this._getStringCacheEntry(true)!;\n cacheEntry.value = result;\n cacheEntry.isTrimmed = !!trimRight;\n }\n return result;\n }\n\n protected _getStringCacheEntry(createIfNeeded: boolean): IBufferLineStringCacheEntry | undefined {\n const cachedEntry = this._stringCacheEntryRef?.deref();\n if (cachedEntry) {\n if (cachedEntry.generation === this._stringCache.generation) {\n return cachedEntry;\n }\n }\n if (!createIfNeeded) {\n return undefined;\n }\n const cacheEntry = this._stringCache.allocateEntry();\n this._stringCacheEntryRef = new WeakRef(cacheEntry);\n return cacheEntry;\n }\n\n private _invalidateStringCache(): void {\n const cacheEntry = this._getStringCacheEntry(false);\n if (cacheEntry) {\n cacheEntry.value = undefined;\n cacheEntry.isTrimmed = false;\n }\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IBufferLineStringCache, IBufferLineStringCacheEntry } from './BufferLine';\nimport { disposableTimeout } from '../Async';\nimport { Disposable, MutableDisposable, toDisposable, type IDisposable } from '../Lifecycle';\n\nconst enum Constants {\n CACHE_TTL_MS = 15000\n}\n\nexport class BufferLineStringCache extends Disposable implements IBufferLineStringCache {\n public generation: number = 0;\n public readonly entries: Set = new Set();\n private readonly _clearTimeout = this._register(new MutableDisposable());\n private _lastAccessTimestamp: number = 0;\n\n constructor() {\n super();\n this._register(toDisposable(() => this.entries.clear()));\n }\n\n public touch(): void {\n this._scheduleClear();\n }\n\n public allocateEntry(): IBufferLineStringCacheEntry {\n const entry: IBufferLineStringCacheEntry = {\n value: undefined,\n isTrimmed: false,\n generation: this.generation\n };\n this.entries.add(entry);\n this._scheduleClear();\n return entry;\n }\n\n public clear(): void {\n this._clearTimeout.clear();\n this._lastAccessTimestamp = 0;\n this.generation++;\n for (const entry of this.entries) {\n entry.value = undefined;\n entry.isTrimmed = false;\n }\n this.entries.clear();\n }\n\n private _scheduleClear(): void {\n this._lastAccessTimestamp = Date.now();\n if (this._clearTimeout.value) {\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS);\n }\n\n private _scheduleClearTimeout(timeoutMs: number): void {\n this._clearTimeout.value = disposableTimeout(() => {\n const elapsed = Date.now() - this._lastAccessTimestamp;\n if (elapsed >= Constants.CACHE_TTL_MS) {\n this.clear();\n return;\n }\n this._scheduleClearTimeout(Constants.CACHE_TTL_MS - elapsed);\n }, timeoutMs);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '\u25C6'\n 'a': '\\u2592', // '\u2592'\n 'b': '\\u2409', // '\u2409' (HT)\n 'c': '\\u240c', // '\u240C' (FF)\n 'd': '\\u240d', // '\u240D' (CR)\n 'e': '\\u240a', // '\u240A' (LF)\n 'f': '\\u00b0', // '\u00B0'\n 'g': '\\u00b1', // '\u00B1'\n 'h': '\\u2424', // '\u2424' (NL)\n 'i': '\\u240b', // '\u240B' (VT)\n 'j': '\\u2518', // '\u2518'\n 'k': '\\u2510', // '\u2510'\n 'l': '\\u250c', // '\u250C'\n 'm': '\\u2514', // '\u2514'\n 'n': '\\u253c', // '\u253C'\n 'o': '\\u23ba', // '\u23BA'\n 'p': '\\u23bb', // '\u23BB'\n 'q': '\\u2500', // '\u2500'\n 'r': '\\u23bc', // '\u23BC'\n 's': '\\u23bd', // '\u23BD'\n 't': '\\u251c', // '\u251C'\n 'u': '\\u2524', // '\u2524'\n 'v': '\\u2534', // '\u2534'\n 'w': '\\u252c', // '\u252C'\n 'x': '\\u2502', // '\u2502'\n 'y': '\\u2264', // '\u2264'\n 'z': '\\u2265', // '\u2265'\n '{': '\\u03c0', // '\u03C0'\n '|': '\\u2260', // '\u2260'\n '}': '\\u00a3', // '\u00A3'\n '~': '\\u00b7' // '\u00B7'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '\u00A3'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '\u00A3',\n '@': '\u00BE',\n '[': 'ij',\n '\\\\': '\u00BD',\n ']': '|',\n '{': '\u00A8',\n '|': 'f',\n '}': '\u00BC',\n '~': '\u00B4'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '\u00A3',\n '@': '\u00E0',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00A7',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00A8'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': '\u00E0',\n '[': '\u00E2',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n '`': '\u00F4',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00FB'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '\u00A7',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00DC',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00DF'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00E9',\n '`': '\u00F9',\n '{': '\u00E0',\n '|': '\u00F2',\n '}': '\u00E8',\n '~': '\u00EC'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': '\u00C4',\n '[': '\u00C6',\n '\\\\': '\u00D8',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E4',\n '{': '\u00E6',\n '|': '\u00F8',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00A1',\n '\\\\': '\u00D1',\n ']': '\u00BF',\n '{': '\u00B0',\n '|': '\u00F1',\n '}': '\u00E7'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': '\u00C9',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': '\u00F9',\n '@': '\u00E0',\n '[': '\u00E9',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n\n '_': '\u00E8',\n '`': '\u00F4',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00FB'\n};\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { BufferLineStringCache } from './BufferLineStringCache';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n private readonly _stringCache: BufferLineStringCache;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n this._stringCache = this._register(new BufferLineStringCache());\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._stringCache, this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this._stringCache.clear();\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n this._stringCache.clear();\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(this._stringCache, newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.287';\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n", "\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n", "/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n if (this._deleteAtKey(value, key)) {\n return true;\n }\n // A pending deletion whose key mutated after `delete()` (disposing a marker\n // resets `line` to -1, and `line` is the sort key) leaves `_array` out of\n // order, so the binary search above can miss a value that is present.\n // Compacting those entries out restores the order; retry before reporting\n // the value absent, else its `onDecorationRemoved` never fires and the\n // decoration paints forever. Miss path only, so the common bulk delete\n // keeps its O(log n) search and deferred-compaction batching.\n if (this._deletedIndices.length === 0) {\n return false;\n }\n this._flushCleanupDeleted();\n return this._deleteAtKey(value, key);\n }\n\n private _deleteAtKey(value: T, key: number): boolean {\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.blur();\n }\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', (e: CompositionEvent) => {\n if (this._compositionHelper instanceof CompositionHelper) {\n if (this._compositionHelper.compositionend(e)) {\n this.textarea!.dispatchEvent(new CustomEvent(\n 'xterm-composition-transaction-accepted',\n { bubbles: true }\n ));\n }\n } else {\n this._compositionHelper!.compositionend();\n }\n }));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._register(toDisposable(() => {\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.dispose();\n }\n }));\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n if (!this._compositionHelper!.keypress?.(key)) {\n this.coreService.triggerDataEvent(key, true);\n }\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n if (\n ev.data &&\n ev.inputType === 'insertText' &&\n !this.optionsService.rawOptions.screenReaderMode &&\n this._compositionHelper instanceof CompositionHelper &&\n this._compositionHelper.input(ev.data)\n ) {\n return true;\n }\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n"], -+ "mappings": "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AG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAC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", -+ "names": ["promptLabelInternal", "promptLabel", "value", "tooMuchOutputInternal", "tooMuchOutput", "prepareTextForTerminal", "text", "bracketTextForPaste", "bracketedPasteMode", "copyHandler", "ev", "selectionService", "handlePasteEvent", "textarea", "coreService", "optionsService", "paste", "moveTextAreaUnderMouseCursor", "screenElement", "pos", "left", "top", "rightClickHandler", "shouldSelectWord", "stringFromCodePoint", "codePoint", "utf32ToString", "data", "start", "end", "result", "i", "codepoint", "StringToUtf32", "input", "target", "length", "size", "startPos", "second", "code", "Utf8ToUtf32", "byte1", "byte2", "byte3", "byte4", "discardInterim", "cp", "pos", "tmp", "type", "missing", "fourStop", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "serviceRegistry", "getServiceDependencies", "ctor", "createDecorator", "id", "decorator", "target", "key", "index", "storeServiceDependency", "IBufferService", "createDecorator", "IMouseStateService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "OscLinkProvider", "_bufferService", "_optionsService", "_oscLinkService", "CellData", "y", "callback", "line", "result", "linkHandler", "cell", "lineLength", "currentLinkId", "currentStart", "finishLink", "x", "text", "endX", "range", "ignoreLink", "parsed", "e", "defaultActivate", "startX", "linkId", "startY", "finalStartX", "endY", "finalEndX", "previousLine", "previousLineLength", "previousStartX", "currentLine", "currentLineLength", "nextLine", "nextLineLength", "nextEndX", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "IOscLinkService", "uri", "newWindow", "ICharSizeService", "createDecorator", "ICoreBrowserService", "IMouseCoordsService", "IMouseService", "IRenderService", "ISelectionService", "ICharacterJoinerService", "IThemeService", "ILinkProviderService", "IKeyboardService", "toDisposable", "fn", "dispose", "arg", "d", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "disposableTimeout", "handler", "timeout", "store", "timer", "disposable", "toDisposable", "TimeoutTimer", "runner", "MicrotaskTimer", "IntervalTimer", "interval", "context", "handle", "getWindow", "e", "candidateNode", "candidateEvent", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "addStandardDisposableListener", "useCapture", "eventType", "getDomNodePagePosition", "domNode", "bb", "win", "AnimationFrameQueueItem", "_runner", "priority", "a", "b", "animationFrameState", "getAnimationFrameState", "targetWindow", "state", "animationFrameRunner", "scheduleAtNextAnimationFrame", "runner", "item", "WindowIntervalTimer", "IntervalTimer", "interval", "FastDomNode", "domNode", "_width", "width", "numberAsPixels", "_height", "height", "_top", "top", "_left", "left", "_bottom", "bottom", "_right", "right", "className", "shouldHaveIt", "position", "layerHint", "contain", "name", "value", "Platform_exports", "__export", "getSafariVersion", "getZoomFactor", "isChrome", "isChromeOS", "isFirefox", "isLegacyEdge", "isLinux", "isMac", "isNode", "isSafari", "isWindows", "userAgent", "platform", "_targetWindow", "majorVersion", "sameOriginWindowChainCache", "getParentWindowIfSameOrigin", "w", "location", "parentLocation", "IframeUtils", "targetWindow", "windowChainCache", "parent", "childWindow", "ancestorWindow", "top", "left", "windowChain", "windowChainEl", "windowInChain", "boundingRect", "StandardMouseEvent", "iframeOffsets", "StandardWheelEvent", "e", "deltaX", "deltaY", "shouldFactorDPR", "isChrome", "chromeVersionMatch", "e1", "e2", "devicePixelRatio", "ev", "isFirefox", "isMac", "isSafari", "isWindows", "GlobalPointerMoveMonitor", "DisposableStore", "invokeStopCallback", "onStopCallback", "initialElement", "pointerId", "initialButtons", "pointerMoveCallback", "eventSource", "toDisposable", "getWindow", "addDisposableListener", "eventType", "e", "Widget", "Disposable", "domNode", "listener", "addDisposableListener", "eventType", "e", "StandardMouseEvent", "getWindow", "ScrollbarArrow", "Widget", "opts", "arrowSize", "GlobalPointerMoveMonitor", "addStandardDisposableListener", "eventType", "e", "WindowIntervalTimer", "TimeoutTimer", "scheduleRepeater", "getWindow", "pointerMoveData", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "fn", "listeners", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "ScrollState", "_ScrollState", "_forceIntegerValues", "width", "scrollWidth", "scrollLeft", "height", "scrollHeight", "scrollTop", "other", "update", "useRawScrollPositions", "previous", "inSmoothScrolling", "widthChanged", "scrollWidthChanged", "scrollLeftChanged", "heightChanged", "scrollHeightChanged", "scrollTopChanged", "Scrollable", "Disposable", "options", "Emitter", "smoothScrollDuration", "scrollPosition", "dimensions", "newState", "reuseAnimation", "validTarget", "newSmoothScrolling", "SmoothScrollingOperation", "oldState", "SmoothScrollingUpdate", "isDone", "createEaseOutCubic", "from", "to", "delta", "completion", "easeOutCubic", "createComposed", "a", "b", "cut", "_SmoothScrollingOperation", "startTime", "duration", "viewportSize", "stop1", "stop2", "state", "now", "newScrollLeft", "newScrollTop", "easeInCubic", "t", "ScrollbarVisibilityController", "Disposable", "visibility", "visibleClassName", "invisibleClassName", "TimeoutTimer", "rawShouldBeVisible", "shouldBeVisible", "isNeeded", "domNode", "withFadeAway", "POINTER_DRAG_RESET_DISTANCE", "AbstractScrollbar", "Widget", "opts", "ScrollbarVisibilityController", "GlobalPointerMoveMonitor", "FastDomNode", "addDisposableListener", "eventType", "arrow", "ScrollbarArrow", "top", "left", "width", "height", "e", "visibleSize", "elementScrollSize", "elementScrollPosition", "domTop", "sliderStart", "sliderStop", "pointerPos", "offsetX", "offsetY", "domNodePosition", "getDomNodePagePosition", "offset", "initialPointerPosition", "initialPointerOrthogonalPosition", "initialScrollbarState", "pointerMoveData", "pointerOrthogonalPosition", "pointerOrthogonalDelta", "isWindows", "pointerDelta", "_desiredScrollPosition", "desiredScrollPosition", "scrollbarSize", "ScrollbarState", "_ScrollbarState", "arrowSize", "scrollbarSize", "oppositeScrollbarSize", "visibleSize", "scrollSize", "scrollPosition", "iVisibleSize", "iScrollSize", "iScrollPosition", "iArrowSize", "computedAvailableSize", "computedRepresentableSize", "computedIsNeeded", "computedSliderSize", "computedSliderRatio", "computedSliderPosition", "r", "offset", "desiredSliderPosition", "correctedOffset", "desiredScrollPosition", "delta", "HorizontalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "e", "offsetX", "offsetY", "size", "target", "VerticalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "hasArrows", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "offsetX", "offsetY", "size", "target", "delta", "currentPosition", "showArrows", "display", "arrow", "arrowSize", "MouseWheelClassifierItem", "timestamp", "deltaX", "deltaY", "_MouseWheelClassifier", "remainingInfluence", "score", "iteration", "index", "influence", "e", "isChrome", "targetWindow", "getWindow", "pageZoomFactor", "getZoomFactor", "previousItem", "item", "absDeltaX", "absDeltaY", "absPreviousDeltaX", "absPreviousDeltaY", "minDeltaX", "minDeltaY", "maxDeltaX", "maxDeltaY", "value", "MouseWheelClassifier", "SmoothScrollableElement", "Widget", "element", "options", "scrollable", "Emitter", "resolvedScrollable", "ownsScrollable", "Scrollable", "callback", "scheduleAtNextAnimationFrame", "resolveOptions", "scrollbarHost", "mouseWheelEvent", "VerticalScrollbar", "HorizontalScrollbar", "FastDomNode", "TimeoutTimer", "dispose", "dimensions", "update", "newClassName", "isMac", "newOptions", "browserEvent", "StandardWheelEvent", "shouldListen", "onMouseWheel", "addDisposableListener", "eventType", "classifier", "didScroll", "shiftConvert", "futureScrollPosition", "desiredScrollPosition", "deltaScrollTop", "desiredScrollTop", "deltaScrollLeft", "desiredScrollLeft", "consumeMouseWheel", "scrollState", "enableTop", "enableLeft", "leftClassName", "topClassName", "topLeftClassName", "opts", "result", "Viewport", "Disposable", "element", "screenElement", "_bufferService", "coreBrowserService", "_coreService", "mouseStateService", "themeService", "_optionsService", "_renderService", "Emitter", "scrollable", "Scrollable", "cb", "scheduleAtNextAnimationFrame", "SmoothScrollableElement", "type", "EventUtils", "toDisposable", "e", "disp", "pos", "line", "disableSmoothScroll", "showScrollbar", "showArrows", "verticalScrollbarSize", "ydisp", "newRow", "diff", "translationY", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "ICoreService", "IMouseStateService", "IThemeService", "IOptionsService", "IRenderService", "BufferDecorationRenderer", "Disposable", "_screenElement", "_bufferService", "_coreBrowserService", "_decorationService", "_renderService", "decoration", "toDisposable", "element", "x", "line", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "IDecorationService", "IRenderService", "ColorZoneStore", "decoration", "z", "padding", "zone", "line", "position", "drawHeight", "drawWidth", "drawX", "OverviewRulerRenderer", "Disposable", "_viewportElement", "_screenElement", "_bufferService", "_decorationService", "_renderService", "_optionsService", "_themeService", "_coreBrowserService", "ColorZoneStore", "toDisposable", "ctx", "scrollbar", "outerWidth", "innerWidth", "pixelsPerLine", "nonFullHeight", "cssCanvasHeight", "deviceCanvasHeight", "decoration", "zones", "zone", "updateCanvasDimensions", "updateAnchor", "__decorateClass", "__decorateParam", "IBufferService", "IDecorationService", "IRenderService", "IOptionsService", "IThemeService", "ICoreBrowserService", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "g", "b", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "XTERM_COMPOSITION_SESSION_START_EVENT", "XTERM_COMPOSITION_SESSION_END_EVENT", "XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT", "CompositionHelper", "_textarea", "_compositionView", "_bufferService", "_optionsService", "_coreService", "_renderService", "_themeService", "start", "end", "ev", "transactionId", "pending", "endData", "timer", "text", "repeatsPendingTextareaInput", "waitForPropagation", "wasComposing", "input", "includeFollowingInput", "textareaInput", "observedInput", "candidate", "observed", "findShortestOrder", "candidateFirstOverlap", "observedFirstOverlap", "overlap", "value", "suffixEnd", "compositionLength", "observedEnd", "suffix", "valueEnd", "dataAlreadySent", "settlesPending", "dispatchSessionEnd", "prevented", "event", "hadPreedit", "callback", "oldValue", "newValue", "diff", "data", "rowRemainder", "preeditText", "doc", "preedit", "caret", "children", "remainder", "buffer", "line", "width", "cellHeight", "colors", "cursor", "color", "background", "dontRecurse", "cursorX", "cursorTop", "cursorLeft", "maxWidth", "anchorBounds", "anchorLeft", "showsRemainder", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "ICoreService", "IRenderService", "IThemeService", "JoinedCellData", "AttributeData", "firstCell", "chars", "width", "value", "CharacterJoinerService", "_bufferService", "CellData", "handler", "joiner", "joinerId", "i", "row", "line", "ranges", "lineStr", "trimmedLength", "rangeStartColumn", "currentStringIndex", "rangeStartStringIndex", "rangeAttrFG", "rangeAttrBG", "x", "joinedRanges", "startIndex", "endIndex", "lineData", "startCol", "text", "allJoinedRanges", "error", "joinerRanges", "j", "currentRangeIndex", "currentRangeStarted", "currentRange", "length", "newRange", "inRange", "range", "__decorateClass", "__decorateParam", "IBufferService", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isBoxOrBlockGlyph", "codepoint", "treatGlyphAsBackgroundColor", "codepoint", "isPowerlineGlyph", "isBoxOrBlockGlyph", "createRenderDimensions", "createDimension", "DomRendererRowFactory", "_document", "_characterJoinerService", "_optionsService", "_coreBrowserService", "_coreService", "_decorationService", "_themeService", "CellData", "start", "end", "columnSelectMode", "lineData", "row", "isCursorRow", "cursorStyle", "cursorInactiveStyle", "cursorX", "cursorBlink", "blinkOn", "cellWidth", "widthCache", "linkStart", "linkEnd", "rowInfo", "elements", "joinedRanges", "colors", "lineLength", "charElement", "cellAmount", "text", "i", "oldBg", "oldFg", "oldExt", "oldLinkHover", "oldSpacing", "oldIsInSelection", "spacing", "skipJoinedCheckUntilX", "classes", "hasHover", "x", "width", "isJoined", "isValidJoinRange", "lastCharX", "cell", "range", "firstSelectionState", "JoinedCellData", "isInSelection", "isCursorCell", "isLinkHover", "isDecorated", "d", "chars", "AttributeData", "fg", "fgColorMode", "bg", "bgColorMode", "isInverse", "temp", "temp2", "bgOverride", "fgOverride", "isTop", "resolvedBg", "channels", "color", "element", "treatGlyphAsBackgroundColor", "cache", "adjustedColor", "ratio", "style", "y", "__decorateClass", "__decorateParam", "ICharacterJoinerService", "IOptionsService", "ICoreBrowserService", "ICoreService", "IDecorationService", "IThemeService", "WidthCache", "canvasFactory", "WidthCacheFontVariantCanvas", "font", "fontSize", "weight", "weightBold", "c", "bold", "italic", "cp", "width", "key", "variant", "throwIfFalsy", "fontFamily", "fontWeight", "fontStyle", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "nextTerminalId", "DomRenderer", "Disposable", "_terminal", "_document", "_element", "_screenElement", "_viewportElement", "_helperContainer", "_linkifier2", "instantiationService", "_charSizeService", "_optionsService", "_bufferService", "_coreService", "_coreBrowserService", "_themeService", "createSelectionRenderModel", "Emitter", "createRenderDimensions", "e", "DomRendererRowFactory", "CursorBlinkStateManager", "addDisposableListener", "toDisposable", "TextBlinkStateManager", "WidthCache", "dpr", "element", "styles", "colors", "color", "blinkAnimationUnderlineId", "blinkAnimationBarId", "blinkAnimationBlockId", "i", "c", "spacing", "cols", "rows", "row", "isVisible", "start", "end", "columnSelectMode", "oldViewportStart", "oldViewportEnd", "newViewportStart", "newViewportEnd", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "documentFragment", "isXFlipped", "startCol", "endCol", "middleRowsCount", "finalEndCol", "renderStartRow", "renderEndRow", "cursorViewportRow", "colStart", "colEnd", "rowCount", "left", "width", "buffer", "cursorAbsoluteY", "cursorX", "cursorBlink", "cursorStyle", "cursorInactiveStyle", "rowInfo", "y", "rowElement", "lineData", "x", "x2", "y2", "enabled", "maxY", "bufferline", "hasBlinkingCells", "__decorateClass", "__decorateParam", "IInstantiationService", "ICharSizeService", "IOptionsService", "IBufferService", "ICoreService", "ICoreBrowserService", "IThemeService", "_rowContainer", "CharSizeService", "Disposable", "document", "parentElement", "_optionsService", "Emitter", "TextMetricsMeasureStrategy", "DomMeasureStrategy", "result", "__decorateClass", "__decorateParam", "IOptionsService", "BaseMeasureStategy", "Disposable", "width", "height", "DomMeasureStrategy", "_document", "_parentElement", "_optionsService", "TextMetricsMeasureStrategy", "a", "metrics", "CoreBrowserService", "Disposable", "_textarea", "_window", "mainDocument", "Emitter", "ScreenDprMonitor", "w", "EventUtils", "addDisposableListener", "value", "_parentWindow", "MutableDisposable", "toDisposable", "parentWindow", "LinkProviderService", "Disposable", "toDisposable", "linkProvider", "providerIndex", "getCoordsRelativeToElement", "window", "event", "element", "rect", "elementStyle", "leftPadding", "topPadding", "getCoords", "colCount", "rowCount", "hasValidCharSize", "cssCellWidth", "cssCellHeight", "isSelection", "coords", "MouseCoordsService", "_charSizeService", "_renderService", "event", "element", "colCount", "rowCount", "isSelection", "getCoords", "getWindow", "coords", "getCoordsRelativeToElement", "__decorateClass", "__decorateParam", "ICharSizeService", "IRenderService", "mainWindow", "tail", "array", "n", "memoize", "_target", "key", "descriptor", "fnKey", "fn", "memoizeKey", "descriptorAny", "args", "_LinkedListNode", "element", "LinkedListNode", "LinkedList", "atTheEnd", "newNode", "oldLast", "oldFirst", "didRemove", "node", "anchor", "EventType", "_Gesture", "Disposable", "targetWindow", "addDisposableListener", "e", "remove", "toDisposable", "timestamp", "i", "len", "touch", "evt", "activeTouchCount", "data", "holdTime", "finalX", "finalY", "deltaT", "deltaX", "deltaY", "dispatchTo", "t", "type", "initialTarget", "event", "currentTime", "setTapCount", "ignoreTarget", "targets", "target", "depth", "now", "a", "b", "t1", "vX", "dirX", "x", "vY", "dirY", "y", "scheduleAtNextAnimationFrame", "deltaPosX", "deltaPosY", "stopped", "d", "__decorateClass", "Gesture", "MouseService", "_renderService", "_mouseCoordsService", "_mouseStateService", "_coreService", "_bufferService", "_optionsService", "_selectionService", "_logService", "_coreBrowserService", "target", "register", "focus", "element", "document", "requestedEvents", "ctx", "eventListeners", "ev", "AltMouseCursorController", "events", "toDisposable", "addDisposableListener", "Gesture", "EventType", "e", "pos", "but", "action", "deltaY", "stripAltFromReport", "sequence", "cellHeight", "lines", "i", "amount", "dpr", "targetWheelEventPixels", "report", "e1", "e2", "pixels", "__decorateClass", "__decorateParam", "IRenderService", "IMouseCoordsService", "IMouseStateService", "ICoreService", "IBufferService", "IOptionsService", "ISelectionService", "ILogService", "ICoreBrowserService", "_element", "_document", "_isActive", "MutableDisposable", "store", "DisposableStore", "syncFromModifier", "targetWindow", "altHeld", "RenderDebouncer", "_renderCallback", "_coreBrowserService", "callback", "rowStart", "rowEnd", "rowCount", "start", "end", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "DebouncedIdleTask", "RenderService", "Disposable", "_rowCount", "screenElement", "_optionsService", "_logService", "_charSizeService", "_coreService", "decorationService", "bufferService", "_coreBrowserService", "themeService", "MutableDisposable", "Emitter", "DebouncedIdleTask", "RenderDebouncer", "start", "end", "SynchronizedOutputHandler", "toDisposable", "w", "observer", "e", "entry", "sync", "isRedrawOnly", "buffered", "cols", "rows", "renderer", "callback", "columnSelectMode", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "ICharSizeService", "ICoreService", "IDecorationService", "IBufferService", "ICoreBrowserService", "IThemeService", "_onTimeout", "result", "moveToCellSequence", "targetX", "targetY", "bufferService", "applicationCursor", "startX", "startY", "resetStartingRow", "moveToRequestedRow", "moveToRequestedCol", "direction", "repeat", "sequence", "rowDifference", "cellsToMove", "colsFromRowEnd", "colsFromRowBeginning", "currX", "bufferLine", "wrappedRowsForRow", "startRow", "endRow", "rowsToMove", "wrappedRowsCount", "verticalDirection", "horizontalDirection", "wrappedRows", "i", "currentRow", "rowCount", "line", "lineWraps", "startCol", "endCol", "forward", "currentCol", "bufferStr", "mod", "count", "str", "rpt", "SelectionModel", "_bufferService", "startPlusLength", "start", "end", "amount", "getRangeLength", "range", "bufferCols", "NON_BREAKING_SPACE_CHAR", "ALL_NON_BREAKING_SPACE_REGEX", "SelectionService", "Disposable", "_element", "_screenElement", "_linkifier", "_bufferService", "_coreService", "_mouseCoordsService", "_optionsService", "_mouseStateService", "_renderService", "_coreBrowserService", "MutableDisposable", "CellData", "Emitter", "event", "amount", "e", "SelectionModel", "toDisposable", "start", "end", "buffer", "result", "startCol", "endCol", "i", "lineText", "startRowEndCol", "bufferLine", "line", "ALL_NON_BREAKING_SPACE_REGEX", "isWindows", "isLinuxMouseSelection", "isLinux", "coords", "x", "y", "allowWhitespaceOnlySelection", "range", "getRangeLength", "offset", "getCoordsRelativeToElement", "terminalHeight", "isMac", "hadSelection", "previousSelectionEnd", "timeElapsed", "coordinates", "sequence", "moveToCellSequence", "hasSelection", "charIndex", "length", "col", "row", "ev", "followWrappedLinesAbove", "followWrappedLinesBelow", "startIndex", "endIndex", "charOffset", "leftWideCharCount", "rightWideCharCount", "leftLongCharOffset", "rightLongCharOffset", "previousBufferLine", "previousLineWordPosition", "nextBufferLine", "nextLineWordPosition", "wordPosition", "endRow", "cell", "wrappedRange", "__decorateClass", "__decorateParam", "IBufferService", "ICoreService", "IMouseCoordsService", "IOptionsService", "IMouseStateService", "IRenderService", "ICoreBrowserService", "TwoKeyMap", "first", "second", "value", "ColorContrastCache", "TwoKeyMap", "bg", "fg", "value", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "DEFAULT_FOREGROUND", "css", "DEFAULT_BACKGROUND", "DEFAULT_CURSOR", "DEFAULT_CURSOR_ACCENT", "DEFAULT_SELECTION", "DEFAULT_OVERVIEW_RULER_BORDER", "ThemeService", "Disposable", "_optionsService", "ColorContrastCache", "Emitter", "color", "DEFAULT_ANSI_COLORS", "theme", "colors", "parseColor", "NULL_COLOR", "colorCount", "i", "slot", "callback", "__decorateClass", "__decorateParam", "IOptionsService", "cssString", "fallback", "KEYCODE_KEY_MAPPINGS", "evaluateKeyboardEvent", "ev", "applicationCursorMode", "isMac", "macOptionIsMeta", "result", "modifiers", "key", "keyCode", "keyString", "KittyKeyboard", "ev", "suffix", "mods", "macOptionAsAlt", "numpadCode", "modifierCode", "funcCode", "digit", "code", "letter", "modifiers", "eventType", "reportEventTypes", "needsEventType", "seq", "number", "keyCode", "flags", "isFunc", "isMod", "reportAlternateKeys", "shiftedKey", "textCode", "result", "csiLetter", "ss3Letter", "tildeCode", "specialKey", "legacyByte", "Win32InputMode", "ev", "vk", "controlChar", "codePoint", "state", "isKeyDown", "sc", "uc", "kd", "cs", "KeyboardService", "_coreService", "_optionsService", "Win32InputMode", "KittyKeyboard", "event", "kittyFlags", "isMac", "evaluateKeyboardEvent", "__decorateClass", "__decorateParam", "ICoreService", "IOptionsService", "ServiceCollection", "entries", "id", "service", "instance", "result", "callback", "key", "value", "InstantiationService", "IInstantiationService", "ctor", "args", "serviceDependencies", "getServiceDependencies", "a", "b", "serviceArgs", "dependency", "firstServiceArgPos", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "optionalParams", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "CircularList", "Disposable", "_maxLength", "Emitter", "newMaxLength", "newArray", "i", "newLength", "index", "value", "start", "deleteCount", "items", "countToTrim", "count", "offset", "expandListBy", "StringBuilder", "chunk", "LimitedStringBuilder", "_limit", "DEFAULT_ATTR_DATA", "AttributeData", "$startIndex", "$workCell", "CellData", "$translateToStringBuilder", "StringBuilder", "BufferLine", "_BufferLine", "_stringCache", "cols", "fillCellData", "isWrapped", "cell", "i", "index", "content", "cp", "stringFromCodePoint", "value", "codePoint", "width", "attrs", "pos", "n", "start", "end", "respectProtect", "uint32Cells", "data", "keys", "key", "extKeys", "line", "newLine", "src", "srcCol", "destCol", "length", "applyInReverse", "srcData", "trimRight", "startCol", "endCol", "outColumns", "isCanonicalRequest", "stringCacheEntry", "chars", "result", "cacheEntry", "createIfNeeded", "cachedEntry", "srcStart", "BufferLineStringCache", "Disposable", "MutableDisposable", "toDisposable", "entry", "timeoutMs", "disposableTimeout", "elapsed", "reflowLargerGetLinesToRemove", "lines", "oldCols", "newCols", "bufferAbsoluteY", "nullCell", "reflowCursorLine", "toRemove", "y", "i", "nextLine", "wrappedLines", "destLineIndex", "destCol", "getWrappedLineTrimmedLength", "srcLineIndex", "srcCol", "srcTrimmedTineLength", "srcRemainingCells", "destRemainingCells", "cellsToCopy", "countToRemove", "reflowLargerCreateNewLayout", "layout", "nextToRemoveIndex", "nextToRemoveStart", "countRemovedSoFar", "reflowLargerApplyNewLayout", "newLayout", "newLayoutLines", "reflowSmallerGetNewLineLengths", "newLineLengths", "cellsNeeded", "srcLine", "cellsAvailable", "oldTrimmedLength", "endsWithWide", "lineLength", "cols", "endsInNull", "followingLineStartsWithWide", "_Marker", "line", "Emitter", "dispose", "disposable", "Marker", "CHARSETS", "DEFAULT_CHARSET", "MAX_BUFFER_SIZE", "Buffer", "Disposable", "_hasScrollback", "_optionsService", "_bufferService", "_logService", "DEFAULT_ATTR_DATA", "DEFAULT_CHARSET", "CellData", "CircularList", "IdleTaskQueue", "toDisposable", "BufferLineStringCache", "attr", "ExtendedAttrs", "isWrapped", "BufferLine", "relativeY", "rows", "correctBufferLength", "fillAttr", "newCols", "newRows", "nullCell", "dirtyMemoryLines", "newMaxLength", "i", "addToY", "y", "amountToTrim", "maxY", "normalRun", "counted", "windowsPty", "reflowCursorLine", "toRemove", "reflowLargerGetLinesToRemove", "newLayoutResult", "reflowLargerCreateNewLayout", "reflowLargerApplyNewLayout", "countRemoved", "viewportAdjustments", "toInsert", "countToInsert", "nextLine", "wrappedLines", "absoluteY", "lastLineLength", "destLineLengths", "reflowSmallerGetNewLineLengths", "linesToAdd", "trimmedLines", "newLines", "newLine", "destLineIndex", "destCol", "srcLineIndex", "srcCol", "cellsToCopy", "wrappedLinesIndex", "getWrappedLineTrimmedLength", "insertEvents", "originalLines", "originalLinesLength", "originalLineIndex", "nextToInsertIndex", "nextToInsert", "countInsertedSoFar", "nextI", "insertCountEmitted", "lineIndex", "trimRight", "startCol", "endCol", "line", "first", "last", "x", "marker", "Marker", "amount", "event", "BufferSet", "Disposable", "_optionsService", "_bufferService", "_logService", "MutableDisposable", "Emitter", "Buffer", "fillAttr", "newCols", "newRows", "i", "BufferService", "Disposable", "optionsService", "logService", "Emitter", "BufferSet", "e", "cols", "rows", "colsChanged", "rowsChanged", "eraseAttr", "isWrapped", "buffer", "newLine", "topRow", "bottomRow", "willBufferBeTrimmed", "scrollRegionHeight", "disp", "suppressScrollEvent", "oldYdisp", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "DEFAULT_OPTIONS", "isMac", "FONT_WEIGHT_OPTIONS", "OptionsService", "Disposable", "options", "Emitter", "defaultOptions", "key", "newValue", "e", "toDisposable", "listener", "eventKey", "keys", "getter", "propName", "setter", "value", "desc", "isCursorStyle", "DEFAULT_MODES", "DEFAULT_DEC_PRIVATE_MODES", "DEFAULT_KITTY_KEYBOARD_STATE", "CoreService", "Disposable", "_bufferService", "_logService", "_optionsService", "Emitter", "data", "wasUserInput", "buffer", "e", "__decorateClass", "__decorateParam", "IBufferService", "ILogService", "IOptionsService", "DEFAULT_PROTOCOLS", "e", "eventCode", "e", "isSGR", "code", "S", "DEFAULT_ENCODINGS", "params", "final", "MouseStateService", "Disposable", "Emitter", "name", "DEFAULT_PROTOCOLS", "protocol", "encoding", "customWheelEventHandler", "ev", "UnicodeService", "_UnicodeService", "Emitter", "value", "state", "width", "shouldJoin", "version", "provider", "num", "s", "result", "precedingInfo", "length", "i", "code", "second", "currentInfo", "chWidth", "codepoint", "preceding", "BMP_COMBINING", "HIGH_COMBINING", "table", "bisearch", "ucs", "data", "min", "max", "mid", "UnicodeV6", "r", "num", "codepoint", "preceding", "width", "shouldJoin", "oldWidth", "UnicodeService", "CharsetService", "g", "charset", "updateWindowsModeWrappedState", "bufferService", "lastChar", "nextLine", "Params", "_Params", "maxLength", "maxSubParamsLength", "values", "params", "value", "k", "newParams", "res", "i", "start", "end", "idx", "result", "length", "store", "cur", "EMPTY_HANDLERS", "OscParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "code", "success", "promiseResult", "handlerResult", "fallThrough", "_OscHandler", "_handler", "LimitedStringBuilder", "ret", "res", "OscHandler", "EMPTY_HANDLERS", "DcsParser", "ident", "handler", "handlerList", "handlerIndex", "j", "params", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "EMPTY_PARAMS", "Params", "_DcsHandler", "_handler", "LimitedStringBuilder", "ret", "res", "DcsHandler", "EMPTY_HANDLERS", "ApcParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "_ApcHandler", "_handler", "LimitedStringBuilder", "ret", "res", "ApcHandler", "TransitionTable", "length", "action", "next", "code", "state", "codes", "i", "NON_ASCII_PRINTABLE", "VT500_TRANSITION_TABLE", "table", "blueprint", "unused", "r", "start", "end", "PRINTABLES", "EXECUTABLES", "states", "EscapeSequenceParser", "Disposable", "_transitions", "Params", "data", "ident", "params", "toDisposable", "OscParser", "DcsParser", "ApcParser", "id", "finalRange", "res", "intermediate", "finalCode", "handler", "handlerList", "handlerIndex", "flag", "callback", "handlers", "handlerPos", "transition", "chunkPos", "promiseResult", "handlerResult", "k", "ch", "csiDone", "j", "c", "l4", "handlersEsc", "jj", "RGB_REX", "HASH_REX", "parseColor", "data", "low", "m", "base", "adv", "result", "i", "c", "pad", "bits", "s", "s2", "toRgbString", "color", "r", "g", "b", "XTERM_VERSION", "GLEVEL", "paramToWindowOption", "opts", "$temp", "InputHandler", "Disposable", "_bufferService", "_charsetService", "_coreService", "_logService", "_optionsService", "_oscLinkService", "_mouseStateService", "_unicodeService", "_parser", "EscapeSequenceParser", "StringToUtf32", "Utf8ToUtf32", "DEFAULT_ATTR_DATA", "Emitter", "DirtyRowTracker", "e", "ident", "params", "code", "identifier", "action", "data", "payload", "start", "end", "OscHandler", "flag", "CHARSETS", "state", "DcsHandler", "cursorStartX", "cursorStartY", "decodedLength", "position", "p", "slowTimeout", "slowPromise", "_res", "rej", "err", "promiseResult", "result", "wasPaused", "i", "len", "viewportEnd", "viewportStart", "chWidth", "charset", "screenReaderMode", "cols", "wraparoundMode", "insertMode", "curAttr", "bufferRow", "precedingJoinState", "pos", "ch", "currentInfo", "UnicodeService", "shouldJoin", "oldWidth", "stringFromCodePoint", "linkId", "oldRow", "oldCol", "BufferLine", "offset", "delta", "id", "callback", "paramToWindowOption", "ApcHandler", "line", "originalX", "maxCol", "x", "y", "diffToTop", "diffToBottom", "param", "clearWrap", "respectProtect", "j", "nextLine", "scrollBackSize", "row", "scrollBottomRowsOffset", "scrollBottomAbsolute", "joinState", "length", "text", "idata", "itext", "tlength", "XTERM_VERSION", "term", "DEFAULT_CHARSET", "ansi", "V", "dm", "mouseProtocol", "mouseEncoding", "cs", "buffers", "active", "alt", "opts", "f", "m", "v", "b2v", "value", "color", "mode", "c1", "c2", "c3", "AttributeData", "attr", "accu", "cSpace", "advance", "subparams", "style", "l", "isBlinking", "top", "bottom", "second", "event", "slots", "idx", "spec", "index", "isValidColorIndex", "parseColor", "uri", "parsedParams", "idParamIndex", "collectAndFlag", "GLEVEL", "scrollRegionHeight", "level", "cell", "CellData", "yOffset", "s", "b", "STYLES", "y1", "y2", "flags", "stack", "count", "__decorateClass", "__decorateParam", "IBufferService", "WriteBuffer", "Disposable", "_action", "TimeoutTimer", "Emitter", "toDisposable", "chunk", "didProcess", "cb", "data", "maxSubsequentCalls", "callback", "lastTime", "promiseResult", "startTime", "result", "continuation", "r", "err", "OscLinkService", "_bufferService", "data", "buffer", "marker", "entry", "castData", "key", "match", "linkId", "y", "e", "linkData", "index", "__decorateClass", "__decorateParam", "IBufferService", "hasWriteSyncWarnHappened", "CoreTerminal", "Disposable", "options", "MutableDisposable", "Emitter", "InstantiationService", "OptionsService", "IOptionsService", "LogService", "ILogService", "BufferService", "IBufferService", "CoreService", "ICoreService", "MouseStateService", "IMouseStateService", "UnicodeService", "UnicodeV6", "IUnicodeService", "CharsetService", "ICharsetService", "OscLinkService", "IOscLinkService", "InputHandler", "EventUtils", "WriteBuffer", "data", "promiseResult", "ev", "key", "callback", "maxSubsequentCalls", "wasUserInput", "x", "y", "eraseAttr", "isWrapped", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "id", "ident", "value", "windowsPty", "disposables", "updateWindowsModeWrappedState", "toDisposable", "d", "i", "SortedList", "_getKey", "logService", "IdleTaskQueue", "value", "sortedAddedValues", "a", "b", "sortedAddedValuesIndex", "arrayIndex", "newArray", "newArrayIndex", "key", "sortedDeletedIndices", "sortedDeletedIndicesIndex", "callback", "min", "max", "mid", "midKey", "$xmin", "$xmax", "DecorationService", "Disposable", "_logService", "_bufferService", "DecorationLineCache", "Emitter", "SortedList", "e", "toDisposable", "options", "decoration", "Decoration", "markerDispose", "listener", "d", "x", "line", "layer", "bucket", "callback", "__decorateClass", "__decorateParam", "ILogService", "IBufferService", "MutableDisposable", "MicrotaskTimer", "lines", "store", "DisposableStore", "amount", "event", "start", "height", "index", "callbacks", "cb", "newMap", "newLine", "existing", "i", "len", "spanCrossers", "deleteEnd", "toReindex", "css", "RENDER_DEBOUNCE_THRESHOLD_MS", "TimeBasedDebouncer", "_renderCallback", "_debounceThresholdMS", "rowStart", "rowEnd", "rowCount", "refreshRequestTime", "elapsed", "waitPeriodBeforeTrailingRefresh", "start", "end", "DEBUG", "AccessibilityManager", "Disposable", "_terminal", "instantiationService", "_coreBrowserService", "_renderService", "doc", "i", "e", "TimeBasedDebouncer", "char", "spaceCount", "addDisposableListener", "toDisposable", "tooMuchOutput", "keyChar", "start", "end", "buffer", "setSize", "line", "columns", "lineData", "posInSet", "element", "position", "boundaryElement", "beforeBoundaryElement", "lastRowPos", "topBoundaryElement", "bottomBoundaryElement", "newElement", "selection", "begin", "lastRowElement", "toRowColumn", "node", "offset", "rowElement", "row", "column", "beginRowColumn", "endRowColumn", "rows", "width", "lastColumn", "targetWidth", "__decorateClass", "__decorateParam", "IInstantiationService", "ICoreBrowserService", "IRenderService", "Linkifier", "Disposable", "_element", "_mouseCoordsService", "_renderService", "_bufferService", "_linkProviderService", "Emitter", "toDisposable", "dispose", "addDisposableListener", "event", "position", "composedPath", "i", "target", "useLineCache", "reply", "linkWithState", "linkProvided", "linkProvider", "links", "linksWithState", "link", "y", "replies", "occupiedCells", "providerReply", "startX", "endX", "x", "index", "hasLinkBefore", "j", "linkAtPosition", "currentLink", "linkEquals", "startRow", "endRow", "v", "e", "start", "end", "element", "showEvent", "range", "scrollOffset", "lower", "upper", "current", "coords", "x1", "y1", "x2", "y2", "fg", "__decorateClass", "__decorateParam", "IMouseCoordsService", "IRenderService", "IBufferService", "ILinkProviderService", "a", "b", "CoreBrowserTerminal", "CoreTerminal", "options", "MutableDisposable", "Platform_exports", "Emitter", "DecorationService", "IDecorationService", "KeyboardService", "IKeyboardService", "LinkProviderService", "ILinkProviderService", "OscLinkProvider", "e", "type", "event", "EventUtils", "toDisposable", "dimensions", "req", "acc", "ident", "colorRgb", "color", "toRgbString", "colors", "channels", "narrowedAcc", "bgLuminance", "rgb", "fgLuminance", "colorSchemeMode", "value", "AccessibilityManager", "ev", "CompositionHelper", "cursorY", "bufferLine", "cursorX", "cellHeight", "width", "cellWidth", "cursorTop", "cursorLeft", "addDisposableListener", "copyHandler", "pasteHandlerWrapper", "handlePasteEvent", "isFirefox", "rightClickHandler", "isLinux", "moveTextAreaUnderMouseCursor", "parent", "fragment", "textarea", "promptLabel", "isChromeOS", "CoreBrowserService", "ICoreBrowserService", "CharSizeService", "ICharSizeService", "ThemeService", "IThemeService", "CharacterJoinerService", "ICharacterJoinerService", "RenderService", "IRenderService", "MouseCoordsService", "IMouseCoordsService", "linkifier", "Linkifier", "Viewport", "SelectionService", "ISelectionService", "MouseService", "IMouseService", "text", "BufferDecorationRenderer", "showScrollbar", "overviewRulerWidth", "OverviewRulerRenderer", "shouldShow", "amount", "disposable", "DomRenderer", "start", "end", "sync", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "data", "paste", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "shouldIgnoreComposition", "result", "scrollCount", "wasModifierOnly", "wasModifierKeyOnlyEvent", "browser", "thirdLevelKey", "key", "x", "y", "i", "DEFAULT_ATTR_DATA", "canvasWidth", "canvasHeight", "AddonManager", "i", "terminal", "instance", "loadedAddon", "index", "BufferLineApiView", "_line", "x", "cell", "CellData", "trimRight", "startColumn", "endColumn", "BufferApiView", "_buffer", "type", "buffer", "y", "line", "BufferLineApiView", "CellData", "BufferNamespaceApi", "Disposable", "_core", "Emitter", "BufferApiView", "ParserApi", "_core", "id", "callback", "params", "data", "handler", "ident", "UnicodeApi", "_core", "provider", "version", "CONSTRUCTOR_ONLY_OPTIONS", "$value", "Terminal", "Disposable", "options", "CoreBrowserTerminal", "AddonManager", "getter", "propName", "setter", "value", "desc", "ParserApi", "UnicodeApi", "BufferNamespaceApi", "m", "mouseTrackingMode", "data", "wasUserInput", "columns", "rows", "parent", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "start", "end", "amount", "pageCount", "line", "callback", "addon", "promptLabel", "tooMuchOutput", "values"] +- "sources": ["../src/browser/LocalizableStrings.ts", "../src/browser/Clipboard.ts", "../src/common/input/TextDecoder.ts", "../src/common/buffer/AttributeData.ts", "../src/common/buffer/CellData.ts", "../src/common/services/ServiceRegistry.ts", "../src/common/services/Services.ts", "../src/browser/OscLinkProvider.ts", "../src/browser/services/Services.ts", "../src/common/Lifecycle.ts", "../src/common/Async.ts", "../src/browser/Dom.ts", "../src/browser/scrollable/fastDomNode.ts", "../src/common/Platform.ts", "../src/browser/scrollable/mouseEvent.ts", "../src/browser/scrollable/globalPointerMoveMonitor.ts", "../src/browser/scrollable/widget.ts", "../src/browser/scrollable/scrollbarArrow.ts", "../src/common/Event.ts", "../src/browser/scrollable/scrollable.ts", "../src/browser/scrollable/scrollbarVisibilityController.ts", "../src/browser/scrollable/abstractScrollbar.ts", "../src/browser/scrollable/scrollbarState.ts", "../src/browser/scrollable/horizontalScrollbar.ts", "../src/browser/scrollable/verticalScrollbar.ts", "../src/browser/scrollable/scrollableElement.ts", "../src/browser/Viewport.ts", "../src/browser/decorations/BufferDecorationRenderer.ts", "../src/browser/decorations/ColorZoneStore.ts", "../src/browser/decorations/OverviewRulerRenderer.ts", "../src/browser/input/CompositionHelper.ts", "../src/common/Color.ts", "../src/browser/services/CharacterJoinerService.ts", "../src/browser/renderer/shared/RendererUtils.ts", "../src/browser/renderer/dom/DomRendererRowFactory.ts", "../src/browser/renderer/dom/WidthCache.ts", "../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/browser/renderer/dom/DomRenderer.ts", "../src/browser/services/CharSizeService.ts", "../src/browser/services/CoreBrowserService.ts", "../src/browser/services/LinkProviderService.ts", "../src/browser/input/Mouse.ts", "../src/browser/services/MouseCoordsService.ts", "../src/browser/scrollable/touch.ts", "../src/browser/services/MouseService.ts", "../src/browser/RenderDebouncer.ts", "../src/common/TaskQueue.ts", "../src/browser/services/RenderService.ts", "../src/browser/input/MoveToCell.ts", "../src/browser/selection/SelectionModel.ts", "../src/common/buffer/BufferRange.ts", "../src/browser/services/SelectionService.ts", "../src/common/MultiKeyMap.ts", "../src/browser/ColorContrastCache.ts", "../src/browser/Types.ts", "../src/browser/services/ThemeService.ts", "../src/common/input/Keyboard.ts", "../src/common/input/KittyKeyboard.ts", "../src/common/input/Win32InputMode.ts", "../src/browser/services/KeyboardService.ts", "../src/common/services/InstantiationService.ts", "../src/common/services/LogService.ts", "../src/common/CircularList.ts", "../src/common/buffer/BufferLine.ts", "../src/common/buffer/BufferReflow.ts", "../src/common/buffer/Marker.ts", "../src/common/data/Charsets.ts", "../src/common/buffer/Buffer.ts", "../src/common/buffer/BufferSet.ts", "../src/common/services/BufferService.ts", "../src/common/services/OptionsService.ts", "../src/common/services/CoreService.ts", "../src/common/services/MouseStateService.ts", "../src/common/services/UnicodeService.ts", "../src/common/input/UnicodeV6.ts", "../src/common/services/CharsetService.ts", "../src/common/WindowsMode.ts", "../src/common/parser/Params.ts", "../src/common/StringBuilder.ts", "../src/common/parser/OscParser.ts", "../src/common/parser/DcsParser.ts", "../src/common/parser/ApcParser.ts", "../src/common/parser/EscapeSequenceParser.ts", "../src/common/input/XParseColor.ts", "../src/common/Version.ts", "../src/common/InputHandler.ts", "../src/common/input/WriteBuffer.ts", "../src/common/services/OscLinkService.ts", "../src/common/CoreTerminal.ts", "../src/common/SortedList.ts", "../src/common/services/DecorationService.ts", "../src/browser/TimeBasedDebouncer.ts", "../src/browser/AccessibilityManager.ts", "../src/browser/Linkifier.ts", "../src/browser/CoreBrowserTerminal.ts", "../src/common/public/AddonManager.ts", "../src/common/public/BufferLineApiView.ts", "../src/common/public/BufferApiView.ts", "../src/common/public/BufferNamespaceApi.ts", "../src/common/public/ParserApi.ts", "../src/common/public/UnicodeApi.ts", "../src/browser/public/Terminal.ts"], +- "sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (\u241B).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._compositionView.textContent = '';\n this._dataAlreadySent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long\n // compositions\n this._compositionView.textContent = `\\u200E${ev.data}\\u200E`;\n this.updateCompositionElements();\n setTimeout(() => {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max( this._compositionPosition.start, end);\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n const currentCompositionSuffix = this._compositionSuffix;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n // Add length of data already sent due to keydown event,\n // otherwise input characters can be duplicated. (Issue #3191)\n currentCompositionPosition.start += this._dataAlreadySent.length;\n if (this._isComposing) {\n // Use the start position of the new composition to get the string\n // if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, this._compositionPosition.start);\n } else {\n // Keep support for non-composition characters typed immediately after composition end\n // while avoiding re-sending the trailing text that was already present\n // before composition started.\n const value = this._textarea.value;\n const valueEnd = currentCompositionSuffix.length > 0 && value.endsWith(currentCompositionSuffix)\n ? value.length - currentCompositionSuffix.length\n : value.length;\n input = value.substring(currentCompositionPosition.start, Math.max(currentCompositionPosition.start, valueEnd));\n }\n if (input.length > 0) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n this._compositionView.style.direction = 'rtl';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n", "import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n readonly mouseupListener: MutableDisposable;\n readonly mousedragListener: MutableDisposable;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const mouseupListener = new MutableDisposable();\n const mousedragListener = new MutableDisposable();\n register(mouseupListener);\n register(mousedragListener);\n const ctx: IMouseBindContext = { target, focus, requestedEvents, mouseupListener, mousedragListener };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n ctx.mouseupListener.clear();\n ctx.mousedragListener.clear();\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n // Use the element's current document in case it moved to another window after open.\n const { element, document: targetDocument } = ctx.target;\n const listenerDocument = element.ownerDocument ?? targetDocument;\n if (ctx.requestedEvents.mouseup) {\n ctx.mouseupListener.value = addDisposableListener(listenerDocument, 'mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.mousedragListener.value = addDisposableListener(listenerDocument, 'mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n ctx.mouseupListener.clear();\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n ctx.mousedragListener.clear();\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec \u00A7 \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" \u2014 i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\n\ninterface IExtendedAttrsExt extends IExtendedAttrs {\n _ext: number;\n _urlId: number;\n}\n\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $extended = DEFAULT_ATTR_DATA.extended.clone() as IExtendedAttrsExt;\n\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n public length: number;\n\n /** line text cache */\n protected _cacheValid = false;\n protected _cache: string = '';\n protected _cacheTrimmed = false;\n\n constructor(\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._cacheValid = false;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n // We use $extended as blueprint and reset the internals\n // mimicking the ctor to avoid a new allocation.\n $extended._ext = 0;\n $extended._urlId = 0;\n cell.extended = $extended;\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._cacheValid = false;\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._cacheValid = false;\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n const $idx = index * Constants.CELL_INDICIES;\n this._data[$idx + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[$idx + Cell.FG] = attrs.fg;\n this._data[$idx + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._cacheValid = false;\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._cacheValid = false;\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine, blank?: boolean): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n if (blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n this._combined = {};\n this._extendedAttrs = {};\n } else {\n this._copySparseMapsFrom(line);\n }\n this._cache = '';\n this._cacheValid = false;\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(blank?: boolean): IBufferLine {\n const newLine = new BufferLine(0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n if (!blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n newLine._copySparseMapsFrom(this);\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._cacheValid = false;\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonical = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonical && this._cacheValid) {\n if (trimRight) {\n return this._cacheTrimmed ? this._cache : this._cache.trimEnd();\n }\n if (!this._cacheTrimmed) {\n return this._cache;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n const cellContents: string[] = [];\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n cellContents.push(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = cellContents.join('');\n if (isCanonical) {\n this._cache = result;\n this._cacheValid = true;\n this._cacheTrimmed = !!trimRight;\n }\n return result;\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '\u25C6'\n 'a': '\\u2592', // '\u2592'\n 'b': '\\u2409', // '\u2409' (HT)\n 'c': '\\u240c', // '\u240C' (FF)\n 'd': '\\u240d', // '\u240D' (CR)\n 'e': '\\u240a', // '\u240A' (LF)\n 'f': '\\u00b0', // '\u00B0'\n 'g': '\\u00b1', // '\u00B1'\n 'h': '\\u2424', // '\u2424' (NL)\n 'i': '\\u240b', // '\u240B' (VT)\n 'j': '\\u2518', // '\u2518'\n 'k': '\\u2510', // '\u2510'\n 'l': '\\u250c', // '\u250C'\n 'm': '\\u2514', // '\u2514'\n 'n': '\\u253c', // '\u253C'\n 'o': '\\u23ba', // '\u23BA'\n 'p': '\\u23bb', // '\u23BB'\n 'q': '\\u2500', // '\u2500'\n 'r': '\\u23bc', // '\u23BC'\n 's': '\\u23bd', // '\u23BD'\n 't': '\\u251c', // '\u251C'\n 'u': '\\u2524', // '\u2524'\n 'v': '\\u2534', // '\u2534'\n 'w': '\\u252c', // '\u252C'\n 'x': '\\u2502', // '\u2502'\n 'y': '\\u2264', // '\u2264'\n 'z': '\\u2265', // '\u2265'\n '{': '\\u03c0', // '\u03C0'\n '|': '\\u2260', // '\u2260'\n '}': '\\u00a3', // '\u00A3'\n '~': '\\u00b7' // '\u00B7'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '\u00A3'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '\u00A3',\n '@': '\u00BE',\n '[': 'ij',\n '\\\\': '\u00BD',\n ']': '|',\n '{': '\u00A8',\n '|': 'f',\n '}': '\u00BC',\n '~': '\u00B4'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '\u00A3',\n '@': '\u00E0',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00A7',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00A8'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': '\u00E0',\n '[': '\u00E2',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n '`': '\u00F4',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00FB'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '\u00A7',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00DC',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00DF'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00E9',\n '`': '\u00F9',\n '{': '\u00E0',\n '|': '\u00F2',\n '}': '\u00E8',\n '~': '\u00EC'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': '\u00C4',\n '[': '\u00C6',\n '\\\\': '\u00D8',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E4',\n '{': '\u00E6',\n '|': '\u00F8',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00A1',\n '\\\\': '\u00D1',\n ']': '\u00BF',\n '{': '\u00B0',\n '|': '\u00F1',\n '}': '\u00E7'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': '\u00C9',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': '\u00F9',\n '@': '\u00E0',\n '[': '\u00E9',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n\n '_': '\u00E8',\n '`': '\u00F4',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00FB'\n};\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine, true);\n } else {\n buffer.lines.push(newLine.clone(true));\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone(true));\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone(true));\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n\u00B2) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.303';\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // isUserScrolling tracks the normal buffer's viewport, so ED3 on the alt\n // screen must not touch it\n if (this._activeBuffer === this._bufferService.buffers.normal) {\n this._bufferService.isUserScrolling = false;\n }\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n", "\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n", "/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0 || !this._decorationsByLine.size) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this.coreService.triggerDataEvent(key, true);\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n"], +- "mappings": "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AAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,I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", +- "names": ["promptLabelInternal", "promptLabel", "value", "tooMuchOutputInternal", "tooMuchOutput", "prepareTextForTerminal", "text", "bracketTextForPaste", "bracketedPasteMode", "copyHandler", "ev", "selectionService", "handlePasteEvent", "textarea", "coreService", "optionsService", "paste", "moveTextAreaUnderMouseCursor", "screenElement", "pos", "left", "top", "rightClickHandler", "shouldSelectWord", "stringFromCodePoint", "codePoint", "utf32ToString", "data", "start", "end", "result", "i", "codepoint", "StringToUtf32", "input", "target", "length", "size", "startPos", "second", "code", "Utf8ToUtf32", "byte1", "byte2", "byte3", "byte4", "discardInterim", "cp", "pos", "tmp", "type", "missing", "fourStop", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "serviceRegistry", "getServiceDependencies", "ctor", "createDecorator", "id", "decorator", "target", "key", "index", "storeServiceDependency", "IBufferService", "createDecorator", "IMouseStateService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "OscLinkProvider", "_bufferService", "_optionsService", "_oscLinkService", "CellData", "y", "callback", "line", "result", "linkHandler", "cell", "lineLength", "currentLinkId", "currentStart", "finishLink", "x", "text", "endX", "range", "ignoreLink", "parsed", "e", "defaultActivate", "startX", "linkId", "startY", "finalStartX", "endY", "finalEndX", "previousLine", "previousLineLength", "previousStartX", "currentLine", "currentLineLength", "nextLine", "nextLineLength", "nextEndX", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "IOscLinkService", "uri", "newWindow", "ICharSizeService", "createDecorator", "ICoreBrowserService", "IMouseCoordsService", "IMouseService", "IRenderService", "ISelectionService", "ICharacterJoinerService", "IThemeService", "ILinkProviderService", "IKeyboardService", "toDisposable", "fn", "dispose", "arg", "d", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "TimeoutTimer", "runner", "timeout", "MicrotaskTimer", "IntervalTimer", "interval", "context", "handle", "getWindow", "e", "candidateNode", "candidateEvent", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "addStandardDisposableListener", "useCapture", "eventType", "getDomNodePagePosition", "domNode", "bb", "win", "AnimationFrameQueueItem", "_runner", "priority", "a", "b", "animationFrameState", "getAnimationFrameState", "targetWindow", "state", "animationFrameRunner", "scheduleAtNextAnimationFrame", "runner", "item", "WindowIntervalTimer", "IntervalTimer", "interval", "FastDomNode", "domNode", "_width", "width", "numberAsPixels", "_height", "height", "_top", "top", "_left", "left", "_bottom", "bottom", "_right", "right", "className", "shouldHaveIt", "position", "layerHint", "contain", "name", "value", "Platform_exports", "__export", "getSafariVersion", "getZoomFactor", "isChrome", "isChromeOS", "isFirefox", "isLegacyEdge", "isLinux", "isMac", "isNode", "isSafari", "isWindows", "userAgent", "platform", "_targetWindow", "majorVersion", "sameOriginWindowChainCache", "getParentWindowIfSameOrigin", "w", "location", "parentLocation", "IframeUtils", "targetWindow", "windowChainCache", "parent", "childWindow", "ancestorWindow", "top", "left", "windowChain", "windowChainEl", "windowInChain", "boundingRect", "StandardMouseEvent", "iframeOffsets", "StandardWheelEvent", "e", "deltaX", "deltaY", "shouldFactorDPR", "isChrome", "chromeVersionMatch", "e1", "e2", "devicePixelRatio", "ev", "isFirefox", "isMac", "isSafari", "isWindows", "GlobalPointerMoveMonitor", "DisposableStore", "invokeStopCallback", "onStopCallback", "initialElement", "pointerId", "initialButtons", "pointerMoveCallback", "eventSource", "toDisposable", "getWindow", "addDisposableListener", "eventType", "e", "Widget", "Disposable", "domNode", "listener", "addDisposableListener", "eventType", "e", "StandardMouseEvent", "getWindow", "ScrollbarArrow", "Widget", "opts", "arrowSize", "GlobalPointerMoveMonitor", "addStandardDisposableListener", "eventType", "e", "WindowIntervalTimer", "TimeoutTimer", "scheduleRepeater", "getWindow", "pointerMoveData", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "i", "len", "EventUtils", "forward", "from", "to", "e", "map", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "ScrollState", "_ScrollState", "_forceIntegerValues", "width", "scrollWidth", "scrollLeft", "height", "scrollHeight", "scrollTop", "other", "update", "useRawScrollPositions", "previous", "inSmoothScrolling", "widthChanged", "scrollWidthChanged", "scrollLeftChanged", "heightChanged", "scrollHeightChanged", "scrollTopChanged", "Scrollable", "Disposable", "options", "Emitter", "smoothScrollDuration", "scrollPosition", "dimensions", "newState", "reuseAnimation", "validTarget", "newSmoothScrolling", "SmoothScrollingOperation", "oldState", "SmoothScrollingUpdate", "isDone", "createEaseOutCubic", "from", "to", "delta", "completion", "easeOutCubic", "createComposed", "a", "b", "cut", "_SmoothScrollingOperation", "startTime", "duration", "viewportSize", "stop1", "stop2", "state", "now", "newScrollLeft", "newScrollTop", "easeInCubic", "t", "ScrollbarVisibilityController", "Disposable", "visibility", "visibleClassName", "invisibleClassName", "TimeoutTimer", "rawShouldBeVisible", "shouldBeVisible", "isNeeded", "domNode", "withFadeAway", "POINTER_DRAG_RESET_DISTANCE", "AbstractScrollbar", "Widget", "opts", "ScrollbarVisibilityController", "GlobalPointerMoveMonitor", "FastDomNode", "addDisposableListener", "eventType", "arrow", "ScrollbarArrow", "top", "left", "width", "height", "e", "visibleSize", "elementScrollSize", "elementScrollPosition", "domTop", "sliderStart", "sliderStop", "pointerPos", "offsetX", "offsetY", "domNodePosition", "getDomNodePagePosition", "offset", "initialPointerPosition", "initialPointerOrthogonalPosition", "initialScrollbarState", "pointerMoveData", "pointerOrthogonalPosition", "pointerOrthogonalDelta", "isWindows", "pointerDelta", "_desiredScrollPosition", "desiredScrollPosition", "scrollbarSize", "ScrollbarState", "_ScrollbarState", "arrowSize", "scrollbarSize", "oppositeScrollbarSize", "visibleSize", "scrollSize", "scrollPosition", "iVisibleSize", "iScrollSize", "iScrollPosition", "iArrowSize", "computedAvailableSize", "computedRepresentableSize", "computedIsNeeded", "computedSliderSize", "computedSliderRatio", "computedSliderPosition", "r", "offset", "desiredSliderPosition", "correctedOffset", "desiredScrollPosition", "delta", "HorizontalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "e", "offsetX", "offsetY", "size", "target", "VerticalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "hasArrows", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "offsetX", "offsetY", "size", "target", "delta", "currentPosition", "showArrows", "display", "arrow", "arrowSize", "MouseWheelClassifierItem", "timestamp", "deltaX", "deltaY", "_MouseWheelClassifier", "remainingInfluence", "score", "iteration", "index", "influence", "e", "isChrome", "targetWindow", "getWindow", "pageZoomFactor", "getZoomFactor", "previousItem", "item", "absDeltaX", "absDeltaY", "absPreviousDeltaX", "absPreviousDeltaY", "minDeltaX", "minDeltaY", "maxDeltaX", "maxDeltaY", "value", "MouseWheelClassifier", "SmoothScrollableElement", "Widget", "element", "options", "scrollable", "Emitter", "resolvedScrollable", "ownsScrollable", "Scrollable", "callback", "scheduleAtNextAnimationFrame", "resolveOptions", "scrollbarHost", "mouseWheelEvent", "VerticalScrollbar", "HorizontalScrollbar", "FastDomNode", "TimeoutTimer", "dispose", "dimensions", "update", "newClassName", "isMac", "newOptions", "browserEvent", "StandardWheelEvent", "shouldListen", "onMouseWheel", "addDisposableListener", "eventType", "classifier", "didScroll", "shiftConvert", "futureScrollPosition", "desiredScrollPosition", "deltaScrollTop", "desiredScrollTop", "deltaScrollLeft", "desiredScrollLeft", "consumeMouseWheel", "scrollState", "enableTop", "enableLeft", "leftClassName", "topClassName", "topLeftClassName", "opts", "result", "Viewport", "Disposable", "element", "screenElement", "_bufferService", "coreBrowserService", "_coreService", "mouseStateService", "themeService", "_optionsService", "_renderService", "Emitter", "scrollable", "Scrollable", "cb", "scheduleAtNextAnimationFrame", "SmoothScrollableElement", "type", "EventUtils", "toDisposable", "e", "disp", "pos", "line", "disableSmoothScroll", "showScrollbar", "showArrows", "verticalScrollbarSize", "ydisp", "newRow", "diff", "translationY", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "ICoreService", "IMouseStateService", "IThemeService", "IOptionsService", "IRenderService", "BufferDecorationRenderer", "Disposable", "_screenElement", "_bufferService", "_coreBrowserService", "_decorationService", "_renderService", "decoration", "toDisposable", "element", "x", "line", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "IDecorationService", "IRenderService", "ColorZoneStore", "decoration", "z", "padding", "zone", "line", "position", "drawHeight", "drawWidth", "drawX", "OverviewRulerRenderer", "Disposable", "_viewportElement", "_screenElement", "_bufferService", "_decorationService", "_renderService", "_optionsService", "_themeService", "_coreBrowserService", "ColorZoneStore", "toDisposable", "ctx", "scrollbar", "outerWidth", "innerWidth", "pixelsPerLine", "nonFullHeight", "cssCanvasHeight", "deviceCanvasHeight", "decoration", "zones", "zone", "updateCanvasDimensions", "updateAnchor", "__decorateClass", "__decorateParam", "IBufferService", "IDecorationService", "IRenderService", "IOptionsService", "IThemeService", "ICoreBrowserService", "CompositionHelper", "_textarea", "_compositionView", "_bufferService", "_optionsService", "_coreService", "_renderService", "start", "end", "ev", "waitForPropagation", "currentCompositionPosition", "currentCompositionSuffix", "input", "value", "valueEnd", "oldValue", "newValue", "diff", "dontRecurse", "cursorX", "cellHeight", "cursorTop", "cursorLeft", "maxWidth", "compositionViewBounds", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "ICoreService", "IRenderService", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "g", "b", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "JoinedCellData", "AttributeData", "firstCell", "chars", "width", "value", "CharacterJoinerService", "_bufferService", "CellData", "handler", "joiner", "joinerId", "i", "row", "line", "ranges", "lineStr", "trimmedLength", "rangeStartColumn", "currentStringIndex", "rangeStartStringIndex", "rangeAttrFG", "rangeAttrBG", "x", "joinedRanges", "startIndex", "endIndex", "lineData", "startCol", "text", "allJoinedRanges", "error", "joinerRanges", "j", "currentRangeIndex", "currentRangeStarted", "currentRange", "length", "newRange", "inRange", "range", "__decorateClass", "__decorateParam", "IBufferService", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isBoxOrBlockGlyph", "codepoint", "treatGlyphAsBackgroundColor", "codepoint", "isPowerlineGlyph", "isBoxOrBlockGlyph", "createRenderDimensions", "createDimension", "DomRendererRowFactory", "_document", "_characterJoinerService", "_optionsService", "_coreBrowserService", "_coreService", "_decorationService", "_themeService", "CellData", "start", "end", "columnSelectMode", "lineData", "row", "isCursorRow", "cursorStyle", "cursorInactiveStyle", "cursorX", "cursorBlink", "blinkOn", "cellWidth", "widthCache", "linkStart", "linkEnd", "rowInfo", "elements", "joinedRanges", "colors", "lineLength", "charElement", "cellAmount", "text", "i", "oldBg", "oldFg", "oldExt", "oldLinkHover", "oldSpacing", "oldIsInSelection", "spacing", "skipJoinedCheckUntilX", "classes", "hasHover", "x", "width", "isJoined", "isValidJoinRange", "lastCharX", "cell", "range", "firstSelectionState", "JoinedCellData", "isInSelection", "isCursorCell", "isLinkHover", "isDecorated", "d", "chars", "AttributeData", "fg", "fgColorMode", "bg", "bgColorMode", "isInverse", "temp", "temp2", "bgOverride", "fgOverride", "isTop", "resolvedBg", "channels", "color", "element", "treatGlyphAsBackgroundColor", "cache", "adjustedColor", "ratio", "style", "y", "__decorateClass", "__decorateParam", "ICharacterJoinerService", "IOptionsService", "ICoreBrowserService", "ICoreService", "IDecorationService", "IThemeService", "WidthCache", "canvasFactory", "WidthCacheFontVariantCanvas", "font", "fontSize", "weight", "weightBold", "c", "bold", "italic", "cp", "width", "key", "variant", "throwIfFalsy", "fontFamily", "fontWeight", "fontStyle", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "nextTerminalId", "DomRenderer", "Disposable", "_terminal", "_document", "_element", "_screenElement", "_viewportElement", "_helperContainer", "_linkifier2", "instantiationService", "_charSizeService", "_optionsService", "_bufferService", "_coreService", "_coreBrowserService", "_themeService", "createSelectionRenderModel", "Emitter", "createRenderDimensions", "e", "DomRendererRowFactory", "CursorBlinkStateManager", "addDisposableListener", "toDisposable", "TextBlinkStateManager", "WidthCache", "dpr", "element", "styles", "colors", "color", "blinkAnimationUnderlineId", "blinkAnimationBarId", "blinkAnimationBlockId", "i", "c", "spacing", "cols", "rows", "row", "isVisible", "start", "end", "columnSelectMode", "oldViewportStart", "oldViewportEnd", "newViewportStart", "newViewportEnd", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "documentFragment", "isXFlipped", "startCol", "endCol", "middleRowsCount", "finalEndCol", "renderStartRow", "renderEndRow", "cursorViewportRow", "colStart", "colEnd", "rowCount", "left", "width", "buffer", "cursorAbsoluteY", "cursorX", "cursorBlink", "cursorStyle", "cursorInactiveStyle", "rowInfo", "y", "rowElement", "lineData", "x", "x2", "y2", "enabled", "maxY", "bufferline", "hasBlinkingCells", "__decorateClass", "__decorateParam", "IInstantiationService", "ICharSizeService", "IOptionsService", "IBufferService", "ICoreService", "ICoreBrowserService", "IThemeService", "_rowContainer", "CharSizeService", "Disposable", "document", "parentElement", "_optionsService", "Emitter", "TextMetricsMeasureStrategy", "DomMeasureStrategy", "result", "__decorateClass", "__decorateParam", "IOptionsService", "BaseMeasureStategy", "Disposable", "width", "height", "DomMeasureStrategy", "_document", "_parentElement", "_optionsService", "TextMetricsMeasureStrategy", "a", "metrics", "CoreBrowserService", "Disposable", "_textarea", "_window", "mainDocument", "Emitter", "ScreenDprMonitor", "w", "EventUtils", "addDisposableListener", "value", "_parentWindow", "MutableDisposable", "toDisposable", "parentWindow", "LinkProviderService", "Disposable", "toDisposable", "linkProvider", "providerIndex", "getCoordsRelativeToElement", "window", "event", "element", "rect", "elementStyle", "leftPadding", "topPadding", "getCoords", "colCount", "rowCount", "hasValidCharSize", "cssCellWidth", "cssCellHeight", "isSelection", "coords", "MouseCoordsService", "_charSizeService", "_renderService", "event", "element", "colCount", "rowCount", "isSelection", "getCoords", "getWindow", "coords", "getCoordsRelativeToElement", "__decorateClass", "__decorateParam", "ICharSizeService", "IRenderService", "mainWindow", "tail", "array", "n", "memoize", "_target", "key", "descriptor", "fnKey", "fn", "memoizeKey", "descriptorAny", "args", "_LinkedListNode", "element", "LinkedListNode", "LinkedList", "atTheEnd", "newNode", "oldLast", "oldFirst", "didRemove", "node", "anchor", "EventType", "_Gesture", "Disposable", "targetWindow", "addDisposableListener", "e", "remove", "toDisposable", "timestamp", "i", "len", "touch", "evt", "activeTouchCount", "data", "holdTime", "finalX", "finalY", "deltaT", "deltaX", "deltaY", "dispatchTo", "t", "type", "initialTarget", "event", "currentTime", "setTapCount", "ignoreTarget", "targets", "target", "depth", "now", "a", "b", "t1", "vX", "dirX", "x", "vY", "dirY", "y", "scheduleAtNextAnimationFrame", "deltaPosX", "deltaPosY", "stopped", "d", "__decorateClass", "Gesture", "MouseService", "_renderService", "_mouseCoordsService", "_mouseStateService", "_coreService", "_bufferService", "_optionsService", "_selectionService", "_logService", "_coreBrowserService", "target", "register", "focus", "element", "document", "requestedEvents", "mouseupListener", "MutableDisposable", "mousedragListener", "ctx", "eventListeners", "ev", "AltMouseCursorController", "events", "addDisposableListener", "Gesture", "EventType", "e", "pos", "but", "action", "deltaY", "stripAltFromReport", "targetDocument", "listenerDocument", "sequence", "cellHeight", "lines", "i", "amount", "dpr", "targetWheelEventPixels", "report", "e1", "e2", "pixels", "__decorateClass", "__decorateParam", "IRenderService", "IMouseCoordsService", "IMouseStateService", "ICoreService", "IBufferService", "IOptionsService", "ISelectionService", "ILogService", "ICoreBrowserService", "_element", "_document", "_isActive", "store", "DisposableStore", "syncFromModifier", "targetWindow", "altHeld", "RenderDebouncer", "_renderCallback", "_coreBrowserService", "callback", "rowStart", "rowEnd", "rowCount", "start", "end", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "DebouncedIdleTask", "RenderService", "Disposable", "_rowCount", "screenElement", "_optionsService", "_logService", "_charSizeService", "_coreService", "decorationService", "bufferService", "_coreBrowserService", "themeService", "MutableDisposable", "Emitter", "DebouncedIdleTask", "RenderDebouncer", "start", "end", "SynchronizedOutputHandler", "toDisposable", "w", "observer", "e", "entry", "sync", "isRedrawOnly", "buffered", "cols", "rows", "renderer", "callback", "columnSelectMode", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "ICharSizeService", "ICoreService", "IDecorationService", "IBufferService", "ICoreBrowserService", "IThemeService", "_onTimeout", "result", "moveToCellSequence", "targetX", "targetY", "bufferService", "applicationCursor", "startX", "startY", "resetStartingRow", "moveToRequestedRow", "moveToRequestedCol", "direction", "repeat", "sequence", "rowDifference", "cellsToMove", "colsFromRowEnd", "colsFromRowBeginning", "currX", "bufferLine", "wrappedRowsForRow", "startRow", "endRow", "rowsToMove", "wrappedRowsCount", "verticalDirection", "horizontalDirection", "wrappedRows", "i", "currentRow", "rowCount", "line", "lineWraps", "startCol", "endCol", "forward", "currentCol", "bufferStr", "mod", "count", "str", "rpt", "SelectionModel", "_bufferService", "startPlusLength", "start", "end", "amount", "getRangeLength", "range", "bufferCols", "NON_BREAKING_SPACE_CHAR", "ALL_NON_BREAKING_SPACE_REGEX", "SelectionService", "Disposable", "_element", "_screenElement", "_linkifier", "_bufferService", "_coreService", "_mouseCoordsService", "_optionsService", "_mouseStateService", "_renderService", "_coreBrowserService", "MutableDisposable", "CellData", "Emitter", "event", "amount", "e", "SelectionModel", "toDisposable", "start", "end", "buffer", "result", "startCol", "endCol", "i", "lineText", "startRowEndCol", "bufferLine", "line", "ALL_NON_BREAKING_SPACE_REGEX", "isWindows", "isLinuxMouseSelection", "isLinux", "coords", "x", "y", "allowWhitespaceOnlySelection", "range", "getRangeLength", "offset", "getCoordsRelativeToElement", "terminalHeight", "isMac", "hadSelection", "previousSelectionEnd", "timeElapsed", "coordinates", "sequence", "moveToCellSequence", "hasSelection", "charIndex", "length", "col", "row", "ev", "followWrappedLinesAbove", "followWrappedLinesBelow", "startIndex", "endIndex", "charOffset", "leftWideCharCount", "rightWideCharCount", "leftLongCharOffset", "rightLongCharOffset", "previousBufferLine", "previousLineWordPosition", "nextBufferLine", "nextLineWordPosition", "wordPosition", "endRow", "cell", "wrappedRange", "__decorateClass", "__decorateParam", "IBufferService", "ICoreService", "IMouseCoordsService", "IOptionsService", "IMouseStateService", "IRenderService", "ICoreBrowserService", "TwoKeyMap", "first", "second", "value", "ColorContrastCache", "TwoKeyMap", "bg", "fg", "value", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "DEFAULT_FOREGROUND", "css", "DEFAULT_BACKGROUND", "DEFAULT_CURSOR", "DEFAULT_CURSOR_ACCENT", "DEFAULT_SELECTION", "DEFAULT_OVERVIEW_RULER_BORDER", "ThemeService", "Disposable", "_optionsService", "ColorContrastCache", "Emitter", "color", "DEFAULT_ANSI_COLORS", "theme", "colors", "parseColor", "NULL_COLOR", "colorCount", "i", "slot", "callback", "__decorateClass", "__decorateParam", "IOptionsService", "cssString", "fallback", "KEYCODE_KEY_MAPPINGS", "evaluateKeyboardEvent", "ev", "applicationCursorMode", "isMac", "macOptionIsMeta", "result", "modifiers", "key", "keyCode", "keyString", "KittyKeyboard", "ev", "suffix", "mods", "macOptionAsAlt", "numpadCode", "modifierCode", "funcCode", "digit", "code", "letter", "modifiers", "eventType", "reportEventTypes", "needsEventType", "seq", "number", "keyCode", "flags", "isFunc", "isMod", "reportAlternateKeys", "shiftedKey", "textCode", "result", "csiLetter", "ss3Letter", "tildeCode", "specialKey", "legacyByte", "Win32InputMode", "ev", "vk", "controlChar", "codePoint", "state", "isKeyDown", "sc", "uc", "kd", "cs", "KeyboardService", "_coreService", "_optionsService", "Win32InputMode", "KittyKeyboard", "event", "kittyFlags", "isMac", "evaluateKeyboardEvent", "__decorateClass", "__decorateParam", "ICoreService", "IOptionsService", "ServiceCollection", "entries", "id", "service", "instance", "result", "callback", "key", "value", "InstantiationService", "IInstantiationService", "ctor", "args", "serviceDependencies", "getServiceDependencies", "a", "b", "serviceArgs", "dependency", "firstServiceArgPos", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "optionalParams", "i", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "CircularList", "Disposable", "_maxLength", "Emitter", "newMaxLength", "newArray", "i", "newLength", "index", "value", "start", "deleteCount", "items", "countToTrim", "count", "offset", "expandListBy", "DEFAULT_ATTR_DATA", "AttributeData", "$startIndex", "$workCell", "CellData", "$extended", "BufferLine", "_BufferLine", "cols", "fillCellData", "isWrapped", "cell", "i", "index", "content", "cp", "stringFromCodePoint", "value", "codePoint", "width", "attrs", "$idx", "pos", "n", "start", "end", "respectProtect", "uint32Cells", "data", "keys", "key", "extKeys", "line", "blank", "newLine", "src", "srcCol", "destCol", "length", "applyInReverse", "srcData", "trimRight", "startCol", "endCol", "outColumns", "isCanonical", "cellContents", "chars", "result", "srcStart", "reflowLargerGetLinesToRemove", "lines", "oldCols", "newCols", "bufferAbsoluteY", "nullCell", "reflowCursorLine", "toRemove", "y", "i", "nextLine", "wrappedLines", "destLineIndex", "destCol", "getWrappedLineTrimmedLength", "srcLineIndex", "srcCol", "srcTrimmedTineLength", "srcRemainingCells", "destRemainingCells", "cellsToCopy", "countToRemove", "reflowLargerCreateNewLayout", "layout", "nextToRemoveIndex", "nextToRemoveStart", "countRemovedSoFar", "reflowLargerApplyNewLayout", "newLayout", "newLayoutLines", "reflowSmallerGetNewLineLengths", "newLineLengths", "cellsNeeded", "srcLine", "cellsAvailable", "oldTrimmedLength", "endsWithWide", "lineLength", "cols", "endsInNull", "followingLineStartsWithWide", "_Marker", "line", "Emitter", "dispose", "disposable", "Marker", "CHARSETS", "DEFAULT_CHARSET", "MAX_BUFFER_SIZE", "Buffer", "Disposable", "_hasScrollback", "_optionsService", "_bufferService", "_logService", "DEFAULT_ATTR_DATA", "DEFAULT_CHARSET", "CellData", "CircularList", "IdleTaskQueue", "toDisposable", "attr", "ExtendedAttrs", "isWrapped", "BufferLine", "relativeY", "rows", "correctBufferLength", "fillAttr", "i", "newCols", "newRows", "nullCell", "dirtyMemoryLines", "newMaxLength", "addToY", "y", "amountToTrim", "maxY", "normalRun", "counted", "windowsPty", "reflowCursorLine", "toRemove", "reflowLargerGetLinesToRemove", "newLayoutResult", "reflowLargerCreateNewLayout", "reflowLargerApplyNewLayout", "countRemoved", "viewportAdjustments", "toInsert", "countToInsert", "nextLine", "wrappedLines", "absoluteY", "lastLineLength", "destLineLengths", "reflowSmallerGetNewLineLengths", "linesToAdd", "trimmedLines", "newLines", "newLine", "destLineIndex", "destCol", "srcLineIndex", "srcCol", "cellsToCopy", "wrappedLinesIndex", "getWrappedLineTrimmedLength", "insertEvents", "originalLines", "originalLinesLength", "originalLineIndex", "nextToInsertIndex", "nextToInsert", "countInsertedSoFar", "nextI", "insertCountEmitted", "lineIndex", "trimRight", "startCol", "endCol", "line", "first", "last", "x", "marker", "Marker", "amount", "event", "BufferSet", "Disposable", "_optionsService", "_bufferService", "_logService", "MutableDisposable", "Emitter", "Buffer", "fillAttr", "newCols", "newRows", "i", "BufferService", "Disposable", "optionsService", "logService", "Emitter", "BufferSet", "e", "cols", "rows", "colsChanged", "rowsChanged", "eraseAttr", "isWrapped", "buffer", "newLine", "topRow", "bottomRow", "willBufferBeTrimmed", "scrollRegionHeight", "disp", "suppressScrollEvent", "oldYdisp", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "DEFAULT_OPTIONS", "isMac", "FONT_WEIGHT_OPTIONS", "OptionsService", "Disposable", "options", "Emitter", "defaultOptions", "key", "newValue", "e", "toDisposable", "listener", "eventKey", "keys", "getter", "propName", "setter", "value", "desc", "isCursorStyle", "DEFAULT_MODES", "DEFAULT_DEC_PRIVATE_MODES", "DEFAULT_KITTY_KEYBOARD_STATE", "CoreService", "Disposable", "_bufferService", "_logService", "_optionsService", "Emitter", "data", "wasUserInput", "buffer", "e", "__decorateClass", "__decorateParam", "IBufferService", "ILogService", "IOptionsService", "DEFAULT_PROTOCOLS", "e", "eventCode", "e", "isSGR", "code", "S", "DEFAULT_ENCODINGS", "params", "final", "MouseStateService", "Disposable", "Emitter", "name", "DEFAULT_PROTOCOLS", "protocol", "encoding", "customWheelEventHandler", "ev", "UnicodeService", "_UnicodeService", "Emitter", "value", "state", "width", "shouldJoin", "version", "provider", "num", "s", "result", "precedingInfo", "length", "i", "code", "second", "currentInfo", "chWidth", "codepoint", "preceding", "BMP_COMBINING", "HIGH_COMBINING", "table", "bisearch", "ucs", "data", "min", "max", "mid", "UnicodeV6", "r", "num", "codepoint", "preceding", "width", "shouldJoin", "oldWidth", "UnicodeService", "CharsetService", "g", "charset", "updateWindowsModeWrappedState", "bufferService", "lastChar", "nextLine", "Params", "_Params", "maxLength", "maxSubParamsLength", "values", "params", "i", "value", "k", "newParams", "res", "start", "end", "idx", "result", "length", "store", "cur", "StringBuilder", "chunk", "LimitedStringBuilder", "_limit", "EMPTY_HANDLERS", "OscParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "code", "success", "promiseResult", "handlerResult", "fallThrough", "_OscHandler", "_handler", "LimitedStringBuilder", "ret", "res", "OscHandler", "EMPTY_HANDLERS", "DcsParser", "ident", "handler", "handlerList", "handlerIndex", "j", "params", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "EMPTY_PARAMS", "Params", "_DcsHandler", "_handler", "LimitedStringBuilder", "ret", "res", "DcsHandler", "EMPTY_HANDLERS", "ApcParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "_ApcHandler", "_handler", "LimitedStringBuilder", "ret", "res", "ApcHandler", "TransitionTable", "length", "action", "next", "code", "state", "codes", "i", "NON_ASCII_PRINTABLE", "VT500_TRANSITION_TABLE", "table", "blueprint", "unused", "r", "start", "end", "PRINTABLES", "EXECUTABLES", "states", "EscapeSequenceParser", "Disposable", "_transitions", "Params", "data", "ident", "params", "toDisposable", "OscParser", "DcsParser", "ApcParser", "id", "finalRange", "res", "intermediate", "finalCode", "handler", "handlerList", "handlerIndex", "flag", "callback", "handlers", "handlerPos", "transition", "chunkPos", "promiseResult", "handlerResult", "k", "ch", "csiDone", "j", "c", "l4", "handlersEsc", "jj", "RGB_REX", "HASH_REX", "parseColor", "data", "low", "m", "base", "adv", "result", "i", "c", "pad", "bits", "s", "s2", "toRgbString", "color", "r", "g", "b", "XTERM_VERSION", "GLEVEL", "paramToWindowOption", "opts", "$temp", "InputHandler", "Disposable", "_bufferService", "_charsetService", "_coreService", "_logService", "_optionsService", "_oscLinkService", "_mouseStateService", "_unicodeService", "_parser", "EscapeSequenceParser", "StringToUtf32", "Utf8ToUtf32", "DEFAULT_ATTR_DATA", "Emitter", "DirtyRowTracker", "e", "ident", "params", "code", "identifier", "action", "data", "payload", "start", "end", "OscHandler", "flag", "CHARSETS", "state", "DcsHandler", "cursorStartX", "cursorStartY", "decodedLength", "position", "p", "slowTimeout", "slowPromise", "_res", "rej", "err", "promiseResult", "result", "wasPaused", "i", "len", "viewportEnd", "viewportStart", "chWidth", "charset", "screenReaderMode", "cols", "wraparoundMode", "insertMode", "curAttr", "bufferRow", "precedingJoinState", "pos", "ch", "currentInfo", "UnicodeService", "shouldJoin", "oldWidth", "stringFromCodePoint", "linkId", "oldRow", "oldCol", "BufferLine", "offset", "delta", "id", "callback", "paramToWindowOption", "ApcHandler", "line", "originalX", "maxCol", "x", "y", "diffToTop", "diffToBottom", "param", "clearWrap", "respectProtect", "j", "nextLine", "scrollBackSize", "row", "scrollBottomRowsOffset", "scrollBottomAbsolute", "joinState", "length", "text", "idata", "itext", "tlength", "XTERM_VERSION", "term", "DEFAULT_CHARSET", "ansi", "V", "dm", "mouseProtocol", "mouseEncoding", "cs", "buffers", "active", "alt", "opts", "f", "m", "v", "b2v", "value", "color", "mode", "c1", "c2", "c3", "AttributeData", "attr", "accu", "cSpace", "advance", "subparams", "style", "l", "isBlinking", "top", "bottom", "second", "event", "slots", "idx", "spec", "index", "isValidColorIndex", "parseColor", "uri", "parsedParams", "idParamIndex", "collectAndFlag", "GLEVEL", "scrollRegionHeight", "level", "cell", "CellData", "yOffset", "s", "b", "STYLES", "y1", "y2", "flags", "stack", "count", "__decorateClass", "__decorateParam", "IBufferService", "WriteBuffer", "Disposable", "_action", "TimeoutTimer", "Emitter", "toDisposable", "chunk", "didProcess", "cb", "data", "maxSubsequentCalls", "callback", "lastTime", "promiseResult", "startTime", "result", "continuation", "r", "err", "OscLinkService", "_bufferService", "data", "buffer", "marker", "entry", "castData", "key", "match", "linkId", "y", "e", "linkData", "index", "__decorateClass", "__decorateParam", "IBufferService", "hasWriteSyncWarnHappened", "CoreTerminal", "Disposable", "options", "MutableDisposable", "Emitter", "InstantiationService", "OptionsService", "IOptionsService", "LogService", "ILogService", "BufferService", "IBufferService", "CoreService", "ICoreService", "MouseStateService", "IMouseStateService", "UnicodeService", "UnicodeV6", "IUnicodeService", "CharsetService", "ICharsetService", "OscLinkService", "IOscLinkService", "InputHandler", "EventUtils", "WriteBuffer", "data", "promiseResult", "ev", "key", "callback", "maxSubsequentCalls", "wasUserInput", "x", "y", "eraseAttr", "isWrapped", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "id", "ident", "value", "windowsPty", "disposables", "updateWindowsModeWrappedState", "toDisposable", "d", "i", "SortedList", "_getKey", "logService", "IdleTaskQueue", "value", "sortedAddedValues", "a", "b", "sortedAddedValuesIndex", "arrayIndex", "newArray", "newArrayIndex", "key", "sortedDeletedIndices", "sortedDeletedIndicesIndex", "callback", "min", "max", "mid", "midKey", "$xmin", "$xmax", "DecorationService", "Disposable", "_logService", "_bufferService", "DecorationLineCache", "Emitter", "SortedList", "e", "toDisposable", "options", "decoration", "Decoration", "markerDispose", "listener", "d", "x", "line", "layer", "bucket", "callback", "__decorateClass", "__decorateParam", "ILogService", "IBufferService", "MutableDisposable", "MicrotaskTimer", "lines", "store", "DisposableStore", "amount", "event", "start", "height", "index", "callbacks", "cb", "newMap", "newLine", "existing", "i", "len", "spanCrossers", "deleteEnd", "toReindex", "css", "RENDER_DEBOUNCE_THRESHOLD_MS", "TimeBasedDebouncer", "_renderCallback", "_debounceThresholdMS", "rowStart", "rowEnd", "rowCount", "refreshRequestTime", "elapsed", "waitPeriodBeforeTrailingRefresh", "start", "end", "DEBUG", "AccessibilityManager", "Disposable", "_terminal", "instantiationService", "_coreBrowserService", "_renderService", "doc", "i", "e", "TimeBasedDebouncer", "char", "spaceCount", "addDisposableListener", "toDisposable", "tooMuchOutput", "keyChar", "start", "end", "buffer", "setSize", "line", "columns", "lineData", "posInSet", "element", "position", "boundaryElement", "beforeBoundaryElement", "lastRowPos", "topBoundaryElement", "bottomBoundaryElement", "newElement", "selection", "begin", "lastRowElement", "toRowColumn", "node", "offset", "rowElement", "row", "column", "beginRowColumn", "endRowColumn", "rows", "width", "lastColumn", "targetWidth", "__decorateClass", "__decorateParam", "IInstantiationService", "ICoreBrowserService", "IRenderService", "Linkifier", "Disposable", "_element", "_mouseCoordsService", "_renderService", "_bufferService", "_linkProviderService", "Emitter", "toDisposable", "dispose", "addDisposableListener", "event", "position", "composedPath", "i", "target", "useLineCache", "reply", "linkWithState", "linkProvided", "linkProvider", "links", "linksWithState", "link", "y", "replies", "occupiedCells", "providerReply", "startX", "endX", "x", "index", "hasLinkBefore", "j", "linkAtPosition", "currentLink", "linkEquals", "startRow", "endRow", "v", "e", "start", "end", "element", "showEvent", "range", "scrollOffset", "lower", "upper", "current", "coords", "x1", "y1", "x2", "y2", "fg", "__decorateClass", "__decorateParam", "IMouseCoordsService", "IRenderService", "IBufferService", "ILinkProviderService", "a", "b", "CoreBrowserTerminal", "CoreTerminal", "options", "MutableDisposable", "Platform_exports", "Emitter", "DecorationService", "IDecorationService", "KeyboardService", "IKeyboardService", "LinkProviderService", "ILinkProviderService", "OscLinkProvider", "e", "type", "event", "EventUtils", "toDisposable", "dimensions", "req", "acc", "ident", "colorRgb", "color", "toRgbString", "colors", "channels", "narrowedAcc", "bgLuminance", "rgb", "fgLuminance", "colorSchemeMode", "value", "AccessibilityManager", "ev", "cursorY", "bufferLine", "cursorX", "cellHeight", "width", "cellWidth", "cursorTop", "cursorLeft", "addDisposableListener", "copyHandler", "pasteHandlerWrapper", "handlePasteEvent", "isFirefox", "rightClickHandler", "isLinux", "moveTextAreaUnderMouseCursor", "parent", "fragment", "textarea", "promptLabel", "isChromeOS", "CoreBrowserService", "ICoreBrowserService", "CharSizeService", "ICharSizeService", "ThemeService", "IThemeService", "CharacterJoinerService", "ICharacterJoinerService", "RenderService", "IRenderService", "CompositionHelper", "MouseCoordsService", "IMouseCoordsService", "linkifier", "Linkifier", "Viewport", "SelectionService", "ISelectionService", "MouseService", "IMouseService", "text", "BufferDecorationRenderer", "showScrollbar", "overviewRulerWidth", "OverviewRulerRenderer", "shouldShow", "amount", "disposable", "DomRenderer", "start", "end", "sync", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "data", "paste", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "shouldIgnoreComposition", "result", "scrollCount", "wasModifierOnly", "wasModifierKeyOnlyEvent", "browser", "thirdLevelKey", "key", "x", "y", "i", "DEFAULT_ATTR_DATA", "canvasWidth", "canvasHeight", "AddonManager", "terminal", "instance", "loadedAddon", "index", "i", "BufferLineApiView", "_line", "x", "cell", "CellData", "trimRight", "startColumn", "endColumn", "BufferApiView", "_buffer", "type", "buffer", "y", "line", "BufferLineApiView", "CellData", "BufferNamespaceApi", "Disposable", "_core", "Emitter", "BufferApiView", "ParserApi", "_core", "id", "callback", "params", "data", "handler", "ident", "UnicodeApi", "_core", "provider", "version", "CONSTRUCTOR_ONLY_OPTIONS", "$value", "Terminal", "Disposable", "options", "CoreBrowserTerminal", "AddonManager", "getter", "propName", "setter", "value", "desc", "ParserApi", "UnicodeApi", "BufferNamespaceApi", "m", "mouseTrackingMode", "data", "wasUserInput", "columns", "rows", "parent", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "start", "end", "amount", "pageCount", "line", "callback", "addon", "promptLabel", "tooMuchOutput", "values"] ++ "sources": ["../src/browser/LocalizableStrings.ts", "../src/browser/Clipboard.ts", "../src/common/input/TextDecoder.ts", "../src/common/buffer/AttributeData.ts", "../src/common/buffer/CellData.ts", "../src/common/services/ServiceRegistry.ts", "../src/common/services/Services.ts", "../src/browser/OscLinkProvider.ts", "../src/browser/services/Services.ts", "../src/common/Lifecycle.ts", "../src/common/Async.ts", "../src/browser/Dom.ts", "../src/browser/scrollable/fastDomNode.ts", "../src/common/Platform.ts", "../src/browser/scrollable/mouseEvent.ts", "../src/browser/scrollable/globalPointerMoveMonitor.ts", "../src/browser/scrollable/widget.ts", "../src/browser/scrollable/scrollbarArrow.ts", "../src/common/Event.ts", "../src/browser/scrollable/scrollable.ts", "../src/browser/scrollable/scrollbarVisibilityController.ts", "../src/browser/scrollable/abstractScrollbar.ts", "../src/browser/scrollable/scrollbarState.ts", "../src/browser/scrollable/horizontalScrollbar.ts", "../src/browser/scrollable/verticalScrollbar.ts", "../src/browser/scrollable/scrollableElement.ts", "../src/browser/Viewport.ts", "../src/browser/decorations/BufferDecorationRenderer.ts", "../src/browser/decorations/ColorZoneStore.ts", "../src/browser/decorations/OverviewRulerRenderer.ts", "../src/common/Color.ts", "../src/browser/input/CompositionHelper.ts", "../src/browser/services/CharacterJoinerService.ts", "../src/browser/renderer/shared/RendererUtils.ts", "../src/browser/renderer/dom/DomRendererRowFactory.ts", "../src/browser/renderer/dom/WidthCache.ts", "../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/browser/renderer/shared/TextBlinkStateManager.ts", "../src/browser/renderer/dom/DomRenderer.ts", "../src/browser/services/CharSizeService.ts", "../src/browser/services/CoreBrowserService.ts", "../src/browser/services/LinkProviderService.ts", "../src/browser/input/Mouse.ts", "../src/browser/services/MouseCoordsService.ts", "../src/browser/scrollable/touch.ts", "../src/browser/services/MouseService.ts", "../src/browser/RenderDebouncer.ts", "../src/common/TaskQueue.ts", "../src/browser/services/RenderService.ts", "../src/browser/input/MoveToCell.ts", "../src/browser/selection/SelectionModel.ts", "../src/common/buffer/BufferRange.ts", "../src/browser/services/SelectionService.ts", "../src/common/MultiKeyMap.ts", "../src/browser/ColorContrastCache.ts", "../src/browser/Types.ts", "../src/browser/services/ThemeService.ts", "../src/common/input/Keyboard.ts", "../src/common/input/KittyKeyboard.ts", "../src/common/input/Win32InputMode.ts", "../src/browser/services/KeyboardService.ts", "../src/common/services/InstantiationService.ts", "../src/common/services/LogService.ts", "../src/common/CircularList.ts", "../src/common/buffer/BufferLine.ts", "../src/common/buffer/BufferReflow.ts", "../src/common/buffer/Marker.ts", "../src/common/data/Charsets.ts", "../src/common/buffer/Buffer.ts", "../src/common/buffer/BufferSet.ts", "../src/common/services/BufferService.ts", "../src/common/services/OptionsService.ts", "../src/common/services/CoreService.ts", "../src/common/services/MouseStateService.ts", "../src/common/services/UnicodeService.ts", "../src/common/input/UnicodeV6.ts", "../src/common/services/CharsetService.ts", "../src/common/WindowsMode.ts", "../src/common/parser/Params.ts", "../src/common/StringBuilder.ts", "../src/common/parser/OscParser.ts", "../src/common/parser/DcsParser.ts", "../src/common/parser/ApcParser.ts", "../src/common/parser/EscapeSequenceParser.ts", "../src/common/input/XParseColor.ts", "../src/common/Version.ts", "../src/common/InputHandler.ts", "../src/common/input/WriteBuffer.ts", "../src/common/services/OscLinkService.ts", "../src/common/CoreTerminal.ts", "../src/common/SortedList.ts", "../src/common/services/DecorationService.ts", "../src/browser/TimeBasedDebouncer.ts", "../src/browser/AccessibilityManager.ts", "../src/browser/Linkifier.ts", "../src/browser/CoreBrowserTerminal.ts", "../src/common/public/AddonManager.ts", "../src/common/public/BufferLineApiView.ts", "../src/common/public/BufferApiView.ts", "../src/common/public/BufferNamespaceApi.ts", "../src/common/public/ParserApi.ts", "../src/common/public/UnicodeApi.ts", "../src/browser/public/Terminal.ts"], ++ "sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\nlet promptLabelInternal = 'Terminal input';\nconst promptLabel = {\n get: () => promptLabelInternal,\n set: (value: string) => promptLabelInternal = value\n};\n\nlet tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read';\nconst tooMuchOutput = {\n get: () => tooMuchOutputInternal,\n set: (value: string) => tooMuchOutputInternal = value\n};\n\nexport {\n promptLabel,\n tooMuchOutput\n};\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from './services/Services';\nimport { ICoreService, IOptionsService } from '../common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (!bracketedPasteMode) {\n return text;\n }\n // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)\n // by replacing ESC (\\x1b) with its visible representation U+241B (\u241B).\n const sanitizedText = text.replace(/\\x1b/g, '\\u241b');\n return `\\x1b[200~${sanitizedText}\\x1b[201~`;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService, optionsService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord) {\n selectionService.rightClickSelect(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos]) && pos < 4) {\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorRGB } from '../Types';\nimport { IAttributeData, IExtendedAttrs } from './Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from './Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from './Types';\nimport { stringFromCodePoint } from '../input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from './Constants';\nimport { AttributeData, ExtendedAttrs } from './AttributeData';\nimport type { IBufferCell as IBufferCellApi } from '@xterm/xterm';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n\n public attributesEquals(other: IBufferCellApi): boolean {\n if (this.getFgColorMode() !== other.getFgColorMode() || this.getFgColor() !== other.getFgColor()) {\n return false;\n }\n if (this.getBgColorMode() !== other.getBgColorMode() || this.getBgColor() !== other.getBgColor()) {\n return false;\n }\n if (this.isInverse() !== other.isInverse()) {\n return false;\n }\n if (this.isBold() !== other.isBold()) {\n return false;\n }\n if (this.isUnderline() !== other.isUnderline()) {\n return false;\n }\n if (this.isUnderline()) {\n if (this.getUnderlineStyle() !== other.getUnderlineStyle()) {\n return false;\n }\n const thisDefault = this.isUnderlineColorDefault();\n const otherDefault = other.isUnderlineColorDefault();\n if (!(thisDefault && otherDefault)) {\n if (thisDefault !== otherDefault) {\n return false;\n }\n if (this.getUnderlineColor() !== other.getUnderlineColor()) {\n return false;\n }\n if (this.getUnderlineColorMode() !== other.getUnderlineColorMode()) {\n return false;\n }\n }\n }\n if (this.isOverline() !== other.isOverline()) {\n return false;\n }\n if (this.isBlink() !== other.isBlink()) {\n return false;\n }\n if (this.isInvisible() !== other.isInvisible()) {\n return false;\n }\n if (this.isItalic() !== other.isItalic()) {\n return false;\n }\n if (this.isDim() !== other.isDim()) {\n return false;\n }\n if (this.isStrikethrough() !== other.isStrikethrough()) {\n return false;\n }\n return true;\n }\n\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface IServiceIdentifier {\n (...args: any[]): void;\n type: T;\n _id: string;\n}\n\nconst enum Constants {\n DI_TARGET = 'di$target',\n DI_DEPENDENCIES = 'di$dependencies'\n}\n\nexport const serviceRegistry: Map> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier, index: number, optional: boolean }[] {\n return ctor[Constants.DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator(id: string): IServiceIdentifier {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator._id = id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[Constants.DI_TARGET] === target) {\n (target as any)[Constants.DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[Constants.DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[Constants.DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from '../Types';\nimport { IAttributeData, IBuffer, IBufferSet } from '../buffer/Types';\nimport { createDecorator, IServiceIdentifier } from './ServiceRegistry';\nimport type { Emitter, IEvent } from '../Event';\n\nexport const IBufferService = createDecorator('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent;\n onScroll: IEvent;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport interface IBufferResizeEvent {\n cols: number;\n rows: number;\n colsChanged: boolean;\n rowsChanged: boolean;\n}\n\nexport const IMouseStateService = createDecorator('MouseStateService');\nexport interface IMouseStateService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void;\n allowCustomWheelEvent(ev: WheelEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent;\n restrictMouseEvent(event: ICoreMouseEvent): boolean;\n encodeMouseEvent(event: ICoreMouseEvent): string;\n readonly isDefaultEncoding: boolean;\n readonly isPixelEncoding: boolean;\n}\n\nexport const ICoreService = createDecorator('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n readonly kittyKeyboard: IKittyKeyboardState;\n\n readonly onData: IEvent;\n readonly onUserInput: IEvent;\n readonly onBinary: IEvent;\n readonly onRequestScrollToBottom: IEvent;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n readonly charsets: (ICharset | undefined)[];\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService(id: IServiceIdentifier, instance: T): void;\n getService(id: IServiceIdentifier): T | undefined;\n createInstance any, R extends InstanceType>(t: Ctor, ...args: GetLeadingNonServiceArgs>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange(key: T, listener: (arg1: Required[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n blinkIntervalDuration?: number;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n mouseEventsRequireAlt?: boolean;\n reflowCursorLine?: boolean;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n showCursorImmediately?: boolean;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n quirks?: ITerminalQuirks;\n scrollbar?: IScrollbarOptions;\n scrollOnEraseInDisplay?: boolean;\n vtExtensions?: IVtExtensions;\n\n [key: string]: any;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport interface ITerminalQuirks {\n allowSetCursorBlink?: boolean;\n}\n\nexport interface IScrollbarOptions {\n showScrollbar?: boolean;\n showArrows?: boolean;\n width?: number;\n overviewRuler?: IOverviewRulerOptions;\n}\n\nexport interface IVtExtensions {\n kittyKeyboard?: boolean;\n kittySgrBoldFaintControl?: boolean;\n win32InputMode?: boolean;\n colorSchemeQuery?: boolean;\n}\n\nexport const IOscLinkService = createDecorator('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register a Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered when the active version changes. */\n readonly onChange: IEvent;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator;\n readonly onDecorationRegistered: IEvent;\n readonly onDecorationRemoved: IEvent;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter;\n /** @internal Start line for line-index removal; kept in sync on buffer line shifts. */\n _indexedStartLine: number;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink } from './Types';\nimport { ILinkProvider } from './services/Services';\nimport { CellData } from '../common/buffer/CellData';\nimport { IBufferLine } from '../common/buffer/Types';\nimport { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n private readonly _workCell = new CellData();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IOscLinkService private readonly _oscLinkService: IOscLinkService\n ) {\n }\n\n public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n const line = this._bufferService.buffer.lines.get(y - 1);\n if (!line) {\n callback(undefined);\n return;\n }\n\n const result: ILink[] = [];\n const linkHandler = this._optionsService.rawOptions.linkHandler;\n const cell = this._workCell;\n const lineLength = line.getTrimmedLength();\n let currentLinkId = -1;\n let currentStart = -1;\n let finishLink = false;\n for (let x = 0; x < lineLength; x++) {\n // Minor optimization, only check for content if there isn't a link in case the link ends with\n // a null cell\n if (currentStart === -1 && !line.hasContent(x)) {\n continue;\n }\n\n line.loadCell(x, cell);\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n if (currentStart === -1) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n continue;\n } else {\n finishLink = cell.extended.urlId !== currentLinkId;\n }\n } else {\n if (currentStart !== -1) {\n finishLink = true;\n }\n }\n\n if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n if (text) {\n const endX = x + (!finishLink && x === lineLength - 1 ? 1 : 0);\n const range = this._getRangeWithLineWrap(y, currentStart, endX, currentLinkId);\n let ignoreLink = false;\n if (!linkHandler?.allowNonHttpProtocols) {\n try {\n const parsed = new URL(text);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n ignoreLink = true;\n }\n } catch {\n // Ignore invalid URLs to prevent unexpected behaviors\n ignoreLink = true;\n }\n }\n\n if (!ignoreLink) {\n // OSC links always use underline and pointer decorations\n result.push({\n text,\n range,\n activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n hover: (e, text) => linkHandler?.hover?.(e, text, range),\n leave: (e, text) => linkHandler?.leave?.(e, text, range)\n });\n }\n }\n finishLink = false;\n\n // Clear link or start a new link if one starts immediately\n if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n currentStart = x;\n currentLinkId = cell.extended.urlId;\n } else {\n currentStart = -1;\n currentLinkId = -1;\n }\n }\n }\n\n // TODO: Handle fetching and returning other link ranges to underline other links with the same\n // id\n callback(result);\n }\n\n /**\n * Expand a single-line OSC 8 range to a contiguous wrapped range for the same link id.\n */\n private _getRangeWithLineWrap(y: number, startX: number, endX: number, linkId: number): IBufferRange {\n let startY = y;\n let finalStartX = startX;\n let endY = y;\n let finalEndX = endX;\n\n // Expand upward only when this segment starts at column 0 and the current line is wrapped.\n while (finalStartX === 0) {\n const currentLine = this._bufferService.buffer.lines.get(startY - 1);\n if (!currentLine?.isWrapped) {\n break;\n }\n const previousLine = this._bufferService.buffer.lines.get(startY - 2);\n if (!previousLine) {\n break;\n }\n const previousLineLength = previousLine.getTrimmedLength();\n if (previousLineLength === 0 || !this._hasUrlId(previousLine, previousLineLength - 1, linkId)) {\n break;\n }\n let previousStartX = previousLineLength - 1;\n while (previousStartX > 0 && this._hasUrlId(previousLine, previousStartX - 1, linkId)) {\n previousStartX--;\n }\n startY--;\n finalStartX = previousStartX;\n }\n\n // Expand downward only when this segment reaches trimmed EOL and the next line is wrapped.\n while (true) {\n const currentLine = this._bufferService.buffer.lines.get(endY - 1);\n if (!currentLine) {\n break;\n }\n const currentLineLength = currentLine.getTrimmedLength();\n if (finalEndX !== currentLineLength) {\n break;\n }\n const nextLine = this._bufferService.buffer.lines.get(endY);\n if (!nextLine?.isWrapped) {\n break;\n }\n const nextLineLength = nextLine.getTrimmedLength();\n if (nextLineLength === 0 || !this._hasUrlId(nextLine, 0, linkId)) {\n break;\n }\n let nextEndX = 1;\n while (nextEndX < nextLineLength && this._hasUrlId(nextLine, nextEndX, linkId)) {\n nextEndX++;\n }\n endY++;\n finalEndX = nextEndX;\n }\n\n // IBufferRange uses 1-based coordinates.\n return {\n start: {\n x: finalStartX + 1,\n y: startY\n },\n end: {\n x: finalEndX,\n y: endY\n }\n };\n }\n\n private _hasUrlId(line: IBufferLine, x: number, linkId: number): boolean {\n const cell = this._workCell;\n line.loadCell(x, cell);\n return !!cell.hasExtendedAttrs() && cell.extended.urlId === linkId;\n }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n if (answer) {\n const newWindow = window.open();\n if (newWindow) {\n try {\n newWindow.opener = null;\n } catch {\n // no-op, Electron can throw\n }\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { IColorSet, ILink, ReadonlyColorSet } from '../Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { createDecorator } from '../../common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';\nimport type { IEvent } from '../../common/Event';\n\nexport const ICharSizeService = createDecorator('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n\n readonly onDprChange: IEvent;\n readonly onWindowChange: IEvent;\n\n /**\n * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g.\n * requestAnimationFrame) should be invoked in the context of this window. This should be set when\n * the window hosting the xterm.js instance changes.\n */\n window: Window & typeof globalThis;\n /**\n * The document of the primary window to be used to create elements when working with multiple\n * windows. This is defined by the documentOverride setting.\n */\n readonly mainDocument: Document;\n /**\n * Helper for getting the devicePixelRatio of the parent window.\n */\n readonly dpr: number;\n}\n\nexport const IMouseCoordsService = createDecorator('MouseCoordsService');\nexport interface IMouseCoordsService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IMouseService = createDecorator('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void;\n reset(): void;\n}\nexport interface IMouseServiceTarget {\n element: HTMLElement;\n screenElement: HTMLElement;\n document: Document;\n handleTouchScroll?(amount: number): void;\n}\n\nexport const IRenderService = createDecorator('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n /**\n * Fires on render\n */\n onRender: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n addRefreshCallback(callback: FrameRequestCallback): number;\n\n refreshRows(start: number, end: number, sync?: boolean): void;\n clearTextureAtlas(): void;\n resize(cols: number, rows: number): void;\n hasRenderer(): boolean;\n setRenderer(renderer: IRenderer): void;\n handleDevicePixelRatioChange(): void;\n handleResize(cols: number, rows: number): void;\n handleCharSizeChanged(): void;\n handleBlur(): void;\n handleFocus(): void;\n handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n handleCursorMove(): void;\n clear(): void;\n}\n\nexport const ISelectionService = createDecorator('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent;\n readonly onRequestRedraw: IEvent;\n readonly onRequestScrollLines: IEvent;\n readonly onSelectionChange: IEvent;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n rightClickSelect(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n handleMouseDown(event: MouseEvent): void;\n isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n serviceBrand: undefined;\n\n register(handler: (text: string) => [number, number][]): number;\n deregister(joinerId: number): boolean;\n getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator('ThemeService');\nexport interface IThemeService {\n serviceBrand: undefined;\n\n readonly colors: ReadonlyColorSet;\n\n readonly onChangeColors: IEvent;\n\n restoreColor(slot?: AllColorIndex): void;\n /**\n * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n * prevent accidental writes.\n */\n modifyColors(callback: (colors: IColorSet) => void): void;\n}\n\n\nexport const ILinkProviderService = createDecorator('LinkProviderService');\nexport interface ILinkProviderService extends IDisposable {\n serviceBrand: undefined;\n readonly linkProviders: ReadonlyArray;\n registerLinkProvider(linkProvider: ILinkProvider): IDisposable;\n}\nexport interface ILinkProvider {\n provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void;\n}\n\nexport const IKeyboardService = createDecorator('KeyboardService');\nexport interface IKeyboardService {\n serviceBrand: undefined;\n evaluateKeyDown(event: KeyboardEvent): IKeyboardResult;\n evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined;\n readonly useKitty: boolean;\n readonly useWin32InputMode: boolean;\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal lifecycle utilities for xterm.js core.\n * Simplified from VS Code's lifecycle.ts - no tracking/leak detection.\n */\n\nexport interface IDisposable {\n dispose(): void;\n}\n\nexport function toDisposable(fn: () => void): IDisposable {\n return { dispose: fn };\n}\n\nexport function dispose(disposable: T): T;\nexport function dispose(disposable: T | undefined): T | undefined;\nexport function dispose(disposables: T[]): T[];\nexport function dispose(arg: T | T[] | undefined): T | T[] | undefined {\n if (!arg) {\n return arg;\n }\n if (Array.isArray(arg)) {\n for (const d of arg) {\n d.dispose();\n }\n return [];\n }\n arg.dispose();\n return arg;\n}\n\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n return toDisposable(() => dispose(disposables));\n}\n\nexport class DisposableStore implements IDisposable {\n private readonly _disposables = new Set();\n private _isDisposed = false;\n\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n public add(o: T): T {\n if (this._isDisposed) {\n o.dispose();\n } else {\n this._disposables.add(o);\n }\n return o;\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n\n public clear(): void {\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.clear();\n }\n}\n\nexport abstract class Disposable implements IDisposable {\n public static readonly None: IDisposable = Object.freeze({ dispose() { } });\n\n protected readonly _store = new DisposableStore();\n\n public dispose(): void {\n this._store.dispose();\n }\n\n protected _register(o: T): T {\n return this._store.add(o);\n }\n}\n\nexport class MutableDisposable implements IDisposable {\n private _value: T | undefined;\n private _isDisposed = false;\n\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal async helpers for xterm.js core.\n */\n\nimport { DisposableStore, IDisposable, toDisposable } from './Lifecycle';\n\nexport function timeout(millis: number): Promise {\n return new Promise(resolve => setTimeout(resolve, millis));\n}\n\n/**\n * Creates a timeout that can be disposed using its returned value.\n * @param handler The timeout handler.\n * @param timeout An optional timeout in milliseconds.\n * @param store An optional {@link DisposableStore} that will have the timeout disposable managed\n * automatically.\n */\nexport function disposableTimeout(handler: () => void, timeout = 0, store?: DisposableStore): IDisposable {\n const timer = setTimeout(() => {\n handler();\n if (store) {\n disposable.dispose();\n }\n }, timeout);\n const disposable = toDisposable(() => {\n clearTimeout(timer);\n });\n store?.add(disposable);\n return disposable;\n}\n\nexport class TimeoutTimer implements IDisposable {\n private _token: any = -1;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n if (this._token !== -1) {\n clearTimeout(this._token);\n this._token = -1;\n }\n }\n\n public cancelAndSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed TimeoutTimer');\n }\n this.cancel();\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n\n public setIfNotSet(runner: () => void, timeout: number): void {\n if (this._isDisposed) {\n throw new Error('Calling setIfNotSet on a disposed TimeoutTimer');\n }\n if (this._token !== -1) {\n return;\n }\n this._token = setTimeout(() => {\n this._token = -1;\n runner();\n }, timeout);\n }\n}\n\n/**\n * Schedules a single runner on the microtask queue. Unlike {@link TimeoutTimer}, a scheduled\n * microtask cannot be unqueued; {@link cancel} prevents the runner from executing if it has not\n * run yet.\n */\nexport class MicrotaskTimer implements IDisposable {\n private _isScheduled = false;\n private _isDisposed = false;\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n\n public cancel(): void {\n this._isScheduled = false;\n }\n\n public set(runner: () => void): void {\n if (this._isDisposed) {\n throw new Error('Calling set on a disposed MicrotaskTimer');\n }\n if (this._isScheduled) {\n return;\n }\n this._isScheduled = true;\n queueMicrotask(() => {\n if (!this._isScheduled) {\n return;\n }\n this._isScheduled = false;\n runner();\n });\n }\n}\n\nexport class IntervalTimer implements IDisposable {\n private _disposable: IDisposable | undefined;\n private _isDisposed = false;\n\n public cancel(): void {\n this._disposable?.dispose();\n this._disposable = undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, context: Window | typeof globalThis = globalThis): void {\n if (this._isDisposed) {\n throw new Error('Calling cancelAndSet on a disposed IntervalTimer');\n }\n this.cancel();\n const handle = context.setInterval(() => {\n runner();\n }, interval);\n this._disposable = {\n dispose: () => {\n context.clearInterval(handle as any);\n this._disposable = undefined;\n }\n };\n }\n\n public dispose(): void {\n this.cancel();\n this._isDisposed = true;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal DOM helpers for xterm.js browser code.\n */\n\nimport { IntervalTimer } from '../common/Async';\nimport { IDisposable } from '../common/Lifecycle';\n\nexport function getWindow(e: Node | UIEvent | undefined | null): Window {\n const candidateNode = e as Node | undefined | null;\n if (candidateNode?.ownerDocument?.defaultView) {\n return candidateNode.ownerDocument.defaultView;\n }\n\n const candidateEvent = e as UIEvent | undefined | null;\n if (candidateEvent?.view) {\n return candidateEvent.view;\n }\n\n return window;\n}\n\nclass DomListener implements IDisposable {\n private _handler: ((e: any) => void) | null;\n private _node: EventTarget | null;\n private readonly _type: string;\n private readonly _options: boolean | AddEventListenerOptions | undefined;\n\n constructor(node: EventTarget, type: string, handler: (e: any) => void, options?: boolean | AddEventListenerOptions) {\n this._node = node;\n this._type = type;\n this._handler = handler;\n this._options = options;\n node.addEventListener(type, handler, options);\n }\n\n public dispose(): void {\n if (!this._node || !this._handler) {\n return;\n }\n this._node.removeEventListener(this._type, this._handler, this._options);\n this._node = null;\n this._handler = null;\n }\n}\n\nexport function addDisposableListener(node: EventTarget, type: K, handler: (event: GlobalEventHandlersEventMap[K]) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, options: AddEventListenerOptions): IDisposable;\nexport function addDisposableListener(node: EventTarget, type: string, handler: (event: any) => void, useCaptureOrOptions?: boolean | AddEventListenerOptions): IDisposable {\n return new DomListener(node, type, handler, useCaptureOrOptions);\n}\n\nexport function addStandardDisposableListener(node: HTMLElement, type: string, handler: (event: any) => void, useCapture?: boolean): IDisposable {\n return addDisposableListener(node, type, handler, useCapture);\n}\n\nexport const eventType = {\n CLICK: 'click',\n MOUSE_DOWN: 'mousedown',\n MOUSE_OVER: 'mouseover',\n MOUSE_LEAVE: 'mouseleave',\n KEY_DOWN: 'keydown',\n KEY_UP: 'keyup',\n INPUT: 'input',\n BLUR: 'blur',\n FOCUS: 'focus',\n CHANGE: 'change',\n POINTER_DOWN: 'pointerdown',\n POINTER_MOVE: 'pointermove',\n POINTER_UP: 'pointerup',\n MOUSE_WHEEL: 'wheel',\n WHEEL: 'wheel'\n} as const;\n\nexport function getDomNodePagePosition(domNode: HTMLElement): { left: number, top: number, width: number, height: number } {\n const bb = domNode.getBoundingClientRect();\n const win = getWindow(domNode);\n return {\n left: bb.left + win.scrollX,\n top: bb.top + win.scrollY,\n width: bb.width,\n height: bb.height\n };\n}\n\nclass AnimationFrameQueueItem implements IDisposable {\n private _canceled = false;\n\n constructor(private readonly _runner: () => void, public priority: number) {\n }\n\n public dispose(): void {\n this._canceled = true;\n }\n\n public execute(): void {\n if (this._canceled) {\n return;\n }\n try {\n this._runner();\n } catch (e) {\n console.error(e);\n }\n }\n\n public static sort(a: AnimationFrameQueueItem, b: AnimationFrameQueueItem): number {\n return b.priority - a.priority;\n }\n}\n\ninterface IWindowAnimationFrameState {\n next: AnimationFrameQueueItem[];\n current: AnimationFrameQueueItem[];\n animFrameRequested: boolean;\n inAnimationFrameRunner: boolean;\n}\n\nconst animationFrameState = new Map();\n\nfunction getAnimationFrameState(targetWindow: Window): IWindowAnimationFrameState {\n let state = animationFrameState.get(targetWindow);\n if (!state) {\n state = {\n next: [],\n current: [],\n animFrameRequested: false,\n inAnimationFrameRunner: false\n };\n animationFrameState.set(targetWindow, state);\n }\n return state;\n}\n\nfunction animationFrameRunner(targetWindow: Window): void {\n const state = getAnimationFrameState(targetWindow);\n state.animFrameRequested = false;\n\n state.current = state.next;\n state.next = [];\n\n state.inAnimationFrameRunner = true;\n while (state.current.length > 0) {\n state.current.sort(AnimationFrameQueueItem.sort);\n const top = state.current.shift()!;\n top.execute();\n }\n state.inAnimationFrameRunner = false;\n}\n\nexport function scheduleAtNextAnimationFrame(targetWindow: Window, runner: () => void, priority: number = 0): IDisposable {\n const state = getAnimationFrameState(targetWindow);\n const item = new AnimationFrameQueueItem(runner, priority);\n state.next.push(item);\n\n if (!state.animFrameRequested) {\n state.animFrameRequested = true;\n targetWindow.requestAnimationFrame(() => animationFrameRunner(targetWindow));\n }\n\n return item;\n}\n\nexport class WindowIntervalTimer extends IntervalTimer {\n private readonly _defaultTarget?: Window;\n\n constructor(node?: Node) {\n super();\n this._defaultTarget = node ? getWindow(node) : undefined;\n }\n\n public cancelAndSet(runner: () => void, interval: number, targetWindow?: Window): void {\n super.cancelAndSet(runner, interval, targetWindow ?? this._defaultTarget ?? window);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport class FastDomNode {\n\n private _width: string = '';\n private _height: string = '';\n private _top: string = '';\n private _left: string = '';\n private _bottom: string = '';\n private _right: string = '';\n private _className: string = '';\n private _position: string = '';\n private _layerHint: boolean = false;\n private _contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint' = 'none';\n\n constructor(\n public readonly domNode: T\n ) { }\n\n public setWidth(_width: number | string): void {\n const width = numberAsPixels(_width);\n if (this._width === width) {\n return;\n }\n this._width = width;\n this.domNode.style.width = this._width;\n }\n\n public setHeight(_height: number | string): void {\n const height = numberAsPixels(_height);\n if (this._height === height) {\n return;\n }\n this._height = height;\n this.domNode.style.height = this._height;\n }\n\n public setTop(_top: number | string): void {\n const top = numberAsPixels(_top);\n if (this._top === top) {\n return;\n }\n this._top = top;\n this.domNode.style.top = this._top;\n }\n\n public setLeft(_left: number | string): void {\n const left = numberAsPixels(_left);\n if (this._left === left) {\n return;\n }\n this._left = left;\n this.domNode.style.left = this._left;\n }\n\n public setBottom(_bottom: number | string): void {\n const bottom = numberAsPixels(_bottom);\n if (this._bottom === bottom) {\n return;\n }\n this._bottom = bottom;\n this.domNode.style.bottom = this._bottom;\n }\n\n public setRight(_right: number | string): void {\n const right = numberAsPixels(_right);\n if (this._right === right) {\n return;\n }\n this._right = right;\n this.domNode.style.right = this._right;\n }\n\n public setClassName(className: string): void {\n if (this._className === className) {\n return;\n }\n this._className = className;\n this.domNode.className = this._className;\n }\n\n public toggleClassName(className: string, shouldHaveIt?: boolean): void {\n this.domNode.classList.toggle(className, shouldHaveIt);\n this._className = this.domNode.className;\n }\n\n public setPosition(position: string): void {\n if (this._position === position) {\n return;\n }\n this._position = position;\n this.domNode.style.position = this._position;\n }\n\n public setLayerHinting(layerHint: boolean): void {\n if (this._layerHint === layerHint) {\n return;\n }\n this._layerHint = layerHint;\n if (layerHint) {\n this.domNode.style.transform = 'translate3d(0px, 0px, 0px)';\n } else {\n this.domNode.style.transform = '';\n }\n }\n\n public setContain(contain: 'none' | 'strict' | 'content' | 'size' | 'layout' | 'style' | 'paint'): void {\n if (this._contain === contain) {\n return;\n }\n this._contain = contain;\n this.domNode.style.contain = this._contain;\n }\n\n public setAttribute(name: string, value: string): void {\n this.domNode.setAttribute(name, value);\n }\n\n}\n\nfunction numberAsPixels(value: number | string): string {\n return (typeof value === 'number' ? `${value}px` : value);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\n// navigator.userAgent is also checked here because bundling with the process module can cause\n// issues otherwise. Note that navigator exists in Node.js 21+ but the userAgent is\n// \"Node.js/\".\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any) && (typeof navigator === 'undefined' || navigator.userAgent.startsWith('Node.js/'))) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isChrome = userAgent.includes('Chrome');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\ninterface IZoomWindow {\n devicePixelRatio?: number;\n}\n\nexport function getZoomFactor(_targetWindow: IZoomWindow): number {\n return 1;\n}\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1], 10);\n}\n\n// Find the user's platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as platform from '../../common/Platform';\n\ninterface IWindowChainElement {\n readonly window: WeakRef;\n readonly iframeElement: Element | null;\n}\n\nconst sameOriginWindowChainCache = new WeakMap();\n\nfunction getParentWindowIfSameOrigin(w: Window): Window | null {\n if (!w.parent || w.parent === w) {\n return null;\n }\n\n try {\n const location = w.location;\n const parentLocation = w.parent.location;\n if (location.origin !== 'null' && parentLocation.origin !== 'null' && location.origin !== parentLocation.origin) {\n return null;\n }\n } catch {\n return null;\n }\n\n return w.parent;\n}\n\nclass IframeUtils {\n\n private static _getSameOriginWindowChain(targetWindow: Window): IWindowChainElement[] {\n let windowChainCache = sameOriginWindowChainCache.get(targetWindow);\n if (!windowChainCache) {\n windowChainCache = [];\n sameOriginWindowChainCache.set(targetWindow, windowChainCache);\n let w: Window | null = targetWindow;\n let parent: Window | null;\n do {\n parent = getParentWindowIfSameOrigin(w);\n if (parent) {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: w.frameElement ?? null\n });\n } else {\n windowChainCache.push({\n window: new WeakRef(w),\n iframeElement: null\n });\n }\n w = parent;\n } while (w);\n }\n return windowChainCache.slice(0);\n }\n\n public static getPositionOfChildWindowRelativeToAncestorWindow(childWindow: Window, ancestorWindow: Window | null): { top: number, left: number } {\n\n if (!ancestorWindow || childWindow === ancestorWindow) {\n return {\n top: 0,\n left: 0\n };\n }\n\n let top = 0;\n let left = 0;\n\n const windowChain = this._getSameOriginWindowChain(childWindow);\n\n for (const windowChainEl of windowChain) {\n const windowInChain = windowChainEl.window.deref();\n top += windowInChain?.scrollY ?? 0;\n left += windowInChain?.scrollX ?? 0;\n\n if (windowInChain === ancestorWindow) {\n break;\n }\n\n if (!windowChainEl.iframeElement) {\n break;\n }\n\n const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();\n top += boundingRect.top;\n left += boundingRect.left;\n }\n\n return {\n top: top,\n left: left\n };\n }\n}\n\nexport interface IMouseEvent {\n readonly browserEvent: MouseEvent;\n readonly leftButton: boolean;\n readonly middleButton: boolean;\n readonly rightButton: boolean;\n readonly buttons: number;\n readonly target: HTMLElement;\n readonly detail: number;\n readonly posx: number;\n readonly posy: number;\n readonly ctrlKey: boolean;\n readonly shiftKey: boolean;\n readonly altKey: boolean;\n readonly metaKey: boolean;\n readonly timestamp: number;\n\n preventDefault(): void;\n stopPropagation(): void;\n}\n\nexport class StandardMouseEvent implements IMouseEvent {\n\n public readonly browserEvent: MouseEvent;\n\n public readonly leftButton: boolean;\n public readonly middleButton: boolean;\n public readonly rightButton: boolean;\n public readonly buttons: number;\n public readonly target: HTMLElement;\n public detail: number;\n public readonly posx: number;\n public readonly posy: number;\n public readonly ctrlKey: boolean;\n public readonly shiftKey: boolean;\n public readonly altKey: boolean;\n public readonly metaKey: boolean;\n public readonly timestamp: number;\n\n constructor(targetWindow: Window, e: MouseEvent) {\n this.timestamp = Date.now();\n this.browserEvent = e;\n this.leftButton = e.button === 0;\n this.middleButton = e.button === 1;\n this.rightButton = e.button === 2;\n this.buttons = e.buttons;\n\n this.target = e.target as HTMLElement;\n\n this.detail = e.detail ?? 1;\n if (e.type === 'dblclick') {\n this.detail = 2;\n }\n this.ctrlKey = e.ctrlKey;\n this.shiftKey = e.shiftKey;\n this.altKey = e.altKey;\n this.metaKey = e.metaKey;\n\n if (typeof e.pageX === 'number') {\n this.posx = e.pageX;\n this.posy = e.pageY;\n } else {\n this.posx = e.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft;\n this.posy = e.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop;\n }\n\n const iframeOffsets = IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(targetWindow, e.view);\n this.posx -= iframeOffsets.left;\n this.posy -= iframeOffsets.top;\n }\n\n public preventDefault(): void {\n this.browserEvent.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent.stopPropagation();\n }\n}\n\nexport interface IMouseWheelEvent extends MouseEvent {\n readonly wheelDelta: number;\n readonly wheelDeltaX: number;\n readonly wheelDeltaY: number;\n\n readonly deltaX: number;\n readonly deltaY: number;\n readonly deltaZ: number;\n readonly deltaMode: number;\n}\n\ninterface IWebKitMouseWheelEvent {\n wheelDeltaY: number;\n wheelDeltaX: number;\n}\n\ninterface IGeckoMouseWheelEvent {\n HORIZONTAL_AXIS: number;\n VERTICAL_AXIS: number;\n axis: number;\n detail: number;\n}\n\nexport class StandardWheelEvent {\n\n public readonly browserEvent: IMouseWheelEvent | null;\n public readonly deltaY: number;\n public readonly deltaX: number;\n public readonly target: Node | null;\n\n constructor(e: IMouseWheelEvent | null, deltaX: number = 0, deltaY: number = 0) {\n\n this.browserEvent = e ?? null;\n this.target = e ? (e.target ?? (e as any).targetNode ?? e.srcElement ?? null) : null;\n\n this.deltaY = deltaY;\n this.deltaX = deltaX;\n\n let shouldFactorDPR: boolean = false;\n if (platform.isChrome) {\n const chromeVersionMatch = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;\n shouldFactorDPR = chromeMajorVersion <= 122;\n }\n\n if (e) {\n const e1 = e as IWebKitMouseWheelEvent as any;\n const e2 = e as unknown as IGeckoMouseWheelEvent;\n const devicePixelRatio = e.view?.devicePixelRatio ?? 1;\n\n if (typeof e1.wheelDeltaY !== 'undefined') {\n if (shouldFactorDPR) {\n this.deltaY = e1.wheelDeltaY / (120 * devicePixelRatio);\n } else {\n this.deltaY = e1.wheelDeltaY / 120;\n }\n } else if (typeof e2.VERTICAL_AXIS !== 'undefined' && e2.axis === e2.VERTICAL_AXIS) {\n this.deltaY = -e2.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaY = -e.deltaY / 3;\n } else {\n this.deltaY = -e.deltaY;\n }\n } else {\n this.deltaY = -e.deltaY / 40;\n }\n }\n\n if (typeof e1.wheelDeltaX !== 'undefined') {\n if (platform.isSafari && platform.isWindows) {\n this.deltaX = -(e1.wheelDeltaX / 120);\n } else if (shouldFactorDPR) {\n this.deltaX = e1.wheelDeltaX / (120 * devicePixelRatio);\n } else {\n this.deltaX = e1.wheelDeltaX / 120;\n }\n } else if (typeof e2.HORIZONTAL_AXIS !== 'undefined' && e2.axis === e2.HORIZONTAL_AXIS) {\n this.deltaX = -e.detail / 3;\n } else if (e.type === 'wheel') {\n const ev = e as unknown as WheelEvent;\n\n if (ev.deltaMode === ev.DOM_DELTA_LINE) {\n if (platform.isFirefox && !platform.isMac) {\n this.deltaX = -e.deltaX / 3;\n } else {\n this.deltaX = -e.deltaX;\n }\n } else {\n this.deltaX = -e.deltaX / 40;\n }\n }\n\n if (this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta) {\n if (shouldFactorDPR) {\n this.deltaY = e.wheelDelta / (120 * devicePixelRatio);\n } else {\n this.deltaY = e.wheelDelta / 120;\n }\n }\n }\n }\n\n public preventDefault(): void {\n this.browserEvent?.preventDefault();\n }\n\n public stopPropagation(): void {\n this.browserEvent?.stopPropagation();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';\n\ntype PointerMoveCallback = (event: PointerEvent) => void;\ntype OnStopCallback = () => void;\n\nexport class GlobalPointerMoveMonitor implements IDisposable {\n\n private readonly _hooks = new DisposableStore();\n private _pointerMoveCallback: PointerMoveCallback | null = null;\n private _onStopCallback: OnStopCallback | null = null;\n\n public dispose(): void {\n this.stopMonitoring(false);\n this._hooks.dispose();\n }\n\n public stopMonitoring(invokeStopCallback: boolean): void {\n if (!this.isMonitoring()) {\n return;\n }\n\n this._hooks.clear();\n this._pointerMoveCallback = null;\n const onStopCallback = this._onStopCallback;\n this._onStopCallback = null;\n\n if (invokeStopCallback && onStopCallback) {\n onStopCallback();\n }\n }\n\n public isMonitoring(): boolean {\n return !!this._pointerMoveCallback;\n }\n\n public startMonitoring(\n initialElement: Element,\n pointerId: number,\n initialButtons: number,\n pointerMoveCallback: PointerMoveCallback,\n onStopCallback: OnStopCallback\n ): void {\n if (this.isMonitoring()) {\n this.stopMonitoring(false);\n }\n this._pointerMoveCallback = pointerMoveCallback;\n this._onStopCallback = onStopCallback;\n\n let eventSource: Element | Window = initialElement;\n\n try {\n initialElement.setPointerCapture(pointerId);\n this._hooks.add(toDisposable(() => {\n try {\n initialElement.releasePointerCapture(pointerId);\n } catch {\n // ignore\n }\n }));\n } catch {\n eventSource = dom.getWindow(initialElement);\n }\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_MOVE,\n (e) => {\n if (e.buttons !== initialButtons) {\n this.stopMonitoring(true);\n return;\n }\n\n e.preventDefault();\n this._pointerMoveCallback!(e);\n }\n ));\n\n this._hooks.add(dom.addDisposableListener(\n eventSource,\n dom.eventType.POINTER_UP,\n (e: PointerEvent) => this.stopMonitoring(true)\n ));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { IMouseEvent, StandardMouseEvent } from './mouseEvent';\nimport { Disposable } from '../../common/Lifecycle';\n\nexport abstract class Widget extends Disposable {\n\n protected _onclick(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.CLICK, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseover(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n\n protected _onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void {\n this._register(dom.addDisposableListener(domNode, dom.eventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(dom.getWindow(domNode), e))));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport * as dom from '../Dom';\n\nexport interface IScrollbarArrowOptions {\n handleActivate: () => void;\n className: string;\n // icon: ThemeIcon;\n\n bgWidth: number;\n bgHeight: number;\n\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport class ScrollbarArrow extends Widget {\n\n private _handleActivate: () => void;\n public bgDomNode: HTMLElement;\n public domNode: HTMLElement;\n private _pointerdownRepeatTimer: dom.WindowIntervalTimer;\n private _pointerdownScheduleRepeatTimer: TimeoutTimer;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n constructor(opts: IScrollbarArrowOptions) {\n super();\n this._handleActivate = opts.handleActivate;\n\n this.bgDomNode = document.createElement('div');\n this.bgDomNode.className = 'xterm-arrow-background';\n this.bgDomNode.style.position = 'absolute';\n this.bgDomNode.style.width = opts.bgWidth + 'px';\n this.bgDomNode.style.height = opts.bgHeight + 'px';\n if (typeof opts.top !== 'undefined') {\n this.bgDomNode.style.top = '0px';\n }\n if (typeof opts.left !== 'undefined') {\n this.bgDomNode.style.left = '0px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.bgDomNode.style.bottom = '0px';\n }\n if (typeof opts.right !== 'undefined') {\n this.bgDomNode.style.right = '0px';\n }\n\n this.domNode = document.createElement('div');\n this.domNode.className = opts.className;\n // this.domNode.classList.add(...ThemeIcon.asClassNameArray(opts.icon));\n\n this.domNode.style.position = 'absolute';\n const arrowSize = Math.min(opts.bgWidth, opts.bgHeight);\n this.domNode.style.width = arrowSize + 'px';\n this.domNode.style.height = arrowSize + 'px';\n if (typeof opts.top !== 'undefined') {\n this.domNode.style.top = opts.top + 'px';\n }\n if (typeof opts.left !== 'undefined') {\n this.domNode.style.left = opts.left + 'px';\n }\n if (typeof opts.bottom !== 'undefined') {\n this.domNode.style.bottom = opts.bottom + 'px';\n }\n if (typeof opts.right !== 'undefined') {\n this.domNode.style.right = opts.right + 'px';\n }\n\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._register(dom.addStandardDisposableListener(this.bgDomNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n this._register(dom.addStandardDisposableListener(this.domNode, dom.eventType.POINTER_DOWN, (e) => this._arrowPointerDown(e)));\n\n this._pointerdownRepeatTimer = this._register(new dom.WindowIntervalTimer());\n this._pointerdownScheduleRepeatTimer = this._register(new TimeoutTimer());\n }\n\n private _arrowPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const scheduleRepeater = (): void => {\n this._pointerdownRepeatTimer.cancelAndSet(() => this._handleActivate(), 1000 / 24, dom.getWindow(e));\n };\n\n this._handleActivate();\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancelAndSet(scheduleRepeater, 200);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData) => { /* Intentional empty */ },\n () => {\n this._pointerdownRepeatTimer.cancel();\n this._pointerdownScheduleRepeatTimer.cancel();\n }\n );\n\n e.preventDefault();\n }\n}\n", "/**\n * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Minimal event utilities for xterm.js core.\n * Simplified from VS Code's event.ts - no leak detection/profiling.\n */\n\nimport { IDisposable, DisposableStore, toDisposable } from './Lifecycle';\n\nexport interface IEvent {\n (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport class Emitter {\n private _listeners: { fn: (e: T) => any, thisArgs: any }[] = [];\n private _disposed = false;\n private _event: IEvent | undefined;\n\n public get event(): IEvent {\n if (this._event) {\n return this._event;\n }\n this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n if (this._disposed) {\n return toDisposable(() => {});\n }\n\n const entry = { fn: listener, thisArgs };\n this._listeners = this._listeners.slice();\n this._listeners.push(entry);\n\n const result = toDisposable(() => {\n const idx = this._listeners.indexOf(entry);\n if (idx !== -1) {\n this._listeners = this._listeners.slice();\n this._listeners.splice(idx, 1);\n }\n });\n\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(result);\n } else {\n disposables.add(result);\n }\n }\n\n return result;\n };\n return this._event;\n }\n\n public fire(event: T): void {\n if (this._disposed || !this._listeners.length) {\n return;\n }\n if (this._listeners.length === 1) {\n this._listeners[0].fn.call(this._listeners[0].thisArgs, event);\n return;\n }\n const listeners = this._listeners;\n for (let i = 0, len = listeners.length; i < len; ++i) {\n listeners[i].fn.call(listeners[i].thisArgs, event);\n }\n }\n\n public dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners.length = 0;\n }\n}\n\nexport namespace EventUtils {\n export function forward(from: IEvent, to: Emitter): IDisposable {\n return from(e => to.fire(e));\n }\n\n export function map(event: IEvent, map: (i: I) => O): IEvent {\n return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n return event(i => listener.call(thisArgs, map(i)), undefined, disposables);\n };\n }\n\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent;\n export function any(...events: IEvent[]): IEvent {\n return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n const store = new DisposableStore();\n for (const event of events) {\n store.add(event(e => listener.call(thisArgs, e)));\n }\n if (disposables) {\n if (Array.isArray(disposables)) {\n disposables.push(store);\n } else {\n disposables.add(store);\n }\n }\n return store;\n };\n }\n\n export function runAndSubscribe(event: IEvent, handler: (e: T) => void, initial: T): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable;\n export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void, initial?: T): IDisposable {\n handler(initial);\n return event(e => handler(e));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Emitter, IEvent } from '../../common/Event';\nimport { Disposable, IDisposable } from '../../common/Lifecycle';\n\nexport const enum ScrollbarVisibility {\n AUTO = 1,\n HIDDEN = 2,\n VISIBLE = 3\n}\n\nexport interface IScrollEvent {\n inSmoothScrolling: boolean;\n\n oldWidth: number;\n oldScrollWidth: number;\n oldScrollLeft: number;\n\n width: number;\n scrollWidth: number;\n scrollLeft: number;\n\n oldHeight: number;\n oldScrollHeight: number;\n oldScrollTop: number;\n\n height: number;\n scrollHeight: number;\n scrollTop: number;\n\n widthChanged: boolean;\n scrollWidthChanged: boolean;\n scrollLeftChanged: boolean;\n\n heightChanged: boolean;\n scrollHeightChanged: boolean;\n scrollTopChanged: boolean;\n}\n\nexport class ScrollState implements IScrollDimensions, IScrollPosition {\n private _scrollStateBrand: void = undefined;\n\n public readonly rawScrollLeft: number;\n public readonly rawScrollTop: number;\n\n public readonly width: number;\n public readonly scrollWidth: number;\n public readonly scrollLeft: number;\n public readonly height: number;\n public readonly scrollHeight: number;\n public readonly scrollTop: number;\n\n constructor(\n private readonly _forceIntegerValues: boolean,\n width: number,\n scrollWidth: number,\n scrollLeft: number,\n height: number,\n scrollHeight: number,\n scrollTop: number\n ) {\n if (this._forceIntegerValues) {\n width = width | 0;\n scrollWidth = scrollWidth | 0;\n scrollLeft = scrollLeft | 0;\n height = height | 0;\n scrollHeight = scrollHeight | 0;\n scrollTop = scrollTop | 0;\n }\n\n this.rawScrollLeft = scrollLeft;\n this.rawScrollTop = scrollTop;\n\n if (width < 0) {\n width = 0;\n }\n if (scrollLeft + width > scrollWidth) {\n scrollLeft = scrollWidth - width;\n }\n if (scrollLeft < 0) {\n scrollLeft = 0;\n }\n\n if (height < 0) {\n height = 0;\n }\n if (scrollTop + height > scrollHeight) {\n scrollTop = scrollHeight - height;\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n\n this.width = width;\n this.scrollWidth = scrollWidth;\n this.scrollLeft = scrollLeft;\n this.height = height;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n }\n\n public equals(other: ScrollState): boolean {\n return (\n this.rawScrollLeft === other.rawScrollLeft\n\t\t\t&& this.rawScrollTop === other.rawScrollTop\n\t\t\t&& this.width === other.width\n\t\t\t&& this.scrollWidth === other.scrollWidth\n\t\t\t&& this.scrollLeft === other.scrollLeft\n\t\t\t&& this.height === other.height\n\t\t\t&& this.scrollHeight === other.scrollHeight\n\t\t\t&& this.scrollTop === other.scrollTop\n );\n }\n\n public withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n (typeof update.width !== 'undefined' ? update.width : this.width),\n (typeof update.scrollWidth !== 'undefined' ? update.scrollWidth : this.scrollWidth),\n useRawScrollPositions ? this.rawScrollLeft : this.scrollLeft,\n (typeof update.height !== 'undefined' ? update.height : this.height),\n (typeof update.scrollHeight !== 'undefined' ? update.scrollHeight : this.scrollHeight),\n useRawScrollPositions ? this.rawScrollTop : this.scrollTop\n );\n }\n\n public withScrollPosition(update: INewScrollPosition): ScrollState {\n return new ScrollState(\n this._forceIntegerValues,\n this.width,\n this.scrollWidth,\n (typeof update.scrollLeft !== 'undefined' ? update.scrollLeft : this.rawScrollLeft),\n this.height,\n this.scrollHeight,\n (typeof update.scrollTop !== 'undefined' ? update.scrollTop : this.rawScrollTop)\n );\n }\n\n public createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): IScrollEvent {\n const widthChanged = (this.width !== previous.width);\n const scrollWidthChanged = (this.scrollWidth !== previous.scrollWidth);\n const scrollLeftChanged = (this.scrollLeft !== previous.scrollLeft);\n\n const heightChanged = (this.height !== previous.height);\n const scrollHeightChanged = (this.scrollHeight !== previous.scrollHeight);\n const scrollTopChanged = (this.scrollTop !== previous.scrollTop);\n\n return {\n inSmoothScrolling: inSmoothScrolling,\n oldWidth: previous.width,\n oldScrollWidth: previous.scrollWidth,\n oldScrollLeft: previous.scrollLeft,\n\n width: this.width,\n scrollWidth: this.scrollWidth,\n scrollLeft: this.scrollLeft,\n\n oldHeight: previous.height,\n oldScrollHeight: previous.scrollHeight,\n oldScrollTop: previous.scrollTop,\n\n height: this.height,\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n\n widthChanged: widthChanged,\n scrollWidthChanged: scrollWidthChanged,\n scrollLeftChanged: scrollLeftChanged,\n\n heightChanged: heightChanged,\n scrollHeightChanged: scrollHeightChanged,\n scrollTopChanged: scrollTopChanged,\n };\n }\n\n}\n\nexport interface IScrollDimensions {\n readonly width: number;\n readonly scrollWidth: number;\n readonly height: number;\n readonly scrollHeight: number;\n}\nexport interface INewScrollDimensions {\n width?: number;\n scrollWidth?: number;\n height?: number;\n scrollHeight?: number;\n}\n\nexport interface IScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n}\nexport interface ISmoothScrollPosition {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n\n readonly width: number;\n readonly height: number;\n}\nexport interface INewScrollPosition {\n scrollLeft?: number;\n scrollTop?: number;\n}\n\nexport interface IScrollableOptions {\n forceIntegerValues: boolean;\n smoothScrollDuration: number;\n scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n}\n\nexport class Scrollable extends Disposable {\n\n private _scrollableBrand: void = undefined;\n\n private _smoothScrollDuration: number;\n private readonly _scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;\n private _state: ScrollState;\n private _smoothScrolling: SmoothScrollingOperation | null;\n\n private _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n constructor(options: IScrollableOptions) {\n super();\n\n this._smoothScrollDuration = options.smoothScrollDuration;\n this._scheduleAtNextAnimationFrame = options.scheduleAtNextAnimationFrame;\n this._state = new ScrollState(options.forceIntegerValues, 0, 0, 0, 0, 0, 0);\n this._smoothScrolling = null;\n }\n\n public override dispose(): void {\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n super.dispose();\n }\n\n public setSmoothScrollDuration(smoothScrollDuration: number): void {\n this._smoothScrollDuration = smoothScrollDuration;\n }\n\n public validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition {\n return this._state.withScrollPosition(scrollPosition);\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._state;\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void {\n const newState = this._state.withScrollDimensions(dimensions, useRawScrollPositions);\n this._setState(newState, Boolean(this._smoothScrolling));\n\n this._smoothScrolling?.acceptScrollDimensions(this._state);\n }\n\n public getFutureScrollPosition(): IScrollPosition {\n if (this._smoothScrolling) {\n return this._smoothScrolling.to;\n }\n return this._state;\n }\n\n public getCurrentScrollPosition(): IScrollPosition {\n return this._state;\n }\n\n public setScrollPositionNow(update: INewScrollPosition): void {\n const newState = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n }\n\n this._setState(newState, false);\n }\n\n public setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void {\n if (this._smoothScrollDuration === 0) {\n this.setScrollPositionNow(update); return;\n }\n\n if (this._smoothScrolling) {\n update = {\n scrollLeft: (typeof update.scrollLeft === 'undefined' ? this._smoothScrolling.to.scrollLeft : update.scrollLeft),\n scrollTop: (typeof update.scrollTop === 'undefined' ? this._smoothScrolling.to.scrollTop : update.scrollTop)\n };\n\n const validTarget = this._state.withScrollPosition(update);\n\n if (this._smoothScrolling.to.scrollLeft === validTarget.scrollLeft && this._smoothScrolling.to.scrollTop === validTarget.scrollTop) {\n return;\n }\n let newSmoothScrolling: SmoothScrollingOperation;\n if (reuseAnimation) {\n newSmoothScrolling = new SmoothScrollingOperation(this._smoothScrolling.from, validTarget, this._smoothScrolling.startTime, this._smoothScrolling.duration);\n } else {\n newSmoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n this._smoothScrolling.dispose();\n this._smoothScrolling = newSmoothScrolling;\n } else {\n const validTarget = this._state.withScrollPosition(update);\n\n this._smoothScrolling = SmoothScrollingOperation.start(this._state, validTarget, this._smoothScrollDuration);\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n public hasPendingScrollAnimation(): boolean {\n return Boolean(this._smoothScrolling);\n }\n\n private _performSmoothScrolling(): void {\n if (!this._smoothScrolling) {\n return;\n }\n const update = this._smoothScrolling.tick();\n const newState = this._state.withScrollPosition(update);\n\n this._setState(newState, true);\n\n if (!this._smoothScrolling) {\n return;\n }\n\n if (update.isDone) {\n this._smoothScrolling.dispose();\n this._smoothScrolling = null;\n return;\n }\n\n this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => {\n if (!this._smoothScrolling) {\n return;\n }\n this._smoothScrolling.animationFrameDisposable = null;\n this._performSmoothScrolling();\n });\n }\n\n private _setState(newState: ScrollState, inSmoothScrolling: boolean): void {\n const oldState = this._state;\n if (oldState.equals(newState)) {\n return;\n }\n this._state = newState;\n this._onScroll.fire(this._state.createScrollEvent(oldState, inSmoothScrolling));\n }\n}\n\nclass SmoothScrollingUpdate {\n\n public readonly scrollLeft: number;\n public readonly scrollTop: number;\n public readonly isDone: boolean;\n\n constructor(scrollLeft: number, scrollTop: number, isDone: boolean) {\n this.scrollLeft = scrollLeft;\n this.scrollTop = scrollTop;\n this.isDone = isDone;\n }\n\n}\n\ninterface IAnimation {\n (completion: number): number;\n}\n\nfunction createEaseOutCubic(from: number, to: number): IAnimation {\n const delta = to - from;\n return function (completion: number): number {\n return from + delta * easeOutCubic(completion);\n };\n}\n\nfunction createComposed(a: IAnimation, b: IAnimation, cut: number): IAnimation {\n return function (completion: number): number {\n if (completion < cut) {\n return a(completion / cut);\n }\n return b((completion - cut) / (1 - cut));\n };\n}\n\nclass SmoothScrollingOperation {\n\n public readonly from: ISmoothScrollPosition;\n public to: ISmoothScrollPosition;\n public readonly duration: number;\n public readonly startTime: number;\n public animationFrameDisposable: IDisposable | null;\n\n private _scrollLeft!: IAnimation;\n private _scrollTop!: IAnimation;\n\n constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number) {\n this.from = from;\n this.to = to;\n this.duration = duration;\n this.startTime = startTime;\n\n this.animationFrameDisposable = null;\n\n this._initAnimations();\n }\n\n private _initAnimations(): void {\n this._scrollLeft = this._initAnimation(this.from.scrollLeft, this.to.scrollLeft, this.to.width);\n this._scrollTop = this._initAnimation(this.from.scrollTop, this.to.scrollTop, this.to.height);\n }\n\n private _initAnimation(from: number, to: number, viewportSize: number): IAnimation {\n const delta = Math.abs(from - to);\n if (delta > 2.5 * viewportSize) {\n let stop1: number; let stop2: number;\n if (from < to) {\n stop1 = from + 0.75 * viewportSize;\n stop2 = to - 0.75 * viewportSize;\n } else {\n stop1 = from - 0.75 * viewportSize;\n stop2 = to + 0.75 * viewportSize;\n }\n return createComposed(createEaseOutCubic(from, stop1), createEaseOutCubic(stop2, to), 0.33);\n }\n return createEaseOutCubic(from, to);\n }\n\n public dispose(): void {\n if (this.animationFrameDisposable !== null) {\n this.animationFrameDisposable.dispose();\n this.animationFrameDisposable = null;\n }\n }\n\n public acceptScrollDimensions(state: ScrollState): void {\n this.to = state.withScrollPosition(this.to);\n this._initAnimations();\n }\n\n public tick(): SmoothScrollingUpdate {\n return this._tick(Date.now());\n }\n\n protected _tick(now: number): SmoothScrollingUpdate {\n const completion = (now - this.startTime) / this.duration;\n\n if (completion < 1) {\n const newScrollLeft = this._scrollLeft(completion);\n const newScrollTop = this._scrollTop(completion);\n return new SmoothScrollingUpdate(newScrollLeft, newScrollTop, false);\n }\n\n return new SmoothScrollingUpdate(this.to.scrollLeft, this.to.scrollTop, true);\n }\n\n public static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation {\n duration = duration + 10;\n const startTime = Date.now() - 10;\n\n return new SmoothScrollingOperation(from, to, startTime, duration);\n }\n}\n\nfunction easeInCubic(t: number): number {\n return Math.pow(t, 3);\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - easeInCubic(1 - t);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FastDomNode } from './fastDomNode';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ScrollbarVisibility } from './scrollable';\n\nexport class ScrollbarVisibilityController extends Disposable {\n private _visibility: ScrollbarVisibility;\n private _visibleClassName: string;\n private _invisibleClassName: string;\n private _domNode: FastDomNode | null;\n private _rawShouldBeVisible: boolean;\n private _shouldBeVisible: boolean;\n private _isNeeded: boolean;\n private _isVisible: boolean;\n private _revealTimer: TimeoutTimer;\n\n constructor(visibility: ScrollbarVisibility, visibleClassName: string, invisibleClassName: string) {\n super();\n this._visibility = visibility;\n this._visibleClassName = visibleClassName;\n this._invisibleClassName = invisibleClassName;\n this._domNode = null;\n this._isVisible = false;\n this._isNeeded = false;\n this._rawShouldBeVisible = false;\n this._shouldBeVisible = false;\n this._revealTimer = this._register(new TimeoutTimer());\n }\n\n public setVisibility(visibility: ScrollbarVisibility): void {\n if (this._visibility !== visibility) {\n this._visibility = visibility;\n this._updateShouldBeVisible();\n }\n }\n\n public setShouldBeVisible(rawShouldBeVisible: boolean): void {\n this._rawShouldBeVisible = rawShouldBeVisible;\n this._updateShouldBeVisible();\n }\n\n private _applyVisibilitySetting(): boolean {\n if (this._visibility === ScrollbarVisibility.HIDDEN) {\n return false;\n }\n if (this._visibility === ScrollbarVisibility.VISIBLE) {\n return true;\n }\n return this._rawShouldBeVisible;\n }\n\n private _updateShouldBeVisible(): void {\n const shouldBeVisible = this._applyVisibilitySetting();\n\n if (this._shouldBeVisible !== shouldBeVisible) {\n this._shouldBeVisible = shouldBeVisible;\n this.ensureVisibility();\n }\n }\n\n public setIsNeeded(isNeeded: boolean): void {\n if (this._isNeeded !== isNeeded) {\n this._isNeeded = isNeeded;\n this.ensureVisibility();\n }\n }\n\n public setDomNode(domNode: FastDomNode): void {\n this._domNode = domNode;\n this._domNode.setClassName(this._invisibleClassName);\n\n this.setShouldBeVisible(false);\n }\n\n public ensureVisibility(): void {\n\n if (!this._isNeeded) {\n this._hide(false);\n return;\n }\n\n if (this._shouldBeVisible) {\n this._reveal();\n } else {\n this._hide(true);\n }\n }\n\n private _reveal(): void {\n if (this._isVisible) {\n return;\n }\n this._isVisible = true;\n\n this._revealTimer.setIfNotSet(() => {\n this._domNode?.setClassName(this._visibleClassName);\n }, 0);\n }\n\n private _hide(withFadeAway: boolean): void {\n this._revealTimer.cancel();\n if (!this._isVisible) {\n return;\n }\n this._isVisible = false;\n this._domNode?.setClassName(this._invisibleClassName + (withFadeAway ? ' xterm-fade' : ''));\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';\nimport { StandardWheelEvent } from './mouseEvent';\nimport { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';\nimport { ScrollbarState } from './scrollbarState';\nimport { ScrollbarVisibilityController } from './scrollbarVisibilityController';\nimport { Widget } from './widget';\nimport * as platform from '../../common/Platform';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';\n\n/**\n * The orthogonal distance to the slider at which dragging \"resets\". This implements \"snapping\"\n */\nconst POINTER_DRAG_RESET_DISTANCE = 140;\n\nexport interface ISimplifiedPointerEvent {\n buttons: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface IScrollbarHost {\n handleMouseWheel(mouseWheelEvent: StandardWheelEvent): void;\n handleDragStart(): void;\n handleDragEnd(): void;\n}\n\ninterface IAbstractScrollbarOptions {\n lazyRender: boolean;\n host: IScrollbarHost;\n scrollbarState: ScrollbarState;\n visibility: ScrollbarVisibility;\n extraScrollbarClassName: string;\n scrollable: Scrollable;\n scrollByPage: boolean;\n}\n\nexport abstract class AbstractScrollbar extends Widget {\n\n protected _host: IScrollbarHost;\n protected _scrollable: Scrollable;\n protected _scrollByPage: boolean;\n private _lazyRender: boolean;\n protected _scrollbarState: ScrollbarState;\n protected _visibilityController: ScrollbarVisibilityController;\n private _pointerMoveMonitor: GlobalPointerMoveMonitor;\n\n public domNode: FastDomNode;\n public slider!: FastDomNode;\n\n protected _shouldRender: boolean;\n\n constructor(opts: IAbstractScrollbarOptions) {\n super();\n this._lazyRender = opts.lazyRender;\n this._host = opts.host;\n this._scrollable = opts.scrollable;\n this._scrollByPage = opts.scrollByPage;\n this._scrollbarState = opts.scrollbarState;\n this._visibilityController = this._register(new ScrollbarVisibilityController(opts.visibility, 'xterm-visible xterm-scrollbar ' + opts.extraScrollbarClassName, 'xterm-invisible xterm-scrollbar ' + opts.extraScrollbarClassName));\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._pointerMoveMonitor = this._register(new GlobalPointerMoveMonitor());\n this._shouldRender = true;\n this.domNode = new FastDomNode(document.createElement('div'));\n this.domNode.setAttribute('role', 'presentation');\n this.domNode.setAttribute('aria-hidden', 'true');\n\n this._visibilityController.setDomNode(this.domNode);\n this.domNode.setPosition('absolute');\n\n this._register(dom.addDisposableListener(this.domNode.domNode, dom.eventType.POINTER_DOWN, (e: PointerEvent) => this._domNodePointerDown(e)));\n }\n\n // ----------------- creation\n\n /**\n * Creates the dom node for an arrow & adds it to the container\n */\n protected _createArrow(opts: IScrollbarArrowOptions): ScrollbarArrow {\n const arrow = this._register(new ScrollbarArrow(opts));\n this.domNode.domNode.appendChild(arrow.bgDomNode);\n this.domNode.domNode.appendChild(arrow.domNode);\n return arrow;\n }\n\n /**\n * Creates the slider dom node, adds it to the container & hooks up the events\n */\n protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void {\n this.slider = new FastDomNode(document.createElement('div'));\n this.slider.setClassName('xterm-slider');\n this.slider.setPosition('absolute');\n this.slider.setTop(top);\n this.slider.setLeft(left);\n if (typeof width === 'number') {\n this.slider.setWidth(width);\n }\n if (typeof height === 'number') {\n this.slider.setHeight(height);\n }\n this.slider.setLayerHinting(true);\n this.slider.setContain('strict');\n\n this.domNode.domNode.appendChild(this.slider.domNode);\n\n this._register(dom.addDisposableListener(\n this.slider.domNode,\n dom.eventType.POINTER_DOWN,\n (e: PointerEvent) => {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n ));\n\n this._onclick(this.slider.domNode, e => {\n if (e.leftButton) {\n e.stopPropagation();\n }\n });\n }\n\n // ----------------- Update state\n\n protected _handleElementSize(visibleSize: number): boolean {\n if (this._scrollbarState.setVisibleSize(visibleSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollSize(elementScrollSize: number): boolean {\n if (this._scrollbarState.setScrollSize(elementScrollSize)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n protected _handleElementScrollPosition(elementScrollPosition: number): boolean {\n if (this._scrollbarState.setScrollPosition(elementScrollPosition)) {\n this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded());\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n return this._shouldRender;\n }\n\n // ----------------- rendering\n\n public beginReveal(): void {\n this._visibilityController.setShouldBeVisible(true);\n }\n\n public beginHide(): void {\n this._visibilityController.setShouldBeVisible(false);\n }\n\n public render(): void {\n if (!this._shouldRender) {\n return;\n }\n this._shouldRender = false;\n\n this._renderDomNode(this._scrollbarState.getRectangleLargeSize(), this._scrollbarState.getRectangleSmallSize());\n this._updateSlider(this._scrollbarState.getSliderSize(), this._scrollbarState.getArrowSize() + this._scrollbarState.getSliderPosition());\n }\n // ----------------- DOM events\n\n private _domNodePointerDown(e: PointerEvent): void {\n if (e.target !== this.domNode.domNode) {\n return;\n }\n this._handlePointerDown(e);\n }\n\n public delegatePointerDown(e: PointerEvent): void {\n const domTop = this.domNode.domNode.getClientRects()[0].top;\n const sliderStart = domTop + this._scrollbarState.getSliderPosition();\n const sliderStop = domTop + this._scrollbarState.getSliderPosition() + this._scrollbarState.getSliderSize();\n const pointerPos = this._sliderPointerPosition(e);\n if (sliderStart <= pointerPos && pointerPos <= sliderStop) {\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n } else {\n this._handlePointerDown(e);\n }\n }\n\n private _handlePointerDown(e: PointerEvent): void {\n let offsetX: number;\n let offsetY: number;\n if (e.target === this.domNode.domNode && typeof e.offsetX === 'number' && typeof e.offsetY === 'number') {\n offsetX = e.offsetX;\n offsetY = e.offsetY;\n } else {\n const domNodePosition = dom.getDomNodePagePosition(this.domNode.domNode);\n offsetX = e.pageX - domNodePosition.left;\n offsetY = e.pageY - domNodePosition.top;\n }\n\n const offset = this._pointerDownRelativePosition(offsetX, offsetY);\n this._setDesiredScrollPositionNow(\n this._scrollByPage\n ? this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(offset)\n : this._scrollbarState.getDesiredScrollPositionFromOffset(offset)\n );\n\n if (e.button === 0) {\n e.preventDefault();\n this._sliderPointerDown(e);\n }\n }\n\n private _sliderPointerDown(e: PointerEvent): void {\n if (!e.target || !(e.target instanceof Element)) {\n return;\n }\n const initialPointerPosition = this._sliderPointerPosition(e);\n const initialPointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(e);\n const initialScrollbarState = this._scrollbarState.clone();\n this.slider.toggleClassName('xterm-active', true);\n\n this._pointerMoveMonitor.startMonitoring(\n e.target,\n e.pointerId,\n e.buttons,\n (pointerMoveData: PointerEvent) => {\n const pointerOrthogonalPosition = this._sliderOrthogonalPointerPosition(pointerMoveData);\n const pointerOrthogonalDelta = Math.abs(pointerOrthogonalPosition - initialPointerOrthogonalPosition);\n\n if (platform.isWindows && pointerOrthogonalDelta > POINTER_DRAG_RESET_DISTANCE) {\n this._setDesiredScrollPositionNow(initialScrollbarState.getScrollPosition());\n return;\n }\n\n const pointerPosition = this._sliderPointerPosition(pointerMoveData);\n const pointerDelta = pointerPosition - initialPointerPosition;\n this._setDesiredScrollPositionNow(initialScrollbarState.getDesiredScrollPositionFromDelta(pointerDelta));\n },\n () => {\n this.slider.toggleClassName('xterm-active', false);\n this._host.handleDragEnd();\n }\n );\n\n this._host.handleDragStart();\n }\n\n private _setDesiredScrollPositionNow(_desiredScrollPosition: number): void {\n\n const desiredScrollPosition: INewScrollPosition = {};\n this.writeScrollPosition(desiredScrollPosition, _desiredScrollPosition);\n\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n public updateScrollbarSize(scrollbarSize: number): void {\n this._updateScrollbarSize(scrollbarSize);\n this._scrollbarState.setScrollbarSize(scrollbarSize);\n this._shouldRender = true;\n if (!this._lazyRender) {\n this.render();\n }\n }\n\n public isNeeded(): boolean {\n return this._scrollbarState.isNeeded();\n }\n\n // ----------------- Overwrite these\n\n protected abstract _renderDomNode(largeSize: number, smallSize: number): void;\n protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;\n\n protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;\n protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;\n protected abstract _updateScrollbarSize(size: number): void;\n\n public abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * The minimal size of the slider (such that it can still be clickable).\n * The slider is artificially enlarged to keep it usable.\n */\nconst MINIMUM_SLIDER_SIZE = 20;\n\ninterface IScrollbarStateComputedValues {\n computedAvailableSize: number;\n computedIsNeeded: boolean;\n computedSliderSize: number;\n computedSliderRatio: number;\n computedSliderPosition: number;\n}\n\nexport class ScrollbarState {\n\n /**\n * For the vertical scrollbar: the width.\n * For the horizontal scrollbar: the height.\n */\n private _scrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the pair horizontal scrollbar.\n * For the horizontal scrollbar: the width of the pair vertical scrollbar.\n */\n private _oppositeScrollbarSize: number;\n\n /**\n * For the vertical scrollbar: the height of the scrollbar's arrows.\n * For the horizontal scrollbar: the width of the scrollbar's arrows.\n */\n private _arrowSize: number;\n\n // --- variables\n /**\n * For the vertical scrollbar: the viewport height.\n * For the horizontal scrollbar: the viewport width.\n */\n private _visibleSize: number;\n\n /**\n * For the vertical scrollbar: the scroll height.\n * For the horizontal scrollbar: the scroll width.\n */\n private _scrollSize: number;\n\n /**\n * For the vertical scrollbar: the scroll top.\n * For the horizontal scrollbar: the scroll left.\n */\n private _scrollPosition: number;\n\n // --- computed variables\n\n /**\n * `visibleSize` - `oppositeScrollbarSize`\n */\n private _computedAvailableSize: number;\n /**\n * (`scrollSize` > 0 && `scrollSize` > `visibleSize`)\n */\n private _computedIsNeeded: boolean;\n\n private _computedSliderSize: number;\n private _computedSliderRatio: number;\n private _computedSliderPosition: number;\n\n constructor(arrowSize: number, scrollbarSize: number, oppositeScrollbarSize: number, visibleSize: number, scrollSize: number, scrollPosition: number) {\n this._scrollbarSize = Math.round(scrollbarSize);\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n this._arrowSize = Math.round(arrowSize);\n\n this._visibleSize = visibleSize;\n this._scrollSize = scrollSize;\n this._scrollPosition = scrollPosition;\n\n this._computedAvailableSize = 0;\n this._computedIsNeeded = false;\n this._computedSliderSize = 0;\n this._computedSliderRatio = 0;\n this._computedSliderPosition = 0;\n\n this._refreshComputedValues();\n }\n\n public clone(): ScrollbarState {\n return new ScrollbarState(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n }\n\n public setVisibleSize(visibleSize: number): boolean {\n const iVisibleSize = Math.round(visibleSize);\n if (this._visibleSize !== iVisibleSize) {\n this._visibleSize = iVisibleSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollSize(scrollSize: number): boolean {\n const iScrollSize = Math.round(scrollSize);\n if (this._scrollSize !== iScrollSize) {\n this._scrollSize = iScrollSize;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollPosition(scrollPosition: number): boolean {\n const iScrollPosition = Math.round(scrollPosition);\n if (this._scrollPosition !== iScrollPosition) {\n this._scrollPosition = iScrollPosition;\n this._refreshComputedValues();\n return true;\n }\n return false;\n }\n\n public setScrollbarSize(scrollbarSize: number): void {\n this._scrollbarSize = Math.round(scrollbarSize);\n }\n\n public setArrowSize(arrowSize: number): void {\n const iArrowSize = Math.round(arrowSize);\n if (this._arrowSize !== iArrowSize) {\n this._arrowSize = iArrowSize;\n this._refreshComputedValues();\n }\n }\n\n public setOppositeScrollbarSize(oppositeScrollbarSize: number): void {\n this._oppositeScrollbarSize = Math.round(oppositeScrollbarSize);\n }\n\n private static _computeValues(\n oppositeScrollbarSize: number,\n arrowSize: number,\n visibleSize: number,\n scrollSize: number,\n scrollPosition: number\n ): IScrollbarStateComputedValues {\n const computedAvailableSize = Math.max(0, visibleSize - oppositeScrollbarSize);\n const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * arrowSize);\n const computedIsNeeded = (scrollSize > 0 && scrollSize > visibleSize);\n\n if (!computedIsNeeded) {\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedRepresentableSize),\n computedSliderRatio: 0,\n computedSliderPosition: 0,\n };\n }\n\n const computedSliderSize = Math.round(Math.max(MINIMUM_SLIDER_SIZE, Math.floor(visibleSize * computedRepresentableSize / scrollSize)));\n\n const computedSliderRatio = (computedRepresentableSize - computedSliderSize) / (scrollSize - visibleSize);\n const computedSliderPosition = (scrollPosition * computedSliderRatio);\n\n return {\n computedAvailableSize: Math.round(computedAvailableSize),\n computedIsNeeded: computedIsNeeded,\n computedSliderSize: Math.round(computedSliderSize),\n computedSliderRatio: computedSliderRatio,\n computedSliderPosition: Math.round(computedSliderPosition),\n };\n }\n\n private _refreshComputedValues(): void {\n const r = ScrollbarState._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition);\n this._computedAvailableSize = r.computedAvailableSize;\n this._computedIsNeeded = r.computedIsNeeded;\n this._computedSliderSize = r.computedSliderSize;\n this._computedSliderRatio = r.computedSliderRatio;\n this._computedSliderPosition = r.computedSliderPosition;\n }\n\n public getArrowSize(): number {\n return this._arrowSize;\n }\n\n public getScrollPosition(): number {\n return this._scrollPosition;\n }\n\n public getRectangleLargeSize(): number {\n return this._computedAvailableSize;\n }\n\n public getRectangleSmallSize(): number {\n return this._scrollbarSize;\n }\n\n public isNeeded(): boolean {\n return this._computedIsNeeded;\n }\n\n public getSliderSize(): number {\n return this._computedSliderSize;\n }\n\n public getSliderPosition(): number {\n return this._computedSliderPosition;\n }\n\n public getDesiredScrollPositionFromOffset(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = offset - this._arrowSize - this._computedSliderSize / 2;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n\n public getDesiredScrollPositionFromOffsetPaged(offset: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const correctedOffset = offset - this._arrowSize;\n let desiredScrollPosition = this._scrollPosition;\n if (correctedOffset < this._computedSliderPosition) {\n desiredScrollPosition -= this._visibleSize;\n } else {\n desiredScrollPosition += this._visibleSize;\n }\n return desiredScrollPosition;\n }\n\n public getDesiredScrollPositionFromDelta(delta: number): number {\n if (!this._computedIsNeeded) {\n return 0;\n }\n\n const desiredSliderPosition = this._computedSliderPosition + delta;\n return Math.round(desiredSliderPosition / this._computedSliderRatio);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\n\nexport class HorizontalScrollbar extends AbstractScrollbar {\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (options.horizontalHasArrows ? options.horizontalScrollbarSize : 0),\n (options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n scrollDimensions.width,\n scrollDimensions.scrollWidth,\n scrollPosition.scrollLeft\n ),\n visibility: options.horizontal,\n extraScrollbarClassName: 'xterm-horizontal',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n if (options.horizontalHasArrows) {\n throw new Error('horizontalHasArrows is not supported in xterm.js');\n }\n\n this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setWidth(sliderSize);\n this.slider.setLeft(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(largeSize);\n this.domNode.setHeight(smallSize);\n this.domNode.setLeft(0);\n this.domNode.setBottom(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollWidth) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollLeft) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.width) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetX;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setHeight(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollLeft = scrollPosition;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.HIDDEN ? 0 : options.horizontalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._visibilityController.setVisibility(options.horizontal);\n this._scrollByPage = options.scrollByPage;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { AbstractScrollbar, ISimplifiedPointerEvent, IScrollbarHost } from './abstractScrollbar';\nimport { IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { ScrollbarState } from './scrollbarState';\nimport { INewScrollPosition, Scrollable, ScrollbarVisibility, IScrollEvent } from './scrollable';\nimport type { ScrollbarArrow } from './scrollbarArrow';\n\nexport class VerticalScrollbar extends AbstractScrollbar {\n private _arrowUp: ScrollbarArrow | undefined;\n private _arrowDown: ScrollbarArrow | undefined;\n private _arrowScrollDelta: number = 0;\n\n constructor(scrollable: Scrollable, options: IScrollableElementResolvedOptions, host: IScrollbarHost) {\n const scrollDimensions = scrollable.getScrollDimensions();\n const scrollPosition = scrollable.getCurrentScrollPosition();\n const hasArrows = options.verticalHasArrows;\n super({\n lazyRender: options.lazyRender,\n host: host,\n scrollbarState: new ScrollbarState(\n (hasArrows ? options.verticalScrollbarSize : 0),\n (options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize),\n 0,\n scrollDimensions.height,\n scrollDimensions.scrollHeight,\n scrollPosition.scrollTop\n ),\n visibility: options.vertical,\n extraScrollbarClassName: 'xterm-vertical',\n scrollable: scrollable,\n scrollByPage: options.scrollByPage\n });\n\n this._setArrows(hasArrows, options.verticalScrollbarSize);\n\n this._createSlider(0, Math.floor((options.verticalScrollbarSize - options.verticalSliderSize) / 2), options.verticalSliderSize, undefined);\n }\n\n protected _updateSlider(sliderSize: number, sliderPosition: number): void {\n this.slider.setHeight(sliderSize);\n this.slider.setTop(sliderPosition);\n }\n\n protected _renderDomNode(largeSize: number, smallSize: number): void {\n this.domNode.setWidth(smallSize);\n this.domNode.setHeight(largeSize);\n this.domNode.setRight(0);\n this.domNode.setTop(0);\n }\n\n public handleScroll(e: IScrollEvent): boolean {\n this._shouldRender = this._handleElementScrollSize(e.scrollHeight) || this._shouldRender;\n this._shouldRender = this._handleElementScrollPosition(e.scrollTop) || this._shouldRender;\n this._shouldRender = this._handleElementSize(e.height) || this._shouldRender;\n return this._shouldRender;\n }\n\n protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {\n return offsetY;\n }\n\n protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageY;\n }\n\n protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {\n return e.pageX;\n }\n\n protected _updateScrollbarSize(size: number): void {\n this.slider.setWidth(size);\n }\n\n public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {\n target.scrollTop = scrollPosition;\n }\n\n private _arrowScroll(delta: number): void {\n const currentPosition = this._scrollable.getCurrentScrollPosition();\n this._scrollable.setScrollPositionNow({ scrollTop: currentPosition.scrollTop + delta });\n }\n\n private _setArrows(showArrows: boolean, size: number): void {\n this._arrowScrollDelta = size;\n if (!this._arrowUp || !this._arrowDown) {\n const arrowDelta = 0;\n this._arrowUp = this._createArrow({\n className: 'xterm-scra xterm-arrow-up',\n top: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(-this._arrowScrollDelta)\n });\n this._arrowDown = this._createArrow({\n className: 'xterm-scra xterm-arrow-down',\n bottom: arrowDelta,\n left: arrowDelta,\n bgWidth: size,\n bgHeight: size,\n handleActivate: () => this._arrowScroll(this._arrowScrollDelta)\n });\n }\n\n this._updateArrowSize(this._arrowUp, size);\n this._updateArrowSize(this._arrowDown, size);\n\n if (!this._arrowUp || !this._arrowDown) {\n return;\n }\n\n const display = showArrows ? '' : 'none';\n this._arrowUp.bgDomNode.style.display = display;\n this._arrowUp.domNode.style.display = display;\n this._arrowDown.bgDomNode.style.display = display;\n this._arrowDown.domNode.style.display = display;\n }\n\n private _updateArrowSize(arrow: ScrollbarArrow | undefined, size: number): void {\n if (!arrow) {\n return;\n }\n arrow.bgDomNode.style.width = `${size}px`;\n arrow.bgDomNode.style.height = `${size}px`;\n arrow.domNode.style.width = `${size}px`;\n arrow.domNode.style.height = `${size}px`;\n }\n\n public updateOptions(options: IScrollableElementResolvedOptions): void {\n const arrowSize = options.verticalHasArrows ? options.verticalScrollbarSize : 0;\n this._scrollbarState.setArrowSize(arrowSize);\n this._setArrows(options.verticalHasArrows, options.verticalScrollbarSize);\n this.updateScrollbarSize(options.vertical === ScrollbarVisibility.HIDDEN ? 0 : options.verticalScrollbarSize);\n this._scrollbarState.setOppositeScrollbarSize(0);\n this._visibilityController.setVisibility(options.vertical);\n this._scrollByPage = options.scrollByPage;\n }\n\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../Dom';\nimport { FastDomNode } from './fastDomNode';\nimport { IMouseEvent, IMouseWheelEvent, StandardWheelEvent } from './mouseEvent';\nimport { IScrollbarHost } from './abstractScrollbar';\nimport { HorizontalScrollbar } from './horizontalScrollbar';\nimport { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';\nimport { VerticalScrollbar } from './verticalScrollbar';\nimport { Widget } from './widget';\nimport { TimeoutTimer } from '../../common/Async';\nimport { Emitter, IEvent } from '../../common/Event';\nimport { IDisposable, dispose } from '../../common/Lifecycle';\nimport * as platform from '../../common/Platform';\nimport { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';\n// import 'vs/css!./media/scrollbars';\n\nconst enum Constants {\n HIDE_TIMEOUT = 500,\n SCROLL_WHEEL_SENSITIVITY = 50\n}\n\nclass MouseWheelClassifierItem {\n public timestamp: number;\n public deltaX: number;\n public deltaY: number;\n public score: number;\n\n constructor(timestamp: number, deltaX: number, deltaY: number) {\n this.timestamp = timestamp;\n this.deltaX = deltaX;\n this.deltaY = deltaY;\n this.score = 0;\n }\n}\n\nclass MouseWheelClassifier {\n\n public static readonly INSTANCE = new MouseWheelClassifier();\n\n private readonly _capacity: number;\n private _memory: MouseWheelClassifierItem[];\n private _front: number;\n private _rear: number;\n\n constructor() {\n this._capacity = 5;\n this._memory = [];\n this._front = -1;\n this._rear = -1;\n }\n\n public isPhysicalMouseWheel(): boolean {\n if (this._front === -1 && this._rear === -1) {\n return false;\n }\n\n let remainingInfluence = 1;\n let score = 0;\n let iteration = 1;\n\n let index = this._rear;\n while (index !== -1) {\n const influence = (index === this._front ? remainingInfluence : Math.pow(2, -iteration));\n remainingInfluence -= influence;\n score += this._memory[index].score * influence;\n\n if (index === this._front) {\n break;\n }\n\n index = (this._capacity + index - 1) % this._capacity;\n iteration++;\n }\n\n return (score <= 0.5);\n }\n\n public acceptStandardWheelEvent(e: StandardWheelEvent): void {\n if (platform.isChrome) {\n const targetWindow = dom.getWindow(e.browserEvent);\n const pageZoomFactor = platform.getZoomFactor(targetWindow);\n this.accept(Date.now(), e.deltaX * pageZoomFactor, e.deltaY * pageZoomFactor);\n } else {\n this.accept(Date.now(), e.deltaX, e.deltaY);\n }\n }\n\n public accept(timestamp: number, deltaX: number, deltaY: number): void {\n let previousItem = null;\n const item = new MouseWheelClassifierItem(timestamp, deltaX, deltaY);\n\n if (this._front === -1 && this._rear === -1) {\n this._memory[0] = item;\n this._front = 0;\n this._rear = 0;\n } else {\n previousItem = this._memory[this._rear];\n\n this._rear = (this._rear + 1) % this._capacity;\n if (this._rear === this._front) {\n this._front = (this._front + 1) % this._capacity;\n }\n this._memory[this._rear] = item;\n }\n\n item.score = this._computeScore(item, previousItem);\n }\n\n private _computeScore(item: MouseWheelClassifierItem, previousItem: MouseWheelClassifierItem | null): number {\n\n if (Math.abs(item.deltaX) > 0 && Math.abs(item.deltaY) > 0) {\n return 1;\n }\n\n let score: number = 0.5;\n\n if (!this._isAlmostInt(item.deltaX) || !this._isAlmostInt(item.deltaY)) {\n score += 0.25;\n }\n\n if (previousItem) {\n const absDeltaX = Math.abs(item.deltaX);\n const absDeltaY = Math.abs(item.deltaY);\n\n const absPreviousDeltaX = Math.abs(previousItem.deltaX);\n const absPreviousDeltaY = Math.abs(previousItem.deltaY);\n\n const minDeltaX = Math.max(Math.min(absDeltaX, absPreviousDeltaX), 1);\n const minDeltaY = Math.max(Math.min(absDeltaY, absPreviousDeltaY), 1);\n\n const maxDeltaX = Math.max(absDeltaX, absPreviousDeltaX);\n const maxDeltaY = Math.max(absDeltaY, absPreviousDeltaY);\n\n const isSameModulo = (maxDeltaX % minDeltaX === 0 && maxDeltaY % minDeltaY === 0);\n if (isSameModulo) {\n score -= 0.5;\n }\n }\n\n return Math.min(Math.max(score, 0), 1);\n }\n\n private _isAlmostInt(value: number): boolean {\n const delta = Math.abs(Math.round(value) - value);\n return (delta < 0.01);\n }\n}\n\nexport class SmoothScrollableElement extends Widget {\n\n private readonly _options: IScrollableElementResolvedOptions;\n protected readonly _scrollable: Scrollable;\n private readonly _verticalScrollbar: VerticalScrollbar;\n private readonly _horizontalScrollbar: HorizontalScrollbar;\n private readonly _domNode: HTMLElement;\n\n private readonly _leftShadowDomNode: FastDomNode | null;\n private readonly _topShadowDomNode: FastDomNode | null;\n private readonly _topLeftShadowDomNode: FastDomNode | null;\n\n private readonly _listenOnDomNode: HTMLElement;\n\n private _mouseWheelToDispose: IDisposable[];\n\n private _isDragging: boolean;\n private _mouseIsOver: boolean;\n\n private readonly _hideTimeout: TimeoutTimer;\n private _shouldRender: boolean;\n\n private _revealOnScroll: boolean;\n\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll: IEvent = this._onScroll.event;\n\n public get options(): Readonly {\n return this._options;\n }\n\n public constructor(element: HTMLElement, options: IScrollableElementCreationOptions, scrollable?: Scrollable) {\n super();\n options = options ?? {};\n let resolvedScrollable: Scrollable;\n const ownsScrollable = !scrollable;\n if (scrollable) {\n resolvedScrollable = scrollable;\n } else {\n options.mouseWheelSmoothScroll = false;\n resolvedScrollable = new Scrollable({\n forceIntegerValues: true,\n smoothScrollDuration: 0,\n scheduleAtNextAnimationFrame: (callback) => dom.scheduleAtNextAnimationFrame(dom.getWindow(element), callback)\n });\n }\n\n this._options = resolveOptions(options);\n this._scrollable = resolvedScrollable;\n\n this._register(this._scrollable.onScroll((e) => {\n this._handleScroll(e);\n this._onScroll.fire(e);\n }));\n if (ownsScrollable) {\n this._register(this._scrollable);\n }\n\n const scrollbarHost: IScrollbarHost = {\n handleMouseWheel: (mouseWheelEvent: StandardWheelEvent) => this._handleMouseWheel(mouseWheelEvent),\n handleDragStart: () => this._handleDragStart(),\n handleDragEnd: () => this._handleDragEnd(),\n };\n this._verticalScrollbar = this._register(new VerticalScrollbar(this._scrollable, this._options, scrollbarHost));\n this._horizontalScrollbar = this._register(new HorizontalScrollbar(this._scrollable, this._options, scrollbarHost));\n\n this._domNode = document.createElement('div');\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n this._domNode.setAttribute('role', 'presentation');\n this._domNode.style.position = 'relative';\n this._domNode.appendChild(element);\n this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode);\n this._domNode.appendChild(this._verticalScrollbar.domNode.domNode);\n\n if (this._options.useShadows) {\n this._leftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._leftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._leftShadowDomNode.domNode);\n\n this._topShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topShadowDomNode.domNode);\n\n this._topLeftShadowDomNode = new FastDomNode(document.createElement('div'));\n this._topLeftShadowDomNode.setClassName('xterm-shadow');\n this._domNode.appendChild(this._topLeftShadowDomNode.domNode);\n } else {\n this._leftShadowDomNode = null;\n this._topShadowDomNode = null;\n this._topLeftShadowDomNode = null;\n }\n\n this._listenOnDomNode = this._options.listenOnDomNode ?? this._domNode;\n\n this._mouseWheelToDispose = [];\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n\n this._onmouseover(this._listenOnDomNode, (e) => this._handleMouseOver(e));\n this._onmouseleave(this._listenOnDomNode, (e) => this._handleMouseLeave(e));\n\n this._hideTimeout = this._register(new TimeoutTimer());\n this._isDragging = false;\n this._mouseIsOver = false;\n\n this._shouldRender = true;\n\n this._revealOnScroll = true;\n }\n\n public override dispose(): void {\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n super.dispose();\n }\n\n public getDomNode(): HTMLElement {\n return this._domNode;\n }\n\n public getScrollDimensions(): IScrollDimensions {\n return this._scrollable.getScrollDimensions();\n }\n\n public setScrollDimensions(dimensions: INewScrollDimensions): void {\n this._scrollable.setScrollDimensions(dimensions, false);\n }\n\n public setScrollPosition(update: INewScrollPosition & { reuseAnimation?: boolean }): void {\n if (update.reuseAnimation) {\n this._scrollable.setScrollPositionSmooth(update, update.reuseAnimation);\n } else {\n this._scrollable.setScrollPositionNow(update);\n }\n }\n\n public getScrollPosition(): IScrollPosition {\n return this._scrollable.getCurrentScrollPosition();\n }\n\n public updateClassName(newClassName: string): void {\n this._options.className = newClassName;\n if (platform.isMac) {\n this._options.className += ' xterm-mac';\n }\n this._domNode.className = 'xterm-scrollable-element ' + this._options.className;\n }\n\n public updateOptions(newOptions: IScrollableElementChangeOptions): void {\n if (typeof newOptions.handleMouseWheel !== 'undefined') {\n this._options.handleMouseWheel = newOptions.handleMouseWheel;\n this._setListeningToMouseWheel(this._options.handleMouseWheel);\n }\n if (typeof newOptions.mouseWheelScrollSensitivity !== 'undefined') {\n this._options.mouseWheelScrollSensitivity = newOptions.mouseWheelScrollSensitivity;\n }\n if (typeof newOptions.fastScrollSensitivity !== 'undefined') {\n this._options.fastScrollSensitivity = newOptions.fastScrollSensitivity;\n }\n if (typeof newOptions.scrollPredominantAxis !== 'undefined') {\n this._options.scrollPredominantAxis = newOptions.scrollPredominantAxis;\n }\n if (typeof newOptions.horizontal !== 'undefined') {\n this._options.horizontal = newOptions.horizontal;\n }\n if (typeof newOptions.vertical !== 'undefined') {\n this._options.vertical = newOptions.vertical;\n }\n if (typeof newOptions.horizontalHasArrows !== 'undefined') {\n this._options.horizontalHasArrows = newOptions.horizontalHasArrows;\n }\n if (typeof newOptions.verticalHasArrows !== 'undefined') {\n this._options.verticalHasArrows = newOptions.verticalHasArrows;\n }\n if (typeof newOptions.horizontalScrollbarSize !== 'undefined') {\n this._options.horizontalScrollbarSize = newOptions.horizontalScrollbarSize;\n }\n if (typeof newOptions.verticalScrollbarSize !== 'undefined') {\n this._options.verticalScrollbarSize = newOptions.verticalScrollbarSize;\n }\n if (typeof newOptions.scrollByPage !== 'undefined') {\n this._options.scrollByPage = newOptions.scrollByPage;\n }\n this._horizontalScrollbar.updateOptions(this._options);\n this._verticalScrollbar.updateOptions(this._options);\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n }\n\n // -------------------- mouse wheel scrolling --------------------\n\n private _setListeningToMouseWheel(shouldListen: boolean): void {\n const isListening = (this._mouseWheelToDispose.length > 0);\n\n if (isListening === shouldListen) {\n return;\n }\n\n this._mouseWheelToDispose = dispose(this._mouseWheelToDispose);\n\n if (shouldListen) {\n const onMouseWheel = (browserEvent: IMouseWheelEvent): void => {\n this._handleMouseWheel(new StandardWheelEvent(browserEvent));\n };\n\n this._mouseWheelToDispose.push(dom.addDisposableListener(this._listenOnDomNode, dom.eventType.MOUSE_WHEEL, onMouseWheel, { passive: false }));\n }\n }\n\n private _handleMouseWheel(e: StandardWheelEvent): void {\n if (e.browserEvent?.defaultPrevented) {\n return;\n }\n\n const classifier = MouseWheelClassifier.INSTANCE;\n classifier.acceptStandardWheelEvent(e);\n\n let didScroll = false;\n\n if (e.deltaY || e.deltaX) {\n let deltaY = e.deltaY * this._options.mouseWheelScrollSensitivity;\n let deltaX = e.deltaX * this._options.mouseWheelScrollSensitivity;\n\n if (this._options.scrollPredominantAxis) {\n if (this._options.scrollYToX && deltaX + deltaY === 0) {\n deltaX = deltaY = 0;\n } else if (Math.abs(deltaY) >= Math.abs(deltaX)) {\n deltaX = 0;\n } else {\n deltaY = 0;\n }\n }\n\n if (this._options.flipAxes) {\n [deltaY, deltaX] = [deltaX, deltaY];\n }\n\n const shiftConvert = !platform.isMac && e.browserEvent && e.browserEvent.shiftKey;\n if ((this._options.scrollYToX || shiftConvert) && !deltaX) {\n deltaX = deltaY;\n deltaY = 0;\n }\n\n if (e.browserEvent && e.browserEvent.altKey) {\n deltaX = deltaX * this._options.fastScrollSensitivity;\n deltaY = deltaY * this._options.fastScrollSensitivity;\n }\n\n const futureScrollPosition = this._scrollable.getFutureScrollPosition();\n\n let desiredScrollPosition: INewScrollPosition = {};\n if (deltaY) {\n const deltaScrollTop = Constants.SCROLL_WHEEL_SENSITIVITY * deltaY;\n const desiredScrollTop = futureScrollPosition.scrollTop - (deltaScrollTop < 0 ? Math.floor(deltaScrollTop) : Math.ceil(deltaScrollTop));\n this._verticalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollTop);\n }\n if (deltaX) {\n const deltaScrollLeft = Constants.SCROLL_WHEEL_SENSITIVITY * deltaX;\n const desiredScrollLeft = futureScrollPosition.scrollLeft - (deltaScrollLeft < 0 ? Math.floor(deltaScrollLeft) : Math.ceil(deltaScrollLeft));\n this._horizontalScrollbar.writeScrollPosition(desiredScrollPosition, desiredScrollLeft);\n }\n\n desiredScrollPosition = this._scrollable.validateScrollPosition(desiredScrollPosition);\n\n if (futureScrollPosition.scrollLeft !== desiredScrollPosition.scrollLeft || futureScrollPosition.scrollTop !== desiredScrollPosition.scrollTop) {\n\n const canPerformSmoothScroll = (\n this._options.mouseWheelSmoothScroll\n\t\t\t\t\t&& classifier.isPhysicalMouseWheel()\n );\n\n if (canPerformSmoothScroll) {\n this._scrollable.setScrollPositionSmooth(desiredScrollPosition);\n } else {\n this._scrollable.setScrollPositionNow(desiredScrollPosition);\n }\n\n didScroll = true;\n }\n }\n\n let consumeMouseWheel = didScroll;\n if (!consumeMouseWheel && this._options.alwaysConsumeMouseWheel) {\n consumeMouseWheel = true;\n }\n if (!consumeMouseWheel && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded())) {\n consumeMouseWheel = true;\n }\n\n if (consumeMouseWheel) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n private _handleScroll(e: IScrollEvent): void {\n this._shouldRender = this._horizontalScrollbar.handleScroll(e) || this._shouldRender;\n this._shouldRender = this._verticalScrollbar.handleScroll(e) || this._shouldRender;\n\n if (this._options.useShadows) {\n this._shouldRender = true;\n }\n\n if (this._revealOnScroll) {\n this._reveal();\n }\n\n if (!this._options.lazyRender) {\n this._render();\n }\n }\n\n public renderNow(): void {\n if (!this._options.lazyRender) {\n throw new Error('Please use `lazyRender` together with `renderNow`!');\n }\n\n this._render();\n }\n\n private _render(): void {\n if (!this._shouldRender) {\n return;\n }\n\n this._shouldRender = false;\n\n this._horizontalScrollbar.render();\n this._verticalScrollbar.render();\n\n if (this._options.useShadows) {\n const scrollState = this._scrollable.getCurrentScrollPosition();\n const enableTop = scrollState.scrollTop > 0;\n const enableLeft = scrollState.scrollLeft > 0;\n\n const leftClassName = (enableLeft ? ' xterm-shadow-left' : '');\n const topClassName = (enableTop ? ' xterm-shadow-top' : '');\n const topLeftClassName = (enableLeft || enableTop ? ' xterm-shadow-top-left-corner' : '');\n this._leftShadowDomNode!.setClassName(`xterm-shadow${leftClassName}`);\n this._topShadowDomNode!.setClassName(`xterm-shadow${topClassName}`);\n this._topLeftShadowDomNode!.setClassName(`xterm-shadow${topLeftClassName}${topClassName}${leftClassName}`);\n }\n }\n\n // -------------------- fade in / fade out --------------------\n\n private _handleDragStart(): void {\n this._isDragging = true;\n this._reveal();\n }\n\n private _handleDragEnd(): void {\n this._isDragging = false;\n this._hide();\n }\n\n private _handleMouseLeave(e: IMouseEvent): void {\n this._mouseIsOver = false;\n this._hide();\n }\n\n private _handleMouseOver(e: IMouseEvent): void {\n this._mouseIsOver = true;\n this._reveal();\n }\n\n private _reveal(): void {\n this._verticalScrollbar.beginReveal();\n this._horizontalScrollbar.beginReveal();\n this._scheduleHide();\n }\n\n private _hide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._verticalScrollbar.beginHide();\n this._horizontalScrollbar.beginHide();\n }\n }\n\n private _scheduleHide(): void {\n if (!this._mouseIsOver && !this._isDragging) {\n this._hideTimeout.cancelAndSet(() => this._hide(), Constants.HIDE_TIMEOUT);\n }\n }\n}\n\nfunction resolveOptions(opts: IScrollableElementCreationOptions): IScrollableElementResolvedOptions {\n const result: IScrollableElementResolvedOptions = {\n lazyRender: (typeof opts.lazyRender !== 'undefined' ? opts.lazyRender : false),\n className: (typeof opts.className !== 'undefined' ? opts.className : ''),\n useShadows: (typeof opts.useShadows !== 'undefined' ? opts.useShadows : true),\n handleMouseWheel: (typeof opts.handleMouseWheel !== 'undefined' ? opts.handleMouseWheel : true),\n flipAxes: (typeof opts.flipAxes !== 'undefined' ? opts.flipAxes : false),\n consumeMouseWheelIfScrollbarIsNeeded: (typeof opts.consumeMouseWheelIfScrollbarIsNeeded !== 'undefined' ? opts.consumeMouseWheelIfScrollbarIsNeeded : false),\n alwaysConsumeMouseWheel: (typeof opts.alwaysConsumeMouseWheel !== 'undefined' ? opts.alwaysConsumeMouseWheel : false),\n scrollYToX: (typeof opts.scrollYToX !== 'undefined' ? opts.scrollYToX : false),\n mouseWheelScrollSensitivity: (typeof opts.mouseWheelScrollSensitivity !== 'undefined' ? opts.mouseWheelScrollSensitivity : 1),\n fastScrollSensitivity: (typeof opts.fastScrollSensitivity !== 'undefined' ? opts.fastScrollSensitivity : 5),\n scrollPredominantAxis: (typeof opts.scrollPredominantAxis !== 'undefined' ? opts.scrollPredominantAxis : true),\n mouseWheelSmoothScroll: (typeof opts.mouseWheelSmoothScroll !== 'undefined' ? opts.mouseWheelSmoothScroll : true),\n\n listenOnDomNode: (typeof opts.listenOnDomNode !== 'undefined' ? opts.listenOnDomNode : null),\n\n horizontal: (typeof opts.horizontal !== 'undefined' ? opts.horizontal : ScrollbarVisibility.AUTO),\n horizontalScrollbarSize: (typeof opts.horizontalScrollbarSize !== 'undefined' ? opts.horizontalScrollbarSize : 10),\n horizontalSliderSize: (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : 0),\n horizontalHasArrows: (typeof opts.horizontalHasArrows !== 'undefined' ? opts.horizontalHasArrows : false),\n\n vertical: (typeof opts.vertical !== 'undefined' ? opts.vertical : ScrollbarVisibility.AUTO),\n verticalScrollbarSize: (typeof opts.verticalScrollbarSize !== 'undefined' ? opts.verticalScrollbarSize : 10),\n verticalHasArrows: (typeof opts.verticalHasArrows !== 'undefined' ? opts.verticalHasArrows : false),\n verticalSliderSize: (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : 0),\n\n scrollByPage: (typeof opts.scrollByPage !== 'undefined' ? opts.scrollByPage : false)\n };\n\n result.horizontalSliderSize = (typeof opts.horizontalSliderSize !== 'undefined' ? opts.horizontalSliderSize : result.horizontalScrollbarSize);\n result.verticalSliderSize = (typeof opts.verticalSliderSize !== 'undefined' ? opts.verticalSliderSize : result.verticalScrollbarSize);\n\n if (platform.isMac) {\n result.className += ' xterm-mac';\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';\nimport { ViewportConstants } from './shared/Constants';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';\nimport { CoreMouseEventType } from '../common/Types';\nimport { scheduleAtNextAnimationFrame } from './Dom';\nimport { SmoothScrollableElement } from './scrollable/scrollableElement';\nimport type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';\nimport { Emitter, EventUtils } from '../common/Event';\nimport { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';\n\nexport class Viewport extends Disposable {\n\n protected _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n private _scrollableElement: SmoothScrollableElement;\n private _styleElement: HTMLStyleElement;\n\n private _queuedAnimationFrame?: number;\n private _latestYDisp?: number;\n private _isSyncing: boolean = false;\n private _isHandlingScroll: boolean = false;\n private _suppressOnScrollHandler: boolean = false;\n private _needsSyncOnRender: boolean = false;\n\n constructor(\n element: HTMLElement,\n screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseStateService mouseStateService: IMouseStateService,\n @IThemeService themeService: IThemeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n const scrollable = this._register(new Scrollable({\n forceIntegerValues: false,\n smoothScrollDuration: this._optionsService.rawOptions.smoothScrollDuration,\n // This is used over `IRenderService.addRefreshCallback` since it can be canceled\n scheduleAtNextAnimationFrame: cb => scheduleAtNextAnimationFrame(coreBrowserService.window, cb)\n }));\n this._register(this._optionsService.onSpecificOptionChange('smoothScrollDuration', () => {\n scrollable.setSmoothScrollDuration(this._optionsService.rawOptions.smoothScrollDuration);\n }));\n\n this._scrollableElement = this._register(new SmoothScrollableElement(screenElement, {\n vertical: ScrollbarVisibility.AUTO,\n horizontal: ScrollbarVisibility.HIDDEN,\n useShadows: false,\n mouseWheelSmoothScroll: true,\n verticalHasArrows: this._optionsService.rawOptions.scrollbar?.showArrows ?? false,\n ...this._getChangeOptions()\n }, scrollable));\n this._register(this._optionsService.onMultipleOptionChange([\n 'scrollSensitivity',\n 'fastScrollSensitivity',\n 'scrollbar'\n ], () => this._scrollableElement.updateOptions(this._getChangeOptions())));\n // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol\n this._register(mouseStateService.onProtocolChange(type => {\n this._scrollableElement.updateOptions({\n handleMouseWheel: !(type & CoreMouseEventType.WHEEL)\n });\n }));\n\n this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 });\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n element.style.backgroundColor = themeService.colors.background.css;\n this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css;\n }));\n element.appendChild(this._scrollableElement.getDomNode());\n this._register(toDisposable(() => this._scrollableElement.getDomNode().remove()));\n\n this._styleElement = coreBrowserService.mainDocument.createElement('style');\n screenElement.appendChild(this._styleElement);\n this._register(toDisposable(() => this._styleElement.remove()));\n this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => {\n this._styleElement.textContent = [\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider {`,\n ` background: ${themeService.colors.scrollbarSliderBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider:hover {`,\n ` background: ${themeService.colors.scrollbarSliderHoverBackground.css};`,\n `}`,\n `.xterm .xterm-scrollable-element > .xterm-scrollbar > .xterm-slider.xterm-active {`,\n ` background: ${themeService.colors.scrollbarSliderActiveBackground.css};`,\n `}`\n ].join('\\n');\n }));\n\n this._register(this._bufferService.onResize(() => this.queueSync()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n // Reset _latestYDisp when switching buffers to prevent stale scroll position\n // from alt buffer contaminating normal buffer scroll position\n this._latestYDisp = undefined;\n this.queueSync();\n }));\n this._register(this._bufferService.onScroll(() => this._sync()));\n\n // Flush deferred viewport sync after a render completes (e.g. after ESU ends\n // synchronized output mode). This ensures DOM scroll position updates atomically\n // with the canvas render.\n this._register(this._renderService.onRender(() => {\n if (this._needsSyncOnRender) {\n this._needsSyncOnRender = false;\n this._sync();\n }\n }));\n\n this._register(this._scrollableElement.onScroll(e => this._handleScroll(e)));\n\n }\n\n public scrollLines(disp: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n reuseAnimation: true,\n scrollTop: pos.scrollTop + disp * this._renderService.dimensions.css.cell.height\n });\n }\n\n public scrollToLine(line: number, disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll) {\n this._latestYDisp = line;\n }\n this._scrollableElement.setScrollPosition({\n reuseAnimation: !disableSmoothScroll,\n scrollTop: line * this._renderService.dimensions.css.cell.height\n });\n }\n\n private _getChangeOptions(): IScrollableElementChangeOptions {\n const showScrollbar = this._optionsService.rawOptions.scrollbar?.showScrollbar ?? true;\n const showArrows = this._optionsService.rawOptions.scrollbar?.showArrows ?? false;\n const verticalScrollbarSize = showScrollbar\n ? (this._optionsService.rawOptions.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)\n : 0;\n return {\n mouseWheelScrollSensitivity: this._optionsService.rawOptions.scrollSensitivity,\n fastScrollSensitivity: this._optionsService.rawOptions.fastScrollSensitivity,\n vertical: showScrollbar ? ScrollbarVisibility.AUTO : ScrollbarVisibility.HIDDEN,\n verticalScrollbarSize,\n verticalHasArrows: showArrows\n };\n }\n\n public queueSync(ydisp?: number): void {\n // Update state\n if (ydisp !== undefined) {\n this._latestYDisp = ydisp;\n }\n\n // Don't queue more than one callback\n if (this._queuedAnimationFrame !== undefined) {\n return;\n }\n this._queuedAnimationFrame = this._renderService.addRefreshCallback(() => {\n this._queuedAnimationFrame = undefined;\n this._sync(this._latestYDisp);\n });\n }\n\n private _sync(ydisp: number = this._bufferService.buffer.ydisp): void {\n if (!this._renderService || this._isSyncing) {\n return;\n }\n // Defer DOM scroll updates during synchronized output to prevent visible\n // scroll position flickering while the canvas content is frozen.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._needsSyncOnRender = true;\n return;\n }\n this._isSyncing = true;\n\n // Ignore any onScroll event that happens as a result of dimensions changing as this should\n // never cause a scrollLines call, only setScrollPosition can do that.\n this._suppressOnScrollHandler = true;\n this._scrollableElement.setScrollDimensions({\n height: this._renderService.dimensions.css.canvas.height,\n scrollHeight: this._renderService.dimensions.css.cell.height * this._bufferService.buffer.lines.length\n });\n this._suppressOnScrollHandler = false;\n\n // If ydisp has been changed by some other component (input/buffer), then stop animating smooth\n // scroll and scroll there immediately.\n if (ydisp !== this._latestYDisp) {\n this._scrollableElement.setScrollPosition({\n scrollTop: ydisp * this._renderService.dimensions.css.cell.height\n });\n }\n\n this._isSyncing = false;\n }\n\n private _handleScroll(e: IScrollEvent): void {\n if (!this._renderService) {\n return;\n }\n if (this._isHandlingScroll || this._suppressOnScrollHandler) {\n return;\n }\n this._isHandlingScroll = true;\n const newRow = Math.round(e.scrollTop / this._renderService.dimensions.css.cell.height);\n const diff = newRow - this._bufferService.buffer.ydisp;\n if (diff !== 0) {\n this._latestYDisp = newRow;\n this._onRequestScrollLines.fire(diff);\n }\n this._isHandlingScroll = false;\n }\n\n public handleTouchScroll(translationY: number): void {\n const pos = this._scrollableElement.getScrollPosition();\n this._scrollableElement.setScrollPosition({\n scrollTop: pos.scrollTop - translationY\n });\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ICoreBrowserService, IRenderService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n private readonly _container: HTMLElement;\n private readonly _decorationElements: Map = new Map();\n\n private _animationFrame: number | undefined;\n private _altBufferIsActive: boolean = false;\n private _dimensionsChanged: boolean = false;\n\n constructor(\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n this._container = document.createElement('div');\n this._container.classList.add('xterm-decoration-container');\n this._screenElement.appendChild(this._container);\n\n this._register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n this._register(this._renderService.onDimensionsChange(() => {\n this._dimensionsChanged = true;\n this._queueRefresh();\n }));\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n }));\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n this._register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n this._register(toDisposable(() => {\n this._container.remove();\n this._decorationElements.clear();\n }));\n }\n\n private _queueRefresh(): void {\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._renderService.addRefreshCallback(() => {\n this._doRefreshDecorations();\n this._animationFrame = undefined;\n });\n }\n\n private _doRefreshDecorations(): void {\n for (const decoration of this._decorationService.decorations) {\n this._renderDecoration(decoration);\n }\n this._dimensionsChanged = false;\n }\n\n private _renderDecoration(decoration: IInternalDecoration): void {\n this._refreshStyle(decoration);\n if (this._dimensionsChanged) {\n this._refreshXPosition(decoration);\n }\n }\n\n private _createElement(decoration: IInternalDecoration): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.classList.add('xterm-decoration');\n element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n const x = decoration.options.x ?? 0;\n if (x && x > this._bufferService.cols) {\n // exceeded the container width, so hide\n element.style.display = 'none';\n }\n this._refreshXPosition(decoration, element);\n\n return element;\n }\n\n private _refreshStyle(decoration: IInternalDecoration): void {\n const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n if (line < 0 || line >= this._bufferService.rows) {\n // outside of viewport\n if (decoration.element) {\n decoration.element.style.display = 'none';\n decoration.onRenderEmitter.fire(decoration.element);\n }\n } else {\n let element = this._decorationElements.get(decoration);\n if (!element) {\n element = this._createElement(decoration);\n decoration.element = element;\n this._decorationElements.set(decoration, element);\n this._container.appendChild(element);\n decoration.onDispose(() => {\n this._decorationElements.delete(decoration);\n element!.remove();\n });\n }\n element.style.display = this._altBufferIsActive ? 'none' : 'block';\n if (!this._altBufferIsActive) {\n element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n }\n decoration.onRenderEmitter.fire(element);\n }\n }\n\n private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n if (!element) {\n return;\n }\n const x = decoration.options.x ?? 0;\n if ((decoration.options.anchor || 'left') === 'right') {\n element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n } else {\n element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n }\n }\n\n private _removeDecoration(decoration: IInternalDecoration): void {\n this._decorationElements.get(decoration)?.remove();\n this._decorationElements.delete(decoration);\n decoration.dispose();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from '../../common/services/Services';\n\nexport interface IColorZoneStore {\n readonly zones: IColorZone[];\n clear(): void;\n addDecoration(decoration: IInternalDecoration): void;\n /**\n * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n * the padding they will be merged into the same zone.\n */\n setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n /** Color in a format supported by canvas' fillStyle. */\n color: string;\n position: 'full' | 'left' | 'center' | 'right' | undefined;\n startBufferLine: number;\n endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n marker: Pick;\n options: Pick;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n private _zones: IColorZone[] = [];\n\n // The zone pool is used to keep zone objects from being freed between clearing the color zone\n // store and fetching the zones. This helps reduce GC pressure since the color zones are\n // accumulated on potentially every scroll event.\n private _zonePool: IColorZone[] = [];\n private _zonePoolIndex = 0;\n\n private _linePadding: { [position: string]: number } = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n };\n\n public get zones(): IColorZone[] {\n // Trim the zone pool to free unused memory\n this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n return this._zones;\n }\n\n public clear(): void {\n this._zones.length = 0;\n this._zonePoolIndex = 0;\n }\n\n public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n if (!decoration.options.overviewRulerOptions) {\n return;\n }\n for (const z of this._zones) {\n if (z.color === decoration.options.overviewRulerOptions.color &&\n z.position === decoration.options.overviewRulerOptions.position) {\n if (this._lineIntersectsZone(z, decoration.marker.line)) {\n return;\n }\n if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n this._addLineToZone(z, decoration.marker.line);\n return;\n }\n }\n }\n // Create using zone pool if possible\n if (this._zonePoolIndex < this._zonePool.length) {\n this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n this._zones.push(this._zonePool[this._zonePoolIndex++]);\n return;\n }\n // Create\n this._zones.push({\n color: decoration.options.overviewRulerOptions.color,\n position: decoration.options.overviewRulerOptions.position,\n startBufferLine: decoration.marker.line,\n endBufferLine: decoration.marker.line\n });\n this._zonePool.push(this._zones[this._zones.length - 1]);\n this._zonePoolIndex++;\n }\n\n public setPadding(padding: { [position: string]: number }): void {\n this._linePadding = padding;\n }\n\n private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n return (\n line >= zone.startBufferLine &&\n line <= zone.endBufferLine\n );\n }\n\n private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n return (\n (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n );\n }\n\n private _addLineToZone(zone: IColorZone, line: number): void {\n zone.startBufferLine = Math.min(zone.startBufferLine, line);\n zone.endBufferLine = Math.max(zone.endBufferLine, line);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';\nimport { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';\n\nconst enum Constants {\n OVERVIEW_RULER_BORDER_WIDTH = 1\n}\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawWidth = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\nconst drawX = {\n full: 0,\n left: 0,\n center: 0,\n right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n private readonly _canvas: HTMLCanvasElement;\n private readonly _ctx: CanvasRenderingContext2D;\n private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n private get _width(): number {\n const scrollbar = this._optionsService.rawOptions.scrollbar;\n const showScrollbar = scrollbar?.showScrollbar ?? true;\n if (!showScrollbar) {\n return 0;\n }\n return scrollbar?.width ?? 0;\n }\n private _animationFrame: number | undefined;\n\n private _shouldUpdateDimensions: boolean | undefined = true;\n private _shouldUpdateAnchor: boolean | undefined = true;\n private _lastKnownBufferLength: number = 0;\n\n constructor(\n private readonly _viewportElement: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IRenderService private readonly _renderService: IRenderService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IThemeService private readonly _themeService: IThemeService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add('xterm-decoration-overview-ruler');\n this._refreshCanvasDimensions();\n this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n this._register(toDisposable(() => this._canvas?.remove()));\n\n const ctx = this._canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Ctx cannot be null');\n } else {\n this._ctx = ctx;\n }\n\n this._register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n this._register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n\n this._register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n }));\n this._register(this._bufferService.onScroll(() => {\n if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n this._refreshDrawHeightConstants();\n this._refreshColorZonePadding();\n }\n }));\n\n this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true)));\n\n this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true)));\n this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true)));\n this._register(this._themeService.onChangeColors(() => this._queueRefresh()));\n this._register(toDisposable(() => {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }));\n this._queueRefresh(true);\n }\n\n private _refreshDrawConstants(): void {\n // width\n const outerWidth = Math.floor((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n const innerWidth = Math.ceil((this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH) / 3);\n drawWidth.full = this._canvas.width;\n drawWidth.left = outerWidth;\n drawWidth.center = innerWidth;\n drawWidth.right = outerWidth;\n // height\n this._refreshDrawHeightConstants();\n // x\n drawX.full = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.left = Constants.OVERVIEW_RULER_BORDER_WIDTH;\n drawX.center = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left;\n drawX.right = Constants.OVERVIEW_RULER_BORDER_WIDTH + drawWidth.left + drawWidth.center;\n }\n\n private _refreshDrawHeightConstants(): void {\n drawHeight.full = Math.round(2 * this._coreBrowserService.dpr);\n // Calculate actual pixels per line\n const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n // Clamp actual pixels within a range\n const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowserService.dpr);\n drawHeight.left = nonFullHeight;\n drawHeight.center = nonFullHeight;\n drawHeight.right = nonFullHeight;\n }\n\n private _refreshColorZonePadding(): void {\n this._colorZoneStore.setPadding({\n full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n });\n this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n }\n\n private _refreshCanvasDimensions(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n const cssCanvasHeight = this._renderService.dimensions.css.canvas.height;\n const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height;\n this._canvas.style.width = `${this._width}px`;\n this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr);\n this._canvas.style.height = `${cssCanvasHeight}px`;\n this._canvas.height = deviceCanvasHeight;\n this._refreshDrawConstants();\n this._refreshColorZonePadding();\n }\n\n private _refreshDecorations(): void {\n if (this._store.isDisposed || !this._renderService.hasRenderer()) {\n return;\n }\n if (this._shouldUpdateDimensions) {\n this._refreshCanvasDimensions();\n }\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n this._colorZoneStore.clear();\n for (const decoration of this._decorationService.decorations) {\n this._colorZoneStore.addDecoration(decoration);\n }\n this._ctx.lineWidth = 1;\n this._renderRulerOutline();\n const zones = this._colorZoneStore.zones;\n for (const zone of zones) {\n if (zone.position !== 'full') {\n this._renderColorZone(zone);\n }\n }\n for (const zone of zones) {\n if (zone.position === 'full') {\n this._renderColorZone(zone);\n }\n }\n this._shouldUpdateDimensions = false;\n this._shouldUpdateAnchor = false;\n }\n\n private _renderRulerOutline(): void {\n this._ctx.fillStyle = this._themeService.colors.overviewRulerBorder.css;\n this._ctx.fillRect(0, 0, Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showTopBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, 0, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, Constants.OVERVIEW_RULER_BORDER_WIDTH);\n }\n if (this._optionsService.rawOptions.scrollbar?.overviewRuler?.showBottomBorder) {\n this._ctx.fillRect(Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.width - Constants.OVERVIEW_RULER_BORDER_WIDTH, this._canvas.height);\n }\n }\n\n private _renderColorZone(zone: IColorZone): void {\n this._ctx.fillStyle = zone.color;\n this._ctx.fillRect(\n /* x */ drawX[zone.position || 'full'],\n /* y */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n ),\n /* w */ drawWidth[zone.position || 'full'],\n /* h */ Math.round(\n (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n )\n );\n }\n\n private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n if (this._store.isDisposed) {\n return;\n }\n this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n if (this._animationFrame !== undefined) {\n return;\n }\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n if (!this._store.isDisposed) {\n this._refreshDecorations();\n }\n this._animationFrame = undefined;\n });\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from './Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1], 10);\n $g = parseInt(rgbaMatch[2], 10);\n $b = parseInt(rgbaMatch[3], 10);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Handle the \"transparent\" keyword\n if (css === 'transparent') {\n return {\n css: 'transparent',\n rgba: 0x00000000\n };\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The second relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService, IThemeService } from '../services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';\nimport { color } from '../../common/Color';\nimport { C0 } from '../../common/data/EscapeSequences';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\ninterface IPendingComposition {\n transactionId: number;\n finalizerTimer?: ReturnType;\n lifecycleSettled: boolean;\n sessionEnded: boolean;\n position: IPosition;\n suffix: string;\n dataAlreadySent: string;\n compositionData: string;\n endData: string;\n inputData: string;\n keypressData: string;\n keypressMayOverlapComposition: boolean;\n expectsPostCompositionInput: boolean;\n nextCompositionStart?: number;\n}\n\nconst XTERM_COMPOSITION_SESSION_START_EVENT = 'xterm-composition-session-start';\nconst XTERM_COMPOSITION_SESSION_END_EVENT = 'xterm-composition-session-end';\nconst XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT =\n 'xterm-composition-transaction-accepted';\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n public get isComposing(): boolean { return this._isComposing; }\n public get hasPendingCompositionFinalization(): boolean {\n return this._pendingComposition !== undefined;\n }\n public get _isSendingComposition(): boolean {\n return this.hasPendingCompositionFinalization;\n }\n public get _pendingKeypressData(): string {\n return this._pendingComposition?.keypressData ?? '';\n }\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Text that existed after the composing range when composition started.\n * This is used to avoid treating existing trailing text as new input.\n */\n private _compositionSuffix: string;\n\n /**\n * Data already sent due to keydown event.\n */\n private _dataAlreadySent: string;\n\n private _pendingComposition?: IPendingComposition;\n\n private _isAwaitingCompositionEnd: boolean;\n\n private _compositionInputData: string;\n\n private _lastCompositionData: string;\n\n private _compositionStartValue: string;\n\n private _compositionStartSelection: IPosition;\n\n private _compositionHasObservedProgress: boolean;\n\n private _canceledKey?: Pick;\n\n /**\n * The pending textarea change timer, if any.\n */\n private _textareaChangeTimer?: number;\n\n /**\n * Whether the IME consumed the last keydown and still owes the commit it produced. Nothing is\n * forwarded for such a keydown, so the commit is claimed by whichever observes it first.\n */\n private _imeKeydownAwaitingCommit: boolean;\n\n /**\n * Identifies the composition transaction that owns deferred work.\n */\n private _compositionTransactionId: number;\n\n /**\n * Timers that still own deferred composition state.\n */\n private _compositionTimers: Set>;\n\n private _compositionPositionTimer?: ReturnType;\n\n private _compositionViewTimer?: ReturnType;\n\n private _compositionEndTimer?: ReturnType;\n\n /** The preedit's own span, used to anchor the native candidate window. */\n private _compositionPreedit?: HTMLElement;\n\n /** The rendered row tail, set only while the cursor sits mid-line. */\n private _compositionRemainder?: HTMLElement;\n\n /** The insertion caret painted above the renderer cursor the composition view covers. */\n private _compositionCaret?: HTMLElement;\n\n /** The last preedit rendered, so a row repaint can re-render without a composition event. */\n private _compositionViewData?: string;\n\n // Keep the six-argument form callable: upstream's own CompositionHelper.test.ts constructs\n // this class directly, and `.npmignore` strips src/**/*.test.ts from the published tarball, so\n // the shipped patch has no hunk that could update that call. Dropping this overload fails the\n // upstream build with TS2554. The theme service is therefore optional, and every color read\n // below keeps the stock fallback that path needs.\n constructor(\n textarea: HTMLTextAreaElement,\n compositionView: HTMLElement,\n bufferService: IBufferService,\n optionsService: IOptionsService,\n coreService: ICoreService,\n renderService: IRenderService\n );\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService private readonly _coreService: ICoreService,\n @IRenderService private readonly _renderService: IRenderService,\n @IThemeService private readonly _themeService?: IThemeService\n ) {\n this._isComposing = false;\n this._isAwaitingCompositionEnd = false;\n this._compositionPosition = { start: 0, end: 0 };\n this._compositionSuffix = '';\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionStartValue = '';\n this._compositionStartSelection = { start: 0, end: 0 };\n this._compositionHasObservedProgress = false;\n this._compositionTransactionId = 0;\n this._compositionTimers = new Set();\n this._imeKeydownAwaitingCommit = false;\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = undefined;\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = undefined;\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n // It's important to use the selection here instead of textarea length to avoid conflicts with\n // screen reader mode\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n this._compositionPosition.start = Math.min(start, end);\n this._compositionPosition.end = Math.max(start, end);\n this._compositionStartValue = this._textarea.value;\n this._compositionStartSelection = { start, end };\n this._compositionHasObservedProgress = false;\n // A real session owns everything it commits, so no keydown is left owing one.\n this._imeKeydownAwaitingCommit = false;\n if (this._pendingComposition) {\n this._pendingComposition.nextCompositionStart = this._compositionPosition.start;\n }\n this._compositionTransactionId++;\n this._isComposing = true;\n this._isAwaitingCompositionEnd = true;\n this._compositionSuffix = this._textarea.value.substring(this._compositionPosition.end);\n this._resetCompositionView();\n this._dataAlreadySent = '';\n this._compositionInputData = '';\n this._lastCompositionData = '';\n this._compositionView.classList.add('active');\n this._dispatchCompositionSessionEvent(new CustomEvent(XTERM_COMPOSITION_SESSION_START_EVENT, {\n bubbles: true,\n detail: { id: this._compositionTransactionId }\n }));\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: Pick): void {\n if (ev.data && !this._isComposing) {\n this.compositionstart();\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (ev.data?.length > 0) {\n this._lastCompositionData = ev.data;\n }\n this._renderCompositionView(ev.data ?? '');\n // Some IMEs resume without compositionstart; keep that inferred transaction visible until\n // compositionend settles it. An empty update hides the overlay without ending the transaction.\n this._compositionView.classList.toggle('active', Boolean(ev.data));\n this.updateCompositionElements();\n const transactionId = this._compositionTransactionId;\n this._cancelDeferredTimer(this._compositionPositionTimer);\n this._compositionPositionTimer = this._defer(() => {\n if (this._isComposing && this._compositionTransactionId === transactionId) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n });\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(ev?: Pick): boolean {\n if (!this._isAwaitingCompositionEnd) {\n return false;\n }\n if (!this._isComposing) {\n const pending = this._pendingComposition;\n if (pending?.transactionId === this._compositionTransactionId) {\n pending.endData = ev?.data ?? '';\n this._updatePostCompositionInputExpectation(pending);\n }\n return false;\n }\n const endData = ev?.data ?? '';\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n const pending = this._pendingComposition;\n if (pending && pending.transactionId !== this._compositionTransactionId) {\n this._sendPendingComposition(pending);\n }\n this._deferCompositionEnd(endData);\n return false;\n }\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n this._finalizeComposition(true, endData);\n return true;\n }\n\n public blur(): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n this._compositionEndTimer = undefined;\n if (this._isComposing) {\n const end = this._textarea.selectionEnd ?? this._textarea.value.length;\n this._compositionPosition.end = Math.max(this._compositionPosition.start, end);\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n this._finalizeComposition(false);\n }\n }\n\n public dispose(): void {\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n for (const timer of this._compositionTimers) {\n clearTimeout(timer);\n }\n this._compositionTimers.clear();\n this._compositionPositionTimer = undefined;\n this._compositionViewTimer = undefined;\n this._compositionEndTimer = undefined;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionTransactionId++;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @returns Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._canceledKey?.code === ev.code && this._canceledKey.timeStamp === ev.timeStamp) {\n this._canceledKey = undefined;\n return false;\n }\n if (ev.key === 'Escape' && (this._isComposing || this.hasPendingCompositionFinalization)) {\n this._canceledKey = { code: ev.code, timeStamp: ev.timeStamp };\n this._cancelComposition();\n return false;\n }\n if (this._isComposing || this.hasPendingCompositionFinalization) {\n // A key the IME swallows can also empty the preedit \u2014 backspacing over the last radical of a\n // Cangjie composition \u2014 and some IMEs report that with no composition event at all.\n this._deferPreeditResync(this._composedRegionLength() > 0);\n if (ev.keyCode === 20 || ev.keyCode === 229) {\n // 20 is CapsLock, 229 is Enter\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n // Nothing is forwarded for a keydown the IME consumed, so it is left owing its commit; any\n // other keydown either forwards its own text or produces none, and clears the debt.\n this._imeKeydownAwaitingCommit = ev.keyCode === 229;\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Defers keypress text while a composition finalizer is pending so all input is emitted once\n * after reconciliation with the final textarea candidate.\n */\n public keypress(text: string): boolean {\n const pending = this._pendingComposition;\n if (!pending) {\n return false;\n }\n if (pending.keypressMayOverlapComposition) {\n pending.keypressData += text;\n return true;\n }\n if (pending.expectsPostCompositionInput && pending.keypressData.length === 0) {\n pending.keypressData = text;\n return true;\n }\n this._sendPendingComposition(pending);\n return false;\n }\n\n public input(text: string): boolean {\n if (this._isComposing) {\n this._compositionHasObservedProgress ||= this._hasCompositionProgress();\n this._compositionInputData += text;\n return true;\n }\n const pending = this._pendingComposition;\n if (!pending) {\n return this._claimImeKeydownCommit(text);\n }\n if (pending.expectsPostCompositionInput) {\n pending.inputData += text;\n pending.expectsPostCompositionInput = false;\n this._sendPendingComposition(pending);\n return true;\n }\n const repeatsPendingTextareaInput =\n text.length > 0 &&\n this._getPendingTextareaInput(pending) === text &&\n this._getPendingTextareaInput(pending, true) === text;\n this._sendPendingComposition(pending);\n if (!repeatsPendingTextareaInput) {\n this._coreService.triggerDataEvent(text, true);\n }\n return true;\n }\n\n /**\n * Settles the commit a keydown the IME consumed still owes. That commit normally arrives as the\n * deferred textarea diff, but an asynchronous IME can deliver it after the diff has already run\n * and found the textarea unchanged, and with the key still down the terminal drops the input\n * event instead (#12099). Whichever path sees the commit first sends it and cancels the other, so\n * an IME that commits before the diff runs still sends once.\n */\n private _claimImeKeydownCommit(text: string): boolean {\n if (!this._imeKeydownAwaitingCommit) {\n return false;\n }\n this._imeKeydownAwaitingCommit = false;\n if (this._textareaChangeTimer !== undefined) {\n clearTimeout(this._textareaChangeTimer);\n this._textareaChangeTimer = undefined;\n }\n this._coreService.triggerDataEvent(text, true);\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean, endData: string = ''): void {\n const wasComposing = this._isComposing;\n this._compositionView.classList.remove('active');\n // Cleared, not just hidden: a rendered tail left in the view is stale DOM the next composition\n // would have to correct before its own first update lands.\n this._resetCompositionView();\n this._isComposing = false;\n if (waitForPropagation && !wasComposing) {\n return;\n }\n\n if (!waitForPropagation) {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition, true);\n }\n if (wasComposing) {\n const input = this._getCompositionInput(\n this._compositionPosition.start + this._dataAlreadySent.length,\n this._compositionSuffix\n );\n this._sendCompositionInput(this._compositionTransactionId, input);\n }\n } else {\n if (this._pendingComposition) {\n this._sendPendingComposition(this._pendingComposition);\n }\n const pending: IPendingComposition = {\n transactionId: this._compositionTransactionId,\n lifecycleSettled: false,\n sessionEnded: false,\n position: {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n },\n suffix: this._compositionSuffix,\n dataAlreadySent: this._dataAlreadySent,\n compositionData: this._lastCompositionData,\n endData,\n inputData: this._compositionInputData,\n keypressData: '',\n keypressMayOverlapComposition:\n this._lastCompositionData.length === 0 && endData.length === 0,\n expectsPostCompositionInput: false\n };\n this._updatePostCompositionInputExpectation(pending);\n this._pendingComposition = pending;\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n pending.finalizerTimer = this._defer(() => {\n pending.finalizerTimer = undefined;\n if (this._compositionTransactionId === pending.transactionId) {\n this._isAwaitingCompositionEnd = false;\n }\n if (this._pendingComposition === pending) {\n this._sendPendingComposition(pending, true);\n }\n });\n }\n }\n\n private _sendPendingComposition(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): void {\n this._cancelPendingFinalizer(pending);\n if (this._pendingComposition === pending) {\n this._pendingComposition = undefined;\n }\n const textareaInput = this._getPendingTextareaInput(pending, includeFollowingInput);\n const observedInput = this._removeAlreadySentData(\n pending.inputData || pending.keypressData,\n pending.dataAlreadySent\n );\n // Why: with no textarea, end, input, or keypress evidence the composition\n // was cancelled (e.g. Backspace over the whole preedit); stale\n // compositionupdate data must not be replayed as committed text.\n const input = this._mergeTextObservations(\n textareaInput || pending.endData || (observedInput ? pending.compositionData : ''),\n observedInput,\n pending.keypressMayOverlapComposition\n );\n this._sendCompositionInput(pending.transactionId, input, !pending.sessionEnded);\n this._settlePendingComposition(pending);\n }\n\n private _cancelPendingFinalizer(pending: IPendingComposition): void {\n if (pending.finalizerTimer === undefined) {\n return;\n }\n clearTimeout(pending.finalizerTimer);\n this._compositionTimers.delete(pending.finalizerTimer);\n pending.finalizerTimer = undefined;\n }\n\n private _settlePendingComposition(pending: IPendingComposition): void {\n if (pending.lifecycleSettled) {\n return;\n }\n pending.lifecycleSettled = true;\n this._dispatchCompositionTransactionSettled();\n }\n\n private _mergeTextObservations(\n candidate: string,\n observed: string,\n findShortestOrder: boolean\n ): string {\n if (!observed || candidate.includes(observed)) {\n return candidate;\n }\n if (!candidate || observed.includes(candidate)) {\n return observed;\n }\n if (findShortestOrder) {\n let candidateFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n candidateFirstOverlap > 0 &&\n !candidate.endsWith(observed.substring(0, candidateFirstOverlap))\n ) {\n candidateFirstOverlap--;\n }\n let observedFirstOverlap = Math.min(candidate.length, observed.length);\n while (\n observedFirstOverlap > 0 &&\n !observed.endsWith(candidate.substring(0, observedFirstOverlap))\n ) {\n observedFirstOverlap--;\n }\n return candidateFirstOverlap > observedFirstOverlap\n ? candidate + observed.substring(candidateFirstOverlap)\n : observed + candidate.substring(observedFirstOverlap);\n }\n let overlap = Math.min(candidate.length, observed.length);\n while (overlap > 0 && !candidate.endsWith(observed.substring(0, overlap))) {\n overlap--;\n }\n return candidate + observed.substring(overlap);\n }\n\n private _updatePostCompositionInputExpectation(pending: IPendingComposition): void {\n pending.expectsPostCompositionInput =\n (pending.endData.length > 0 || pending.compositionData.length > 0) &&\n pending.inputData.length === 0 &&\n this._getPendingTextareaInput(pending).length === 0;\n }\n\n private _getPendingTextareaInput(\n pending: IPendingComposition,\n includeFollowingInput: boolean = false\n ): string {\n const value = this._textarea.value;\n const start = pending.position.start + pending.dataAlreadySent.length;\n if (pending.nextCompositionStart !== undefined) {\n return value.substring(start, Math.max(start, pending.nextCompositionStart));\n }\n const suffixEnd =\n pending.suffix.length > 0 && value.endsWith(pending.suffix)\n ? value.length - pending.suffix.length\n : value.length;\n const compositionLength = (pending.endData || pending.compositionData).length;\n const observedEnd = includeFollowingInput\n ? suffixEnd\n : Math.max(pending.position.end, start + compositionLength);\n return value.substring(start, Math.max(start, Math.min(suffixEnd, observedEnd)));\n }\n\n private _getCompositionInput(start: number, suffix: string): string {\n const value = this._textarea.value;\n const valueEnd =\n suffix.length > 0 && value.endsWith(suffix) ? value.length - suffix.length : value.length;\n return value.substring(start, Math.max(start, valueEnd));\n }\n\n private _removeAlreadySentData(input: string, dataAlreadySent: string): string {\n if (dataAlreadySent.length === 0) {\n return input;\n }\n if (input.startsWith(dataAlreadySent)) {\n return input.substring(dataAlreadySent.length);\n }\n return dataAlreadySent.includes(input) ? '' : input;\n }\n\n private _cancelComposition(): void {\n const pending = this._pendingComposition;\n if (\n pending &&\n this._isComposing &&\n pending.transactionId !== this._compositionTransactionId\n ) {\n this._sendPendingComposition(pending);\n }\n const transactionId = this._isComposing\n ? this._compositionTransactionId\n : this._pendingComposition?.transactionId ?? 0;\n const settlesPending = pending !== undefined && this._pendingComposition === pending;\n this._pendingComposition = undefined;\n this._isAwaitingCompositionEnd = false;\n this._isComposing = false;\n this._compositionView.classList.remove('active');\n this._resetCompositionView();\n this._textarea.value =\n this._textarea.value.substring(0, this._compositionPosition.start) + this._compositionSuffix;\n this._sendCompositionInput(transactionId, '');\n if (settlesPending && pending) {\n this._settlePendingComposition(pending);\n }\n }\n\n private _sendCompositionInput(\n transactionId: number,\n input: string,\n dispatchSessionEnd: boolean = true\n ): void {\n let prevented = false;\n if (dispatchSessionEnd) {\n const event = new CustomEvent(XTERM_COMPOSITION_SESSION_END_EVENT, {\n bubbles: true,\n cancelable: true,\n detail: { id: transactionId, data: input }\n });\n this._dispatchCompositionSessionEvent(event);\n prevented = event.defaultPrevented;\n }\n if (input.length > 0 && !prevented) {\n this._coreService.triggerDataEvent(input, true);\n }\n }\n\n private _endPendingCompositionSession(pending: IPendingComposition): void {\n if (pending.sessionEnded) {\n return;\n }\n pending.sessionEnded = true;\n const input =\n this._getPendingTextareaInput(pending) ||\n pending.endData ||\n pending.compositionData;\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_SESSION_END_EVENT,\n {\n bubbles: true,\n cancelable: true,\n detail: {\n id: pending.transactionId,\n data: input,\n dataPendingReconciliation: true\n }\n }\n ));\n }\n\n private _dispatchCompositionSessionEvent(event: CustomEvent): void {\n if (typeof this._textarea.dispatchEvent === 'function') {\n this._textarea.dispatchEvent(event);\n }\n }\n\n private _dispatchCompositionTransactionSettled(): void {\n this._dispatchCompositionSessionEvent(new CustomEvent(\n 'xterm-composition-transaction-settled',\n { bubbles: true }\n ));\n }\n\n private _deferCompositionEnd(endData: string): void {\n this._cancelDeferredTimer(this._compositionEndTimer);\n const transactionId = this._compositionTransactionId;\n const timer = this._defer(() => {\n if (\n this._compositionEndTimer !== timer ||\n !this._isComposing ||\n this._compositionTransactionId !== transactionId\n ) {\n return;\n }\n this._compositionEndTimer = undefined;\n if (!this._compositionEndBelongsToCurrentTransaction(endData)) {\n if (endData.length === 0 && !this._hasCompositionProgress()) {\n this._cancelComposition();\n }\n return;\n }\n this._finalizeComposition(true, endData);\n this._dispatchCompositionSessionEvent(new CustomEvent(\n XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT,\n { bubbles: true }\n ));\n const pending = this._pendingComposition;\n if (pending?.transactionId === transactionId) {\n this._sendPendingComposition(pending, true);\n }\n });\n this._compositionEndTimer = timer;\n }\n\n /** How much of the textarea the IME currently owns; 0 means there is no preedit left. */\n private _composedRegionLength(): number {\n const end = this._textarea.value.length - this._compositionSuffix.length;\n return Math.max(0, end - this._compositionPosition.start);\n }\n\n /**\n * Re-derives the preedit from the textarea once the key that changed it has settled, and treats\n * a composition emptied that way as cancelled. Mirrors how native terminals clear a preedit on\n * the empty-marked-text state instead of on a specific key.\n */\n private _deferPreeditResync(hadPreedit: boolean): void {\n if (!hadPreedit || !this._isComposing) {\n return;\n }\n const transactionId = this._compositionTransactionId;\n this._defer(() => {\n if (\n this._isComposing &&\n this._compositionTransactionId === transactionId &&\n this._composedRegionLength() === 0\n ) {\n this._cancelComposition();\n }\n });\n }\n\n private _hasCompositionProgress(): boolean {\n const start = this._textarea.selectionStart ?? this._textarea.value.length;\n const end = this._textarea.selectionEnd ?? start;\n return this._compositionHasObservedProgress || (\n this._textarea.value !== this._compositionStartValue ||\n start !== this._compositionStartSelection.start ||\n end !== this._compositionStartSelection.end\n );\n }\n\n private _compositionEndBelongsToCurrentTransaction(endData: string): boolean {\n return (\n this._hasCompositionProgress() ||\n (endData.length > 0 && endData === this._lastCompositionData)\n );\n }\n\n private _defer(callback: () => void): ReturnType {\n const timer = setTimeout(() => {\n this._compositionTimers.delete(timer);\n callback();\n }, 0);\n this._compositionTimers.add(timer);\n return timer;\n }\n\n private _cancelDeferredTimer(timer?: ReturnType): void {\n if (timer === undefined) {\n return;\n }\n clearTimeout(timer);\n this._compositionTimers.delete(timer);\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n if (this._textareaChangeTimer) {\n return;\n }\n const oldValue = this._textarea.value;\n this._textareaChangeTimer = window.setTimeout(() => {\n this._textareaChangeTimer = undefined;\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n\n const diff = newValue.replace(oldValue, '');\n\n if (newValue !== oldValue) {\n this._imeKeydownAwaitingCommit = false;\n }\n this._dataAlreadySent = diff;\n\n if (newValue.length > oldValue.length) {\n this._coreService.triggerDataEvent(diff, true);\n } else if (newValue.length < oldValue.length) {\n this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n this._coreService.triggerDataEvent(newValue, true);\n }\n\n }\n }, 0);\n }\n\n /**\n * Renders the preedit into the view and, when the cursor sits mid-line, the rest of the row\n * after it, so a composition reads as inserted text pushing the tail right rather than an opaque\n * box hiding the character under the cursor. Nothing reaches the pty while composing, so those\n * cells still hold their characters; only what the overlay shows changes.\n */\n private _renderCompositionView(data: string, rowRemainder = this._getRowRemainderText()): void {\n if (!data) {\n this._resetCompositionView();\n return;\n }\n // Keep DOM order LTR so the insertion caret follows the preedit.\n const preeditText = `\u200E${data}\u200E`;\n this._compositionViewData = data;\n const doc = this._compositionView.ownerDocument;\n const preedit = doc.createElement('span');\n preedit.className = 'xterm-composition-preedit';\n // Underlined so the composing text stays distinguishable from the tail it pushed right.\n preedit.style.flexShrink = '0';\n preedit.style.textDecoration = 'underline';\n preedit.textContent = preeditText;\n const caret = doc.createElement('span');\n caret.className = 'xterm-composition-caret';\n caret.setAttribute('aria-hidden', 'true');\n const children = [preedit, caret];\n let remainder: HTMLElement | undefined;\n if (rowRemainder) {\n remainder = doc.createElement('span');\n remainder.className = 'xterm-composition-remainder';\n // Why: the view is nowrap, which collapses runs of spaces, so committed padding would draw\n // its trailing glyph cells to the left of where the grid has them.\n remainder.style.whiteSpace = 'pre';\n remainder.textContent = rowRemainder;\n children.push(remainder);\n }\n this._compositionView.replaceChildren(...children);\n this._compositionPreedit = preedit;\n this._compositionCaret = caret;\n this._compositionRemainder = remainder;\n this._styleCompositionCaret();\n }\n\n /** The committed row text from the cursor rightwards \u2014 what a mid-line preedit would cover. */\n private _getRowRemainderText(): string {\n const buffer = this._bufferService.buffer;\n if (!buffer.isCursorInViewport) {\n return '';\n }\n const line = buffer.lines.get(buffer.ybase + buffer.y);\n // The explicit end column keeps this off the line string cache, whose self-renewing\n // idle-clear timer the composition path must not arm.\n return line\n ? line.translateToString(true, Math.min(buffer.x, this._bufferService.cols - 1), line.length)\n : '';\n }\n\n private _styleCompositionCaret(): void {\n const caret = this._compositionCaret;\n if (!caret) {\n return;\n }\n const width = Math.max(1, this._optionsService.rawOptions.cursorWidth);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const colors = this._themeService?.colors;\n const cursor = colors && (\n color.ensureContrastRatio(colors.background, colors.cursor, 3) ?? colors.cursor\n );\n caret.style.backgroundColor = cursor?.css ?? '#FFF';\n caret.style.display = 'inline-block';\n caret.style.flexShrink = '0';\n caret.style.height = cellHeight + 'px';\n caret.style.marginLeft = -width + 'px';\n caret.style.verticalAlign = 'top';\n caret.style.width = width + 'px';\n }\n\n private _resetCompositionView(): void {\n this._compositionView.textContent = '';\n this._compositionPreedit = undefined;\n this._compositionRemainder = undefined;\n this._compositionCaret = undefined;\n this._compositionViewData = '';\n this._compositionView.style.display = '';\n this._compositionView.style.justifyContent = '';\n }\n\n /**\n * The theme background with any alpha dropped. The view masks the cells it draws over, so a\n * see-through background would re-expose the very characters the rendered tail stands in for.\n */\n private _opaqueViewBackground(): string {\n const background = this._themeService?.colors.background;\n return background ? color.opaque(background).css : '#000';\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n // Empty updates hide the overlay without ending the inferred transaction.\n if (!this._compositionView.classList.contains('active')) {\n return;\n }\n\n // A TUI can repaint the row under an open composition (spinners, streamed output), and this\n // already runs on every render \u2014 so keep the rendered tail current with the buffer. A string\n // compare adds no layout read.\n const rowRemainder = this._getRowRemainderText();\n if (\n this._compositionViewData &&\n rowRemainder !== (this._compositionRemainder?.textContent ?? '')\n ) {\n this._renderCompositionView(this._compositionViewData, rowRemainder);\n }\n this._styleCompositionCaret();\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n // Limit the composition view width to the space between the cursor and\n // the terminal's right edge, preventing it from overflowing the terminal.\n const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft;\n this._compositionView.style.maxWidth = maxWidth + 'px';\n this._compositionView.style.overflow = 'hidden';\n const anchorBounds =\n (this._compositionPreedit ?? this._compositionView).getBoundingClientRect();\n const anchorLeft = cursorLeft + Math.min(0, maxWidth - anchorBounds.width);\n const showsRemainder =\n Boolean(this._compositionRemainder) && anchorBounds.width < maxWidth;\n if (this._compositionRemainder) {\n this._compositionRemainder.style.display = showsRemainder ? '' : 'none';\n }\n // End alignment keeps the caret visible when the preedit consumes the remaining width.\n this._compositionView.style.direction = 'ltr';\n this._compositionView.style.display = showsRemainder ? '' : 'flex';\n this._compositionView.style.justifyContent = showsRemainder ? '' : 'flex-end';\n // Themed rather than the stock #000/#FFF, so the pushed tail reads as ordinary terminal text\n // and light themes keep contrast.\n this._compositionView.style.background = this._opaqueViewBackground();\n this._compositionView.style.color = this._themeService?.colors.foreground.css ?? '#FFF';\n // Sized and placed to match the preedit, not the whole view, so the candidate window\n // anchors to the composing text rather than the end of the rendered tail. The clamp has to\n // be applied here and not only in Orca's terminal-ime-candidate-anchor.ts, because\n // CoreBrowserTerminal calls this from onRender as well as from composition events, and a\n // render can land after the last composition event that module can hear.\n this._textarea.style.left = anchorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n this._textarea.style.width = Math.max(anchorBounds.width, 1) + 'px';\n this._textarea.style.height = Math.max(anchorBounds.height, 1) + 'px';\n this._textarea.style.lineHeight = anchorBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n this._cancelDeferredTimer(this._compositionViewTimer);\n this._compositionViewTimer = this._defer(() => this.updateCompositionElements(true));\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { ICharacterJoiner } from '../Types';\nimport { AttributeData } from '../../common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService } from '../../common/services/Services';\nimport { ICharacterJoinerService } from './Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n public serviceBrand: undefined;\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(\n @IBufferService private _bufferService: IBufferService\n ) { }\n\n public register(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregister(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n const trimmedLength = line.getTrimmedLength();\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < trimmedLength; x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (trimmedLength - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n let allJoinedRanges: [number, number][] = [];\n try {\n allJoinedRanges = this._characterJoiners[0].handler(text);\n } catch (error) {\n console.error(error);\n }\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n try {\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n }\n } catch (error) {\n console.error(error);\n }\n }\n this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n return allJoinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n const trimmedLength = line.getTrimmedLength();\n for (let x = startCol; x < trimmedLength; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = trimmedLength;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from './Types';\n\nexport function throwIfFalsy(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from '../../../common/Types';\nimport { IBufferLine, ICellData } from '../../../common/buffer/Types';\nimport { INVERTED_DEFAULT_COLOR } from '../shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';\nimport { CellData } from '../../../common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';\nimport { channels, color } from '../../../common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { JoinedCellData } from '../../services/CharacterJoinerService';\nimport { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';\nimport { AttributeData } from '../../../common/buffer/AttributeData';\nimport { WidthCache } from './WidthCache';\nimport { IColorContrastCache } from '../../Types';\n\n\nexport const enum RowCss {\n BOLD_CLASS = 'xterm-bold',\n DIM_CLASS = 'xterm-dim',\n ITALIC_CLASS = 'xterm-italic',\n UNDERLINE_CLASS = 'xterm-underline',\n OVERLINE_CLASS = 'xterm-overline',\n STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n BLINK_HIDDEN_CLASS = 'xterm-blink-hidden',\n CURSOR_CLASS = 'xterm-cursor',\n CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n private _selectionStart: [number, number] | undefined;\n private _selectionEnd: [number, number] | undefined;\n private _columnSelectMode: boolean = false;\n\n public defaultSpacing = 0;\n\n constructor(\n private readonly _document: Document,\n @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService private readonly _decorationService: IDecorationService,\n @IThemeService private readonly _themeService: IThemeService\n ) {}\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionStart = start;\n this._selectionEnd = end;\n this._columnSelectMode = columnSelectMode;\n }\n\n public createRow(\n lineData: IBufferLine,\n row: number,\n isCursorRow: boolean,\n cursorStyle: string | undefined,\n cursorInactiveStyle: string | undefined,\n cursorX: number,\n cursorBlink: boolean,\n blinkOn: boolean,\n cellWidth: number,\n widthCache: WidthCache,\n linkStart: number,\n linkEnd: number,\n rowInfo?: { hasBlinkingCells: boolean }\n ): HTMLSpanElement[] {\n\n const elements: HTMLSpanElement[] = [];\n if (rowInfo) {\n rowInfo.hasBlinkingCells = false;\n }\n const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n const colors = this._themeService.colors;\n\n let lineLength = lineData.getNoBgTrimmedLength();\n if (isCursorRow && lineLength < cursorX + 1) {\n lineLength = cursorX + 1;\n }\n\n let charElement: HTMLSpanElement | undefined;\n let cellAmount = 0;\n let text = '';\n let i;\n let oldBg = 0;\n let oldFg = 0;\n let oldExt = 0;\n let oldLinkHover: number | boolean = false;\n let oldSpacing = 0;\n let oldIsInSelection: boolean = false;\n let spacing;\n let skipJoinedCheckUntilX = 0;\n const classes: string[] = [];\n\n const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n let width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n\n // Indicates whether this cell is part of a joined range that should be ignored as it cannot\n // be rendered entirely, like the selection state differs across the range.\n let isValidJoinRange = (x >= skipJoinedCheckUntilX);\n\n let lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n let cell: ICellData = this._workCell;\n if (joinedRanges.length > 0 && x === joinedRanges[0][0] && isValidJoinRange) {\n const range = joinedRanges.shift()!;\n // If the ligature's selection state is not consistent, don't join it. This helps the\n // selection render correctly regardless whether they should be joined.\n const firstSelectionState = this._isCellInSelection(range[0], row);\n for (i = range[0] + 1; i < range[1]; i++) {\n isValidJoinRange &&= (firstSelectionState === this._isCellInSelection(i, row));\n }\n // Similarly, if the cursor is in the ligature, don't join it.\n isValidJoinRange &&= !isCursorRow || cursorX < range[0] || cursorX >= range[1];\n if (!isValidJoinRange) {\n skipJoinedCheckUntilX = range[1];\n } else {\n isJoined = true;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n cell = new JoinedCellData(\n this._workCell,\n lineData.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n\n // Recalculate width\n width = cell.getWidth();\n }\n }\n\n const isInSelection = this._isCellInSelection(x, row);\n const isCursorCell = isCursorRow && x === cursorX;\n const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n if (rowInfo && cell.isBlink()) {\n rowInfo.hasBlinkingCells = true;\n }\n const isBlinkHidden = !blinkOn && cell.isBlink();\n if (isBlinkHidden) {\n classes.push(RowCss.BLINK_HIDDEN_CLASS);\n }\n\n let isDecorated = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n isDecorated = true;\n });\n\n // get chars to render for this cell\n let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n chars = '\\xa0';\n }\n\n // lookup char render width and calc spacing\n spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n if (!charElement) {\n charElement = this._document.createElement('span');\n } else {\n /**\n * chars can only be merged on existing span if:\n * - existing span only contains mergeable chars (cellAmount != 0)\n * - bg did not change (or both are in selection)\n * - fg did not change (or both are in selection and selection fg is set)\n * - ext did not change\n * - underline from hover state did not change\n * - cell content renders to same letter-spacing\n * - cell is not cursor\n */\n if (\n cellAmount\n && (\n (isInSelection && oldIsInSelection)\n || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n )\n && (\n (isInSelection && oldIsInSelection && colors.selectionForeground)\n || cell.fg === oldFg\n )\n && cell.extended.ext === oldExt\n && isLinkHover === oldLinkHover\n && spacing === oldSpacing\n && !isCursorCell\n && !isJoined\n && !isDecorated\n && isValidJoinRange\n ) {\n // no span alterations, thus only account chars skipping all code below\n if (cell.isInvisible()) {\n text += WHITESPACE_CELL_CHAR;\n } else {\n text += chars;\n }\n cellAmount++;\n continue;\n } else {\n /**\n * cannot merge:\n * - apply left-over text to old span\n * - create new span, reset state holders cellAmount & text\n */\n if (cellAmount) {\n charElement.textContent = text;\n }\n charElement = this._document.createElement('span');\n cellAmount = 0;\n text = '';\n }\n }\n // preserve conditions for next merger eval round\n oldBg = cell.bg;\n oldFg = cell.fg;\n oldExt = cell.extended.ext;\n oldLinkHover = isLinkHover;\n oldSpacing = spacing;\n oldIsInSelection = isInSelection;\n\n if (isJoined) {\n // The DOM renderer colors the background of the cursor but for ligatures all cells are\n // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n // the cursor looks the same when on any character of the ligature though\n if (cursorX >= x && cursorX <= lastCharX) {\n cursorX = x;\n }\n }\n\n if (!this._coreService.isCursorHidden && isCursorCell && this._coreService.isCursorInitialized) {\n classes.push(RowCss.CURSOR_CLASS);\n if (this._coreBrowserService.isFocused) {\n if (cursorBlink) {\n classes.push(RowCss.CURSOR_BLINK_CLASS);\n }\n classes.push(\n cursorStyle === 'bar'\n ? RowCss.CURSOR_STYLE_BAR_CLASS\n : cursorStyle === 'underline'\n ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n : RowCss.CURSOR_STYLE_BLOCK_CLASS\n );\n } else {\n if (cursorInactiveStyle) {\n switch (cursorInactiveStyle) {\n case 'outline':\n classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n break;\n case 'block':\n classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n break;\n case 'bar':\n classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n break;\n }\n }\n }\n }\n\n if (cell.isBold()) {\n classes.push(RowCss.BOLD_CLASS);\n }\n\n if (cell.isItalic()) {\n classes.push(RowCss.ITALIC_CLASS);\n }\n\n if (cell.isDim()) {\n classes.push(RowCss.DIM_CLASS);\n }\n\n if (cell.isInvisible()) {\n text = WHITESPACE_CELL_CHAR;\n } else {\n text = cell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n if (cell.isUnderline()) {\n classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n if (!cell.isUnderlineColorDefault()) {\n if (cell.isUnderlineColorRGB()) {\n charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n } else {\n let fg = cell.getUnderlineColor();\n if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n charElement.style.textDecorationColor = colors.ansi[fg].css;\n }\n }\n }\n\n if (cell.isOverline()) {\n classes.push(RowCss.OVERLINE_CLASS);\n if (text === ' ') {\n text = '\\xa0'; // =  \n }\n }\n\n if (cell.isStrikethrough()) {\n classes.push(RowCss.STRIKETHROUGH_CLASS);\n }\n\n // apply link hover underline late, effectively overrides any previous text-decoration\n // settings\n if (isLinkHover) {\n charElement.style.textDecoration = 'underline';\n }\n\n let fg = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bg = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Apply any decoration foreground/background overrides, this must happen after inverse has\n // been applied\n let bgOverride: IColor | undefined;\n let fgOverride: IColor | undefined;\n let isTop = false;\n this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n if (d.options.layer !== 'top' && isTop) {\n return;\n }\n if (d.backgroundColorRGB) {\n bgColorMode = Attributes.CM_RGB;\n bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n bgOverride = d.backgroundColorRGB;\n }\n if (d.foregroundColorRGB) {\n fgColorMode = Attributes.CM_RGB;\n fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n fgOverride = d.foregroundColorRGB;\n }\n isTop = d.options.layer === 'top';\n });\n\n // Apply selection\n if (!isTop && isInSelection) {\n // If in the selection, force the element to be above the selection to improve contrast and\n // support opaque selections. The applies background is not actually needed here as\n // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n // contrast ratio\n bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n bgColorMode = Attributes.CM_RGB;\n // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n // ensure text is drawn above the selection.\n isTop = true;\n // Apply selection foreground if applicable\n if (colors.selectionForeground) {\n fgColorMode = Attributes.CM_RGB;\n fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n fgOverride = colors.selectionForeground;\n }\n }\n\n // If it's a top decoration, render above the selection\n if (isTop) {\n classes.push('xterm-decoration-top');\n }\n\n // Background\n let resolvedBg: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n resolvedBg = colors.ansi[bg];\n classes.push(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n resolvedBg = channels.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n this._addStyle(charElement, `background-color:#${(bg >>> 0).toString(16).padStart(6, '0')}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n resolvedBg = colors.foreground;\n classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n } else {\n resolvedBg = colors.background;\n }\n }\n\n // If there is no background override by now it's the original color, so apply dim if needed\n if (!bgOverride) {\n if (cell.isDim()) {\n bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n }\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n classes.push(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = channels.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n this._addStyle(charElement, `color:#${fg.toString(16).padStart(6, '0')}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, fgOverride)) {\n if (isInverse) {\n classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // apply CSS classes\n // slightly faster than using classList by omitting\n // checks for doubled entries (code above should not have doublets)\n if (classes.length) {\n charElement.className = classes.join(' ');\n classes.length = 0;\n }\n\n // exclude conditions for cell merging - never merge these\n if (!isCursorCell && !isJoined && !isDecorated && isValidJoinRange) {\n cellAmount++;\n } else {\n charElement.textContent = text;\n }\n // apply letter-spacing rule\n if (spacing !== this.defaultSpacing) {\n charElement.style.letterSpacing = `${spacing}px`;\n }\n\n elements.push(charElement);\n x = lastCharX;\n }\n\n // postfix text of last merged span\n if (charElement && cellAmount) {\n charElement.textContent = text;\n }\n\n return elements;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n if (this._optionsService.rawOptions.minimumContrastRatio === 1 || treatGlyphAsBackgroundColor(cell.getCode())) {\n return false;\n }\n\n // Try get from cache first, only use the cache when there are no decoration overrides\n const cache = this._getContrastCache(cell);\n let adjustedColor: IColor | undefined | null = undefined;\n if (!bgOverride && !fgOverride) {\n adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n }\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n adjustedColor = color.ensureContrastRatio(bgOverride ?? bg, fgOverride ?? fg, ratio);\n cache.setColor((bgOverride ?? bg).rgba, (fgOverride ?? fg).rgba, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _getContrastCache(cell: ICellData): IColorContrastCache {\n if (cell.isDim()) {\n return this._themeService.colors.halfContrastCache;\n }\n return this._themeService.colors.contrastCache;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n\n private _isCellInSelection(x: number, y: number): boolean {\n const start = this._selectionStart;\n const end = this._selectionEnd;\n if (!start || !end) {\n return false;\n }\n if (this._columnSelectMode) {\n if (start[0] <= end[0]) {\n return x >= start[0] && y >= start[1] &&\n x < end[0] && y <= end[1];\n }\n return x < start[0] && y >= start[1] &&\n x >= end[0] && y <= end[1];\n }\n return (y > start[1] && y < end[1]) ||\n (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n (start[1] < end[1] && y === end[1] && x < end[0]) ||\n (start[1] < end[1] && y === start[1] && x >= start[0]);\n }\n}\n", "/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from '../shared/RendererUtils';\nimport { IDisposable } from '../../../common/Types';\nimport { FontWeight } from '../../../common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n /** sentinel for unset values in flat cache */\n FLAT_UNSET = -9999,\n /** size of flat cache, size-1 equals highest codepoint handled by flat */\n FLAT_SIZE = 256,\n /** char repeat for measuring */\n REPEAT = 32\n}\n\n\nconst enum FontVariant {\n REGULAR = 0,\n BOLD = 1,\n ITALIC = 2,\n BOLD_ITALIC = 3\n}\n\nexport interface IWidthCacheFontVariantCanvas {\n setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void;\n measure(c: string): number;\n}\n\nexport class WidthCache implements IDisposable {\n // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n // It has a small memory footprint (only 1MB for full BMP caching),\n // still the sweet spot is not reached before touching 32k different codepoints,\n // thus we store the remaining <<20% of terminal data in a holey structure.\n protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n // holey cache for bold, italic and bold&italic for any string\n // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n // so a shared API across terminals is needed\n protected _holey: Map | undefined;\n\n private _font = '';\n private _fontSize = 0;\n private _weight: FontWeight = 'normal';\n private _weightBold: FontWeight = 'bold';\n private _canvasElements: IWidthCacheFontVariantCanvas[] = [];\n\n constructor(\n canvasFactory: () => IWidthCacheFontVariantCanvas = () => new WidthCacheFontVariantCanvas()\n ) {\n this._canvasElements = [\n canvasFactory(),\n canvasFactory(),\n canvasFactory(),\n canvasFactory()\n ];\n\n this.clear();\n }\n\n public dispose(): void {\n this._canvasElements.length = 0;\n this._holey = undefined; // free cache memory via GC\n }\n\n /**\n * Clear the width cache.\n */\n public clear(): void {\n this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n // .clear() has some overhead, re-assign instead (>3 times faster)\n this._holey = new Map();\n }\n\n /**\n * Set the font for measuring.\n * Must be called for any changes on font settings.\n * Also clears the cache.\n */\n public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n // skip if nothing changed\n if (\n font === this._font &&\n fontSize === this._fontSize &&\n weight === this._weight &&\n weightBold === this._weightBold\n ) {\n return;\n }\n\n this._font = font;\n this._fontSize = fontSize;\n this._weight = weight;\n this._weightBold = weightBold;\n\n this._canvasElements[FontVariant.REGULAR].setFont(font, fontSize, weight, false);\n this._canvasElements[FontVariant.BOLD].setFont(font, fontSize, weightBold, false);\n this._canvasElements[FontVariant.ITALIC].setFont(font, fontSize, weight, true);\n this._canvasElements[FontVariant.BOLD_ITALIC].setFont(font, fontSize, weightBold, true);\n\n this.clear();\n }\n\n /**\n * Get the render width for cell content `c` with current font settings.\n * `variant` denotes the font variant to be used.\n */\n public get(c: string, bold: boolean | number, italic: boolean | number): number {\n let cp: number;\n if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n if (this._flat[cp] !== WidthCacheSettings.FLAT_UNSET) {\n return this._flat[cp];\n }\n const width = this._measure(c, 0);\n if (width > 0) {\n this._flat[cp] = width;\n }\n return width;\n }\n let key = c;\n if (bold) key += 'B';\n if (italic) key += 'I';\n let width = this._holey!.get(key);\n if (width === undefined) {\n let variant = 0;\n if (bold) variant |= FontVariant.BOLD;\n if (italic) variant |= FontVariant.ITALIC;\n width = this._measure(c, variant);\n if (width > 0) {\n this._holey!.set(key, width);\n }\n }\n return width;\n }\n\n protected _measure(c: string, variant: FontVariant): number {\n return this._canvasElements[variant].measure(c);\n }\n}\n\nclass WidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {\n private _canvas: OffscreenCanvas | HTMLCanvasElement;\n private _ctx: OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\n constructor() {\n if (typeof OffscreenCanvas !== 'undefined') {\n this._canvas = new OffscreenCanvas(1, 1);\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n } else {\n this._canvas = document.createElement('canvas');\n this._canvas.width = 1;\n this._canvas.height = 1;\n this._ctx = throwIfFalsy(this._canvas.getContext('2d'));\n }\n }\n\n public setFont(fontFamily: string, fontSize: number, fontWeight: FontWeight, italic: boolean): void {\n const fontStyle = italic ? 'italic' : '';\n this._ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`.trim();\n }\n\n public measure(c: string): number {\n return this._ctx.measureText(c).width;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from '../../Types';\nimport { ISelectionRenderModel } from './Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from '../../services/Services';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IOptionsService } from '../../../common/services/Services';\n\nexport class TextBlinkStateManager extends Disposable {\n private _intervalDuration: number = 0;\n private _interval: number | undefined;\n private _blinkOn: boolean = true;\n private _needsBlinkInViewport: boolean = false;\n private _isViewportVisible: boolean = true;\n\n constructor(\n private readonly _renderCallback: () => void,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n this._register(this._optionsService.onSpecificOptionChange('blinkIntervalDuration', duration => {\n this.setIntervalDuration(duration);\n }));\n this.setIntervalDuration(this._optionsService.rawOptions.blinkIntervalDuration);\n this._register(toDisposable(() => this._clearInterval()));\n }\n\n public get isBlinkOn(): boolean {\n return this._blinkOn;\n }\n\n public get isEnabled(): boolean {\n return this._intervalDuration > 0;\n }\n\n public setNeedsBlinkInViewport(needsBlinkInViewport: boolean): void {\n if (this._needsBlinkInViewport === needsBlinkInViewport) {\n return;\n }\n\n this._needsBlinkInViewport = needsBlinkInViewport;\n this._updateIntervalState();\n }\n\n public setViewportVisible(isVisible: boolean): void {\n if (this._isViewportVisible === isVisible) {\n return;\n }\n\n this._isViewportVisible = isVisible;\n this._updateIntervalState();\n }\n\n public setIntervalDuration(duration: number): void {\n if (duration === this._intervalDuration) {\n return;\n }\n\n this._intervalDuration = duration;\n this._clearInterval();\n this._updateIntervalState();\n }\n\n private _updateIntervalState(): void {\n const shouldBlink = this._intervalDuration > 0 && this._needsBlinkInViewport && this._isViewportVisible;\n if (shouldBlink) {\n if (this._interval !== undefined) {\n return;\n }\n const wasBlinkOn = this._blinkOn;\n this._blinkOn = true;\n this._interval = this._coreBrowserService.window.setInterval(() => {\n this._blinkOn = !this._blinkOn;\n this._renderCallback();\n }, this._intervalDuration);\n if (!wasBlinkOn) {\n this._renderCallback();\n }\n return;\n }\n\n this._clearInterval();\n if (!this._blinkOn) {\n this._blinkOn = true;\n this._renderCallback();\n }\n }\n\n private _clearInterval(): void {\n if (this._interval !== undefined) {\n this._coreBrowserService.window.clearInterval(this._interval);\n this._interval = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';\nimport { WidthCache } from './WidthCache';\nimport { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';\nimport { createRenderDimensions } from '../shared/RendererUtils';\nimport { createSelectionRenderModel } from '../shared/SelectionRenderModel';\nimport { TextBlinkStateManager } from '../shared/TextBlinkStateManager';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';\nimport { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';\nimport { color } from '../../../common/Color';\nimport { Disposable, toDisposable } from '../../../common/Lifecycle';\nimport { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';\nimport { Emitter } from '../../../common/Event';\nimport { addDisposableListener } from '../../Dom';\n\n\nconst enum Constants {\n TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-',\n ROW_CONTAINER_CLASS = 'xterm-rows',\n FG_CLASS_PREFIX = 'xterm-fg-',\n BG_CLASS_PREFIX = 'xterm-bg-',\n FOCUS_CLASS = 'xterm-focus',\n SELECTION_CLASS = 'xterm-selection',\n CURSOR_BLINK_IDLE_CLASS = 'xterm-cursor-blink-idle'\n}\n\nlet nextTerminalId = 1;\n\n/**\n * The standard renderer and fallback for when the webgl addon is slow. This is not meant to be\n * particularly fast and will even lack some features such as custom glyphs, hoever this is more\n * reliable as webgl may not work on some machines.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n private _widthCache: WidthCache;\n private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();\n private _lastSelectionStart: [number, number] | undefined;\n private _lastSelectionEnd: [number, number] | undefined;\n private _lastSelectionColumnMode: boolean = false;\n private _cursorBlinkStateManager: CursorBlinkStateManager;\n private _textBlinkStateManager: TextBlinkStateManager;\n private _rowHasBlinkingCells: boolean[] = [];\n private _rowHasBlinkingCellsCount: number = 0;\n\n public dimensions: IRenderDimensions;\n\n private readonly _onRequestRedraw = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _document: Document,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _helperContainer: HTMLElement,\n private readonly _linkifier2: ILinkifier2,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService private readonly _themeService: IThemeService\n ) {\n super();\n this._rowContainer = this._document.createElement('div');\n this._rowContainer.classList.add(Constants.ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = this._document.createElement('div');\n this._selectionContainer.classList.add(Constants.SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = createRenderDimensions();\n this._updateDimensions();\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._register(this._themeService.onChangeColors(e => this._injectCss(e)));\n this._injectCss(this._themeService.colors);\n\n this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n this._element.classList.add(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n this._register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._rowContainer, this._coreBrowserService);\n this._register(addDisposableListener(this._document, 'mousedown', () => this._cursorBlinkStateManager.restartBlinkAnimation()));\n this._register(toDisposable(() => this._cursorBlinkStateManager.dispose()));\n this._textBlinkStateManager = this._register(new TextBlinkStateManager(\n () => this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }),\n this._coreBrowserService,\n this._optionsService\n ));\n\n this._register(toDisposable(() => {\n this._element.classList.remove(Constants.TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n this._rowContainer.remove();\n this._selectionContainer.remove();\n this._widthCache.dispose();\n this._themeStyleElement.remove();\n this._dimensionsStyleElement.remove();\n }));\n\n this._widthCache = new WidthCache();\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n private _updateDimensions(): void {\n const dpr = this._coreBrowserService.dpr;\n this.dimensions.device.char.width = this._charSizeService.width * dpr;\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n this.dimensions.device.char.left = 0;\n this.dimensions.device.char.top = 0;\n this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.css.canvas.width}px`;\n element.style.height = `${this.dimensions.css.cell.height}px`;\n element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` + // TODO: find workaround for inline-block (creates ~20% render penalty)\n ` height: 100%;` +\n ` vertical-align: top;` +\n `}`;\n\n this._dimensionsStyleElement.textContent = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n }\n\n private _injectCss(colors: ReadonlyColorSet): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = this._document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} {` +\n // Disabling pointer events circumvents a browser behavior that prevents `click` events from\n // being delivered if the target element is replaced during the click. This happened due to\n // refresh() being called during the mousedown handler to start a selection.\n ` pointer-events: none;` +\n ` color: ${colors.foreground.css};` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}, ${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} span {` +\n ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n ` font-kerning: none;` +\n ` white-space: pre` +\n `}`;\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .xterm-dim {` +\n ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}` +\n `${this._terminalSelector} span.${RowCss.BLINK_HIDDEN_CLASS} {` +\n ` visibility: hidden;` +\n `}`;\n // Blink animation\n const blinkAnimationUnderlineId = `blink_underline_${this._terminalClass}`;\n const blinkAnimationBarId = `blink_bar_${this._terminalClass}`;\n const blinkAnimationBlockId = `blink_block_${this._terminalClass}`;\n styles +=\n `@keyframes ${blinkAnimationUnderlineId} {` +\n ` 50% {` +\n ` border-bottom-style: hidden;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBarId} {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes ${blinkAnimationBlockId} {` +\n ` 0% {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: inherit;` +\n ` color: ${colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` animation: ${blinkAnimationUnderlineId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` animation: ${blinkAnimationBarId} 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: ${blinkAnimationBlockId} 1s step-end infinite;` +\n `}` +\n // Disable cursor blinking when idle\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS}.${Constants.CURSOR_BLINK_IDLE_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS} {` +\n ` animation: none !important;` +\n `}` +\n // !important helps fix an issue where the cursor will not render on top of the selection,\n // however it's very hard to fix this issue and retain the blink animation without the use of\n // !important. So this edge case fails when cursor blink is on.\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${colors.cursor.css};` +\n ` color: ${colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS}:not(.${RowCss.CURSOR_BLINK_CLASS}) {` +\n ` background-color: ${colors.cursor.css} !important;` +\n ` color: ${colors.cursorAccent.css} !important;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n ` outline: 1px solid ${colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${Constants.ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` border-bottom: 1px ${colors.cursor.css};` +\n ` border-bottom-style: solid;` +\n ` height: calc(100% - 1px);` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector}.focus .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n `}` +\n `${this._terminalSelector} .${Constants.SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n `}`;\n // Colors\n for (const [i, c] of colors.ansi.entries()) {\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n }\n styles +=\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n `${this._terminalSelector} .${Constants.FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n `${this._terminalSelector} .${Constants.BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n this._themeStyleElement.textContent = styles;\n }\n\n /**\n * default letter spacing\n * Due to rounding issues in dimensions dpr calc glyph might render\n * slightly too wide or too narrow. The method corrects the stacking offsets\n * by applying a default letter-spacing for all chars.\n * The value gets passed to the row factory to avoid setting this value again\n * (render speedup is roughly 10%).\n */\n private _setDefaultSpacing(): void {\n // measure same char as in CharSizeService to get the base deviation\n const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n this._rowContainer.style.letterSpacing = `${spacing}px`;\n this._rowFactory.defaultSpacing = spacing;\n }\n\n public handleDevicePixelRatioChange(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = this._document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n this._rowHasBlinkingCells.push(false);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n if (this._rowHasBlinkingCells.pop()) {\n this._rowHasBlinkingCellsCount--;\n }\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);\n }\n\n public handleCharSizeChanged(): void {\n this._updateDimensions();\n this._widthCache.clear();\n this._setDefaultSpacing();\n }\n\n public handleBlur(): void {\n this._rowContainer.classList.remove(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.pause();\n this.renderRows(0, this._bufferService.rows - 1);\n }\n\n public handleFocus(): void {\n this._rowContainer.classList.add(Constants.FOCUS_CLASS);\n this._cursorBlinkStateManager.resume();\n this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n }\n\n public handleViewportVisibilityChange(isVisible: boolean): void {\n this._textBlinkStateManager.setViewportVisible(isVisible);\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n const rows = this._bufferService.rows;\n\n // Remove all selections\n this._selectionContainer.replaceChildren();\n this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n\n // Determine old selection viewport band\n let oldViewportStart = 0;\n let oldViewportEnd = -1;\n if (this._lastSelectionStart && this._lastSelectionEnd) {\n this._selectionRenderModel.update(this._terminal, this._lastSelectionStart, this._lastSelectionEnd, this._lastSelectionColumnMode);\n if (this._selectionRenderModel.hasSelection) {\n oldViewportStart = this._selectionRenderModel.viewportCappedStartRow;\n oldViewportEnd = this._selectionRenderModel.viewportCappedEndRow;\n }\n }\n\n // Determine new selection viewport band and create overlays\n let newViewportStart = 0;\n let newViewportEnd = -1;\n if (!start || !end) {\n return;\n }\n this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);\n if (this._selectionRenderModel.hasSelection) {\n const viewportStartRow = this._selectionRenderModel.viewportStartRow;\n const viewportEndRow = this._selectionRenderModel.viewportEndRow;\n const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;\n const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;\n\n newViewportStart = viewportCappedStartRow;\n newViewportEnd = viewportCappedEndRow;\n\n // Create the selections\n const documentFragment = this._document.createDocumentFragment();\n\n if (columnSelectMode) {\n const isXFlipped = start[0] > end[0];\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const finalEndCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, finalEndCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n // Compute minimal row range to redraw\n let renderStartRow = Math.min(oldViewportStart, newViewportStart);\n let renderEndRow = Math.max(oldViewportEnd, newViewportEnd);\n\n if (renderEndRow >= 0) {\n // Clamp to viewport\n renderStartRow = Math.max(renderStartRow, 0);\n renderEndRow = Math.min(renderEndRow, rows - 1);\n\n // Ensure cursor row is included when a selection is present\n const buffer = this._bufferService.buffer;\n const cursorViewportRow = buffer.y;\n if (this._selectionRenderModel.hasSelection && cursorViewportRow >= 0 && cursorViewportRow < rows) {\n renderStartRow = Math.min(renderStartRow, cursorViewportRow);\n renderEndRow = Math.max(renderEndRow, cursorViewportRow);\n }\n\n this.renderRows(renderStartRow, renderEndRow);\n }\n\n // Update last selection state\n this._lastSelectionStart = start;\n this._lastSelectionEnd = end;\n this._lastSelectionColumnMode = columnSelectMode;\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = this._document.createElement('div');\n const left = colStart * this.dimensions.css.cell.width;\n let width = this.dimensions.css.cell.width * (colEnd - colStart);\n if (left + width > this.dimensions.css.canvas.width) {\n width = this.dimensions.css.canvas.width - left;\n }\n\n element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n element.style.top = `${row * this.dimensions.css.cell.height}px`;\n element.style.left = `${left}px`;\n element.style.width = `${width}px`;\n return element;\n }\n\n public handleCursorMove(): void {\n // Reset idle timer on cursor movement (which happens on input)\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n // Refresh CSS\n this._injectCss(this._themeService.colors);\n // update spacing cache\n this._widthCache.setFont(\n this._optionsService.rawOptions.fontFamily,\n this._optionsService.rawOptions.fontSize,\n this._optionsService.rawOptions.fontWeight,\n this._optionsService.rawOptions.fontWeightBold\n );\n this._setDefaultSpacing();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n /**\n * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n * `@testing-library/react`\n *\n * references:\n * - https://github.com/testing-library/react-testing-library/issues/1146\n * - https://github.com/jsdom/jsdom/issues/1245\n */\n e.replaceChildren();\n }\n if (this._rowHasBlinkingCellsCount > 0) {\n this._rowHasBlinkingCells.fill(false);\n this._rowHasBlinkingCellsCount = 0;\n this._textBlinkStateManager.setNeedsBlinkInViewport(false);\n }\n }\n\n public renderRows(start: number, end: number): void {\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._coreService.decPrivateModes.cursorBlink ?? this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._coreService.decPrivateModes.cursorStyle ?? this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n for (let y = start; y <= end; y++) {\n const row = y + buffer.ydisp;\n const rowElement = this._rowElements[y];\n if (!rowElement) {\n continue;\n }\n const lineData = buffer.lines.get(row);\n if (!lineData) {\n rowElement.replaceChildren();\n this._setRowBlinkState(y, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n lineData,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n -1,\n -1,\n rowInfo\n )\n );\n this._setRowBlinkState(y, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private get _terminalSelector(): string {\n return `.${Constants.TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n private _handleLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _handleLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n /**\n * NOTE: The linkifier may send out of viewport y-values if:\n * - negative y-value: the link started at a higher line\n * - y-value >= maxY: the link ends at a line below viewport\n *\n * For negative y-values we can simply adjust x = 0,\n * as higher up link start means, that everything from\n * (0,0) is a link under top-down-left-right char progression\n *\n * Additionally there might be a small chance of out-of-sync x|y-values\n * from a race condition of render updates vs. link event handler execution:\n * - (sync) resize: chances terminal buffer in sync, schedules render update async\n * - (async) link handler race condition: new buffer metrics, but still on old render state\n * - (async) render update: brings term metrics and render state back in sync\n */\n // clip coords into viewport\n if (y < 0) x = 0;\n if (y2 < 0) x2 = 0;\n const maxY = this._bufferService.rows - 1;\n y = Math.max(Math.min(y, maxY), 0);\n y2 = Math.max(Math.min(y2, maxY), 0);\n\n cols = Math.min(cols, this._bufferService.cols);\n const buffer = this._bufferService.buffer;\n const cursorAbsoluteY = buffer.ybase + buffer.y;\n const cursorX = Math.min(buffer.x, cols - 1);\n const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n const rowInfo = { hasBlinkingCells: false };\n\n // refresh rows within link range\n for (let i = y; i <= y2; ++i) {\n const row = i + buffer.ydisp;\n const rowElement = this._rowElements[i];\n if (!rowElement) {\n continue;\n }\n const bufferline = buffer.lines.get(row);\n if (!bufferline) {\n rowElement.replaceChildren();\n this._setRowBlinkState(i, false);\n continue;\n }\n rowElement.replaceChildren(\n ...this._rowFactory.createRow(\n bufferline,\n row,\n row === cursorAbsoluteY,\n cursorStyle,\n cursorInactiveStyle,\n cursorX,\n cursorBlink,\n this._textBlinkStateManager.isBlinkOn,\n this.dimensions.css.cell.width,\n this._widthCache,\n enabled ? (i === y ? x : 0) : -1,\n enabled ? ((i === y2 ? x2 : cols) - 1) : -1,\n rowInfo\n )\n );\n this._setRowBlinkState(i, rowInfo.hasBlinkingCells);\n }\n this._updateTextBlinkState();\n }\n\n private _setRowBlinkState(row: number, hasBlinkingCells: boolean): void {\n const previous = this._rowHasBlinkingCells[row];\n if (previous === hasBlinkingCells) {\n return;\n }\n this._rowHasBlinkingCells[row] = hasBlinkingCells;\n this._rowHasBlinkingCellsCount += hasBlinkingCells ? 1 : -1;\n }\n\n private _updateTextBlinkState(): void {\n this._textBlinkStateManager.setNeedsBlinkInViewport(this._rowHasBlinkingCellsCount > 0);\n }\n}\n\nclass CursorBlinkStateManager {\n private _idleTimeout: number | undefined;\n private _isIdlePaused: boolean = false;\n\n constructor(\n private readonly _rowContainer: HTMLElement,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n if (this._coreBrowserService.isFocused) {\n this._resetIdleTimer();\n }\n }\n\n public dispose(): void {\n this._clearIdleTimer();\n }\n\n public restartBlinkAnimation(): void {\n if (this._isIdlePaused) {\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n }\n this._resetIdleTimer();\n }\n\n public pause(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n }\n\n public resume(): void {\n this._isIdlePaused = false;\n this._rowContainer.classList.remove(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._resetIdleTimer();\n }\n\n private _resetIdleTimer(): void {\n this._isIdlePaused = false;\n this._clearIdleTimer();\n this._idleTimeout = this._coreBrowserService.window.setTimeout(() => {\n this._stopBlinkingDueToIdle();\n }, RendererConstants.CURSOR_BLINK_IDLE_TIMEOUT);\n }\n\n private _clearIdleTimer(): void {\n if (this._idleTimeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._idleTimeout);\n this._idleTimeout = undefined;\n }\n }\n\n private _stopBlinkingDueToIdle(): void {\n this._rowContainer.classList.add(Constants.CURSOR_BLINK_IDLE_CLASS);\n this._isIdlePaused = true;\n this._idleTimeout = undefined;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from '../../common/services/Services';\nimport { ICharSizeService } from './Services';\nimport { Disposable } from '../../common/Lifecycle';\nimport { Emitter } from '../../common/Event';\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private readonly _onCharSizeChange = this._register(new Emitter());\n public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n try {\n this._measureStrategy = this._register(new TextMetricsMeasureStrategy(this._optionsService));\n } catch {\n this._measureStrategy = this._register(new DomMeasureStrategy(document, parentElement, this._optionsService));\n }\n this._register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): Readonly;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\nconst enum DomMeasureStrategyConstants {\n REPEAT = 32\n}\n\nabstract class BaseMeasureStategy extends Disposable implements IMeasureStrategy {\n protected _result: IMeasureResult = { width: 0, height: 0 };\n\n protected _validateAndSet(width: number | undefined, height: number | undefined): void {\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (width !== undefined && width > 0 && height !== undefined && height > 0) {\n this._result.width = width;\n this._result.height = height;\n }\n }\n\n public abstract measure(): Readonly;\n}\n\nclass DomMeasureStrategy extends BaseMeasureStategy {\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n super();\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W'.repeat(DomMeasureStrategyConstants.REPEAT);\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._measureElement.style.whiteSpace = 'pre';\n this._measureElement.style.fontKerning = 'none';\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): Readonly {\n this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n this._validateAndSet(Number(this._measureElement.offsetWidth) / DomMeasureStrategyConstants.REPEAT, Number(this._measureElement.offsetHeight));\n\n return this._result;\n }\n}\n\nclass TextMetricsMeasureStrategy extends BaseMeasureStategy {\n private _canvas: OffscreenCanvas;\n private _ctx: OffscreenCanvasRenderingContext2D;\n\n constructor(\n private _optionsService: IOptionsService\n ) {\n super();\n // This will throw if any required API is not supported\n this._canvas = new OffscreenCanvas(100, 100);\n this._ctx = this._canvas.getContext('2d')!;\n const a = this._ctx.measureText('W');\n if (!('width' in a && 'fontBoundingBoxAscent' in a && 'fontBoundingBoxDescent' in a)) {\n throw new Error('Required font metrics not supported');\n }\n }\n\n public measure(): Readonly {\n this._ctx.font = `${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;\n const metrics = this._ctx.measureText('W');\n this._validateAndSet(metrics.width, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent);\n return this._result;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\nimport { Emitter, EventUtils } from '../../common/Event';\nimport { addDisposableListener } from '../Dom';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\n\nexport class CoreBrowserService extends Disposable implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n private _isFocused = false;\n private _cachedIsFocused: boolean | undefined = undefined;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n private readonly _onWindowChange = this._register(new Emitter());\n public readonly onWindowChange = this._onWindowChange.event;\n\n constructor(\n private _textarea: HTMLTextAreaElement,\n private _window: Window & typeof globalThis,\n public readonly mainDocument: Document\n ) {\n super();\n\n this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window));\n\n // Monitor device pixel ratio\n this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w)));\n this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange));\n\n this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true));\n this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false));\n }\n\n public get window(): Window & typeof globalThis {\n return this._window;\n }\n\n public set window(value: Window & typeof globalThis) {\n if (this._window !== value) {\n this._window = value;\n this._onWindowChange.fire(this._window);\n }\n }\n\n public get dpr(): number {\n return this.window.devicePixelRatio;\n }\n\n public get isFocused(): boolean {\n if (this._cachedIsFocused === undefined) {\n this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n queueMicrotask(() => this._cachedIsFocused = undefined);\n }\n return this._cachedIsFocused;\n }\n}\n\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will _register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nclass ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n private _windowResizeListener = this._register(new MutableDisposable());\n\n private readonly _onDprChange = this._register(new Emitter());\n public readonly onDprChange = this._onDprChange.event;\n\n constructor(private _parentWindow: Window) {\n super();\n\n // Initialize listener and dpr value\n this._outerListener = () => this._setDprAndFireIfDiffers();\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._updateDpr();\n\n // Monitor active window resize\n this._setWindowResizeListener();\n\n // Setup additional disposables\n this._register(toDisposable(() => this.clearListener()));\n }\n\n\n public setWindow(parentWindow: Window): void {\n this._parentWindow = parentWindow;\n this._setWindowResizeListener();\n this._setDprAndFireIfDiffers();\n }\n\n private _setWindowResizeListener(): void {\n this._windowResizeListener.value = addDisposableListener(this._parentWindow, 'resize', () => this._setDprAndFireIfDiffers());\n }\n\n private _setDprAndFireIfDiffers(): void {\n if (this._parentWindow.devicePixelRatio !== this._currentDevicePixelRatio) {\n this._onDprChange.fire(this._parentWindow.devicePixelRatio);\n }\n this._updateDpr();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._outerListener = undefined;\n }\n}\n", "import { ILinkProvider, ILinkProviderService } from './Services';\nimport { Disposable, toDisposable } from '../../common/Lifecycle';\nimport { IDisposable } from '../../common/Types';\n\nexport class LinkProviderService extends Disposable implements ILinkProviderService {\n declare public serviceBrand: undefined;\n\n public readonly linkProviders: ILinkProvider[] = [];\n\n constructor() {\n super();\n this._register(toDisposable(() => this.linkProviders.length = 0));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this.linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this.linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this.linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n const elementStyle = window.getComputedStyle(element);\n const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);\n const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);\n return [\n event.clientX - rect.left - leftPadding,\n event.clientY - rect.top - topPadding\n ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows in the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick, event: Pick, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there is no valid character size.\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(window, event, element);\n coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an additional point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { getWindow } from '../Dom';\nimport { getCoords, getCoordsRelativeToElement } from '../input/Mouse';\nimport { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';\n\nexport class MouseCoordsService implements IMouseCoordsService {\n public serviceBrand: undefined;\n\n constructor(\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n getWindow(element),\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.css.cell.width,\n this._renderService.dimensions.css.cell.height,\n isSelection\n );\n }\n\n public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n const coords = getCoordsRelativeToElement(getWindow(element), event, element);\n if (!this._charSizeService.hasValidSize) {\n return undefined;\n }\n coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n return {\n col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n x: Math.floor(coords[0]),\n y: Math.floor(coords[1])\n };\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as DomUtils from '../Dom';\nimport { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';\n\nconst mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;\n\nfunction tail(array: ArrayLike, n: number = 0): T | undefined {\n return array[array.length - (1 + n)];\n}\n\nfunction memoize(_target: any, key: string, descriptor: PropertyDescriptor): void {\n let fnKey: string | null = null;\n let fn: Function | null = null;\n\n if (typeof descriptor.value === 'function') {\n fnKey = 'value';\n fn = descriptor.value;\n\n if (fn!.length !== 0) {\n console.warn('Memoize should only be used in functions with zero parameters');\n }\n } else if (typeof descriptor.get === 'function') {\n fnKey = 'get';\n fn = descriptor.get;\n }\n\n if (!fn || !fnKey) {\n throw new Error('not supported');\n }\n\n const memoizeKey = `$memoize$${key}`;\n const descriptorAny = descriptor as { [key: string]: any };\n descriptorAny[fnKey] = function (...args: any[]) {\n if (!this.hasOwnProperty(memoizeKey)) {\n Object.defineProperty(this, memoizeKey, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: fn.apply(this, args)\n });\n }\n\n return (this as { [key: string]: any })[memoizeKey];\n };\n}\n\nclass LinkedListNode {\n\n public static readonly Undefined = new LinkedListNode(undefined);\n\n public element: E;\n public next: LinkedListNode;\n public prev: LinkedListNode;\n\n public constructor(element: E) {\n this.element = element;\n this.next = LinkedListNode.Undefined;\n this.prev = LinkedListNode.Undefined;\n }\n}\n\nclass LinkedList {\n\n private _first: LinkedListNode = LinkedListNode.Undefined;\n private _last: LinkedListNode = LinkedListNode.Undefined;\n\n public push(element: E): () => void {\n return this._insert(element, true);\n }\n\n private _insert(element: E, atTheEnd: boolean): () => void {\n const newNode = new LinkedListNode(element);\n if (this._first === LinkedListNode.Undefined) {\n this._first = newNode;\n this._last = newNode;\n\n } else if (atTheEnd) {\n const oldLast = this._last;\n this._last = newNode;\n newNode.prev = oldLast;\n oldLast.next = newNode;\n\n } else {\n const oldFirst = this._first;\n this._first = newNode;\n newNode.next = oldFirst;\n oldFirst.prev = newNode;\n }\n let didRemove = false;\n return () => {\n if (!didRemove) {\n didRemove = true;\n this._remove(newNode);\n }\n };\n }\n\n private _remove(node: LinkedListNode): void {\n if (node.prev !== LinkedListNode.Undefined && node.next !== LinkedListNode.Undefined) {\n const anchor = node.prev;\n anchor.next = node.next;\n node.next.prev = anchor;\n\n } else if (node.prev === LinkedListNode.Undefined && node.next === LinkedListNode.Undefined) {\n this._first = LinkedListNode.Undefined;\n this._last = LinkedListNode.Undefined;\n\n } else if (node.next === LinkedListNode.Undefined) {\n this._last = this._last.prev!;\n this._last.next = LinkedListNode.Undefined;\n\n } else if (node.prev === LinkedListNode.Undefined) {\n this._first = this._first.next!;\n this._first.prev = LinkedListNode.Undefined;\n }\n }\n\n public *[Symbol.iterator](): Iterator {\n let node = this._first;\n while (node !== LinkedListNode.Undefined) {\n yield node.element;\n node = node.next;\n }\n }\n}\n\nexport namespace EventType {\n export const TAP = '-xterm-gesturetap';\n export const CHANGE = '-xterm-gesturechange';\n export const START = '-xterm-gesturestart';\n export const END = '-xterm-gesturesend';\n export const CONTEXT_MENU = '-xterm-gesturecontextmenu';\n}\n\ninterface ITouchData {\n id: number;\n initialTarget: EventTarget;\n initialTimeStamp: number;\n initialPageX: number;\n initialPageY: number;\n rollingTimestamps: number[];\n rollingPageX: number[];\n rollingPageY: number[];\n}\n\nexport interface IGestureEvent extends MouseEvent {\n initialTarget: EventTarget | undefined;\n translationX: number;\n translationY: number;\n pageX: number;\n pageY: number;\n clientX: number;\n clientY: number;\n tapCount: number;\n}\n\ninterface ITouch {\n identifier: number;\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n radiusX: number;\n radiusY: number;\n rotationAngle: number;\n force: number;\n target: Element;\n}\n\ninterface ITouchList {\n [i: number]: ITouch;\n length: number;\n item(index: number): ITouch;\n identifiedTouch(id: number): ITouch;\n}\n\ninterface ITouchEvent extends Event {\n touches: ITouchList;\n targetTouches: ITouchList;\n changedTouches: ITouchList;\n}\n\nexport class Gesture extends Disposable {\n\n private static readonly _scrollFriction = -0.005;\n private static _instance: Gesture;\n private static readonly _holdDelay = 700;\n\n private _dispatched = false;\n private readonly _targets = new LinkedList();\n private readonly _ignoreTargets = new LinkedList();\n private _handle: IDisposable | null;\n\n private readonly _activeTouches: { [id: number]: ITouchData };\n\n private _lastSetTapCountTime: number;\n\n private static readonly _clearTapCountTime = 400; // ms\n\n\n private constructor() {\n super();\n\n this._activeTouches = {};\n this._handle = null;\n this._lastSetTapCountTime = 0;\n\n const targetWindow = mainWindow;\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchstart', (e: ITouchEvent) => this._handleTouchStart(e), { passive: false }));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchend', (e: ITouchEvent) => this._handleTouchEnd(targetWindow, e)));\n this._register(DomUtils.addDisposableListener(targetWindow.document, 'touchmove', (e: ITouchEvent) => this._handleTouchMove(e), { passive: false }));\n }\n\n public static addTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._targets.push(element);\n return toDisposable(remove);\n }\n\n public static ignoreTarget(element: HTMLElement): IDisposable {\n if (!Gesture.isTouchDevice()) {\n return Disposable.None;\n }\n if (!Gesture._instance) {\n Gesture._instance = new Gesture();\n }\n\n const remove = Gesture._instance._ignoreTargets.push(element);\n return toDisposable(remove);\n }\n\n @memoize\n public static isTouchDevice(): boolean {\n return 'ontouchstart' in mainWindow || navigator.maxTouchPoints > 0;\n }\n\n public override dispose(): void {\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n super.dispose();\n }\n\n private _handleTouchStart(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n if (this._handle) {\n this._handle.dispose();\n this._handle = null;\n }\n\n for (let i = 0, len = e.targetTouches.length; i < len; i++) {\n const touch = e.targetTouches.item(i);\n\n this._activeTouches[touch.identifier] = {\n id: touch.identifier,\n initialTarget: touch.target,\n initialTimeStamp: timestamp,\n initialPageX: touch.pageX,\n initialPageY: touch.pageY,\n rollingTimestamps: [timestamp],\n rollingPageX: [touch.pageX],\n rollingPageY: [touch.pageY]\n };\n\n const evt = this._newGestureEvent(EventType.START, touch.target);\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n this._dispatchEvent(evt);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _handleTouchEnd(targetWindow: Window, e: ITouchEvent): void {\n const timestamp = Date.now();\n\n const activeTouchCount = Object.keys(this._activeTouches).length;\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('move of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n const holdTime = Date.now() - data.initialTimeStamp;\n\n if (holdTime < Gesture._holdDelay\n && Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n && Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.TAP, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (holdTime >= Gesture._holdDelay\n\t\t\t\t&& Math.abs(data.initialPageX - tail(data.rollingPageX)!) < 30\n\t\t\t\t&& Math.abs(data.initialPageY - tail(data.rollingPageY)!) < 30) {\n\n const evt = this._newGestureEvent(EventType.CONTEXT_MENU, data.initialTarget);\n evt.pageX = tail(data.rollingPageX)!;\n evt.pageY = tail(data.rollingPageY)!;\n this._dispatchEvent(evt);\n\n } else if (activeTouchCount === 1) {\n const finalX = tail(data.rollingPageX)!;\n const finalY = tail(data.rollingPageY)!;\n\n const deltaT = tail(data.rollingTimestamps)! - data.rollingTimestamps[0];\n const deltaX = finalX - data.rollingPageX[0];\n const deltaY = finalY - data.rollingPageY[0];\n\n const dispatchTo = [...this._targets].filter(t => data.initialTarget instanceof Node && t.contains(data.initialTarget));\n this._inertia(targetWindow, dispatchTo, timestamp,\n Math.abs(deltaX) / deltaT,\n deltaX > 0 ? 1 : -1,\n finalX,\n Math.abs(deltaY) / deltaT,\n deltaY > 0 ? 1 : -1,\n finalY\n );\n }\n\n\n this._dispatchEvent(this._newGestureEvent(EventType.END, data.initialTarget));\n delete this._activeTouches[touch.identifier];\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n\n private _newGestureEvent(type: string, initialTarget?: EventTarget): IGestureEvent {\n const event = document.createEvent('CustomEvent') as unknown as IGestureEvent;\n event.initEvent(type, false, true);\n event.initialTarget = initialTarget;\n event.tapCount = 0;\n return event;\n }\n\n private _dispatchEvent(event: IGestureEvent): void {\n if (event.type === EventType.TAP) {\n const currentTime = (new Date()).getTime();\n let setTapCount;\n if (currentTime - this._lastSetTapCountTime > Gesture._clearTapCountTime) {\n setTapCount = 1;\n } else {\n setTapCount = 2;\n }\n\n this._lastSetTapCountTime = currentTime;\n event.tapCount = setTapCount;\n } else if (event.type === EventType.CHANGE || event.type === EventType.CONTEXT_MENU) {\n this._lastSetTapCountTime = 0;\n }\n\n if (event.initialTarget instanceof Node) {\n for (const ignoreTarget of this._ignoreTargets) {\n if (ignoreTarget.contains(event.initialTarget)) {\n return;\n }\n }\n\n const targets: [number, HTMLElement][] = [];\n for (const target of this._targets) {\n if (target.contains(event.initialTarget)) {\n let depth = 0;\n let now: Node | null = event.initialTarget;\n while (now && now !== target) {\n depth++;\n now = now.parentElement;\n }\n targets.push([depth, target]);\n }\n }\n\n targets.sort((a, b) => a[0] - b[0]);\n\n for (const [, target] of targets) {\n target.dispatchEvent(event);\n this._dispatched = true;\n }\n }\n }\n\n private _inertia(targetWindow: Window, dispatchTo: ReadonlyArray, t1: number, vX: number, dirX: number, x: number, vY: number, dirY: number, y: number): void {\n this._handle = DomUtils.scheduleAtNextAnimationFrame(targetWindow, () => {\n const now = Date.now();\n\n const deltaT = now - t1;\n let deltaPosX = 0;\n let deltaPosY = 0;\n let stopped = true;\n\n vX += Gesture._scrollFriction * deltaT;\n vY += Gesture._scrollFriction * deltaT;\n\n if (vX > 0) {\n stopped = false;\n deltaPosX = dirX * vX * deltaT;\n }\n\n if (vY > 0) {\n stopped = false;\n deltaPosY = dirY * vY * deltaT;\n }\n\n const evt = this._newGestureEvent(EventType.CHANGE);\n evt.translationX = deltaPosX;\n evt.translationY = deltaPosY;\n dispatchTo.forEach(d => d.dispatchEvent(evt));\n\n if (!stopped) {\n this._inertia(targetWindow, dispatchTo, now, vX, dirX, x + deltaPosX, vY, dirY, y + deltaPosY);\n }\n });\n }\n\n private _handleTouchMove(e: ITouchEvent): void {\n const timestamp = Date.now();\n\n for (let i = 0, len = e.changedTouches.length; i < len; i++) {\n\n const touch = e.changedTouches.item(i);\n\n if (!this._activeTouches.hasOwnProperty(String(touch.identifier))) {\n console.warn('end of an UNKNOWN touch', touch);\n continue;\n }\n\n const data = this._activeTouches[touch.identifier];\n\n const evt = this._newGestureEvent(EventType.CHANGE, data.initialTarget);\n evt.translationX = touch.pageX - tail(data.rollingPageX)!;\n evt.translationY = touch.pageY - tail(data.rollingPageY)!;\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n evt.clientX = touch.clientX;\n evt.clientY = touch.clientY;\n this._dispatchEvent(evt);\n\n if (data.rollingPageX.length > 3) {\n data.rollingPageX.shift();\n data.rollingPageY.shift();\n data.rollingTimestamps.shift();\n }\n\n data.rollingPageX.push(touch.pageX);\n data.rollingPageY.push(touch.pageY);\n data.rollingTimestamps.push(timestamp);\n }\n\n if (this._dispatched) {\n e.preventDefault();\n e.stopPropagation();\n this._dispatched = false;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableListener } from '../Dom';\nimport { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { DisposableStore, MutableDisposable } from '../../common/Lifecycle';\nimport { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';\nimport { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';\n\ntype RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;\n\nexport const enum MouseEventCssClasses {\n ENABLE_MOUSE_EVENTS = 'enable-mouse-events'\n}\n\ninterface IMouseBindContext {\n readonly target: IMouseServiceTarget;\n readonly focus: () => void;\n readonly requestedEvents: RequestedMouseEvents;\n readonly mouseupListener: MutableDisposable;\n readonly mousedragListener: MutableDisposable;\n}\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n private _lastEvent: ICoreMouseEvent | null = null;\n private _wheelPartialScroll: number = 0;\n private _touchScrollAccumulator: number = 0;\n private _altMouseCursor: AltMouseCursorController | undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @ICoreService private readonly _coreService: ICoreService,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @ILogService private readonly _logService: ILogService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void {\n const { element, document } = target;\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of MouseStateService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: RequestedMouseEvents = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const mouseupListener = new MutableDisposable();\n const mousedragListener = new MutableDisposable();\n register(mouseupListener);\n register(mousedragListener);\n const ctx: IMouseBindContext = { target, focus, requestedEvents, mouseupListener, mousedragListener };\n const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {\n mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),\n wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),\n mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent),\n mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent)\n };\n this._altMouseCursor = new AltMouseCursorController(\n element,\n document,\n () => this._mouseStateService.areMouseEventsActive\n && !!this._optionsService.rawOptions.mouseEventsRequireAlt\n );\n register(this._altMouseCursor);\n register(this._mouseStateService.onProtocolChange(events => {\n this._handleProtocolChange(ctx, eventListeners, events);\n }));\n register(this._optionsService.onSpecificOptionChange('mouseEventsRequireAlt', () => {\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev)));\n register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false }));\n register(Gesture.addTarget(target.screenElement));\n register(addDisposableListener(target.screenElement, GestureEventType.START, () => this._handleTouchStart()));\n register(addDisposableListener(target.screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleTouchChange(ctx, e)));\n }\n\n private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean {\n // Get mouse coordinates\n const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) {\n return false;\n }\n const deltaY = (ev as WheelEvent).deltaY;\n if (deltaY === 0) {\n return false;\n }\n const lines = this._consumeWheelEvent(\n ev as WheelEvent,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n return false;\n }\n action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n if (but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive\n && !ev.altKey) {\n return false;\n }\n\n // Alt is only used locally to gate mouse passthrough; do not forward it to the\n // application (e.g. tmux ignores alt-modified mouse reports).\n const stripAltFromReport = but !== CoreMouseButton.WHEEL\n && this._optionsService.rawOptions.mouseEventsRequireAlt\n && this._mouseStateService.areMouseEventsActive;\n\n return this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: stripAltFromReport ? false : ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void {\n this._sendEvent(ctx, ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n ctx.mouseupListener.clear();\n ctx.mousedragListener.clear();\n }\n }\n\n private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false {\n this._sendEvent(ctx, ev);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move while a button is held\n if (ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void {\n // deal only with move without any button\n if (!ev.buttons) {\n this._sendEvent(ctx, ev);\n }\n }\n\n private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void {\n ev.preventDefault();\n ctx.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) {\n return;\n }\n\n this._sendEvent(ctx, ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n // Use the element's current document in case it moved to another window after open.\n const { element, document: targetDocument } = ctx.target;\n const listenerDocument = element.ownerDocument ?? targetDocument;\n if (ctx.requestedEvents.mouseup) {\n ctx.mouseupListener.value = addDisposableListener(listenerDocument, 'mouseup', ctx.requestedEvents.mouseup);\n }\n if (ctx.requestedEvents.mousedrag) {\n ctx.mousedragListener.value = addDisposableListener(listenerDocument, 'mousemove', ctx.requestedEvents.mousedrag);\n }\n }\n\n private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void {\n // do nothing, if app side handles wheel itself\n if (ctx.requestedEvents.wheel) {\n return;\n }\n\n if (!this._mouseStateService.allowCustomWheelEvent(ev)) {\n return false;\n }\n\n if (!this._bufferService.buffer.hasScrollback) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse\n // events are not enabled.\n // This used implementation used get the actual lines/partial lines scrolled from the\n // viewport but since moving to the new viewport implementation has been simplified to\n // simply send a single up or down sequence.\n\n // Do nothing if there's no vertical scroll\n const deltaY = ev.deltaY;\n if (deltaY === 0) {\n return false;\n }\n\n const lines = this._consumeWheelEvent(\n ev,\n this._renderService?.dimensions?.device?.cell?.height,\n this._coreBrowserService?.dpr\n );\n if (lines === 0) {\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n this._coreService.triggerDataEvent(sequence, true);\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n }\n\n private _handleTouchStart(): void {\n this._touchScrollAccumulator = 0;\n }\n\n private _handleTouchChange(ctx: IMouseBindContext, e: IGestureEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n // When mouse protocol has wheel events active, send as mouse wheel events.\n if (ctx.requestedEvents.wheel) {\n this._handleTouchScrollAsWheel(ctx, e);\n return;\n }\n\n // When in alt buffer (no scrollback), send up/down key sequences.\n if (!this._bufferService.buffer.hasScrollback) {\n this._handleTouchScrollAsKeys(e);\n return;\n }\n\n // Normal scrollback: delegate to viewport scrolling when available.\n ctx.target.handleTouchScroll?.(e.translationY);\n }\n\n private _handleTouchScrollAsKeys(e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const sequence = C0.ESC\n + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[')\n + (lines < 0 ? 'A' : 'B');\n for (let i = 0; i < Math.abs(lines); i++) {\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n\n private _handleTouchScrollAsWheel(ctx: IMouseBindContext, e: IGestureEvent): void {\n const cellHeight = this._renderService?.dimensions.css.cell.height;\n if (!cellHeight) {\n return;\n }\n\n this._touchScrollAccumulator -= e.translationY;\n const lines = Math.trunc(this._touchScrollAccumulator / cellHeight);\n if (lines === 0) {\n return;\n }\n\n this._touchScrollAccumulator -= lines * cellHeight;\n const pos = this._mouseCoordsService.getMouseReportCoords(e, ctx.target.screenElement);\n if (!pos) {\n return;\n }\n\n for (let i = 0; i < Math.abs(lines); i++) {\n this._triggerMouseEvent({\n col: pos.col,\n row: pos.row,\n x: pos.x,\n y: pos.y,\n button: CoreMouseButton.WHEEL,\n action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN,\n ctrl: false,\n alt: false,\n shift: false\n });\n }\n }\n\n public reset(): void {\n this._lastEvent = null;\n this._wheelPartialScroll = 0;\n this._touchScrollAccumulator = 0;\n }\n\n private _syncMouseModeState(element: HTMLElement): void {\n if (this._mouseStateService.areMouseEventsActive) {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt) {\n this._altMouseCursor?.resetClass();\n this._selectionService.enable();\n } else {\n element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.disable();\n }\n } else {\n element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n this._selectionService.enable();\n }\n }\n\n private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {\n const { element } = ctx.target;\n const { requestedEvents } = ctx;\n // apply global changes on events\n if (events) {\n if (this._optionsService.rawOptions.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._explainEvents(events));\n }\n } else {\n this._logService.debug('Unbinding from mouse events.');\n }\n this._syncMouseModeState(element);\n this._altMouseCursor?.sync();\n\n // add/remove handlers from requestedEvents\n if (!(events & CoreMouseEventType.MOVE)) {\n if (requestedEvents.mousemove) {\n element.removeEventListener('mousemove', requestedEvents.mousemove);\n }\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n element.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n if (requestedEvents.wheel) {\n element.removeEventListener('wheel', requestedEvents.wheel);\n }\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n element.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n ctx.mouseupListener.clear();\n requestedEvents.mouseup = null;\n } else {\n requestedEvents.mouseup ??= eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n ctx.mousedragListener.clear();\n requestedEvents.mousedrag = null;\n } else {\n requestedEvents.mousedrag ??= eventListeners.mousedrag;\n }\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n // Multiply the scroll speed when the modifier key is pressed\n if (ev.altKey || ev.ctrlKey || ev.shiftKey) {\n return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n }\n return amount * this._optionsService.rawOptions.scrollSensitivity;\n }\n\n /**\n * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls.\n * This prevents hyper-sensitive scrolling in alt buffer.\n */\n private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0 || ev.shiftKey) {\n return 0;\n }\n\n if (cellHeight === undefined || dpr === undefined) {\n return 0;\n }\n\n const targetWheelEventPixels = cellHeight / dpr;\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= (targetWheelEventPixels + 0.0); // Prevent integer division\n\n const isLikelyTrackpad = Math.abs(ev.deltaY) < 50;\n if (isLikelyTrackpad) {\n amount *= 0.3;\n }\n\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the browser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fulfill protocol and encoding restrictions.\n */\n private _triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move events at grid or pixel level\n if (e.action === CoreMouseAction.MOVE\n && this._lastEvent\n && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding)\n ) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._mouseStateService.restrictMouseEvent(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._mouseStateService.encodeMouseEvent(e);\n if (report) {\n if (this._mouseStateService.isDefaultEncoding) {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n return true;\n }\n\n private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n if (pixels) {\n if (e1.x !== e2.x) return false;\n if (e1.y !== e2.y) return false;\n } else {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n }\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n\n}\n\n/**\n * Toggles MouseEventCssClasses.ENABLE_MOUSE_EVENTS on the terminal element while alt is held when\n * `mouseEventsRequireAlt` is active. DOM listeners are only registered while active.\n */\nexport class AltMouseCursorController implements IDisposable {\n private readonly _listeners = new MutableDisposable();\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _document: Document,\n private readonly _isActive: () => boolean\n ) {\n }\n\n public dispose(): void {\n this._listeners.dispose();\n }\n\n public sync(): void {\n this._listeners.clear();\n\n if (!this._isActive()) {\n return;\n }\n\n const store = new DisposableStore();\n const syncFromModifier = (ev: KeyboardEvent | MouseEvent): void => this.syncFromModifier(ev);\n store.add(addDisposableListener(this._document, 'keydown', syncFromModifier));\n store.add(addDisposableListener(this._document, 'keyup', syncFromModifier));\n store.add(addDisposableListener(this._element, 'mousemove', syncFromModifier));\n const targetWindow = this._element.ownerDocument?.defaultView;\n if (targetWindow) {\n store.add(addDisposableListener(targetWindow, 'blur', () => {\n if (this._isActive()) {\n this.resetClass();\n }\n }));\n }\n this._listeners.value = store;\n }\n\n public resetClass(): void {\n this._updateClass(false);\n }\n\n public syncFromModifier(ev: KeyboardEvent | MouseEvent): void {\n if (!this._isActive()) {\n return;\n }\n this._updateClass(ev.getModifierState('Alt'));\n }\n\n private _updateClass(altHeld: boolean): void {\n if (altHeld) {\n this._element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from './Types';\nimport { ICoreBrowserService } from './services/Services';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n private _refreshCallbacks: FrameRequestCallback[] = [];\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame !== undefined) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n this._refreshCallbacks.push(callback);\n this._animationFrame ??= this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n return this._animationFrame;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame !== undefined) {\n return;\n }\n\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n this._animationFrame = undefined;\n\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n this._runRefreshCallbacks();\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n this._runRefreshCallbacks();\n }\n\n private _runRefreshCallbacks(): void {\n for (const callback of this._refreshCallbacks) {\n callback(0);\n }\n this._refreshCallbacks = [];\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ILogService } from './services/Services';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the main thread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n protected readonly _logService: ILogService;\n\n constructor(logService: ILogService) {\n this._logService = logService;\n }\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration: number;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining: number;\n while (this._i < this._tasks.length) {\n taskDuration = performance.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, performance.now might not be stable (changes on wall clock\n // changes), this is not an issue here as a clock change during a short running task is very\n // unlikely in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, performance.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n this._logService.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = performance.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - performance.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = ('requestIdleCallback' in globalThis) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor(logService: ILogService) {\n this._queue = new IdleTaskQueue(logService);\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n\n public dispose(): void {\n this._queue.clear();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { RenderDebouncer } from '../RenderDebouncer';\nimport { IRenderDebouncerWithCallback } from '../Types';\nimport { IRenderDimensions, IRenderer } from '../renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport { DebouncedIdleTask } from '../../common/TaskQueue';\nimport { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nconst enum Constants {\n SYNCHRONIZED_OUTPUT_TIMEOUT_MS = 1000\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderer: MutableDisposable = this._register(new MutableDisposable());\n private _renderDebouncer: IRenderDebouncerWithCallback;\n private _pausedResizeTask: DebouncedIdleTask;\n private _observerDisposable = this._register(new MutableDisposable());\n private _intersectionObserver: IntersectionObserver | undefined;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _syncOutputHandler: SynchronizedOutputHandler;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n private readonly _onRenderedViewportChange = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n private readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onRefreshRequest = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n constructor(\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ILogService private readonly _logService: ILogService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService,\n @IDecorationService decorationService: IDecorationService,\n @IBufferService bufferService: IBufferService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IThemeService themeService: IThemeService\n ) {\n super();\n\n this._pausedResizeTask = this._register(new DebouncedIdleTask(this._logService));\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end), this._coreBrowserService);\n this._register(this._renderDebouncer);\n\n this._syncOutputHandler = new SynchronizedOutputHandler(\n this._coreBrowserService,\n this._coreService,\n () => this._fullRefresh()\n );\n this._register(toDisposable(() => this._syncOutputHandler.dispose()));\n\n this._register(this._coreBrowserService.onDprChange(() => this.handleDevicePixelRatioChange()));\n\n this._register(bufferService.onResize(() => this._fullRefresh()));\n this._register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n this._register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n this._register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n // Do a full refresh whenever any decoration is added or removed. This may not actually result\n // in changes but since decorations should be used sparingly or added/removed all in the same\n // frame this should have minimal performance impact.\n this._register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n this._register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n // Clear the renderer when the a change that could affect glyphs occurs\n this._register(this._optionsService.onMultipleOptionChange([\n 'drawBoldTextInBrightColors',\n 'letterSpacing',\n 'lineHeight',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontWeightBold',\n 'minimumContrastRatio',\n 'rescaleOverlappingGlyphs'\n ], () => {\n this.clear();\n this.handleResize(bufferService.cols, bufferService.rows);\n this._fullRefresh();\n }));\n\n // Refresh the cursor line when the cursor changes\n this._register(this._optionsService.onMultipleOptionChange([\n 'cursorBlink',\n 'cursorStyle'\n ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, undefined, true)));\n\n this._register(themeService.onChangeColors(() => this._fullRefresh()));\n\n this._registerIntersectionObserver(this._coreBrowserService.window, screenElement);\n this._register(this._coreBrowserService.onWindowChange((w) => this._registerIntersectionObserver(w, screenElement)));\n }\n\n private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void {\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in w) {\n const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n this._observerDisposable.value = toDisposable(() => {\n this._intersectionObserver?.disconnect();\n this._intersectionObserver = undefined;\n });\n this._intersectionObserver = observer;\n observer.observe(screenElement);\n }\n }\n\n private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n this._renderer.value?.handleViewportVisibilityChange?.(!this._isPaused);\n\n // Terminal was hidden on open\n if (!this._isPaused && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n\n if (!this._isPaused && this._needsFullRefresh) {\n this._pausedResizeTask.flush();\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, sync: boolean = false, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n const buffered = this._syncOutputHandler.flush();\n if (buffered) {\n start = Math.min(start, buffered.start);\n end = Math.max(end, buffered.end);\n }\n\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n\n if (sync) {\n this._renderRows(start, end);\n } else {\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n }\n\n private _renderRows(start: number, end: number): void {\n if (!this._renderer.value) {\n return;\n }\n\n // Skip rendering if synchronized output mode is enabled. This check must happen here\n // (in addition to refreshRows) to handle renders that were queued before the mode was enabled.\n if (this._coreService.decPrivateModes.synchronizedOutput) {\n this._syncOutputHandler.bufferRows(start, end);\n return;\n }\n\n // Since this is debounced, a resize event could have happened between the time a refresh was\n // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n // given the current viewport state.\n start = Math.min(start, this._rowCount - 1);\n end = Math.min(end, this._rowCount - 1);\n\n // Render\n this._renderer.value.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRenderedViewportChange.fire({ start, end });\n }\n this._onRender.fire({ start, end });\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n private _handleOptionsChanged(): void {\n if (!this._renderer.value) {\n return;\n }\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n if (!this._renderer.value) {\n return;\n }\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.value.dimensions);\n }\n\n public hasRenderer(): boolean {\n return !!this._renderer.value;\n }\n\n public setRenderer(renderer: IRenderer): void {\n this._renderer.value = renderer;\n // If the value was not set, the terminal is being disposed so ignore it\n if (this._renderer.value) {\n this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, e.sync, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n }\n\n public addRefreshCallback(callback: FrameRequestCallback): number {\n return this._renderDebouncer.addRefreshCallback(callback);\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public clearTextureAtlas(): void {\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.clearTextureAtlas?.();\n this._fullRefresh();\n }\n\n public handleDevicePixelRatioChange(): void {\n // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n // when devicePixelRatio changes\n this._charSizeService.measure();\n\n if (!this._renderer.value) {\n return;\n }\n this._renderer.value.handleDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public handleResize(cols: number, rows: number): void {\n if (!this._renderer.value) {\n return;\n }\n if (this._isPaused) {\n this._pausedResizeTask.set(() => this._renderer.value?.handleResize(cols, rows));\n } else {\n this._renderer.value.handleResize(cols, rows);\n }\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public handleCharSizeChanged(): void {\n this._renderer.value?.handleCharSizeChanged();\n }\n\n public handleBlur(): void {\n this._renderer.value?.handleBlur();\n }\n\n public handleFocus(): void {\n this._renderer.value?.handleFocus();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n }\n\n public handleCursorMove(): void {\n this._renderer.value?.handleCursorMove();\n }\n\n public clear(): void {\n this._renderer.value?.clear();\n }\n}\n\n/**\n * Buffers row refresh requests during synchronized output mode (DEC mode 2026).\n * When the mode is disabled, the accumulated row range is flushed for rendering.\n * A safety timeout ensures rendering occurs even if the end sequence is not received.\n */\nclass SynchronizedOutputHandler {\n private _start: number = 0;\n private _end: number = 0;\n private _timeout: number | undefined;\n private _isBuffering: boolean = false;\n\n constructor(\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _onTimeout: () => void\n ) {}\n\n public bufferRows(start: number, end: number): void {\n if (!this._isBuffering) {\n this._start = start;\n this._end = end;\n this._isBuffering = true;\n } else {\n this._start = Math.min(this._start, start);\n this._end = Math.max(this._end, end);\n }\n\n this._timeout ??= this._coreBrowserService.window.setTimeout(() => {\n this._timeout = undefined;\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onTimeout();\n }, Constants.SYNCHRONIZED_OUTPUT_TIMEOUT_MS);\n }\n\n public flush(): { start: number, end: number } | undefined {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n\n if (!this._isBuffering) {\n return undefined;\n }\n\n const result = { start: this._start, end: this._end };\n this._isBuffering = false;\n return result;\n }\n\n public dispose(): void {\n if (this._timeout !== undefined) {\n this._coreBrowserService.window.clearTimeout(this._timeout);\n this._timeout = undefined;\n }\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from '../../common/data/EscapeSequences';\nimport { IBufferService } from '../../common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(startY, bufferService);\n const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line?.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line?.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line?.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while ((currentCol !== endCol || currentRow !== endRow) &&\n currentRow >= 0 &&\n currentRow < bufferService.buffer.lines.length) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from '../../common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n // Ensure the trailing EOL isn't included when the selection ends on the right edge\n if (startPlusLength % this._bufferService.cols === 0) {\n return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n }\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n // Keep the whole wrapped word/line selected if the content wraps multiple lines\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @returns Whether a refresh is necessary.\n */\n public handleTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start row is trimmed away, reset to the buffer origin.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart = [0, 0];\n return true;\n }\n return false;\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from '@xterm/xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n if (range.start.y > range.end.y) {\n throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n }\n return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from '../Types';\nimport { getCoordsRelativeToElement } from '../input/Mouse';\nimport { moveToCellSequence } from '../input/MoveToCell';\nimport { SelectionModel } from '../selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';\nimport { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';\nimport { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';\nimport * as Browser from '../../common/Platform';\nimport { IDisposable } from '../../common/Types';\nimport { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';\nimport { getRangeLength } from '../../common/buffer/BufferRange';\nimport { CellData } from '../../common/buffer/CellData';\nimport { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';\nimport { Emitter } from '../../common/Event';\n\nconst enum Constants {\n /**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\n DRAG_SCROLL_MAX_THRESHOLD = 50,\n /**\n * The maximum scrolling speed\n */\n DRAG_SCROLL_MAX_SPEED = 15,\n /**\n * The number of milliseconds between drag scroll updates.\n */\n DRAG_SCROLL_INTERVAL = 50,\n /**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\n ALT_CLICK_MOVE_CURSOR_TIME = 500\n}\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private readonly _trimListener = this._register(new MutableDisposable());\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n private _oldHasSelection: boolean = false;\n private _oldSelectionStart: [number, number] | undefined = undefined;\n private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n private readonly _onLinuxMouseSelection = this._register(new Emitter());\n public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n private readonly _onRedrawRequest = this._register(new Emitter());\n public readonly onRequestRedraw = this._onRedrawRequest.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onRequestScrollLines = this._register(new Emitter());\n public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _linkifier: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IMouseStateService private readonly _mouseStateService: IMouseStateService,\n @IRenderService private readonly _renderService: IRenderService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener.value = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n this._register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n\n this._register(toDisposable(() => {\n this._removeMouseDownListeners();\n }));\n\n // Clear selection when resizing vertically. This experience could be improved, this is the\n // simple option to fix the buggy behavior. https://github.com/xtermjs/xterm.js/issues/5300\n this._register(this._bufferService.onResize(e => {\n if (e.rowsChanged) {\n this.clearSelection();\n }\n }));\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n // For column selection it's not enough to rely on final selection's swapping of reversed\n // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n const startCol = start[0] < end[0] ? start[0] : end[0];\n const endCol = start[0] < end[0] ? end[0] : start[0];\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine?.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n private _isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n public isCellInSelection(x: number, y: number): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return this._areCoordsInSelection([x, y], start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n // Check if there is a link under the cursor first and select that if so\n const range = this._linkifier.currentLink?.link?.range;\n if (range) {\n this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n this._model.selectionEnd = undefined;\n return true;\n }\n\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, allowWhitespaceOnlySelection);\n this._model.selectionEnd = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _handleTrim(amount: number): void {\n const needsRefresh = this._model.handleTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.css.canvas.height;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -Constants.DRAG_SCROLL_MAX_THRESHOLD), Constants.DRAG_SCROLL_MAX_THRESHOLD);\n offset /= Constants.DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (Constants.DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return !event.altKey;\n }\n\n if (Browser.isMac) {\n return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public handleMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive && event.altKey) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._handleIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._handleSingleClick(event);\n } else if (event.detail === 2) {\n this._handleDoubleClick(event);\n } else if (event.detail === 3) {\n this._handleTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), Constants.DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _handleIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _handleSingleClick(event: MouseEvent): void {\n // Track if there was a selection before clearing\n const hadSelection = this.hasSelection;\n\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Fire selection change event if a selection was cleared\n if (hadSelection) {\n this._fireOnSelectionChange(this._model.finalSelectionStart, this._model.finalSelectionEnd, false);\n }\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current word.\n * @param event The mouse event.\n */\n private _handleDoubleClick(event: MouseEvent): void {\n if (this._selectWordAtCursor(event, true)) {\n this._activeSelectionMode = SelectionMode.WORD;\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _handleTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n if (this._optionsService.rawOptions.mouseEventsRequireAlt && this._mouseStateService.areMouseEventsActive) {\n return false;\n }\n return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _handleMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n if (this._model.selectionEnd[0] < this._bufferService.cols) {\n this._model.selectionEnd[0]++;\n }\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every Constants.DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows - 1, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _handleMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < Constants.ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseCoordsService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else {\n this._fireEventIfSelectionChanged();\n }\n }\n\n private _fireEventIfSelectionChanged(): void {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n if (!hasSelection) {\n if (this._oldHasSelection) {\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n return;\n }\n\n // Sanity check, these should not be undefined as there is a selection\n if (!start || !end) {\n return;\n }\n\n if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n this._fireOnSelectionChange(start, end, hasSelection);\n }\n }\n\n private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n this._oldSelectionStart = start;\n this._oldSelectionEnd = end;\n this._oldHasSelection = hasSelection;\n this._onSelectionChange.fire();\n }\n\n private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.value = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n }\n\n /**\n * Converts a viewport column (0 to cols - 1) to the character index on the\n * buffer line, the latter takes into account wide and null characters.\n * @param bufferLine The buffer line to use.\n * @param x The x index in the buffer line to convert.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n let charIndex = x;\n for (let i = 0; x >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && x !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n this._fireEventIfSelectionChanged();\n }\n\n public rightClickSelect(ev: MouseEvent): void {\n if (!this._isClickInSelection(ev)) {\n if (this._selectWordAtCursor(ev, false)) {\n this.refresh(true);\n }\n this._fireEventIfSelectionChanged();\n }\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param cell The cell to check.\n */\n private _isCharWordSeparator(cell: ICellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n const range: IBufferRange = {\n start: { x: 0, y: wrappedRange.first },\n end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n };\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = undefined;\n this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap {\n private _data: TwoKeyMap> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from './Types';\nimport { IColor } from '../common/Types';\nimport { TwoKeyMap } from '../common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: TwoKeyMap = new TwoKeyMap();\n private _css: TwoKeyMap = new TwoKeyMap();\n\n public setCss(bg: number, fg: number, value: string | null): void {\n this._css.set(bg, fg, value);\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._css.get(bg, fg);\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n this._color.set(bg, fg, value);\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color.get(bg, fg);\n }\n\n public clear(): void {\n this._color.clear();\n this._css.clear();\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, ITerminalOptions } from '../common/Types';\nimport { CharData, IBuffer } from '../common/buffer/Types';\nimport { ICoreTerminal } from '../common/CoreTerminal';\nimport { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';\nimport { channels, css } from '../common/Color';\nimport type { IEvent } from '../common/Event';\n\n/**\n * A portion of the public API that are implemented identially internally and simply passed through.\n */\ntype InternalPassthroughApis = Omit;\n\nexport interface ITerminal extends InternalPassthroughApis, ICoreTerminal {\n screenElement: HTMLElement | undefined;\n browser: IBrowser;\n buffer: IBuffer;\n linkifier: ILinkifier2 | undefined;\n options: Required;\n\n readonly dimensions: IRenderDimensionsApi | undefined;\n\n onBlur: IEvent;\n onFocus: IEvent;\n onDimensionsChange: IEvent;\n onA11yChar: IEvent;\n onA11yTab: IEvent;\n onWillOpen: IEvent;\n}\n\nexport type CustomKeyEventHandler = (event: KeyboardEvent) => boolean;\nexport type CustomWheelEventHandler = (event: WheelEvent) => boolean;\n\nexport type LineData = CharData[];\n\nexport interface ICompositionHelper {\n readonly isComposing: boolean;\n compositionstart(): void;\n compositionupdate(ev: CompositionEvent): void;\n compositionend(): boolean | void;\n updateCompositionElements(dontRecurse?: boolean): void;\n keydown(ev: KeyboardEvent): boolean;\n keypress?(text: string): boolean;\n}\n\nexport interface IBrowser {\n isNode: boolean;\n userAgent: string;\n platform: string;\n isFirefox: boolean;\n isMac: boolean;\n isIpad: boolean;\n isIphone: boolean;\n isWindows: boolean;\n}\n\nexport interface IColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n cursorAccent: IColor;\n selectionForeground: IColor | undefined;\n selectionBackgroundTransparent: IColor;\n /** The selection blended on top of background. */\n selectionBackgroundOpaque: IColor;\n selectionInactiveBackgroundTransparent: IColor;\n selectionInactiveBackgroundOpaque: IColor;\n scrollbarSliderBackground: IColor;\n scrollbarSliderHoverBackground: IColor;\n scrollbarSliderActiveBackground: IColor;\n overviewRulerBorder: IColor;\n ansi: IColor[];\n /** Maps original colors to colors that respect minimum contrast ratio. */\n contrastCache: IColorContrastCache;\n /** Maps original colors to colors that respect _half_ of the minimum contrast ratio. */\n halfContrastCache: IColorContrastCache;\n}\n\nexport type ReadonlyColorSet = Readonly> & { ansi: Readonly['ansi']> };\n\nexport interface IColorContrastCache {\n clear(): void;\n setCss(bg: number, fg: number, value: string | null): void;\n getCss(bg: number, fg: number): string | null | undefined;\n setColor(bg: number, fg: number, value: IColor | null): void;\n getColor(bg: number, fg: number): IColor | null | undefined;\n}\n\nexport interface IPartialColorSet {\n foreground: IColor;\n background: IColor;\n cursor?: IColor;\n cursorAccent?: IColor;\n selectionBackground?: IColor;\n ansi: IColor[];\n}\n\nexport interface IViewport extends IDisposable {\n scrollBarWidth: number;\n readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>;\n syncScrollArea(immediate?: boolean, force?: boolean): void;\n getLinesScrolled(ev: WheelEvent): number;\n getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement };\n handleWheel(ev: WheelEvent): boolean;\n handleTouchStart(ev: TouchEvent): void;\n handleTouchMove(ev: TouchEvent): boolean;\n scrollLines(disp: number): void; // todo api name?\n reset(): void;\n}\n\nexport interface ILinkifierEvent {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n cols: number;\n fg: number | undefined;\n}\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\nexport interface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport interface ILinkifier2 extends IDisposable {\n onShowLinkUnderline: IEvent;\n onHideLinkUnderline: IEvent;\n readonly currentLink: ILinkWithState | undefined;\n}\n\nexport interface ILink {\n range: IBufferRange;\n text: string;\n decorations?: ILinkDecorations;\n activate(event: MouseEvent, text: string): void;\n hover?(event: MouseEvent, text: string): void;\n leave?(event: MouseEvent, text: string): void;\n dispose?(): void;\n}\n\nexport interface ILinkDecorations {\n pointerCursor: boolean;\n underline: boolean;\n}\n\nexport interface IBufferRange {\n start: IBufferCellPosition;\n end: IBufferCellPosition;\n}\n\nexport interface IBufferCellPosition {\n x: number;\n y: number;\n}\n\nexport type CharacterJoinerHandler = (text: string) => [number, number][];\n\nexport interface ICharacterJoiner {\n id: number;\n handler: CharacterJoinerHandler;\n}\n\nexport interface IRenderDebouncer extends IDisposable {\n refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void;\n}\n\nexport interface IRenderDebouncerWithCallback extends IRenderDebouncer {\n addRefreshCallback(callback: FrameRequestCallback): number;\n}\n\nexport interface IBufferElementProvider {\n provideBufferElements(): DocumentFragment | HTMLElement;\n}\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})());\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from '../ColorContrastCache';\nimport { IThemeService } from './Services';\nimport { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';\nimport { color, css, NULL_COLOR } from '../../common/Color';\nimport { Disposable } from '../../common/Lifecycle';\nimport { IOptionsService, ITheme } from '../../common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';\nimport { Emitter } from '../../common/Event';\n\ninterface IRestoreColorSet {\n foreground: IColor;\n background: IColor;\n cursor: IColor;\n ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = DEFAULT_BACKGROUND;\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\nconst DEFAULT_OVERVIEW_RULER_BORDER = DEFAULT_FOREGROUND;\n\nexport class ThemeService extends Disposable implements IThemeService {\n public serviceBrand: undefined;\n\n private _colors: IColorSet;\n private _contrastCache: IColorContrastCache = new ColorContrastCache();\n private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n private _restoreColors!: IRestoreColorSet;\n\n public get colors(): ReadonlyColorSet { return this._colors; }\n\n private readonly _onChangeColors = this._register(new Emitter());\n public readonly onChangeColors = this._onChangeColors.event;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this._colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionForeground: undefined,\n selectionBackgroundTransparent: DEFAULT_SELECTION,\n selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n scrollbarSliderBackground: color.opacity(DEFAULT_FOREGROUND, 0.2),\n scrollbarSliderHoverBackground: color.opacity(DEFAULT_FOREGROUND, 0.4),\n scrollbarSliderActiveBackground: color.opacity(DEFAULT_FOREGROUND, 0.5),\n overviewRulerBorder: DEFAULT_FOREGROUND,\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache,\n halfContrastCache: this._halfContrastCache\n };\n this._updateRestoreColors();\n this._setTheme(this._optionsService.rawOptions.theme);\n\n this._register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n this._register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n private _setTheme(theme: ITheme = {}): void {\n const colors = this._colors;\n colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n colors.cursor = color.blend(colors.background, parseColor(theme.cursor, DEFAULT_CURSOR));\n colors.cursorAccent = color.blend(colors.background, parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT));\n colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n if (colors.selectionForeground === NULL_COLOR) {\n colors.selectionForeground = undefined;\n }\n\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n }\n if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n const opacity = 0.3;\n colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n }\n colors.scrollbarSliderBackground = parseColor(theme.scrollbarSliderBackground, color.opacity(colors.foreground, 0.2));\n colors.scrollbarSliderHoverBackground = parseColor(theme.scrollbarSliderHoverBackground, color.opacity(colors.foreground, 0.4));\n colors.scrollbarSliderActiveBackground = parseColor(theme.scrollbarSliderActiveBackground, color.opacity(colors.foreground, 0.5));\n colors.overviewRulerBorder = parseColor(theme.overviewRulerBorder, DEFAULT_OVERVIEW_RULER_BORDER);\n colors.ansi = DEFAULT_ANSI_COLORS.slice();\n colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n if (theme.extendedAnsi) {\n const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n for (let i = 0; i < colorCount; i++) {\n colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n }\n }\n // Clear the cache\n this._contrastCache.clear();\n this._halfContrastCache.clear();\n this._updateRestoreColors();\n this._onChangeColors.fire(this.colors);\n }\n\n public restoreColor(slot?: AllColorIndex): void {\n this._restoreColor(slot);\n this._onChangeColors.fire(this.colors);\n }\n\n private _restoreColor(slot: AllColorIndex | undefined): void {\n // unset slot restores all ansi colors\n if (slot === undefined) {\n for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n this._colors.ansi[i] = this._restoreColors.ansi[i];\n }\n return;\n }\n switch (slot) {\n case SpecialColorIndex.FOREGROUND:\n this._colors.foreground = this._restoreColors.foreground;\n break;\n case SpecialColorIndex.BACKGROUND:\n this._colors.background = this._restoreColors.background;\n break;\n case SpecialColorIndex.CURSOR:\n this._colors.cursor = this._restoreColors.cursor;\n break;\n default:\n this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n }\n }\n\n public modifyColors(callback: (colors: IColorSet) => void): void {\n callback(this._colors);\n // Assume the change happened\n this._onChangeColors.fire(this.colors);\n }\n\n private _updateRestoreColors(): void {\n this._restoreColors = {\n foreground: this._colors.foreground,\n background: this._colors.background,\n cursor: this._colors.cursor,\n ansi: this._colors.ansi.slice()\n };\n }\n}\n\nfunction parseColor(\n cssString: string | undefined,\n fallback: IColor\n): IColor {\n if (cssString !== undefined) {\n try {\n return css.toColor(cssString);\n } catch {\n // no-op\n }\n }\n return fallback;\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key event to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n result.key = ev.ctrlKey ? '\\b' : C0.DEL; // ^H or ^?\n if (ev.altKey) {\n result.key = C0.ESC + result.key;\n }\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n if (ev.key === 'c' && ev.ctrlKey) {\n // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware\n // keyboard\n result.key = C0.ETX;\n } else {\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n }\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // or + are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else if (ev.ctrlKey) {\n result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.key === '/') {\n result.key = C0.US; // https://github.com/xtermjs/xterm.js/issues/5457\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n let keyString = String.fromCharCode(keyCode);\n if (ev.shiftKey) {\n keyString = keyString.toUpperCase();\n }\n result.key = C0.ESC + keyString;\n } else if (ev.keyCode === 32) {\n result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n // Alt will produce a \"dead key\" (initate composition) with some\n // of the letters in US layout (e.g. N/E/U).\n // It's safe to match against Key* since no other `code` values begin with \"Key\".\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n let keyString = ev.code.slice(3, 4);\n if (!ev.shiftKey) {\n keyString = keyString.toLowerCase();\n }\n result.key = C0.ESC + keyString;\n result.cancel = true;\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock,\n // volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey && ev.shiftKey) {\n switch (ev.code) {\n case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_\n case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2)\n case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6)\n }\n }\n break;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Kitty keyboard protocol implementation.\n * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Kitty keyboard protocol enhancement flags (bitfield).\n */\nexport const enum KittyKeyboardFlags {\n NONE = 0b00000,\n /** Disambiguate escape codes - fixes ambiguous legacy encodings */\n DISAMBIGUATE_ESCAPE_CODES = 0b00001,\n /** Report event types - press/repeat/release */\n REPORT_EVENT_TYPES = 0b00010,\n /** Report alternate keys - shifted key and base layout key */\n REPORT_ALTERNATE_KEYS = 0b00100,\n /** Report all keys as escape codes - text-producing keys as CSI u */\n REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,\n /** Report associated text - includes text codepoints in escape code */\n REPORT_ASSOCIATED_TEXT = 0b10000,\n}\n\n/**\n * Kitty keyboard event types.\n */\nexport const enum KittyKeyboardEventType {\n PRESS = 1,\n REPEAT = 2,\n RELEASE = 3,\n}\n\n/**\n * Kitty modifier bits (different from xterm modifier encoding).\n * Value sent = 1 + modifier_bits\n */\nexport const enum KittyKeyboardModifiers {\n SHIFT = 0b00000001,\n ALT = 0b00000010,\n CTRL = 0b00000100,\n SUPER = 0b00001000,\n HYPER = 0b00010000,\n META = 0b00100000,\n CAPS_LOCK = 0b01000000,\n NUM_LOCK = 0b10000000,\n}\n\n/**\n * Kitty keyboard protocol handler class.\n * Encapsulates all key code mappings and encoding logic.\n */\nexport class KittyKeyboard {\n /**\n * Functional key codes for Kitty protocol.\n * Keys that don't produce text have specific unicode codepoint mappings.\n */\n private readonly _functionalKeyCodes: { [key: string]: number } = {\n 'Escape': 27,\n 'Enter': 13,\n 'Tab': 9,\n 'Backspace': 127,\n 'CapsLock': 57358,\n 'ScrollLock': 57359,\n 'NumLock': 57360,\n 'PrintScreen': 57361,\n 'Pause': 57362,\n 'ContextMenu': 57363,\n // F13-F35 (F1-F12 use legacy encoding)\n 'F13': 57376,\n 'F14': 57377,\n 'F15': 57378,\n 'F16': 57379,\n 'F17': 57380,\n 'F18': 57381,\n 'F19': 57382,\n 'F20': 57383,\n 'F21': 57384,\n 'F22': 57385,\n 'F23': 57386,\n 'F24': 57387,\n 'F25': 57388,\n // Keypad keys\n 'KP_0': 57399,\n 'KP_1': 57400,\n 'KP_2': 57401,\n 'KP_3': 57402,\n 'KP_4': 57403,\n 'KP_5': 57404,\n 'KP_6': 57405,\n 'KP_7': 57406,\n 'KP_8': 57407,\n 'KP_9': 57408,\n 'KP_Decimal': 57409,\n 'KP_Divide': 57410,\n 'KP_Multiply': 57411,\n 'KP_Subtract': 57412,\n 'KP_Add': 57413,\n 'KP_Enter': 57414,\n 'KP_Equal': 57415,\n // Modifier keys\n 'ShiftLeft': 57441,\n 'ShiftRight': 57447,\n 'ControlLeft': 57442,\n 'ControlRight': 57448,\n 'AltLeft': 57443,\n 'AltRight': 57449,\n 'MetaLeft': 57444,\n 'MetaRight': 57450,\n // Media keys\n 'MediaPlayPause': 57430,\n 'MediaStop': 57432,\n 'MediaTrackNext': 57435,\n 'MediaTrackPrevious': 57436,\n 'AudioVolumeDown': 57438,\n 'AudioVolumeUp': 57439,\n 'AudioVolumeMute': 57440\n };\n\n /**\n * Keys that use CSI ~ encoding with a number parameter.\n */\n private readonly _csiTildeKeys: { [key: string]: number } = {\n 'Insert': 2,\n 'Delete': 3,\n 'PageUp': 5,\n 'PageDown': 6,\n 'F5': 15,\n 'F6': 17,\n 'F7': 18,\n 'F8': 19,\n 'F9': 20,\n 'F10': 21,\n 'F11': 23,\n 'F12': 24\n };\n\n /**\n * Keys that use CSI letter encoding (arrows, Home, End).\n */\n private readonly _csiLetterKeys: { [key: string]: string } = {\n 'ArrowUp': 'A',\n 'ArrowDown': 'B',\n 'ArrowRight': 'C',\n 'ArrowLeft': 'D',\n 'Home': 'H',\n 'End': 'F'\n };\n\n /**\n * Function keys F1-F4 use SS3 encoding without modifiers.\n */\n private readonly _ss3FunctionKeys: { [key: string]: string } = {\n 'F1': 'P',\n 'F2': 'Q',\n 'F3': 'R',\n 'F4': 'S'\n };\n\n /**\n * Map browser key codes to Kitty numpad codes.\n */\n private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {\n if (ev.code.startsWith('Numpad')) {\n const suffix = ev.code.slice(6);\n if (suffix >= '0' && suffix <= '9') {\n return 57399 + parseInt(suffix, 10);\n }\n switch (suffix) {\n case 'Decimal': return 57409;\n case 'Divide': return 57410;\n case 'Multiply': return 57411;\n case 'Subtract': return 57412;\n case 'Add': return 57413;\n case 'Enter': return 57414;\n case 'Equal': return 57415;\n }\n }\n return undefined;\n }\n\n /**\n * Get modifier key code from code property.\n */\n private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {\n switch (ev.code) {\n case 'ShiftLeft': return 57441;\n case 'ShiftRight': return 57447;\n case 'ControlLeft': return 57442;\n case 'ControlRight': return 57448;\n case 'AltLeft': return 57443;\n case 'AltRight': return 57449;\n case 'MetaLeft': return 57444;\n case 'MetaRight': return 57450;\n }\n return undefined;\n }\n\n /**\n * Encode modifiers for Kitty protocol.\n * Returns 1 + modifier bits, or 0 if no modifiers.\n */\n private _encodeModifiers(ev: IKeyboardEvent): number {\n let mods = 0;\n if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;\n if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;\n if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;\n if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;\n return mods > 0 ? mods + 1 : 0;\n }\n\n /**\n * Get the unicode key code for a keyboard event.\n * Returns the lowercase codepoint for letters.\n * For shifted keys, uses the code property to get the base key.\n */\n private _getKeyCode(ev: IKeyboardEvent, macOptionAsAlt: boolean): number | undefined {\n const numpadCode = this._getNumpadKeyCode(ev);\n if (numpadCode !== undefined) {\n return numpadCode;\n }\n\n const modifierCode = this._getModifierKeyCode(ev);\n if (modifierCode !== undefined) {\n return modifierCode;\n }\n\n const funcCode = this._functionalKeyCodes[ev.key];\n if (funcCode !== undefined) {\n return funcCode;\n }\n\n if ((ev.shiftKey || (macOptionAsAlt && ev.altKey)) && ev.code) {\n if (ev.code.startsWith('Digit') && ev.code.length === 6) {\n const digit = ev.code.charAt(5);\n if (digit >= '0' && digit <= '9') {\n return digit.charCodeAt(0);\n }\n }\n if (ev.code.startsWith('Key') && ev.code.length === 4) {\n const letter = ev.code.charAt(3).toLowerCase();\n return letter.charCodeAt(0);\n }\n }\n\n if (ev.key.length === 1) {\n const code = ev.key.codePointAt(0)!;\n if (code >= 65 && code <= 90) {\n return code + 32;\n }\n return code;\n }\n\n return undefined;\n }\n\n /**\n * Check if a key is a modifier key.\n */\n private _isModifierKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';\n }\n\n /**\n * Check if a key is a lock key (CapsLock/NumLock/ScrollLock).\n *\n * Kitty's reference implementation classifies these as modifier keys for the\n * purpose of suppressing press events (kitty/keys.c `is_modifier_key()`\n * includes `GLFW_FKEY_CAPS_LOCK`, `GLFW_FKEY_SCROLL_LOCK`, `GLFW_FKEY_NUM_LOCK`),\n * and its test suite asserts that a CapsLock press with no protocol flags\n * produces empty output.\n */\n private _isLockKey(ev: IKeyboardEvent): boolean {\n return ev.key === 'CapsLock' || ev.key === 'NumLock' || ev.key === 'ScrollLock';\n }\n\n /**\n * Build CSI letter sequence for arrow keys, Home, End.\n * Format: CSI [1;mod] letter\n */\n private _buildCsiLetterSequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + '[' + letter;\n }\n\n /**\n * Build SS3 sequence for F1-F4.\n * Without modifiers: SS3 letter\n * With modifiers: CSI 1;mod letter\n */\n private _buildSs3Sequence(\n letter: string,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n if (modifiers > 0 || needsEventType) {\n let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n seq += letter;\n return seq;\n }\n return C0.ESC + 'O' + letter;\n }\n\n /**\n * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.\n * Format: CSI number [;mod[:event]] ~\n */\n private _buildCsiTildeSequence(\n number: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n reportEventTypes: boolean\n ): string {\n const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;\n\n let seq = C0.ESC + '[' + number;\n if (modifiers > 0 || needsEventType) {\n seq += ';' + (modifiers > 0 ? modifiers : '1');\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n seq += '~';\n return seq;\n }\n\n /**\n * Build CSI u sequence.\n * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u\n */\n private _buildCsiUSequence(\n ev: IKeyboardEvent,\n keyCode: number,\n modifiers: number,\n eventType: KittyKeyboardEventType,\n flags: number,\n isFunc: boolean,\n isMod: boolean\n ): string {\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);\n\n let seq = C0.ESC + '[' + keyCode;\n\n let shiftedKey: number | undefined;\n if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {\n shiftedKey = ev.key.codePointAt(0);\n seq += ':' + shiftedKey;\n }\n\n const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&\n eventType !== KittyKeyboardEventType.RELEASE &&\n ev.key.length === 1 &&\n !isFunc &&\n !isMod &&\n !ev.ctrlKey;\n const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;\n\n const needsEventType = reportEventTypes &&\n eventType !== KittyKeyboardEventType.PRESS &&\n (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);\n\n if (modifiers > 0 || needsEventType || textCode !== undefined) {\n seq += ';';\n if (modifiers > 0) {\n seq += modifiers;\n } else if (needsEventType) {\n seq += '1';\n }\n if (needsEventType) {\n seq += ':' + eventType;\n }\n }\n\n if (textCode !== undefined) {\n seq += ';' + textCode;\n }\n\n seq += 'u';\n return seq;\n }\n\n /**\n * Evaluate a keyboard event using Kitty keyboard protocol.\n *\n * @param ev The keyboard event.\n * @param flags The active Kitty keyboard enhancement flags.\n * @param eventType The event type (press, repeat, release).\n * @param macOptionAsAlt When true, macOS Option-composed ev.key values are unwound via ev.code.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluate(\n ev: IKeyboardEvent,\n flags: number,\n eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS,\n macOptionAsAlt: boolean = false\n ): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n cancel: false,\n key: undefined\n };\n\n const modifiers = this._encodeModifiers(ev);\n const isMod = this._isModifierKey(ev);\n const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);\n\n if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {\n return result;\n }\n\n if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n // Spec \u00A7 \"Report all keys as escape codes\": \"Additionally, with this mode,\n // events for pressing modifier keys are reported.\" \u2014 i.e. *without* this\n // mode, modifier-key press events are suppressed. Kitty's is_modifier_key()\n // treats CapsLock/NumLock/ScrollLock as modifier keys for this rule.\n if (this._isLockKey(ev) && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const csiLetter = this._csiLetterKeys[ev.key];\n if (csiLetter) {\n result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const ss3Letter = this._ss3FunctionKeys[ev.key];\n if (ss3Letter) {\n result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const tildeCode = this._csiTildeKeys[ev.key];\n if (tildeCode !== undefined) {\n result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);\n result.cancel = true;\n return result;\n }\n\n const keyCode = this._getKeyCode(ev, macOptionAsAlt);\n if (keyCode === undefined) {\n return result;\n }\n\n // Special handling for Enter/Tab/Backspace.\n const specialKey = keyCode === 13 || keyCode === 9 || keyCode === 127;\n\n // Per spec, Enter/Tab/Backspace will not have release events unless \"Report all keys as escape\n // codes\" is also set.\n if (specialKey && eventType === KittyKeyboardEventType.RELEASE && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {\n return result;\n }\n\n const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;\n\n const useCsiU = !!(\n flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES ||\n (reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) ||\n // Enabling REPORT_EVENT_TYPES without DISAMBIGUATE_ESCAPE_CODES doesn't really make sense, so\n // just make REPORT_EVENT_TYPES imply DISAMBIGUATE_ESCAPE_CODES here for simplicity.\n // See: https://github.com/kovidgoyal/kitty/issues/9999\n ((flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES || reportEventTypes) &&\n (\n // Per spec, Enter/Tab/Backspace \"still generate the same bytes as in legacy mode\" and\n // consider space to be a text-generating key, so these skip the isFunc fast-path and only\n // get CSI u when modifiers are present (handled below).\n (isFunc && !specialKey) ||\n (\n (modifiers > 0 && ev.key.length !== 1) ||\n modifiers - 1 > KittyKeyboardModifiers.SHIFT\n )\n )\n )\n );\n\n if (useCsiU) {\n result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);\n result.cancel = true;\n } else {\n const legacyByte = keyCode === 13 ? '\\r' : keyCode === 9 ? '\\t' : keyCode === 127 ? '\\x7f' : undefined;\n if (legacyByte) {\n result.key = legacyByte;\n } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n result.key = ev.key;\n }\n }\n\n return result;\n }\n\n /**\n * Check if Kitty protocol should be used based on flags.\n */\n public static shouldUseProtocol(flags: number): boolean {\n return flags > 0;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Win32 input mode implementation.\n * @see https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md\n *\n * Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n * Vk: Virtual key code (decimal)\n * Sc: Scan code (decimal)\n * Uc: Unicode character (decimal codepoint, 0 if none)\n * Kd: Key down (1) or up (0)\n * Cs: Control key state (modifier flags)\n * Rc: Repeat count (usually 1)\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from '../Types';\nimport { C0 } from '../data/EscapeSequences';\n\n/**\n * Win32 control key state flags (from Windows API).\n */\nexport const enum Win32ControlKeyState {\n RIGHT_ALT_PRESSED = 0b000000001,\n LEFT_ALT_PRESSED = 0b000000010,\n RIGHT_CTRL_PRESSED = 0b000000100,\n LEFT_CTRL_PRESSED = 0b000001000,\n SHIFT_PRESSED = 0b000010000,\n NUMLOCK_ON = 0b000100000,\n SCROLLLOCK_ON = 0b001000000,\n CAPSLOCK_ON = 0b010000000,\n ENHANCED_KEY = 0b100000000,\n}\n\n/**\n * Win32 input mode handler. Lookup tables are only initialized when this class\n * is instantiated, reducing bundle size for environments that don't use this mode.\n */\nexport class Win32InputMode {\n /**\n * Mapping from browser KeyboardEvent.code to Win32 virtual key codes.\n * Based on https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n */\n private readonly _codeToVk: { [code: string]: number } = {\n // Letters\n 'KeyA': 0x41, 'KeyB': 0x42, 'KeyC': 0x43, 'KeyD': 0x44, 'KeyE': 0x45,\n 'KeyF': 0x46, 'KeyG': 0x47, 'KeyH': 0x48, 'KeyI': 0x49, 'KeyJ': 0x4A,\n 'KeyK': 0x4B, 'KeyL': 0x4C, 'KeyM': 0x4D, 'KeyN': 0x4E, 'KeyO': 0x4F,\n 'KeyP': 0x50, 'KeyQ': 0x51, 'KeyR': 0x52, 'KeyS': 0x53, 'KeyT': 0x54,\n 'KeyU': 0x55, 'KeyV': 0x56, 'KeyW': 0x57, 'KeyX': 0x58, 'KeyY': 0x59,\n 'KeyZ': 0x5A,\n\n // Digits\n 'Digit0': 0x30, 'Digit1': 0x31, 'Digit2': 0x32, 'Digit3': 0x33, 'Digit4': 0x34,\n 'Digit5': 0x35, 'Digit6': 0x36, 'Digit7': 0x37, 'Digit8': 0x38, 'Digit9': 0x39,\n\n // Function keys\n 'F1': 0x70, 'F2': 0x71, 'F3': 0x72, 'F4': 0x73, 'F5': 0x74, 'F6': 0x75,\n 'F7': 0x76, 'F8': 0x77, 'F9': 0x78, 'F10': 0x79, 'F11': 0x7A, 'F12': 0x7B,\n 'F13': 0x7C, 'F14': 0x7D, 'F15': 0x7E, 'F16': 0x7F, 'F17': 0x80, 'F18': 0x81,\n 'F19': 0x82, 'F20': 0x83, 'F21': 0x84, 'F22': 0x85, 'F23': 0x86, 'F24': 0x87,\n\n // Numpad\n 'Numpad0': 0x60, 'Numpad1': 0x61, 'Numpad2': 0x62, 'Numpad3': 0x63, 'Numpad4': 0x64,\n 'Numpad5': 0x65, 'Numpad6': 0x66, 'Numpad7': 0x67, 'Numpad8': 0x68, 'Numpad9': 0x69,\n 'NumpadMultiply': 0x6A, 'NumpadAdd': 0x6B, 'NumpadSeparator': 0x6C,\n 'NumpadSubtract': 0x6D, 'NumpadDecimal': 0x6E, 'NumpadDivide': 0x6F,\n 'NumpadEnter': 0x0D, // Same as Enter but with ENHANCED_KEY flag\n 'NumLock': 0x90,\n\n // Navigation\n 'ArrowUp': 0x26, 'ArrowDown': 0x28, 'ArrowLeft': 0x25, 'ArrowRight': 0x27,\n 'Home': 0x24, 'End': 0x23, 'PageUp': 0x21, 'PageDown': 0x22,\n 'Insert': 0x2D, 'Delete': 0x2E,\n\n // Modifiers\n 'ShiftLeft': 0x10, 'ShiftRight': 0x10,\n 'ControlLeft': 0x11, 'ControlRight': 0x11,\n 'AltLeft': 0x12, 'AltRight': 0x12,\n 'MetaLeft': 0x5B, 'MetaRight': 0x5C,\n 'CapsLock': 0x14, 'ScrollLock': 0x91,\n\n // Special keys\n 'Escape': 0x1B, 'Enter': 0x0D, 'Tab': 0x09, 'Space': 0x20,\n 'Backspace': 0x08, 'Pause': 0x13, 'ContextMenu': 0x5D, 'PrintScreen': 0x2C,\n\n // OEM keys (US keyboard layout)\n 'Semicolon': 0xBA, // ;:\n 'Equal': 0xBB, // =+\n 'Comma': 0xBC, // ,<\n 'Minus': 0xBD, // -_\n 'Period': 0xBE, // .>\n 'Slash': 0xBF, // /?\n 'Backquote': 0xC0, // `~\n 'BracketLeft': 0xDB, // [{\n 'Backslash': 0xDC, // \\|\n 'BracketRight': 0xDD, // ]}\n 'Quote': 0xDE, // '\"\n 'IntlBackslash': 0xE2 // Non-US backslash\n };\n\n /**\n * Mapping from browser KeyboardEvent.code to approximate Win32 scan codes.\n * Note: Scan codes can vary by keyboard layout. These are approximations\n * based on standard US keyboard layout.\n */\n private readonly _codeToScancode: { [code: string]: number } = {\n // Letters (row by row)\n 'KeyQ': 0x10, 'KeyW': 0x11, 'KeyE': 0x12, 'KeyR': 0x13, 'KeyT': 0x14,\n 'KeyY': 0x15, 'KeyU': 0x16, 'KeyI': 0x17, 'KeyO': 0x18, 'KeyP': 0x19,\n 'KeyA': 0x1E, 'KeyS': 0x1F, 'KeyD': 0x20, 'KeyF': 0x21, 'KeyG': 0x22,\n 'KeyH': 0x23, 'KeyJ': 0x24, 'KeyK': 0x25, 'KeyL': 0x26,\n 'KeyZ': 0x2C, 'KeyX': 0x2D, 'KeyC': 0x2E, 'KeyV': 0x2F, 'KeyB': 0x30,\n 'KeyN': 0x31, 'KeyM': 0x32,\n\n // Digits\n 'Digit1': 0x02, 'Digit2': 0x03, 'Digit3': 0x04, 'Digit4': 0x05, 'Digit5': 0x06,\n 'Digit6': 0x07, 'Digit7': 0x08, 'Digit8': 0x09, 'Digit9': 0x0A, 'Digit0': 0x0B,\n\n // Function keys\n 'F1': 0x3B, 'F2': 0x3C, 'F3': 0x3D, 'F4': 0x3E, 'F5': 0x3F, 'F6': 0x40,\n 'F7': 0x41, 'F8': 0x42, 'F9': 0x43, 'F10': 0x44, 'F11': 0x57, 'F12': 0x58,\n\n // Numpad\n 'Numpad0': 0x52, 'Numpad1': 0x4F, 'Numpad2': 0x50, 'Numpad3': 0x51, 'Numpad4': 0x4B,\n 'Numpad5': 0x4C, 'Numpad6': 0x4D, 'Numpad7': 0x47, 'Numpad8': 0x48, 'Numpad9': 0x49,\n 'NumpadMultiply': 0x37, 'NumpadAdd': 0x4E, 'NumpadSubtract': 0x4A,\n 'NumpadDecimal': 0x53, 'NumpadDivide': 0x35, 'NumpadEnter': 0x1C,\n 'NumLock': 0x45,\n\n // Navigation (extended keys)\n 'ArrowUp': 0x48, 'ArrowDown': 0x50, 'ArrowLeft': 0x4B, 'ArrowRight': 0x4D,\n 'Home': 0x47, 'End': 0x4F, 'PageUp': 0x49, 'PageDown': 0x51,\n 'Insert': 0x52, 'Delete': 0x53,\n\n // Modifiers\n 'ShiftLeft': 0x2A, 'ShiftRight': 0x36,\n 'ControlLeft': 0x1D, 'ControlRight': 0x1D,\n 'AltLeft': 0x38, 'AltRight': 0x38,\n 'CapsLock': 0x3A, 'ScrollLock': 0x46,\n\n // Special keys\n 'Escape': 0x01, 'Enter': 0x1C, 'Tab': 0x0F, 'Space': 0x39,\n 'Backspace': 0x0E, 'Pause': 0x45,\n\n // OEM keys\n 'Semicolon': 0x27, 'Equal': 0x0D, 'Comma': 0x33, 'Minus': 0x0C,\n 'Period': 0x34, 'Slash': 0x35, 'Backquote': 0x29,\n 'BracketLeft': 0x1A, 'Backslash': 0x2B, 'BracketRight': 0x1B, 'Quote': 0x28\n };\n\n /**\n * Codes that represent enhanced keys (extended keyboard keys).\n */\n private readonly _enhancedKeyCodes = new Set([\n 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Home', 'End', 'PageUp', 'PageDown', 'Insert', 'Delete',\n 'NumpadEnter', 'NumpadDivide',\n 'ControlRight', 'AltRight',\n 'PrintScreen', 'Pause', 'ContextMenu',\n 'MetaLeft', 'MetaRight'\n ]);\n\n /**\n * Mapping of special keys (ev.key values) to their Unicode control character codes.\n * These keys have multi-character ev.key strings but produce control characters.\n * @see https://docs.microsoft.com/en-us/windows/console/key-event-record-str\n */\n private readonly _keyToControlChar: { [key: string]: number } = {\n 'Enter': 0x0D, // Carriage return\n 'Backspace': 0x08, // Backspace\n 'Tab': 0x09, // Horizontal tab\n 'Escape': 0x1B // Escape\n };\n\n /**\n * Get the Win32 virtual key code for a keyboard event.\n */\n private _getVirtualKeyCode(ev: IKeyboardEvent): number {\n const vk = this._codeToVk[ev.code];\n if (vk !== undefined) {\n return vk;\n }\n // Fall back to keyCode for unmapped keys\n return ev.keyCode || 0;\n }\n\n /**\n * Get the Win32 scan code for a keyboard event.\n * Returns 0 if unknown (scan codes vary by hardware).\n */\n private _getScanCode(ev: IKeyboardEvent): number {\n return this._codeToScancode[ev.code] || 0;\n }\n\n /**\n * Get the unicode character for a keyboard event.\n * Returns 0 for non-character keys.\n */\n private _getUnicodeChar(ev: IKeyboardEvent): number {\n // Handle special keys that produce control characters\n // Ctrl modifies some of these: Ctrl+Enter=LF, Ctrl+Backspace=DEL\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n if (ev.key === 'Enter') {\n return 0x0A; // Line feed (Ctrl+Enter)\n }\n if (ev.key === 'Backspace') {\n return 0x7F; // DEL (Ctrl+Backspace)\n }\n }\n\n // Check for special keys that always produce control characters\n const controlChar = this._keyToControlChar[ev.key];\n if (controlChar !== undefined) {\n return controlChar;\n }\n\n // Only single-character keys produce unicode output\n if (ev.key.length === 1) {\n const codePoint = ev.key.codePointAt(0) || 0;\n\n // Handle Ctrl+letter combinations - these produce control characters (0x01-0x1A)\n if (ev.ctrlKey && !ev.altKey && !ev.metaKey) {\n // Convert A-Z or a-z to control character (Ctrl+A = 0x01, Ctrl+C = 0x03, etc.)\n if (codePoint >= 0x41 && codePoint <= 0x5A) { // A-Z\n return codePoint - 0x40;\n }\n if (codePoint >= 0x61 && codePoint <= 0x7A) { // a-z\n return codePoint - 0x60;\n }\n }\n\n return codePoint;\n }\n return 0;\n }\n\n /**\n * Get the Win32 control key state flags.\n */\n private _getControlKeyState(ev: IKeyboardEvent): number {\n let state = 0;\n\n if (ev.shiftKey) {\n state |= Win32ControlKeyState.SHIFT_PRESSED;\n }\n\n // Note: We can't distinguish left/right for ctrl/alt in standard browser events,\n // so we use the generic pressed flags. The right-side flags are used when\n // we can detect them (e.g., via code property).\n if (ev.ctrlKey) {\n if (ev.code === 'ControlRight') {\n state |= Win32ControlKeyState.RIGHT_CTRL_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_CTRL_PRESSED;\n }\n }\n\n if (ev.altKey) {\n if (ev.code === 'AltRight') {\n state |= Win32ControlKeyState.RIGHT_ALT_PRESSED;\n } else {\n state |= Win32ControlKeyState.LEFT_ALT_PRESSED;\n }\n }\n\n // Check for enhanced key\n if (this._enhancedKeyCodes.has(ev.code)) {\n state |= Win32ControlKeyState.ENHANCED_KEY;\n }\n\n return state;\n }\n\n /**\n * Evaluate a keyboard event using Win32 input mode.\n *\n * @param ev The keyboard event.\n * @param isKeyDown Whether this is a keydown (true) or keyup (false) event.\n * @returns The keyboard result with the encoded key sequence.\n */\n public evaluateKeyboardEvent(ev: IKeyboardEvent, isKeyDown: boolean): IKeyboardResult {\n const vk = this._getVirtualKeyCode(ev);\n const sc = this._getScanCode(ev);\n const uc = this._getUnicodeChar(ev);\n const kd = isKeyDown ? 1 : 0;\n const cs = this._getControlKeyState(ev);\n const rc = 1; // Repeat count, always 1 for now\n\n // Format: CSI Vk ; Sc ; Uc ; Kd ; Cs ; Rc _\n return {\n type: KeyboardResultType.SEND_KEY,\n cancel: true,\n key: `${C0.ESC}[${vk};${sc};${uc};${kd};${cs};${rc}_`\n };\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IKeyboardService } from './Services';\nimport { evaluateKeyboardEvent } from '../../common/input/Keyboard';\nimport { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';\nimport { Win32InputMode } from '../../common/input/Win32InputMode';\nimport { isMac } from '../../common/Platform';\nimport { ICoreService, IOptionsService } from '../../common/services/Services';\nimport { IKeyboardResult } from '../../common/Types';\n\nexport class KeyboardService implements IKeyboardService {\n public serviceBrand: undefined;\n\n private _win32InputMode: Win32InputMode | undefined;\n private _kittyKeyboard: KittyKeyboard | undefined;\n\n constructor(\n @ICoreService private readonly _coreService: ICoreService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n }\n\n private _getWin32InputMode(): Win32InputMode {\n this._win32InputMode ??= new Win32InputMode();\n return this._win32InputMode;\n }\n\n private _getKittyKeyboard(): KittyKeyboard {\n this._kittyKeyboard ??= new KittyKeyboard();\n return this._kittyKeyboard;\n }\n\n public evaluateKeyDown(event: KeyboardEvent): IKeyboardResult {\n // Win32 input mode takes priority (most raw)\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, true);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return this.useKitty\n ? this._getKittyKeyboard().evaluate(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS, isMac && this._optionsService.rawOptions.macOptionIsMeta)\n : evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, isMac, this._optionsService.rawOptions.macOptionIsMeta);\n }\n\n public evaluateKeyUp(event: KeyboardEvent): IKeyboardResult | undefined {\n // Win32 input mode sends key up events\n if (this.useWin32InputMode) {\n return this._getWin32InputMode().evaluateKeyboardEvent(event, false);\n }\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n if (this.useKitty && (kittyFlags & KittyKeyboardFlags.REPORT_EVENT_TYPES)) {\n return this._getKittyKeyboard().evaluate(event, kittyFlags, KittyKeyboardEventType.RELEASE, isMac && this._optionsService.rawOptions.macOptionIsMeta);\n }\n return undefined;\n }\n\n public get useKitty(): boolean {\n const kittyFlags = this._coreService.kittyKeyboard.flags;\n return !!(this._optionsService.rawOptions.vtExtensions?.kittyKeyboard && KittyKeyboard.shouldUseProtocol(kittyFlags));\n }\n\n public get useWin32InputMode(): boolean {\n return !!(this._optionsService.rawOptions.vtExtensions?.win32InputMode && this._coreService.decPrivateModes.win32InputMode);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService } from './Services';\nimport { IServiceIdentifier, getServiceDependencies } from './ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map, any>();\n\n constructor(...entries: [IServiceIdentifier, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set(id: IServiceIdentifier, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier, instance: any) => any): void {\n for (const [key, value] of this._entries.entries()) {\n callback(key, value);\n }\n }\n\n public has(id: IServiceIdentifier): boolean {\n return this._entries.has(id);\n }\n\n public get(id: IServiceIdentifier): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n public serviceBrand: undefined;\n\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService(id: IServiceIdentifier, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService(id: IServiceIdentifier): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id._id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from './Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this._register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from './Lifecycle';\nimport { Emitter, type IEvent } from './Event';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\nexport interface ICircularList {\n length: number;\n maxLength: number;\n isFull: boolean;\n\n onDeleteEmitter: Emitter;\n onDelete: IEvent;\n onInsertEmitter: Emitter;\n onInsert: IEvent;\n onTrimEmitter: Emitter;\n onTrim: IEvent;\n\n get(index: number): T | undefined;\n set(index: number, value: T): void;\n push(value: T): void;\n recycle(): T;\n pop(): T | undefined;\n splice(start: number, deleteCount: number, ...items: T[]): void;\n trimStart(count: number): void;\n shiftElements(start: number, count: number, offset: number): void;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList extends Disposable implements ICircularList {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public readonly onDeleteEmitter = this._register(new Emitter());\n public readonly onDelete = this.onDeleteEmitter.event;\n public readonly onInsertEmitter = this._register(new Emitter());\n public readonly onInsert = this.onInsertEmitter.event;\n public readonly onTrimEmitter = this._register(new Emitter());\n public readonly onTrim = this.onTrimEmitter.event;\n\n constructor(\n private _maxLength: number\n ) {\n super();\n this._array = new Array(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @returns The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @returns The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n if (items.length) {\n this.onInsertEmitter.fire({ index: start, amount: items.length });\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from './Types';\nimport { AttributeData } from './AttributeData';\nimport { CellData } from './CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from './Constants';\nimport { stringFromCodePoint } from '../input/TextDecoder';\n\n// Buffer memory layout:\n//\n// [0]: content `uint32_t` - wcwidth(2) comb(1) codepoint(21)\n// [1]: fg `uint32_t` - flags(8) r(8) g(8) b(8)\n// [2]: bg `uint32_t` - flags(8) r(8) g(8) b(8)\n\nconst enum Constants {\n /** The number of 32 bit array indices taken by one cell. */\n CELL_INDICIES = 3,\n /** Factor when to cleanup underlying array buffer after shrinking. */\n CLEANUP_THRESHOLD = 2\n}\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * Constants.CELL_INDICIES + Cell.CONTENT];`\n * `fg = data[column * Constants.CELL_INDICIES + Cell.FG];`\n * `bg = data[column * Constants.CELL_INDICIES + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\n\ninterface IExtendedAttrsExt extends IExtendedAttrs {\n _ext: number;\n _urlId: number;\n}\n\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\nconst $workCell = new CellData();\nconst $extended = DEFAULT_ATTR_DATA.extended.clone() as IExtendedAttrsExt;\n\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n /** Sparse cache; only read when `IS_COMBINED_MASK` is set in `_data`. */\n protected _combined: {[index: number]: string} = {};\n /** Sparse cache; only read when `HAS_EXTENDED` is set in `_data`. */\n protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n public length: number;\n\n /** line text cache */\n protected _cacheValid = false;\n protected _cache: string = '';\n protected _cacheTrimmed = false;\n\n constructor(\n cols: number,\n fillCellData?: ICellData,\n public isWrapped: boolean = false\n ) {\n this._data = new Uint32Array(cols * Constants.CELL_INDICIES);\n const cell = fillCellData ?? CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * Constants.CELL_INDICIES + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._cacheValid = false;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n */\n public hasContent(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /** Get state of protected flag. */\n public isProtected(index: number): number {\n return this._data[index * Constants.CELL_INDICIES + Cell.BG] & BgFlags.PROTECTED;\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n $startIndex = index * Constants.CELL_INDICIES;\n cell.content = this._data[$startIndex + Cell.CONTENT];\n cell.fg = this._data[$startIndex + Cell.FG];\n cell.bg = this._data[$startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n } else {\n cell.combinedData = '';\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index]!;\n } else {\n // Do not mutate cell.extended in place: it may still reference this line's map entry from a\n // prior loadCell into a reused CellData (e.g. $workCell during insert/delete).\n // We use $extended as blueprint and reset the internals\n // mimicking the ctor to avoid a new allocation.\n $extended._ext = 0;\n $extended._urlId = 0;\n cell.extended = $extended;\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n this._cacheValid = false;\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = cell.content;\n this._data[index * Constants.CELL_INDICIES + Cell.FG] = cell.fg;\n this._data[index * Constants.CELL_INDICIES + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void {\n this._cacheValid = false;\n if (attrs.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = attrs.extended;\n }\n const $idx = index * Constants.CELL_INDICIES;\n this._data[$idx + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[$idx + Cell.FG] = attrs.fg;\n this._data[$idx + Cell.BG] = attrs.bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number, width: number): void {\n this._cacheValid = false;\n let content = this._data[index * Constants.CELL_INDICIES + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n }\n if (width) {\n content &= ~Content.WIDTH_MASK;\n content |= width << Content.WIDTH_SHIFT;\n }\n this._data[index * Constants.CELL_INDICIES + Cell.CONTENT] = content;\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n\n if (n < this.length - pos) {\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, $workCell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData);\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData): void {\n this._cacheValid = false;\n pos %= this.length;\n if (n < this.length - pos) {\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, $workCell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData);\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodepoint(pos, 0, 1, fillCellData);\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n while (start < end && start < this.length) {\n if (!this.isProtected(start)) {\n this.setCell(start, fillCellData);\n }\n start++;\n }\n return;\n }\n\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodepoint(start - 1, 0, 1, fillCellData);\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodepoint(end, 0, 1, fillCellData);\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n /**\n * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n * The underlying array buffer will not change if there is still enough space\n * to hold the new buffer line data.\n * Returns a boolean indicating, whether a `cleanupMemory` call would free\n * excess memory (true after shrinking > Constants.CLEANUP_THRESHOLD).\n */\n public resize(cols: number, fillCellData: ICellData): boolean {\n this._cacheValid = false;\n if (cols === this.length) {\n return this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n const uint32Cells = cols * Constants.CELL_INDICIES;\n if (cols > this.length) {\n if (this._data.buffer.byteLength >= uint32Cells * 4) {\n // optimization: avoid alloc and data copy if buffer has enough room\n this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n } else {\n // slow path: new alloc and full data copy\n const data = new Uint32Array(uint32Cells);\n data.set(this._data);\n this._data = data;\n }\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n // optimization: just shrink the view on existing buffer\n this._data = this._data.subarray(0, uint32Cells);\n // Remove any cut off combined data\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n // remove any cut off extended attributes\n const extKeys = Object.keys(this._extendedAttrs);\n for (let i = 0; i < extKeys.length; i++) {\n const key = parseInt(extKeys[i], 10);\n if (key >= cols) {\n delete this._extendedAttrs[key];\n }\n }\n }\n this.length = cols;\n return uint32Cells * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n }\n\n /**\n * Cleanup underlying array buffer.\n * A cleanup will be triggered if the array buffer exceeds the actual used\n * memory by a factor of Constants.CLEANUP_THRESHOLD.\n * Returns 0 or 1 indicating whether a cleanup happened.\n */\n public cleanupMemory(): number {\n if (this._data.length * 4 * Constants.CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n const data = new Uint32Array(this._data.length);\n data.set(this._data);\n this._data = data;\n return 1;\n }\n return 0;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n this._cacheValid = false;\n // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n if (respectProtect) {\n for (let i = 0; i < this.length; ++i) {\n if (!this.isProtected(i)) {\n this.setCell(i, fillCellData);\n }\n }\n return;\n }\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine, blank?: boolean): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n if (blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n this._combined = {};\n this._extendedAttrs = {};\n } else {\n this._copySparseMapsFrom(line);\n }\n this._cache = '';\n this._cacheValid = false;\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(blank?: boolean): IBufferLine {\n const newLine = new BufferLine(0, undefined, false);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n if (!blank) {\n // a blank line may never hold combined or extended attrs,\n // thus we can skip handling them\n newLine._copySparseMapsFrom(this);\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public getNoBgTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * Constants.CELL_INDICIES + Cell.BG] & Attributes.CM_MASK)) {\n return i + (this._data[i * Constants.CELL_INDICIES + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n this._cacheValid = false;\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < Constants.CELL_INDICIES; i++) {\n this._data[(destCol + cell) * Constants.CELL_INDICIES + i] = srcData[(srcCol + cell) * Constants.CELL_INDICIES + i];\n }\n this._copyCellMapsFrom(src, srcCol + cell, destCol + cell);\n }\n }\n }\n\n /**\n * Translates the buffer line to a string. Caching only applies to canonical full-line translation\n * requests (regardless of `trimRight` value).\n *\n * @param trimRight Whether to trim any empty cells on the right.\n * @param startCol The column to start the string (0-based inclusive).\n * @param endCol The column to end the string (0-based exclusive).\n * @param outColumns if specified, this array will be filled with column numbers such that\n * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]`\n * is where the character following `returnedString` will be displayed.\n *\n * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the\n * returned string, the corresponding entries in `outColumns` will have the same column number.\n */\n public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string {\n const isCanonical = (startCol === undefined || startCol === 0) && endCol === undefined && outColumns === undefined;\n if (isCanonical && this._cacheValid) {\n if (trimRight) {\n return this._cacheTrimmed ? this._cache : this._cache.trimEnd();\n }\n if (!this._cacheTrimmed) {\n return this._cache;\n }\n }\n startCol = startCol ?? 0;\n endCol = endCol ?? this.length;\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n if (outColumns) {\n outColumns.length = 0;\n }\n const cellContents: string[] = [];\n while (startCol < endCol) {\n const content = this._data[startCol * Constants.CELL_INDICIES + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n cellContents.push(chars);\n if (outColumns) {\n for (let i = 0; i < chars.length; ++i) {\n outColumns.push(startCol);\n }\n }\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1\n }\n if (outColumns) {\n outColumns.push(startCol);\n }\n const result = cellContents.join('');\n if (isCanonical) {\n this._cache = result;\n this._cacheValid = true;\n this._cacheTrimmed = !!trimRight;\n }\n return result;\n }\n\n /** Copy sparse map entries for a single cell when `_data` flags require them. */\n private _copyCellMapsFrom(src: BufferLine, srcCol: number, destCol: number): void {\n const srcStart = srcCol * Constants.CELL_INDICIES;\n if (src._data[srcStart + Cell.CONTENT] & Content.IS_COMBINED_MASK) {\n this._combined[destCol] = src._combined[srcCol];\n }\n if (src._data[srcStart + Cell.BG] & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[destCol] = src._extendedAttrs[srcCol];\n }\n }\n\n /** Rebuild sparse maps from another line, keyed only by `_data` flags. */\n private _copySparseMapsFrom(line: BufferLine): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < line.length; i++) {\n this._copyCellMapsFrom(line, i, i);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from './BufferLine';\nimport { CircularList } from '../CircularList';\nimport { IBufferLine, ICellData } from './Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n * @param reflowCursorLine Whether to reflow the line containing the cursor.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData, reflowCursorLine: boolean): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n let cellsNeeded = 0;\n for (let i = 0; i < wrappedLines.length; i++) {\n cellsNeeded += getWrappedLineTrimmedLength(wrappedLines, i, oldCols);\n }\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { dispose, IDisposable } from '../Lifecycle';\nimport { IMarker } from './Types';\nimport { Emitter } from '../Event';\n\nexport class Marker implements IMarker {\n private static _nextId = 1;\n\n public isDisposed: boolean = false;\n private readonly _disposables: IDisposable[] = [];\n\n private readonly _id: number = Marker._nextId++;\n public get id(): number { return this._id; }\n\n private readonly _onDispose = this.register(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n constructor(\n public line: number\n ) {\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a chance to react\n this._onDispose.fire();\n dispose(this._disposables);\n this._disposables.length = 0;\n }\n\n public register(disposable: T): T {\n this._disposables.push(disposable);\n return disposable;\n }\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from '../Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '\u25C6'\n 'a': '\\u2592', // '\u2592'\n 'b': '\\u2409', // '\u2409' (HT)\n 'c': '\\u240c', // '\u240C' (FF)\n 'd': '\\u240d', // '\u240D' (CR)\n 'e': '\\u240a', // '\u240A' (LF)\n 'f': '\\u00b0', // '\u00B0'\n 'g': '\\u00b1', // '\u00B1'\n 'h': '\\u2424', // '\u2424' (NL)\n 'i': '\\u240b', // '\u240B' (VT)\n 'j': '\\u2518', // '\u2518'\n 'k': '\\u2510', // '\u2510'\n 'l': '\\u250c', // '\u250C'\n 'm': '\\u2514', // '\u2514'\n 'n': '\\u253c', // '\u253C'\n 'o': '\\u23ba', // '\u23BA'\n 'p': '\\u23bb', // '\u23BB'\n 'q': '\\u2500', // '\u2500'\n 'r': '\\u23bc', // '\u23BC'\n 's': '\\u23bd', // '\u23BD'\n 't': '\\u251c', // '\u251C'\n 'u': '\\u2524', // '\u2524'\n 'v': '\\u2534', // '\u2534'\n 'w': '\\u252c', // '\u252C'\n 'x': '\\u2502', // '\u2502'\n 'y': '\\u2264', // '\u2264'\n 'z': '\\u2265', // '\u2265'\n '{': '\\u03c0', // '\u03C0'\n '|': '\\u2260', // '\u2260'\n '}': '\\u00a3', // '\u00A3'\n '~': '\\u00b7' // '\u00B7'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '\u00A3'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '\u00A3',\n '@': '\u00BE',\n '[': 'ij',\n '\\\\': '\u00BD',\n ']': '|',\n '{': '\u00A8',\n '|': 'f',\n '}': '\u00BC',\n '~': '\u00B4'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] = CHARSETS['5'] = {\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '\u00A3',\n '@': '\u00E0',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00A7',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00A8'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': '\u00E0',\n '[': '\u00E2',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n '`': '\u00F4',\n '{': '\u00E9',\n '|': '\u00F9',\n '}': '\u00E8',\n '~': '\u00FB'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '\u00A7',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00DC',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00DF'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00B0',\n '\\\\': '\u00E7',\n ']': '\u00E9',\n '`': '\u00F9',\n '{': '\u00E0',\n '|': '\u00F2',\n '}': '\u00E8',\n '~': '\u00EC'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] = CHARSETS['6'] = {\n '@': '\u00C4',\n '[': '\u00C6',\n '\\\\': '\u00D8',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E4',\n '{': '\u00E6',\n '|': '\u00F8',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '\u00A3',\n '@': '\u00A7',\n '[': '\u00A1',\n '\\\\': '\u00D1',\n ']': '\u00BF',\n '{': '\u00B0',\n '|': '\u00F1',\n '}': '\u00E7'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] = CHARSETS['7'] = {\n '@': '\u00C9',\n '[': '\u00C4',\n '\\\\': '\u00D6',\n ']': '\u00C5',\n '^': '\u00DC',\n '`': '\u00E9',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00E5',\n '~': '\u00FC'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': '\u00F9',\n '@': '\u00E0',\n '[': '\u00E9',\n '\\\\': '\u00E7',\n ']': '\u00EA',\n '^': '\u00EE',\n\n '_': '\u00E8',\n '`': '\u00F4',\n '{': '\u00E4',\n '|': '\u00F6',\n '}': '\u00FC',\n '~': '\u00FB'\n};\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from '../CircularList';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IdleTaskQueue } from '../TaskQueue';\nimport { ICharset } from '../Types';\nimport { IAttributeData, IBuffer, IBufferLine, ICellData } from './Types';\nimport { ExtendedAttrs } from './AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from './BufferReflow';\nimport { CellData } from './CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from './Constants';\nimport { Marker } from './Marker';\nimport { DEFAULT_CHARSET } from '../data/Charsets';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer extends Disposable implements IBuffer {\n public lines: CircularList;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n public tabs: { [column: number]: boolean | undefined } = {};\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public savedCharsets: (ICharset | undefined)[] = [];\n public savedGlevel: number = 0;\n public savedOriginMode: boolean = false;\n public savedWraparoundMode: boolean = true;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n private _isClearing: boolean = false;\n private _memoryCleanupQueue: InstanceType;\n private _memoryCleanupPosition = 0;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n this._memoryCleanupQueue = new IdleTaskQueue(this._logService);\n this._register(toDisposable(() => this._memoryCleanupQueue.clear()));\n this._register(toDisposable(() => this.clearAllMarkers()));\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n fillAttr ??= DEFAULT_ATTR_DATA;\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to its initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // count bufferlines with overly big memory to be cleaned afterwards\n let dirtyMemoryLines = 0;\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // if (this._cols > newCols) {\n // console.log('increase!');\n // }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n // Just add the new missing rows on Windows as conpty reprints the screen with its\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell, false));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n // +boolean for fast 0 or 1 conversion\n dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n\n // Ensure the cursor position invariant: ybase + y must be within buffer bounds\n // This can be violated during reflow or when shrinking rows\n if (this.lines.length > 0) {\n const maxY = Math.max(0, this.lines.length - this.ybase - 1);\n this.y = Math.min(this.y, maxY);\n }\n\n this._memoryCleanupQueue.clear();\n // schedule memory cleanup only, if more than 10% of the lines are affected\n if (dirtyMemoryLines > 0.1 * this.lines.length) {\n this._memoryCleanupPosition = 0;\n this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n }\n }\n\n private _batchedMemoryCleanup(): boolean {\n let normalRun = true;\n if (this._memoryCleanupPosition >= this.lines.length) {\n // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n // lines, which should finish rather quick if there are no more cleanups pending\n this._memoryCleanupPosition = 0;\n normalRun = false;\n }\n let counted = 0;\n while (this._memoryCleanupPosition < this.lines.length) {\n counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n // cleanup max 100 lines per batch\n if (counted > 100) {\n return true;\n }\n }\n // normal runs always need another rescan afterwards\n // if we made it here with normalRun=false, we are in a final run\n // and can end the cleanup task for sure\n return normalRun;\n }\n\n private get _isReflowEnabled(): boolean {\n const windowsPty = this._optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.buildNumber) {\n return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n }\n return this._hasScrollback;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA), reflowCursorLine);\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell, false));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const reflowCursorLine = this._optionsService.rawOptions.reflowCursorLine;\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n if (!reflowCursorLine) {\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n if (wrappedLines[destLineIndex] === undefined) {\n // Sanity check that the line exists, this has been known to fail for an unknown reason\n // which would stop the reflow from happening if an exception would throw.\n break;\n }\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param lineIndex The absolute index of the line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n x ??= this.x;\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Clears markers on single line.\n * @param y The line to clear.\n */\n public clearMarkers(y: number): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].line === y) {\n this.markers[i].dispose();\n this.markers.splice(i--, 1);\n }\n }\n this._isClearing = false;\n }\n\n /**\n * Clears markers on all lines\n */\n public clearAllMarkers(): void {\n this._isClearing = true;\n for (let i = 0; i < this.markers.length; i++) {\n this.markers[i].dispose();\n }\n this.markers.length = 0;\n this._isClearing = false;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n if (!this._isClearing) {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, MutableDisposable } from '../Lifecycle';\nimport { Buffer } from './Buffer';\nimport { IAttributeData, IBuffer, IBufferSet } from './Types';\nimport { IBufferService, ILogService, IOptionsService } from '../services/Services';\nimport { Emitter } from '../Event';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal!: Buffer;\n private _alt!: Buffer;\n private _activeBuffer!: Buffer;\n private readonly _normalBuffer = this._register(new MutableDisposable());\n private readonly _altBuffer = this._register(new MutableDisposable());\n\n private readonly _onBufferActivate = this._register(new Emitter<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>());\n public readonly onBufferActivate = this._onBufferActivate.event;\n\n /**\n * Create a new BufferSet for the given terminal.\n */\n constructor(\n private readonly _optionsService: IOptionsService,\n private readonly _bufferService: IBufferService,\n private readonly _logService: ILogService\n ) {\n super();\n this.reset();\n this._register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n this._register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n }\n\n public reset(): void {\n this._normal = new Buffer(true, this._optionsService, this._bufferService, this._logService);\n this._normalBuffer.value = this._normal;\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, this._optionsService, this._bufferService, this._logService);\n this._altBuffer.value = this._alt;\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clearAllMarkers();\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n this.setupTabStops(newCols);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IAttributeData, IBuffer, IBufferLine, IBufferSet } from '../buffer/Types';\nimport { BufferSet } from '../buffer/BufferSet';\nimport { IBufferService, ILogService, IOptionsService, type IBufferResizeEvent } from './Services';\nimport { Emitter } from '../Event';\n\nexport const enum BufferServiceConstants {\n MINIMUM_COLS = 2, // Less than 2 can mess with wide chars\n MINIMUM_ROWS = 1\n}\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private readonly _onResize = this._register(new Emitter());\n public readonly onResize = this._onResize.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n constructor(\n @IOptionsService optionsService: IOptionsService,\n @ILogService logService: ILogService\n ) {\n super();\n this.cols = Math.max(optionsService.rawOptions.cols || 0, BufferServiceConstants.MINIMUM_COLS);\n this.rows = Math.max(optionsService.rawOptions.rows || 0, BufferServiceConstants.MINIMUM_ROWS);\n this.buffers = this._register(new BufferSet(optionsService, this, logService));\n this._register(this.buffers.onBufferActivate(e => {\n this._onScroll.fire(e.activeBuffer.ydisp);\n }));\n }\n\n public resize(cols: number, rows: number): void {\n const colsChanged = this.cols !== cols;\n const rowsChanged = this.rows !== rows;\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this._onResize.fire({ cols, rows, colsChanged, rowsChanged });\n }\n\n public reset(): void {\n this.buffers.reset();\n this.isUserScrolling = false;\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine, true);\n } else {\n buffer.lines.push(newLine.clone(true));\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone(true));\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone(true));\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { isMac } from '../Platform';\nimport { CursorStyle, IDisposable } from '../Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from './Services';\nimport { Emitter } from '../Event';\n\nexport const DEFAULT_OPTIONS: Readonly> = {\n cols: 80,\n rows: 24,\n showCursorImmediately: false,\n cursorBlink: false,\n blinkIntervalDuration: 0,\n cursorStyle: 'block',\n cursorWidth: 1,\n cursorInactiveStyle: 'outline',\n drawBoldTextInBrightColors: true,\n documentOverride: null,\n fastScrollSensitivity: 5,\n fontFamily: 'monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n ignoreBracketedPasteMode: false,\n lineHeight: 1.0,\n letterSpacing: 0,\n linkHandler: null,\n logLevel: 'info',\n logger: null,\n scrollback: 1000,\n scrollbar: { showScrollbar: true },\n scrollOnEraseInDisplay: false,\n scrollOnUserInput: true,\n scrollSensitivity: 1,\n screenReaderMode: false,\n smoothScrollDuration: 0,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n mouseEventsRequireAlt: false,\n disableStdin: false,\n allowProposedApi: false,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n reflowCursorLine: false,\n rescaleOverlappingGlyphs: false,\n rightClickSelectsWord: isMac,\n windowOptions: {},\n windowsPty: {},\n wordSeparator: ' ()[]{}\\',\"`',\n altClickMovesCursor: true,\n convertEol: false,\n termName: 'xterm',\n quirks: {},\n vtExtensions: {}\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n public serviceBrand: any;\n\n public readonly rawOptions: Required;\n public options: Required;\n\n private readonly _onOptionChange = this._register(new Emitter());\n public readonly onOptionChange = this._onOptionChange.event;\n\n constructor(options: Partial) {\n super();\n // set the default value of each option\n const defaultOptions = { ...DEFAULT_OPTIONS };\n for (const key in options) {\n if (key in defaultOptions) {\n try {\n const newValue = options[key];\n defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n // set up getters and setters for each option\n this.rawOptions = defaultOptions;\n this.options = { ... defaultOptions };\n this._setupOptions();\n\n // Clear out options that could link outside xterm.js as they could easily cause an embedder\n // memory leak\n this._register(toDisposable(() => {\n this.rawOptions.linkHandler = null;\n this.rawOptions.documentOverride = null;\n }));\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onSpecificOptionChange(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (eventKey === key) {\n listener(this.rawOptions[key]);\n }\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n return this.onOptionChange(eventKey => {\n if (keys.indexOf(eventKey) !== -1) {\n listener();\n }\n });\n }\n\n private _setupOptions(): void {\n const getter = (propName: string): any => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n return this.rawOptions[propName];\n };\n\n const setter = (propName: string, value: any): void => {\n if (!(propName in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${propName}\"`);\n }\n\n value = this._sanitizeAndValidateOption(propName, value);\n // Don't fire an option change event if they didn't change\n if (this.rawOptions[propName] !== value) {\n this.rawOptions[propName] = value;\n this._onOptionChange.fire(propName);\n }\n };\n\n for (const propName in this.rawOptions) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this.options, propName, desc);\n }\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'cursorStyle':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n if (!isCursorStyle(value)) {\n throw new Error(`\"${value}\" is not a valid value for ${key}`);\n }\n break;\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'fontWeight':\n case 'fontWeightBold':\n if (typeof value === 'number' && 1 <= value && value <= 1000) {\n // already valid numeric value\n break;\n }\n value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n break;\n case 'blinkIntervalDuration':\n value = Math.floor(value);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n case 'rows':\n case 'cols':\n if (!value && value !== 0) {\n throw new Error(`${key} must be numeric, value: ${value}`);\n }\n break;\n case 'windowsPty':\n value = value ?? {};\n break;\n }\n return value;\n }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n return value === 'block' || value === 'underline' || value === 'bar';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from '../Lifecycle';\nimport { IDecPrivateModes, IKittyKeyboardState, IModes } from '../Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from './Services';\nimport { Emitter } from '../Event';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n colorSchemeUpdates: false,\n cursorBlink: undefined,\n cursorStyle: undefined,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n synchronizedOutput: false,\n win32InputMode: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nconst DEFAULT_KITTY_KEYBOARD_STATE = (): IKittyKeyboardState => ({\n flags: 0,\n mainFlags: 0,\n altFlags: 0,\n mainStack: [],\n altStack: []\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n public kittyKeyboard: IKittyKeyboardState;\n\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n private readonly _onUserInput = this._register(new Emitter());\n public readonly onUserInput = this._onUserInput.event;\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onRequestScrollToBottom = this._register(new Emitter());\n public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this.isCursorInitialized = _optionsService.rawOptions.showCursorImmediately ?? false;\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public reset(): void {\n this.modes = structuredClone(DEFAULT_MODES);\n this.decPrivateModes = structuredClone(DEFAULT_DEC_PRIVATE_MODES);\n this.kittyKeyboard = DEFAULT_KITTY_KEYBOARD_STATE();\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n this._onRequestScrollToBottom.fire();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`);\n this._logService.trace(`sending data (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.rawOptions.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`);\n this._logService.trace(`sending binary (codes)`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IMouseStateService } from './Services';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from '../Types';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n },\n SGR_PIXELS: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n }\n};\n\n/**\n * MouseStateService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class MouseStateService extends Disposable implements IMouseStateService {\n public serviceBrand: any;\n\n private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n private _encodings: { [name: string]: CoreMouseEncoding } = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined;\n\n private readonly _onProtocolChange = this._register(new Emitter());\n public readonly onProtocolChange = this._onProtocolChange.event;\n\n constructor() {\n super();\n\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n }\n\n public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void {\n this._customWheelEventHandler = customWheelEventHandler;\n }\n\n public allowCustomWheelEvent(ev: WheelEvent): boolean {\n return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true;\n }\n\n public restrictMouseEvent(e: ICoreMouseEvent): boolean {\n return this._protocols[this._activeProtocol].restrict(e);\n }\n\n public encodeMouseEvent(e: ICoreMouseEvent): string {\n return this._encodings[this._activeEncoding](e);\n }\n\n public get isDefaultEncoding(): boolean {\n return this._activeEncoding === 'DEFAULT';\n }\n\n public get isPixelEncoding(): boolean {\n return this._activeEncoding === 'SGR_PIXELS';\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from './Services';\nimport { Emitter } from '../Event';\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider!: IUnicodeVersionProvider;\n\n private readonly _onChange = new Emitter();\n public readonly onChange = this._onChange.event;\n\n public static extractShouldJoin(value: UnicodeCharProperties): boolean {\n return (value & 1) !== 0;\n }\n public static extractWidth(value: UnicodeCharProperties): UnicodeCharWidth {\n return ((value >> 1) & 0x3) as UnicodeCharWidth;\n }\n public static extractCharKind(value: UnicodeCharProperties): number {\n return value >> 3;\n }\n public static createPropertyValue(state: number, width: number, shouldJoin: boolean = false): UnicodeCharProperties {\n return ((state & 0xffffff) << 3) | ((width & 3) << 1) | (shouldJoin?1:0);\n }\n\n public dispose(): void {\n this._onChange.dispose();\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n if (!this._active) {\n this.activeVersion = provider.version;\n }\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): UnicodeCharWidth {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n let precedingInfo = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n const currentInfo = this.charProperties(code, precedingInfo);\n let chWidth = UnicodeService.extractWidth(currentInfo);\n if (UnicodeService.extractShouldJoin(currentInfo)) {\n chWidth -= UnicodeService.extractWidth(precedingInfo);\n }\n result += chWidth;\n precedingInfo = currentInfo;\n }\n return result;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n return this._activeProvider.charProperties(codepoint, preceding);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from '../services/Services';\nimport { UnicodeService } from '../services/UnicodeService';\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n table.fill(1);\n table[0] = 0;\n // control chars\n table.fill(0, 1, 32);\n table.fill(0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n table.fill(2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n table.fill(2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n table.fill(2, 0xac00, 0xd7a4);\n table.fill(2, 0xf900, 0xfb00);\n table.fill(2, 0xfe10, 0xfe1a);\n table.fill(2, 0xfe30, 0xfe70);\n table.fill(2, 0xff00, 0xff61);\n table.fill(2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): UnicodeCharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as UnicodeCharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n\n public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {\n let width = this.wcwidth(codepoint);\n let shouldJoin = width === 0 && preceding !== 0;\n // HACK: Ideally this file would not depend on the service which uses it\n if (shouldJoin) {\n const oldWidth = UnicodeService.extractWidth(preceding);\n if (oldWidth === 0) {\n shouldJoin = false;\n } else if (oldWidth > width) {\n width = oldWidth;\n }\n }\n return UnicodeService.createPropertyValue(0, width, shouldJoin);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from './Services';\nimport { ICharset } from '../Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public get charsets(): (ICharset | undefined)[] {\n return this._charsets;\n }\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from './buffer/Constants';\nimport { IBufferService } from './services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from './Types';\n\nconst enum Constants {\n /**\n * Max value supported for a single param/subparam (clamped to positive int32 range)\n */\n MAX_VALUE = 0x7FFFFFFF,\n /**\n * Max allowed subparams for a single sequence (hardcoded limitation)\n */\n MAX_SUBPARAMS = 256\n}\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (Array.isArray(value)) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > Constants.MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Reset and add 0 as first param (ZDM).\n */\n public resetZdm(): void {\n this.length = 1;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n this._subParamsIdx[0] = 0;\n this.params[0] = 0;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `maxSubParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values less than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > Constants.MAX_VALUE ? Constants.MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, Constants.MAX_VALUE) : value;\n }\n}\n", "/**\n * Copyright (c) 2026 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Accumulates string data from multiple chunks without O(n\u00B2) string concatenation.\n */\nexport class StringBuilder {\n private _chunks: string[] = [];\n private _length = 0;\n\n public get length(): number {\n return this._length;\n }\n\n public reset(): void {\n this._chunks.length = 0;\n this._length = 0;\n }\n\n public append(chunk: string): void {\n this._chunks.push(chunk);\n this._length += chunk.length;\n }\n\n public toString(): string {\n return this._chunks.join('');\n }\n}\n\n/**\n * String builder that rejects payloads larger than a fixed limit.\n */\nexport class LimitedStringBuilder {\n private readonly _builder = new StringBuilder();\n\n constructor(private readonly _limit: number) { }\n\n public get length(): number {\n return this._builder.length;\n }\n\n public get limit(): number {\n return this._limit;\n }\n\n public reset(): void {\n this._builder.reset();\n }\n\n /**\n * @returns true if the limit was exceeded (buffer is cleared in that case)\n */\n public append(chunk: string): boolean {\n this._builder.append(chunk);\n if (this._builder.length > this._limit) {\n this._builder.reset();\n return true;\n }\n return false;\n }\n\n public toString(): string {\n return this._builder.toString();\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from './Types';\nimport { OscState, ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _active = EMPTY_HANDLERS;\n private _id = -1;\n private _handlers: IHandlerCollection = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n\n if (!this._active.length) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers\n // we always have to call .end for proper cleanup,\n // here we use `success` to indicate whether a handler should execute\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n\n }\n this._active = EMPTY_HANDLERS;\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(OscHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from '../Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from './Types';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { Params } from './Params';\nimport { ParserConstants } from './Constants';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n // force cleanup leftover handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].unhook(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].unhook(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(DcsHandler._payloadLimit);\n private _params: IParams = EMPTY_PARAMS;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => boolean | Promise) { }\n\n public hook(params: IParams): void {\n // since we need to preserve params until `unhook`, we have to clone it\n // (only borrowed from parser and spans multiple parser states)\n // perf optimization:\n // clone only, if we have non empty params, otherwise stick with default\n this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString(), this._params);\n if (ret instanceof Promise) {\n // need to hold data and params until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._params = EMPTY_PARAMS;\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from './Types';\nimport { ParserConstants } from './Constants';\nimport { utf32ToString } from '../input/TextDecoder';\nimport { IDisposable } from '../Types';\nimport { LimitedStringBuilder } from '../StringBuilder';\n\nconst EMPTY_HANDLERS: IApcHandler[] = [];\n\n/**\n * APC Parser for handling Application Program Command sequences.\n * APC sequences use the format: ESC _ ESC \\\n *\n * Unlike OSC which uses numeric identifiers (e.g., OSC 1337),\n * APC uses the first character as the identifier (e.g., 'G' for Kitty graphics).\n * The identifier is the character code of the first byte after ESC _.\n */\nexport class ApcParser implements IApcParser {\n private _handlers: IHandlerCollection = Object.create(null);\n private _active = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: ApcFallbackHandlerType = () => { };\n private _stack: ISubParserStackState = {\n paused: false,\n loopPosition: 0,\n fallThrough: false\n };\n\n /**\n * Register an APC handler for a specific identifier.\n * @param ident The character code of the first byte (e.g., 0x47 for 'G')\n * @param handler The handler to register\n */\n public registerHandler(ident: number, handler: IApcHandler): IDisposable {\n this._handlers[ident] ??= [];\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => { };\n this._active = EMPTY_HANDLERS;\n }\n\n public reset(): void {\n // force cleanup handlers\n if (this._active.length) {\n for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n this._active[j].end(false);\n }\n }\n this._stack.paused = false;\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public start(ident: number): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'START');\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].start();\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n /**\n * Indicates end of an APC command.\n * Whether the APC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean, promiseResult: boolean = true): void | Promise {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'END', success);\n } else {\n let handlerResult: boolean | Promise = false;\n let j = this._active.length - 1;\n let fallThrough = false;\n if (this._stack.paused) {\n j = this._stack.loopPosition - 1;\n handlerResult = promiseResult;\n fallThrough = this._stack.fallThrough;\n this._stack.paused = false;\n }\n if (!fallThrough && handlerResult === false) {\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(success);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = false;\n return handlerResult;\n }\n }\n j--;\n }\n // cleanup left over handlers (fallThrough for async)\n for (; j >= 0; j--) {\n handlerResult = this._active[j].end(false);\n if (handlerResult instanceof Promise) {\n this._stack.paused = true;\n this._stack.loopPosition = j;\n this._stack.fallThrough = true;\n return handlerResult;\n }\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as APC handlers.\n */\nexport class ApcHandler implements IApcHandler {\n private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;\n\n private _data = new LimitedStringBuilder(ApcHandler._payloadLimit);\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => boolean | Promise) { }\n\n public start(): void {\n this._data.reset();\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n if (this._data.append(utf32ToString(data, start, end))) {\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): boolean | Promise {\n let ret: boolean | Promise = false;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data.toString());\n if (ret instanceof Promise) {\n // need to hold data until `ret` got resolved\n // dont care for errors, data will be freed anyway on next start\n return ret.then(res => {\n this._data.reset();\n this._hitLimit = false;\n return res;\n });\n }\n }\n this._data.reset();\n this._hitLimit = false;\n return ret;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType, IApcHandler, IApcParser, ApcFallbackHandlerType } from './Types';\nimport { ParserState, ParserAction } from './Constants';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { IDisposable } from '../Types';\nimport { Params } from './Params';\nimport { OscParser } from './OscParser';\nimport { DcsParser } from './DcsParser';\nimport { ApcParser } from './ApcParser';\n\n/**\n * VT commands done by the parser\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 8,\n TRANSITION_STATE_MASK = 255,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint16Array;\n\n constructor(length: number) {\n this.table = new Uint16Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n // table size:\n // (ParserState.STATE_LENGTH - 1) << TableAccess.INDEX_STATE_SHIFT | NON_ASCII_PRINTABLE + 1\n const table: TransitionTable = new TransitionTable(4257);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.STATE_LENGTH);\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (const state of states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e], state, ParserAction.IGNORE, ParserState.SOS_PM_STRING); // SOS, PM\n table.add(0x9f, state, ParserAction.CLEAR, ParserState.APC_ENTRY); // APC\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm\n table.addMany([0x58, 0x5e], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n table.add(0x9c, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_STRING, ParserAction.IGNORE, ParserState.SOS_PM_STRING);\n // apc\n table.add(0x5f, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.APC_ENTRY);\n table.addMany(EXECUTABLES, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.add(0x7f, ParserState.APC_ENTRY, ParserAction.IGNORE, ParserState.APC_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.APC_ENTRY, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.APC_ENTRY, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x30, 0x7f), ParserState.APC_INTERMEDIATE, ParserAction.APC_START, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.APC_INTERMEDIATE, ParserAction.COLLECT, ParserState.APC_INTERMEDIATE);\n table.add(0x7f, ParserState.APC_INTERMEDIATE, ParserAction.IGNORE, ParserState.APC_INTERMEDIATE);\n table.addMany(PRINTABLES, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany(r(0x08, 0x0e), ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n table.add(0x7f, ParserState.APC_PASSTHROUGH, ParserAction.IGNORE, ParserState.APC_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.APC_PASSTHROUGH, ParserAction.APC_END, ParserState.GROUND);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(NON_ASCII_PRINTABLE, ParserState.APC_PASSTHROUGH, ParserAction.APC_PUT, ParserState.APC_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingJoinState: number; // UnicodeJoinProperties\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n // fast path for EXE bytes < 0x18\n protected _executeHandlersArr: (ExecuteHandlerType | undefined)[];\n protected _csiHandlers: IHandlerCollection;\n protected _escHandlers: IHandlerCollection;\n protected readonly _oscParser: IOscParser;\n protected readonly _dcsParser: IDcsParser;\n protected readonly _apcParser: IApcParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n // parser stack save for async handler support\n protected _parseStack: IParserStackState = {\n state: ParserStackType.NONE,\n handlers: [],\n handlerPos: 0,\n transition: 0,\n chunkPos: 0\n };\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingJoinState = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._register(toDisposable(() => {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._executeHandlersArr = new Array(0x18).fill(undefined);\n this._escHandlers = Object.create(null);\n }));\n this._oscParser = this._register(new OscParser());\n this._dcsParser = this._register(new DcsParser());\n this._apcParser = this._register(new ApcParser());\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.registerEscHandler({ final: '\\\\' }, () => true);\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res < 0x3c || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n this._escHandlers[ident] ??= [];\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n const code = flag.charCodeAt(0);\n this._executeHandlers[code] = handler;\n if (code < 0x18) this._executeHandlersArr[code] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n const code = flag.charCodeAt(0);\n if (this._executeHandlers[code]) delete this._executeHandlers[code];\n if (code < 0x18) this._executeHandlersArr[code] = undefined;\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n this._csiHandlers[ident] ??= [];\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.registerHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.registerHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public registerApcHandler(id: IFunctionIdentifier, handler: IApcHandler): IDisposable {\n id.prefix = undefined; // APC does not support prefix byte\n return this._apcParser.registerHandler(this._identifier(id, [0x30, 0x7e]), handler);\n }\n public clearApcHandler(id: IFunctionIdentifier): void {\n id.prefix = undefined; // APC does not support prefix byte\n this._apcParser.clearHandler(this._identifier(id, [0x30, 0x7e]));\n }\n public setApcHandlerFallback(handler: ApcFallbackHandlerType): void {\n this._apcParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n /**\n * Reset parser to initial values.\n *\n * This can also be used to lift the improper continuation error condition\n * when dealing with async handlers. Use this only as a last resort to silence\n * that error when the terminal has no pending data to be processed. Note that\n * the interrupted async handler might continue its work in the future messing\n * up the terminal state even further.\n */\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._apcParser.reset();\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n // abort pending continuation from async handler\n // Here the RESET type indicates, that the next parse call will\n // ignore any saved stack, instead continues sync with next codepoint from GROUND\n if (this._parseStack.state !== ParserStackType.NONE) {\n this._parseStack.state = ParserStackType.RESET;\n this._parseStack.handlers = []; // also release handlers ref\n }\n }\n\n /**\n * Async parse support.\n */\n protected _preserveStack(\n state: ParserStackType,\n handlers: ResumableHandlersType,\n handlerPos: number,\n transition: number,\n chunkPos: number\n ): void {\n this._parseStack.state = state;\n this._parseStack.handlers = handlers;\n this._parseStack.handlerPos = handlerPos;\n this._parseStack.transition = transition;\n this._parseStack.chunkPos = chunkPos;\n }\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n *\n * Additionally the following fast paths exist before the table lookup:\n * - EXE bytes < 0x18 in non-payload states (avoids table lookup entirely)\n * - 7-bit CSI sequences without intermediates (ESC [ params final)\n *\n * Note on asynchronous handler support:\n * Any handler returning a promise will be treated as asynchronous.\n * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n * creates a stack save and returns the promise to the caller.\n * For proper continuation of the paused state it is important\n * to await the promise resolving. On resolve the parse must be repeated\n * with the same chunk of data and the resolved value in `promiseResult`\n * until no promise is returned.\n *\n * Important: With only sync handlers defined, parsing is completely synchronous as well.\n * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n *\n * Boilerplate for proper parsing of multiple chunks with async handlers:\n *\n * ```typescript\n * async function parseMultipleChunks(chunks: Uint32Array[]): Promise {\n * for (const chunk of chunks) {\n * let result: void | Promise;\n * let prev: boolean | undefined;\n * while (result = parser.parse(chunk, chunk.length, prev)) {\n * prev = await result;\n * }\n * }\n * // finished parsing all chunks...\n * }\n * ```\n */\n public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise {\n let code: number;\n let transition: number;\n let start = 0;\n let handlerResult: void | boolean | Promise;\n\n // resume from async handler\n if (this._parseStack.state) {\n // allow sync parser reset even in continuation mode\n // Note: can be used to recover parser from improper continuation error below\n if (this._parseStack.state === ParserStackType.RESET) {\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n } else {\n if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n /**\n * Reject further parsing on improper continuation after pausing. This is a really bad\n * condition with screwed up execution order and prolly messed up terminal state,\n * therefore we exit hard with an exception and reject any further parsing.\n *\n * Note: With `Terminal.write` usage this exception should never occur, as the top level\n * calls are guaranteed to handle async conditions properly. If you ever encounter this\n * exception in your terminal integration it indicates, that you injected data chunks to\n * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n * continuation of a running async handler.\n *\n * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n * the pending async handler still might mess up the terminal later. Instead fix the\n * faulty async handling, so this error will not be thrown anymore.\n */\n this._parseStack.state = ParserStackType.FAIL;\n throw new Error('improper continuation due to previous async handler, giving up parsing');\n }\n\n // we have to resume the old handler loop if:\n // - return value of the promise was `false`\n // - handlers are not exhausted yet\n const handlers = this._parseStack.handlers;\n let handlerPos = this._parseStack.handlerPos - 1;\n switch (this._parseStack.state) {\n case ParserStackType.CSI:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.ESC:\n if (promiseResult === false && handlerPos > -1) {\n for (; handlerPos >= 0; handlerPos--) {\n handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._parseStack.handlerPos = handlerPos;\n return handlerResult;\n }\n }\n }\n this._parseStack.handlers = [];\n break;\n case ParserStackType.DCS:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.OSC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserStackType.APC:\n code = data[this._parseStack.chunkPos];\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n if (handlerResult) {\n return handlerResult;\n }\n if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n break;\n }\n // cleanup before continuing with the main sync loop\n this._parseStack.state = ParserStackType.NONE;\n start = this._parseStack.chunkPos + 1;\n this.precedingJoinState = 0;\n this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n\n // continue with main sync loop\n\n // process input string\n for (let i = start; i < length; ++i) {\n code = data[i];\n\n // EXE fast-path: common control bytes (0x00-0x17) in non-payload states\n if (code < 0x18 && this.currentState <= ParserState.CSI_IGNORE) {\n (this._executeHandlersArr[code] ?? this._executeHandlerFb)(code);\n this.precedingJoinState = 0;\n continue;\n }\n\n // CSI fast-path: collapse ESC [ into a single entry, parse params+final in a tight loop\n if (code === 0x1b\n && this.currentState < ParserState.OSC_STRING\n && i + 2 < length && data[i + 1] === 0x5b\n ) {\n this._params.resetZdm();\n this._collect = 0;\n let k = i + 2;\n let ch = data[k];\n if (ch >= 0x3c && ch <= 0x3f) {\n this._collect = ch;\n k++;\n }\n let csiDone = false;\n for (; k < length; k++) {\n ch = data[k];\n if (ch >= 0x30 && ch <= 0x39) {\n this._params.addDigit(ch - 48);\n } else if (ch === 0x3b) {\n this._params.addParam(0);\n } else if (ch === 0x3a) {\n this._params.addSubParam(-1);\n } else if (ch >= 0x40 && ch <= 0x7e) {\n const handlers = this._csiHandlers[this._collect << 8 | ch];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n transition = ParserAction.CSI_DISPATCH << TableAccess.TRANSITION_ACTION_SHIFT | ParserState.GROUND;\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, k);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | ch, this._params);\n }\n this.precedingJoinState = 0;\n i = k;\n this.currentState = ParserState.GROUND;\n csiDone = true;\n break;\n } else {\n break;\n }\n }\n if (!csiDone) {\n i = k - 1;\n this.currentState = ParserState.CSI_PARAM;\n }\n continue;\n }\n\n // normal transition & action lookup\n transition = this._transitions.table[\n this.currentState << TableAccess.INDEX_STATE_SHIFT |\n (code < NON_ASCII_PRINTABLE ? code : NON_ASCII_PRINTABLE)\n ];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n let c = i;\n const l4 = length - 4;\n while (c < l4\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n && data[++c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)\n ) {}\n if (c >= l4) {\n while (c < length && data[c] >= 0x20 && (data[c] <= 0x7e || data[c] >= NON_ASCII_PRINTABLE)) {\n c++;\n }\n }\n this._printHandler(data, i, c);\n i = c - 1;\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingJoinState = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState: this.currentState,\n collect: this._collect,\n params: this._params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[this._collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlers[j](this._params);\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n return handlerResult;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(this._collect << 8 | code, this._params);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n this._params.addParam(0); // ZDM\n break;\n case 0x3a:\n this._params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n this._params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n this._collect <<= 8;\n this._collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[this._collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // true means success and to stop bubbling\n // a promise indicates an async handler that needs to finish before progressing\n handlerResult = handlersEsc[jj]();\n if (handlerResult === true) {\n break;\n } else if (handlerResult instanceof Promise) {\n this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n return handlerResult;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(this._collect << 8 | code);\n }\n this.precedingJoinState = 0;\n break;\n case ParserAction.CLEAR:\n this._params.resetZdm();\n this._collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n this._dcsParser.hook(this._collect << 8 | code, this._params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._dcsParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.OSC_START:\n this._oscParser.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n this._oscParser.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n case ParserAction.APC_START:\n this._apcParser.start(this._collect << 8 | code);\n break;\n case ParserAction.APC_PUT:\n // inner loop - exit APC_PUT: 0x18, 0x1a, 0x1b, 0x9c\n // allowed: 00/08 .. 00/13, 02/00 .. 07/14 + NON_ASCII_PRINTABLE\n for (let j = i + 1; ; ++j) {\n if (j < length && (\n (data[j] >= 0x20 && data[j] < 0x7f) || (data[j] >= 0x08 && data[j] < 0x0e) || data[j] >= NON_ASCII_PRINTABLE\n )) continue;\n this._apcParser.put(data, i, j);\n i = j - 1;\n break;\n }\n break;\n case ParserAction.APC_END:\n handlerResult = this._apcParser.end(code !== 0x18 && code !== 0x1a);\n if (handlerResult) {\n this._preserveStack(ParserStackType.APC, [], 0, transition, i);\n return handlerResult;\n }\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n this._params.resetZdm();\n this._collect = 0;\n this.precedingJoinState = 0;\n break;\n }\n this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:// with , , in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n if (!data) return;\n // also handle uppercases\n let low = data.toLowerCase();\n if (low.startsWith('rgb:')) {\n // 'rgb:' specifier\n low = low.slice(4);\n const m = RGB_REX.exec(low);\n if (m) {\n const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n return [\n Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n ];\n }\n } else if (low.startsWith('#')) {\n // '#' specifier\n low = low.slice(1);\n if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n const adv = low.length / 3;\n const result: [number, number, number] = [0, 0, 0];\n for (let i = 0; i < 3; ++i) {\n const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n }\n return result;\n }\n }\n\n // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n // they would add. In order to support named colors, we would need some way of optionally loading\n // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n const s = n.toString(16);\n const s2 = s.length < 2 ? '0' + s : s;\n switch (bits) {\n case 4:\n return s[0];\n case 8:\n return s2;\n case 12:\n return (s2 + s2).slice(0, 3);\n default:\n return s2 + s2;\n }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n const [r, g, b] = color;\n return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n", "/**\n * Copyright (c) 2025 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * The xterm.js version. This is updated by the publish script from package.json.\n */\nexport const XTERM_VERSION = '6.1.0-beta.303';\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from './Types';\nimport { IAttributeData, IBuffer } from './buffer/Types';\nimport { C0, C1 } from './data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from './data/Charsets';\nimport { EscapeSequenceParser } from './parser/EscapeSequenceParser';\nimport { Disposable } from './Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from './input/TextDecoder';\nimport { BufferLine, DEFAULT_ATTR_DATA } from './buffer/BufferLine';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from './parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from './buffer/Constants';\nimport { CellData } from './buffer/CellData';\nimport { AttributeData } from './buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { UnicodeService } from './services/UnicodeService';\nimport { OscHandler } from './parser/OscParser';\nimport { DcsHandler } from './parser/DcsParser';\nimport { ApcHandler } from './parser/ApcParser';\nimport { parseColor } from './input/XParseColor';\nimport { Emitter } from './Event';\nimport { XTERM_VERSION } from './Version';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps \\| Pt ST\" \"Definitions for user-defined keys.\"\n// @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n// @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst enum Constants {\n MAX_PARSEBUFFER_LENGTH = 131072,\n /** Limit length of title and icon name stacks. */\n STACK_LIMIT = 10,\n // create a warning log if an async handler takes longer than the limit (in ms)\n SLOW_ASYNC_LIMIT = 5000\n}\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _windowTitle = '';\n private _iconName = '';\n private _dirtyRowTracker: IDirtyRowTracker;\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n public getAttrData(): IAttributeData { return this._curAttrData; }\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _activeBuffer: IBuffer;\n\n private readonly _onRequestBell = this._register(new Emitter());\n public readonly onRequestBell = this._onRequestBell.event;\n private readonly _onRequestRefreshRows = this._register(new Emitter<{ start: number, end: number } | undefined>());\n public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n private readonly _onRequestReset = this._register(new Emitter());\n public readonly onRequestReset = this._onRequestReset.event;\n private readonly _onRequestSendFocus = this._register(new Emitter());\n public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n private readonly _onRequestSyncScrollBar = this._register(new Emitter());\n public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n private readonly _onRequestWindowsOptionsReport = this._register(new Emitter());\n public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n private readonly _onA11yChar = this._register(new Emitter());\n public readonly onA11yChar = this._onA11yChar.event;\n private readonly _onA11yTab = this._register(new Emitter());\n public readonly onA11yTab = this._onA11yTab.event;\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n private readonly _onScroll = this._register(new Emitter());\n public readonly onScroll = this._onScroll.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onColor = this._register(new Emitter());\n public readonly onColor = this._onColor.event;\n private readonly _onRequestColorSchemeQuery = this._register(new Emitter());\n public readonly onRequestColorSchemeQuery = this._onRequestColorSchemeQuery.event;\n\n private _parseStack: IParseStack = {\n paused: false,\n cursorStartX: 0,\n cursorStartY: 0,\n decodedLength: 0,\n position: 0\n };\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _oscLinkService: IOscLinkService,\n private readonly _mouseStateService: IMouseStateService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this._register(this._parser);\n this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n // Track properties used in performance critical code manually to avoid using slow getters\n this._activeBuffer = this._bufferService.buffer;\n this._register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n this._parser.setApcHandlerFallback((ident, action, payload) => {\n this._logService.debug('Unknown APC code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n this._parser.registerCsiHandler({ final: '^' }, params => this.scrollDown(params));\n this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'q' }, params => this.sendXtVersion(params));\n this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n // Kitty keyboard protocol handlers\n this._parser.registerCsiHandler({ prefix: '=', final: 'u' }, params => this.kittyKeyboardSet(params));\n this._parser.registerCsiHandler({ prefix: '?', final: 'u' }, params => this.kittyKeyboardQuery(params));\n this._parser.registerCsiHandler({ prefix: '>', final: 'u' }, params => this.kittyKeyboardPush(params));\n this._parser.registerCsiHandler({ prefix: '<', final: 'u' }, params => this.kittyKeyboardPop(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n // 1 - icon name\n this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n // 2 - title\n this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n // 10 - Change VT100 text foreground color to Pt.\n this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n // 11 - Change VT100 text background color to Pt.\n this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n // 12 - Change text cursor color to Pt.\n this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n // 111 - Reset VT100 text background color.\n this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n // 112 - Reset text cursor color.\n this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n }\n\n /**\n * Async parse support.\n */\n private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n this._parseStack.paused = true;\n this._parseStack.cursorStartX = cursorStartX;\n this._parseStack.cursorStartY = cursorStartY;\n this._parseStack.decodedLength = decodedLength;\n this._parseStack.position = position;\n }\n\n private _logSlowResolvingAsync(p: Promise): void {\n // log a limited warning about an async handler taking too long\n if (this._logService.logLevel <= LogLevelEnum.WARN) {\n let slowTimeout: ReturnType | undefined;\n const slowPromise = new Promise((_res, rej) => {\n slowTimeout = setTimeout(() => rej('#SLOW_TIMEOUT'), Constants.SLOW_ASYNC_LIMIT);\n });\n Promise.race([p, slowPromise])\n .then(() => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n }, err => {\n if (slowTimeout !== undefined) {\n clearTimeout(slowTimeout);\n }\n if (err !== '#SLOW_TIMEOUT') {\n throw err;\n }\n console.warn(`async parser handler taking longer than ${Constants.SLOW_ASYNC_LIMIT} ms`);\n });\n }\n }\n\n private _getCurrentLinkId(): number {\n return this._curAttrData.extended.urlId;\n }\n\n /**\n * Parse call with async handler support.\n *\n * Whether the stack state got preserved for the next call, is indicated by the return value:\n * - undefined (void):\n * all handlers were sync, no stack save, continue normally with next chunk\n * - Promise\\:\n * execution stopped at async handler, stack saved, continue with same chunk and the promise\n * resolve value as `promiseResult` until the method returns `undefined`\n *\n * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n * and proper continuation of async parser handlers.\n */\n public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise {\n let result: void | Promise;\n let cursorStartX = this._activeBuffer.x;\n let cursorStartY = this._activeBuffer.y;\n let start = 0;\n const wasPaused = this._parseStack.paused;\n\n if (wasPaused) {\n // assumption: _parseBuffer never mutates between async calls\n if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n this._logSlowResolvingAsync(result);\n return result;\n }\n cursorStartX = this._parseStack.cursorStartX;\n cursorStartY = this._parseStack.cursorStartY;\n this._parseStack.paused = false;\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n start = this._parseStack.position + Constants.MAX_PARSEBUFFER_LENGTH;\n }\n }\n\n // Log debug data, the log level gate is to prevent extra work in this hot path\n if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n this._logService.debug(`parsing data ${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`);\n }\n if (this._logService.logLevel === LogLevelEnum.TRACE) {\n this._logService.trace(`parsing data (codes)`, typeof data === 'string'\n ? data.split('').map(e => e.charCodeAt(0))\n : data\n );\n }\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < Constants.MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, Constants.MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n // Important: do not clear between async calls, otherwise we lost pending update information.\n if (!wasPaused) {\n this._dirtyRowTracker.clearRange();\n }\n\n // process big data in smaller chunks\n if (data.length > Constants.MAX_PARSEBUFFER_LENGTH) {\n for (let i = start; i < data.length; i += Constants.MAX_PARSEBUFFER_LENGTH) {\n const end = i + Constants.MAX_PARSEBUFFER_LENGTH < data.length ? i + Constants.MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, i);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n } else {\n if (!wasPaused) {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n if (result = this._parser.parse(this._parseBuffer, len)) {\n this._preserveStack(cursorStartX, cursorStartY, len, 0);\n this._logSlowResolvingAsync(result);\n return result;\n }\n }\n }\n\n if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing, fire only for rows within the\n // _viewport_ which is relative to ydisp, not relative to ybase.\n const viewportEnd = this._dirtyRowTracker.end + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n const viewportStart = this._dirtyRowTracker.start + (this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n if (viewportStart < this._bufferService.rows) {\n this._onRequestRefreshRows.fire({\n start: Math.min(viewportStart, this._bufferService.rows - 1),\n end: Math.min(viewportEnd, this._bufferService.rows - 1)\n });\n }\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n\n // Defensive check: bufferRow can be undefined if a resize occurred mid-write due to async\n // scheduling gaps in WriteBuffer. See https://github.com/xtermjs/xterm.js/issues/5597\n if (!bufferRow) {\n return;\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr);\n }\n\n let precedingJoinState = this._parser.precedingJoinState;\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // Soft hyphen's (U+00AD) behavior is ambiguous and differs across terminals. We opt to treat\n // it as a zero-width hint to text layout engines and simply ignore it.\n if (code === 0xAD) {\n continue;\n }\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n const currentInfo = this._unicodeService.charProperties(code, precedingJoinState);\n chWidth = UnicodeService.extractWidth(currentInfo);\n const shouldJoin = UnicodeService.extractShouldJoin(currentInfo);\n const oldWidth = shouldJoin ? UnicodeService.extractWidth(precedingJoinState) : 0;\n precedingJoinState = currentInfo;\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n const linkId = this._getCurrentLinkId();\n if (linkId) {\n this._oscLinkService.addLineToLink(linkId, this._activeBuffer.ybase + this._activeBuffer.y);\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (this._activeBuffer.x + chWidth - oldWidth > cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n const oldRow = bufferRow;\n let oldCol = this._activeBuffer.x - oldWidth;\n this._activeBuffer.x = oldWidth;\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData(), true);\n } else {\n if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (!bufferRow) {\n return;\n }\n if (oldWidth > 0 && bufferRow instanceof BufferLine) {\n // Combining character widens 1 column to 2.\n // Move old character to next line.\n bufferRow.copyCellsFrom(oldRow as BufferLine,\n oldCol, 0, oldWidth, false);\n }\n // clear left over cells to the right\n while (oldCol < cols) {\n oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr);\n }\n } else {\n this._activeBuffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert combining char at last cursor position\n // this._activeBuffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for this._activeBuffer.x to avoid overflow left\n if (shouldJoin && this._activeBuffer.x) {\n const offset = bufferRow.getWidth(this._activeBuffer.x - 1) ? 1 : 2;\n // if empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(this._activeBuffer.x - offset,\n code, chWidth);\n for (let delta = chWidth - oldWidth; --delta >= 0;) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n continue;\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr));\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr);\n }\n }\n }\n\n this._parser.precedingJoinState = precedingJoinState;\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr);\n }\n\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Forward registerCsiHandler from parser.\n */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.registerCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.registerCsiHandler(id, callback);\n }\n\n /**\n * Forward registerDcsHandler from parser.\n */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward registerEscHandler from parser.\n */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._parser.registerEscHandler(id, callback);\n }\n\n /**\n * Forward registerOscHandler from parser.\n */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * Forward registerApcHandler from parser.\n */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._parser.registerApcHandler(id, new ApcHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): boolean {\n this._onRequestBell.fire();\n return true;\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): boolean {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._optionsService.rawOptions.convertEol) {\n this._activeBuffer.x = 0;\n }\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n } else {\n // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n // the line. This is particularly important on conpty/Windows where revisiting lines to\n // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n // 21376 and above.\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (this._activeBuffer.x >= this._bufferService.cols) {\n this._activeBuffer.x--;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n this._onLineFeed.fire();\n return true;\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): boolean {\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): boolean {\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n }\n return true;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (this._activeBuffer.x > 0) {\n this._activeBuffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (this._activeBuffer.x === 0\n && this._activeBuffer.y > this._activeBuffer.scrollTop\n && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n this._activeBuffer.y--;\n this._activeBuffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n // cell further back\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n this._activeBuffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once\n // before early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n const originalX = this._activeBuffer.x;\n this._activeBuffer.x = this._activeBuffer.nextStop();\n if (this._optionsService.rawOptions.screenReaderMode) {\n this._onA11yTab.fire(this._activeBuffer.x - originalX);\n }\n return true;\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): boolean {\n this._charsetService.setgLevel(1);\n return true;\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): boolean {\n this._charsetService.setgLevel(0);\n return true;\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n this._activeBuffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._activeBuffer.x = x;\n this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n } else {\n this._activeBuffer.x = x;\n this._activeBuffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): boolean {\n // stop at scrollTop\n const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n return true;\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): boolean {\n // stop at scrollBottom\n const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n return true;\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): boolean {\n this._moveCursor(-(params.params[0] || 1), 0);\n return true;\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): boolean {\n this.cursorDown(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): boolean {\n this.cursorUp(params);\n this._activeBuffer.x = 0;\n return true;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): boolean {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1\n );\n return true;\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): boolean {\n this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): boolean {\n this._moveCursor(params.params[0] || 1, 0);\n return true;\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): boolean {\n this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n return true;\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): boolean {\n this._moveCursor(0, params.params[0] || 1);\n return true;\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): boolean {\n this.cursorPosition(params);\n return true;\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): boolean {\n const param = params.params[0];\n if (param === 0) {\n delete this._activeBuffer.tabs[this._activeBuffer.x];\n } else if (param === 3) {\n this._activeBuffer.tabs = {};\n }\n return true;\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.nextStop();\n }\n return true;\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): boolean {\n if (this._activeBuffer.x >= this._bufferService.cols) {\n return true;\n }\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.x = this._activeBuffer.prevStop();\n }\n return true;\n }\n\n /**\n * CSI Ps \" q Select Character Protection Attribute (DECSCA).\n *\n * @vt: #Y CSI DECSCA \"Select Character Protection Attribute\" \"CSI Ps \" q\" \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n */\n public selectProtected(params: IParams): boolean {\n const p = params.params[0];\n if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n return true;\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y The row index relative to the viewport.\n * @param start The start x index of the range to be erased.\n * @param end The end x index of the range to be erased (exclusive).\n * @param clearWrap clear the isWrapped flag\n * @param respectProtect Whether to respect the protection attribute (DECSCA).\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (!line) {\n return;\n }\n line.replaceCells(\n start,\n end,\n this._activeBuffer.getNullCell(this._eraseAttrData()),\n respectProtect\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n * the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n if (line) {\n line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n line.isWrapped = false;\n }\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #Y CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Same as ED with respecting protection flag.\"\n */\n public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(j);\n break;\n case 1:\n j = this._activeBuffer.y;\n this._dirtyRowTracker.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n const nextLine = this._activeBuffer.lines.get(j + 1);\n if (nextLine) {\n nextLine.isWrapped = false;\n }\n }\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n break;\n case 2:\n if (this._optionsService.rawOptions.scrollOnEraseInDisplay) {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markRangeDirty(0, j - 1);\n while (j--) {\n const currentLine = this._activeBuffer.lines.get(this._activeBuffer.ybase + j);\n if (currentLine?.getTrimmedLength()) {\n break;\n }\n }\n for (; j >= 0; j--) {\n this._bufferService.scroll(this._eraseAttrData());\n }\n }\n else {\n j = this._bufferService.rows;\n this._dirtyRowTracker.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j, respectProtect);\n }\n this._dirtyRowTracker.markDirty(0);\n }\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._activeBuffer.lines.trimStart(scrollBackSize);\n this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n // isUserScrolling tracks the normal buffer's viewport, so ED3 on the alt\n // screen must not touch it\n if (this._activeBuffer === this._bufferService.buffers.normal) {\n this._bufferService.isUserScrolling = false;\n }\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #Y CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Same as EL with respecting protecting flag.\"\n */\n public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n this._restrictCursor(this._bufferService.cols);\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n break;\n case 1:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n break;\n case 2:\n this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n break;\n }\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n return true;\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): boolean {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n\n const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n this._activeBuffer.lines.splice(row, 1);\n this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n return true;\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n * past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.insertCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to\n * the left. Character attributes move with the characters. The terminal adds blank characters at\n * the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.deleteCells(\n this._activeBuffer.x,\n params.params[0] || 1,\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): boolean {\n let param = params.params[0] || 1;\n\n while (param--) {\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n * outside the scrolling margins.\n */\n public insertColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): boolean {\n if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n return true;\n }\n const param = params.params[0] || 1;\n for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n return true;\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): boolean {\n this._restrictCursor();\n const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n if (line) {\n line.replaceCells(\n this._activeBuffer.x,\n this._activeBuffer.x + (params.params[0] || 1),\n this._activeBuffer.getNullCell(this._eraseAttrData())\n );\n this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n }\n return true;\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * We extend xterm's behavior to allow repeating entire grapheme clusters.\n * This isn't 100% xterm-compatible, but it seems saner and more useful.\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n * set. REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): boolean {\n const joinState = this._parser.precedingJoinState;\n if (!joinState) {\n return true;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const chWidth = UnicodeService.extractWidth(joinState);\n const x = this._activeBuffer.x - chWidth;\n const bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n const text = bufferRow.getString(x);\n const data = new Uint32Array(text.length * length);\n let idata = 0;\n for (let itext = 0; itext < text.length;) {\n const ch = text.codePointAt(itext) || 0;\n data[idata++] = ch;\n itext += ch > 0xffff ? 2 : 1;\n }\n let tlength = idata;\n for (let i = 1; i < length; ++i) {\n data.copyWithin(tlength, 0, idata);\n tlength += idata;\n }\n this.print(data, 0, tlength);\n return true;\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n return true;\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n return true;\n }\n\n /**\n * CSI > Ps q\n * Ps = 0 => Report xterm name and version (XTVERSION).\n *\n * The response is a DCS sequence identifying the version: DCS > | text ST\n *\n * @vt: #Y CSI XTVERSION \"Report Xterm Version\" \"CSI > q\" \"Report the terminal name and version.\"\n */\n public sendXtVersion(params: IParams): boolean {\n if (params.params[0] > 0) {\n return true;\n }\n this._coreService.triggerDataEvent(`${C0.ESC}P>|xterm.js(${XTERM_VERSION})${C0.ESC}\\\\`);\n return true;\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.rawOptions.termName + '').startsWith(term);\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). | #Y |\n */\n public setMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n this._optionsService.options.convertEol = true;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1016 | Enable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = true;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._mouseStateService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._mouseStateService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._mouseStateService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._mouseStateService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n this._onRequestSendFocus.fire();\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'SGR_PIXELS';\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n // Swap kitty keyboard flags: save main, restore alt\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.mainFlags = state.flags;\n state.flags = state.altFlags;\n }\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = true;\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = true;\n }\n break;\n case 9001: // win32-input-mode (https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md)\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = true;\n }\n break;\n }\n }\n return true;\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). | #Y |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n this._optionsService.options.convertEol = false;\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1016 | Disable SGR-Pixels Mouse Mode. | #Y |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): boolean {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {\n this._optionsService.options.cursorBlink = false;\n }\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._mouseStateService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 1016: // sgr pixels mode mouse\n this._mouseStateService.activeEncoding = 'DEFAULT';\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Swap kitty keyboard flags: save alt, restore main\n if (this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n const state = this._coreService.kittyKeyboard;\n state.altFlags = state.flags;\n state.flags = state.mainFlags;\n }\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(undefined);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n case 2026: // synchronized output (https://github.com/contour-terminal/vt-extensions/blob/master/synchronized-output.md)\n this._coreService.decPrivateModes.synchronizedOutput = false;\n this._onRequestRefreshRows.fire(undefined);\n break;\n case 2031: // color scheme updates (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._coreService.decPrivateModes.colorSchemeUpdates = false;\n }\n break;\n case 9001: // win32-input-mode\n if (this._optionsService.rawOptions.vtExtensions?.win32InputMode) {\n this._coreService.decPrivateModes.win32InputMode = false;\n }\n break;\n }\n }\n return true;\n }\n\n /**\n * CSI Ps $ p Request ANSI Mode (DECRQM).\n *\n * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n * and Pm is the mode value:\n * 0 - not recognized\n * 1 - set\n * 2 - reset\n * 3 - permanently set\n * 4 - permanently reset\n *\n * @vt: #Y CSI DECRQM \"Request Mode\" \"CSI Ps $p\" \"Request mode state.\"\n * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n * or DECSET/DECRST, and `Pm` is the mode value:\n * - 0: not recognized\n * - 1: set\n * - 2: reset\n * - 3: permanently set\n * - 4: permanently reset\n *\n * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n * that a certain operation mode is not implemented and cannot be used.\n *\n * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n * and only report, whether the alternate buffer is set.\n *\n * Mouse encodings and mouse protocols are handled mutual exclusive,\n * thus only one of each of those can be set at a given time.\n *\n * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n * e.g. if the default implementation already exposes a certain behavior. If you find\n * discrepancies in the mode reports, please file a bug.\n */\n public requestMode(params: IParams, ansi: boolean): boolean {\n // return value as in DECRPM\n const enum V {\n NOT_RECOGNIZED = 0,\n SET = 1,\n RESET = 2,\n PERMANENTLY_SET = 3,\n PERMANENTLY_RESET = 4\n }\n\n // access helpers\n const dm = this._coreService.decPrivateModes;\n const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService;\n const cs = this._coreService;\n const { buffers, cols } = this._bufferService;\n const { active, alt } = buffers;\n const opts = this._optionsService.rawOptions;\n\n const f = (m: number, v: V): boolean => {\n cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n return true;\n };\n const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n const p = params.params[0];\n\n if (ansi) {\n if (p === 2) return f(p, V.PERMANENTLY_RESET);\n if (p === 4) return f(p, b2v(cs.modes.insertMode));\n if (p === 12) return f(p, V.PERMANENTLY_SET);\n if (p === 20) return f(p, b2v(opts.convertEol));\n return f(p, V.NOT_RECOGNIZED);\n }\n\n if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n if (p === 6) return f(p, b2v(dm.origin));\n if (p === 7) return f(p, b2v(dm.wraparound));\n if (p === 8) return f(p, V.PERMANENTLY_SET);\n if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n if (p === 12) return f(p, b2v(opts.cursorBlink));\n if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n if (p === 45) return f(p, b2v(dm.reverseWraparound));\n if (p === 66) return f(p, b2v(dm.applicationKeypad));\n if (p === 67) return f(p, V.PERMANENTLY_RESET);\n if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n if (p === 1004) return f(p, b2v(dm.sendFocus));\n if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n if (p === 2026) return f(p, b2v(dm.synchronizedOutput));\n if (p === 9001) return this._optionsService.rawOptions.vtExtensions?.win32InputMode ? f(p, b2v(dm.win32InputMode)) : f(p, V.NOT_RECOGNIZED);\n return f(p, V.NOT_RECOGNIZED);\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n private _processSGR0(attr: IAttributeData): void {\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n attr.extended = attr.extended.clone();\n // Reset underline style and color. Note that we don't want to reset other\n // fields such as the url id.\n attr.extended.underlineStyle = UnderlineStyle.NONE;\n attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters (strikethrough). | #Y |\n * | 21 | Doubly underlined. | #Y |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out (strikethrough). | #Y |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 53 | Overlined. | #Y |\n * | 55 | Not Overlined. | #Y |\n * | 58 | Underline color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 221 | Not bold (kitty extension). | #Y |\n * | 222 | Not faint (kitty extension). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #Y |\n * | 3 | Curly underline. | #Y |\n * | 4 | Dotted underline. | #Y |\n * | 5 | Dashed underline. | #Y |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n * as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n */\n public charAttributes(params: IParams): boolean {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._processSGR0(this._curAttrData);\n return true;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n this._processSGR0(attr);\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 9) {\n // strikethrough\n attr.fg |= FgFlags.STRIKETHROUGH;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n this._processUnderline(UnderlineStyle.NONE, attr);\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 29) {\n // not strikethrough\n attr.fg &= ~FgFlags.STRIKETHROUGH;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & Attributes.RGB_MASK;\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & Attributes.RGB_MASK;\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 53) {\n // overline\n attr.bg |= BgFlags.OVERLINE;\n } else if (p === 55) {\n // not overline\n attr.bg &= ~BgFlags.OVERLINE;\n } else if (p === 221 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not bold (kitty extension)\n attr.fg &= ~FgFlags.BOLD;\n } else if (p === 222 && (this._optionsService.rawOptions.vtExtensions?.kittySgrBoldFaintControl ?? true)) {\n // not faint (kitty extension)\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n return true;\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): boolean {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n return true;\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): boolean {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._activeBuffer.y + 1;\n const x = this._activeBuffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n case 996:\n // color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n if (this._optionsService.rawOptions.vtExtensions?.colorSchemeQuery ?? true) {\n this._onRequestColorSchemeQuery.fire();\n }\n break;\n }\n return true;\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n * sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): boolean {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._activeBuffer.scrollTop = 0;\n this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._activeBuffer.savedX = 0;\n this._activeBuffer.savedY = this._activeBuffer.ybase;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n return true;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> reset to option.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - 0: reset to option\n * - empty, 1: blinking block\n * - 2: steady block\n * - 3: blinking underline\n * - 4: steady underline\n * - 5: blinking bar\n * - 6: steady bar\n */\n public setCursorStyle(params: IParams): boolean {\n const param = params.length === 0 ? 1 : params.params[0];\n if (param === 0) {\n this._coreService.decPrivateModes.cursorStyle = undefined;\n this._coreService.decPrivateModes.cursorBlink = undefined;\n } else {\n switch (param) {\n case 1:\n case 2:\n this._coreService.decPrivateModes.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._coreService.decPrivateModes.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._coreService.decPrivateModes.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._coreService.decPrivateModes.cursorBlink = isBlinking;\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): boolean {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._activeBuffer.scrollTop = top - 1;\n this._activeBuffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n return true;\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): boolean {\n if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n return true;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > Constants.STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > Constants.STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n return true;\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): boolean {\n this._activeBuffer.savedX = this._activeBuffer.x;\n this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._activeBuffer.savedCharset = this._charsetService.charset;\n this._activeBuffer.savedCharsets = this._charsetService.charsets.slice();\n this._activeBuffer.savedGlevel = this._charsetService.glevel;\n this._activeBuffer.savedOriginMode = this._coreService.decPrivateModes.origin;\n this._activeBuffer.savedWraparoundMode = this._coreService.decPrivateModes.wraparound;\n return true;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): boolean {\n this._activeBuffer.x = this._activeBuffer.savedX || 0;\n this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n for (let i = 0; i < this._activeBuffer.savedCharsets.length; i++) {\n this._charsetService.setgCharset(i, this._activeBuffer.savedCharsets[i]);\n }\n this._charsetService.setgLevel(this._activeBuffer.savedGlevel);\n this._coreService.decPrivateModes.origin = this._activeBuffer.savedOriginMode;\n this._coreService.decPrivateModes.wraparound = this._activeBuffer.savedWraparoundMode;\n this._restrictCursor();\n return true;\n }\n\n /**\n * OSC 2; ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event\n * `Terminal.onTitleChange`.\n */\n public setTitle(data: string): boolean {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n return true;\n }\n\n /**\n * OSC 1; ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): boolean {\n this._iconName = data;\n return true;\n }\n\n /**\n * OSC 4; ; ST (set ANSI color to )\n *\n * @vt: #Y OSC 4 \"Set ANSI color\" \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n * currently set color.\n */\n public setOrReportIndexedColor(data: string): boolean {\n const event: IColorEvent = [];\n const slots = data.split(';');\n while (slots.length > 1) {\n const idx = slots.shift() as string;\n const spec = slots.shift() as string;\n if (/^\\d+$/.exec(idx)) {\n const index = parseInt(idx, 10);\n if (isValidColorIndex(index)) {\n if (spec === '?') {\n event.push({ type: ColorRequestType.REPORT, index });\n } else {\n const color = parseColor(spec);\n if (color) {\n event.push({ type: ColorRequestType.SET, index, color });\n }\n }\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 8 ; ; ST - create hyperlink\n * OSC 8 ; ; ST - finish hyperlink\n *\n * Test case:\n *\n * ```sh\n * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n * ```\n *\n * @vt: #Y OSC 8 \"Create hyperlink\" \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n * optional list of key=value assignments, separated by the : character.\n * Example: `id=xyz123:foo=bar:baz=quux`.\n * Currently only the id key is defined. Cells that share the same ID and URI share hover\n * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n */\n public setHyperlink(data: string): boolean {\n // Arg parsing is special cases to support unencoded semi-colons in the URIs (#4944)\n const idx = data.indexOf(';');\n if (idx === -1) {\n // malformed sequence, just return as handled\n return true;\n }\n const id = data.slice(0, idx).trim();\n const uri = data.slice(idx + 1);\n if (uri) {\n return this._createHyperlink(id, uri);\n }\n if (id.trim()) {\n return false;\n }\n return this._finishHyperlink();\n }\n\n private _createHyperlink(params: string, uri: string): boolean {\n // It's legal to open a new hyperlink without explicitly finishing the previous one\n if (this._getCurrentLinkId()) {\n this._finishHyperlink();\n }\n const parsedParams = params.split(':');\n let id: string | undefined;\n const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n if (idParamIndex !== -1) {\n id = parsedParams[idParamIndex].slice(3) || undefined;\n }\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n this._curAttrData.updateExtended();\n return true;\n }\n\n private _finishHyperlink(): boolean {\n this._curAttrData.extended = this._curAttrData.extended.clone();\n this._curAttrData.extended.urlId = 0;\n this._curAttrData.updateExtended();\n return true;\n }\n\n // special colors - OSC 10 | 11 | 12\n private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n /**\n * Apply colors requests for special colors in OSC 10 | 11 | 12.\n * Since these commands are stacking from multiple parameters,\n * we handle them in a loop with an entry offset to `_specialColors`.\n */\n private _setOrReportSpecialColor(data: string, offset: number): boolean {\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i, ++offset) {\n if (offset >= this._specialColors.length) break;\n if (slots[i] === '?') {\n this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n } else {\n const color = parseColor(slots[i]);\n if (color) {\n this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n }\n }\n }\n return true;\n }\n\n /**\n * OSC 10 ; | ST - set or query default foreground color\n *\n * @vt: #Y OSC 10 \"Set or query default foreground color\" \"OSC 10 ; Pt BEL\" \"Set or query default foreground color.\"\n * To set the color, the following color specification formats are supported:\n * - `rgb://` for `, , ` in `h | hh | hhh | hhhh`, where\n * `h` is a single hexadecimal digit (case insignificant). The different widths scale\n * from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n * - `#RRGGBB` - 8 bits per channel\n * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n *\n * **Note:** X11 named colors are currently unsupported.\n *\n * If `Pt` contains `?` instead of a color specification, the terminal\n * returns a sequence with the current default foreground color\n * (use that sequence to restore the color after changes).\n *\n * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n */\n public setOrReportFgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 0);\n }\n\n /**\n * OSC 11 ; | ST - set or query default background color\n *\n * @vt: #Y OSC 11 \"Set or query default background color\" \"OSC 11 ; Pt BEL\" \"Same as OSC 10, but for default background.\"\n */\n public setOrReportBgColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 1);\n }\n\n /**\n * OSC 12 ; | ST - set or query default cursor color\n *\n * @vt: #Y OSC 12 \"Set or query default cursor color\" \"OSC 12 ; Pt BEL\" \"Same as OSC 10, but for default cursor color.\"\n */\n public setOrReportCursorColor(data: string): boolean {\n return this._setOrReportSpecialColor(data, 2);\n }\n\n /**\n * OSC 104 ; ST - restore ANSI color \n *\n * @vt: #Y OSC 104 \"Reset ANSI color\" \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n * specified by the loaded theme. Any number of `c` parameters may be given.\n * If no parameters are given, the entire indexed color table will be reset.\n */\n public restoreIndexedColor(data: string): boolean {\n if (!data) {\n this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n return true;\n }\n const event: IColorEvent = [];\n const slots = data.split(';');\n for (let i = 0; i < slots.length; ++i) {\n if (/^\\d+$/.exec(slots[i])) {\n const index = parseInt(slots[i], 10);\n if (isValidColorIndex(index)) {\n event.push({ type: ColorRequestType.RESTORE, index });\n }\n }\n }\n if (event.length) {\n this._onColor.fire(event);\n }\n return true;\n }\n\n /**\n * OSC 110 ST - restore default foreground color\n *\n * @vt: #Y OSC 110 \"Restore default foreground color\" \"OSC 110 BEL\" \"Restore default foreground to themed color.\"\n */\n public restoreFgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n return true;\n }\n\n /**\n * OSC 111 ST - restore default background color\n *\n * @vt: #Y OSC 111 \"Restore default background color\" \"OSC 111 BEL\" \"Restore default background to themed color.\"\n */\n public restoreBgColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n return true;\n }\n\n /**\n * OSC 112 ST - restore default cursor color\n *\n * @vt: #Y OSC 112 \"Restore default cursor color\" \"OSC 112 BEL\" \"Restore default cursor to themed color.\"\n */\n public restoreCursorColor(data: string): boolean {\n this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n return true;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): boolean {\n this._activeBuffer.x = 0;\n this.index();\n return true;\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): boolean {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): boolean {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n return true;\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): boolean {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n return true;\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): boolean {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return true;\n }\n if (collectAndFlag[0] === '/') {\n return true; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] ?? DEFAULT_CHARSET);\n return true;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): boolean {\n this._restrictCursor();\n this._activeBuffer.y++;\n if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n this._activeBuffer.y--;\n this._bufferService.scroll(this._eraseAttrData());\n } else if (this._activeBuffer.y >= this._bufferService.rows) {\n this._activeBuffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n return true;\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): boolean {\n this._activeBuffer.tabs[this._activeBuffer.x] = true;\n return true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): boolean {\n this._restrictCursor();\n if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n } else {\n this._activeBuffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n return true;\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n *\n * @vt: #Y ESC RIS \"Full Reset\" \"ESC c\" \"Reset to initial state.\"\n */\n public fullReset(): boolean {\n this._parser.reset();\n this._onRequestReset.fire();\n return true;\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): boolean {\n this._charsetService.setgLevel(level);\n return true;\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): boolean {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n const line = this._activeBuffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowTracker.markAllDirty();\n this._setCursor(0, 0);\n return true;\n }\n\n\n /**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[Limited support, see below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | `Ps \" q` (DECSCA 2 is reported as Ps = 0) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\n public requestStatusString(data: string, params: IParams): boolean {\n const f = (s: string): boolean => {\n this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n return true;\n };\n\n // access helpers\n const b = this._bufferService.buffer;\n const opts = this._optionsService.rawOptions;\n const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n if (data === '\"p') return f(`P1$r61;1\"p`);\n if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n // FIXME: report real SGR settings instead of 0m\n if (data === 'm') return f(`P1$r0m`);\n if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n return f(`P0$r`);\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n this._dirtyRowTracker.markRangeDirty(y1, y2);\n }\n\n // #region Kitty keyboard\n\n /**\n * CSI = flags ; mode u\n * Set Kitty keyboard protocol flags.\n * mode: 1=set, 2=set-only-specified, 3=reset-only-specified\n *\n * @vt: #Y CSI KKBDSET \"Kitty Keyboard Set\" \"CSI = Ps ; Pm u\" \"Set Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardSet(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const mode = params.length > 1 ? (params.params[1] || 1) : 1;\n const state = this._coreService.kittyKeyboard;\n\n switch (mode) {\n case 1: // Set all flags\n state.flags = flags;\n break;\n case 2: // Set only specified flags (OR)\n state.flags |= flags;\n break;\n case 3: // Reset only specified flags (AND NOT)\n state.flags &= ~flags;\n break;\n }\n return true;\n }\n\n /**\n * CSI ? u\n * Query Kitty keyboard protocol flags.\n * Terminal responds with CSI ? flags u\n *\n * @vt: #Y CSI KKBDQUERY \"Kitty Keyboard Query\" \"CSI ? u\" \"Query Kitty keyboard protocol flags.\"\n */\n public kittyKeyboardQuery(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = this._coreService.kittyKeyboard.flags;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`);\n return true;\n }\n\n /**\n * CSI > flags u\n * Push Kitty keyboard flags onto stack and set new flags.\n *\n * @vt: #Y CSI KKBDPUSH \"Kitty Keyboard Push\" \"CSI > Ps u\" \"Push keyboard flags to stack and set new flags.\"\n */\n public kittyKeyboardPush(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const flags = params.params[0] || 0;\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Evict oldest entry if stack is full (DoS protection, limit of 16)\n if (stack.length >= 16) {\n stack.shift();\n }\n\n // Push current flags onto stack and set new flags\n stack.push(state.flags);\n state.flags = flags;\n return true;\n }\n\n /**\n * CSI < count u\n * Pop Kitty keyboard flags from stack.\n *\n * @vt: #Y CSI KKBDPOP \"Kitty Keyboard Pop\" \"CSI < Ps u\" \"Pop keyboard flags from stack.\"\n */\n public kittyKeyboardPop(params: IParams): boolean {\n if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) {\n return true;\n }\n const count = Math.max(1, params.params[0] || 1);\n const state = this._coreService.kittyKeyboard;\n const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt;\n const stack = isAlt ? state.altStack : state.mainStack;\n\n // Pop specified number of entries from stack\n for (let i = 0; i < count && stack.length > 0; i++) {\n state.flags = stack.pop()!;\n }\n // If stack is empty after popping, reset to 0\n if (stack.length === 0 && count > 0) {\n state.flags = 0;\n }\n return true;\n }\n\n // #endregion\n}\n\nexport interface IDirtyRowTracker {\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n public start!: number;\n public end!: number;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this.start = this._bufferService.buffer.y;\n this.end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this.start) {\n this.start = y;\n } else if (y > this.end) {\n this.end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n $temp = y1;\n y1 = y2;\n y2 = $temp;\n }\n if (y1 < this.start) {\n this.start = y1;\n }\n if (y2 > this.end) {\n this.end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n\nexport function isValidColorIndex(value: number): value is ColorIndex {\n return 0 <= value && value < 256;\n}\n", "\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TimeoutTimer } from '../Async';\nimport { Disposable, toDisposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nconst enum Constants {\n /**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\n DISCARD_WATERMARK = 50000000, // ~50 MB\n /**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\n WRITE_TIMEOUT_MS = 12,\n /**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\n WRITE_BUFFER_LENGTH_THRESHOLD = 50\n}\n\nexport class WriteBuffer extends Disposable {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n private _isSyncWriting = false;\n private _syncCalls = 0;\n private _didUserInput = false;\n\n private readonly _innerWriteTimer = this._register(new TimeoutTimer());\n private readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {\n super();\n this._register(toDisposable(() => {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }));\n }\n\n public handleUserInput(): void {\n this._didUserInput = true;\n }\n\n /**\n * Flushes all pending writes synchronously. This is useful when you need to\n * ensure all queued data is processed before performing an operation that\n * depends upon everything being parsed like resize.\n *\n * Note: This is unreliable with async parser handlers as it does not wait for\n * promises to resolve.\n */\n public flushSync(): void {\n if (this._store.isDisposed) {\n return;\n }\n // exit early if another sync write loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // Process all pending chunks synchronously\n let chunk: string | Uint8Array | undefined;\n let didProcess = false;\n while (chunk = this._writeBuffer.shift()) {\n didProcess = true;\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n\n // Reset buffer state\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n\n this._isSyncWriting = false;\n if (didProcess) {\n this._onWriteParsed.fire();\n }\n }\n\n /**\n * @deprecated Unreliable, to be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._store.isDisposed) {\n return;\n }\n // stop writeSync recursions with maxSubsequentCalls argument\n // This is dangerous to use as it will lose the current data chunk\n // and return immediately.\n if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n // comment next line if a whole loop block should only contain x `writeSync` calls\n // (total flat vs. deep nested limit)\n this._syncCalls = 0;\n return;\n }\n // append chunk to buffer\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(undefined);\n\n // increase recursion counter\n this._syncCalls++;\n // exit early if another writeSync loop is active\n if (this._isSyncWriting) {\n return;\n }\n this._isSyncWriting = true;\n\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n // we have to do it here as single loop steps to not corrupt loop subject\n // by another writeSync call triggered from _action\n let chunk: string | Uint8Array | undefined;\n while (chunk = this._writeBuffer.shift()) {\n this._action(chunk);\n const cb = this._callbacks.shift();\n if (cb) cb();\n }\n // reset to avoid reprocessing of chunks with scheduled innerWrite call\n // stopping scheduled innerWrite by offset > length condition\n this._pendingData = 0;\n this._bufferOffset = 0x7FFFFFFF;\n\n // allow another writeSync to loop\n this._isSyncWriting = false;\n this._syncCalls = 0;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._store.isDisposed) {\n return;\n }\n if (this._pendingData > Constants.DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n\n // If this is the first write call after the user has done some input,\n // parse it immediately to minimize input latency,\n // otherwise schedule for the next event\n if (this._didUserInput) {\n this._didUserInput = false;\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n this._innerWrite();\n return;\n }\n\n this._scheduleInnerWrite();\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n /**\n * Inner write call, that enters the sliced chunk processing by timing.\n *\n * `lastTime` indicates, when the last _innerWrite call had started.\n * It is used to aggregate async handler execution under a timeout constraint\n * effectively lowering the redrawing needs, schematically:\n *\n * macroTask _innerWrite:\n * if (performance.now() - (lastTime | 0) < Constants.WRITE_TIMEOUT_MS):\n * schedule microTask _innerWrite(lastTime)\n * else:\n * schedule macroTask _innerWrite(0)\n *\n * overall execution order on task queues:\n *\n * macrotasks: [...] --> _innerWrite(0) --> [...] --> screenUpdate --> [...]\n * m t: |\n * i a: [...]\n * c s: |\n * r k: while < timeout:\n * o s: _innerWrite(timeout)\n *\n * `promiseResult` depicts the promise resolve value of an async handler.\n * This value gets carried forward through all saved stack states of the\n * paused parser for proper continuation.\n *\n * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n */\n private _scheduleInnerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n this._innerWriteTimer.cancelAndSet(() => this._innerWrite(lastTime, promiseResult), 0);\n }\n\n protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n if (this._store.isDisposed) {\n return;\n }\n const startTime = lastTime || performance.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const result = this._action(data, promiseResult);\n if (result) {\n /**\n * If we get a promise as return value, we re-schedule the continuation\n * as thenable on the promise and exit right away.\n *\n * The exit here means, that we block input processing at the current active chunk,\n * the exact execution position within the chunk is preserved by the saved\n * stack content in InputHandler and EscapeSequenceParser.\n *\n * Resuming happens automatically from that saved stack state.\n * Also the resolved promise value is passed along the callstack to\n * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n *\n * Exceptions on async handlers will be logged to console async, but do not interrupt\n * the input processing (continues with next handler at the current input position).\n */\n\n /**\n * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n * This might already be too late, if our .then enters really late (executor + prev thens\n * took very long). This cannot be solved here for the handler itself (it is the handlers\n * responsibility to slice hard work), but we can at least schedule a screen update as we\n * gain control.\n */\n const continuation: (r: boolean) => void = (r: boolean) => {\n if (this._store.isDisposed) {\n return;\n }\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n this._scheduleInnerWrite(0, r);\n } else {\n this._innerWrite(startTime, r);\n }\n };\n\n /**\n * Optimization considerations:\n * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n * This might schedule too many screen updates with bad throughput drops (in case a slow\n * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n * this condition here, also the renderer has no way to spot nonsense updates either.\n * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n *\n * If favoring of FPS shows bad throughput impact, use the following instead. It favors\n * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n * current microtask queue (executed before setTimeout).\n */\n // const continuation: (r: boolean) => void = performance.now() - startTime >=\n // Constants.WRITE_TIMEOUT_MS\n // ? r => setTimeout(() => this._innerWrite(0, r))\n // : r => this._innerWrite(startTime, r);\n\n // Handle exceptions synchronously to current band position, idea:\n // 1. spawn a single microtask which we allow to throw hard\n // 2. spawn a promise immediately resolving to `true`\n // (executed on the same queue, thus properly aligned before continuation happens)\n result.catch(err => {\n queueMicrotask(() => {throw err;});\n return Promise.resolve(false);\n }).then(continuation);\n return;\n }\n\n const cb = this._callbacks[this._bufferOffset];\n if (cb) cb();\n this._bufferOffset++;\n this._pendingData -= data.length;\n\n if (performance.now() - startTime >= Constants.WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > Constants.WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n this._scheduleInnerWrite();\n } else {\n this._writeBuffer.length = 0;\n this._callbacks.length = 0;\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n this._onWriteParsed.fire();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from './Services';\nimport { IOscLinkData } from '../Types';\nimport { IMarker } from '../buffer/Types';\n\nexport class OscLinkService implements IOscLinkService {\n public serviceBrand: any;\n\n private _nextId = 1;\n\n /**\n * A map of the link key to link entry. This is used to add additional lines to links with ids.\n */\n private _entriesWithId: Map = new Map();\n\n /**\n * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n * representation of a unique link should not be confused with \"id\" (string) which comes in with\n * `id=` in the OSC link's properties.\n */\n private _dataByLinkId: Map = new Map();\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n }\n\n public registerLink(data: IOscLinkData): number {\n const buffer = this._bufferService.buffer;\n\n // Links with no id will only ever be registered a single time\n if (data.id === undefined) {\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryNoId = {\n data,\n id: this._nextId++,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n // Add the line to the link if it already exists\n const castData = data as Required;\n const key = this._getEntryIdKey(castData);\n const match = this._entriesWithId.get(key);\n if (match) {\n this.addLineToLink(match.id, buffer.ybase + buffer.y);\n return match.id;\n }\n\n // Create the link\n const marker = buffer.addMarker(buffer.ybase + buffer.y);\n const entry: IOscLinkEntryWithId = {\n id: this._nextId++,\n key: this._getEntryIdKey(castData),\n data: castData,\n lines: [marker]\n };\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n this._entriesWithId.set(entry.key, entry);\n this._dataByLinkId.set(entry.id, entry);\n return entry.id;\n }\n\n public addLineToLink(linkId: number, y: number): void {\n const entry = this._dataByLinkId.get(linkId);\n if (!entry) {\n return;\n }\n if (entry.lines.every(e => e.line !== y)) {\n const marker = this._bufferService.buffer.addMarker(y);\n entry.lines.push(marker);\n marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n }\n }\n\n public getLinkData(linkId: number): IOscLinkData | undefined {\n return this._dataByLinkId.get(linkId)?.data;\n }\n\n private _getEntryIdKey(linkData: Required): string {\n return `${linkData.id};;${linkData.uri}`;\n }\n\n private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n const index = entry.lines.indexOf(marker);\n if (index === -1) {\n return;\n }\n entry.lines.splice(index, 1);\n if (entry.lines.length === 0) {\n if (entry.data.id !== undefined) {\n this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n }\n this._dataByLinkId.delete(entry.id);\n }\n }\n}\n\ninterface IOscLinkEntry {\n data: T;\n id: number;\n lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry> {\n key: string;\n}\n", "/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';\nimport { InstantiationService } from './services/InstantiationService';\nimport { LogService } from './services/LogService';\nimport { BufferService, BufferServiceConstants } from './services/BufferService';\nimport { OptionsService } from './services/OptionsService';\nimport { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';\nimport { IAttributeData, IBufferSet } from './buffer/Types';\nimport { CoreService } from './services/CoreService';\nimport { MouseStateService } from './services/MouseStateService';\nimport { UnicodeV6 } from './input/UnicodeV6';\nimport { UnicodeService } from './services/UnicodeService';\nimport { CharsetService } from './services/CharsetService';\nimport { updateWindowsModeWrappedState } from './WindowsMode';\nimport { IFunctionIdentifier } from './parser/Types';\nimport { InputHandler } from './InputHandler';\nimport { WriteBuffer } from './input/WriteBuffer';\nimport { OscLinkService } from './services/OscLinkService';\nimport { Emitter, EventUtils, type IEvent } from './Event';\nimport { Disposable, MutableDisposable, toDisposable } from './Lifecycle';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport interface ICoreTerminal {\n mouseStateService: IMouseStateService;\n coreService: ICoreService;\n optionsService: IOptionsService;\n unicodeService: IUnicodeService;\n buffers: IBufferSet;\n options: Required;\n registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable;\n registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable;\n registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable;\n registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable;\n registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable;\n}\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _oscLinkService: IOscLinkService;\n\n public readonly mouseStateService: IMouseStateService;\n public readonly coreService: ICoreService;\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsWrappingHeuristics = this._register(new MutableDisposable());\n\n private readonly _onBinary = this._register(new Emitter());\n public readonly onBinary = this._onBinary.event;\n private readonly _onData = this._register(new Emitter());\n public readonly onData = this._onData.event;\n protected _onLineFeed = this._register(new Emitter());\n public readonly onLineFeed = this._onLineFeed.event;\n protected readonly _onRender = this._register(new Emitter<{ start: number, end: number }>());\n public readonly onRender = this._onRender.event;\n private readonly _onResize = this._register(new Emitter<{ cols: number, rows: number }>());\n public readonly onResize = this._onResize.event;\n protected readonly _onWriteParsed = this._register(new Emitter());\n public readonly onWriteParsed = this._onWriteParsed.event;\n\n /**\n * Internally we track the source of the scroll but this is meaningless outside the library so\n * it's filtered out.\n */\n protected _onScrollApi?: Emitter;\n protected _onScroll = this._register(new Emitter());\n public get onScroll(): IEvent {\n if (!this._onScrollApi) {\n this._onScrollApi = this._register(new Emitter());\n this._onScroll.event(ev => {\n this._onScrollApi?.fire(ev.position);\n });\n }\n return this._onScrollApi.event;\n }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n public get options(): Required { return this.optionsService.options; }\n public set options(options: ITerminalOptions) {\n for (const key in options) {\n this.optionsService.options[key] = options[key];\n }\n }\n\n constructor(\n options: Partial\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = this._register(new OptionsService(options));\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._logService = this._register(this._instantiationService.createInstance(LogService));\n this._instantiationService.setService(ILogService, this._logService);\n this._bufferService = this._register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this.coreService = this._register(this._instantiationService.createInstance(CoreService));\n this._instantiationService.setService(ICoreService, this.coreService);\n this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));\n this._instantiationService.setService(IMouseStateService, this.mouseStateService);\n this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));\n this.unicodeService.register(new UnicodeV6());\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n\n // Register input handler and handle/forward events\n this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService));\n this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed));\n\n // Setup listeners\n this._register(EventUtils.forward(this._bufferService.onResize, this._onResize));\n this._register(EventUtils.forward(this.coreService.onData, this._onData));\n this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary));\n this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true)));\n this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput()));\n this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange()));\n this._register(this._bufferService.onScroll(() => {\n this._onScroll.fire({ position: this._bufferService.buffer.ydisp });\n this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n }));\n // Setup WriteBuffer\n this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n /**\n * Write data to terminal synchonously.\n *\n * This method is unreliable with async parser handlers, thus should not\n * be used anymore. If you need blocking semantics on data input consider\n * `write` with a callback instead.\n *\n * @deprecated Unreliable, will be removed soon.\n */\n public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n this._logService.warn('writeSync is unreliable and will be removed soon.');\n hasWriteSyncWarnHappened = true;\n }\n this._writeBuffer.writeSync(data, maxSubsequentCalls);\n }\n\n public input(data: string, wasUserInput: boolean = true): void {\n this.coreService.triggerDataEvent(data, wasUserInput);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, BufferServiceConstants.MINIMUM_COLS);\n y = Math.max(y, BufferServiceConstants.MINIMUM_ROWS);\n\n // Flush pending writes before resize to avoid race conditions where async\n // writes are processed with incorrect dimensions\n this._writeBuffer.flushSync();\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param eraseAttr The attribute data to use the for blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n this._bufferService.scroll(eraseAttr, isWrapped);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n * unwanted events being handled by the viewport when the event was triggered from the viewport\n * originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n this._bufferService.scrollLines(disp, suppressScrollEvent);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise): IDisposable {\n return this._inputHandler.registerEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise): IDisposable {\n return this._inputHandler.registerCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerOscHandler(ident, callback);\n }\n\n /** Add handler for APC escape sequence. See xterm.d.ts for details. */\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._inputHandler.registerApcHandler(id, callback);\n }\n\n protected _setup(): void {\n this._handleWindowsPtyOptionChange();\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this.coreService.reset();\n this.mouseStateService.reset();\n }\n\n\n private _handleWindowsPtyOptionChange(): void {\n let value = false;\n const windowsPty = this.optionsService.rawOptions.windowsPty;\n if (windowsPty && windowsPty.backend !== undefined && windowsPty.buildNumber !== undefined) {\n value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n }\n if (value) {\n this._enableWindowsWrappingHeuristics();\n } else {\n this._windowsWrappingHeuristics.clear();\n }\n }\n\n protected _enableWindowsWrappingHeuristics(): void {\n if (!this._windowsWrappingHeuristics.value) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsWrappingHeuristics.value = toDisposable(() => {\n for (const d of disposables) {\n d.dispose();\n }\n });\n }\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IdleTaskQueue } from './TaskQueue';\nimport type { ILogService } from './services/Services';\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. Deferred\n * batch insertion and deletion is used to significantly reduce the time it takes to insert and\n * delete a large amount of items in succession. This list is based on binary search and as such\n * locating a key will take O(log n) amortized, this includes the by key iterator.\n */\nexport class SortedList {\n private _array: T[] = [];\n\n private readonly _insertedValues: T[] = [];\n private readonly _flushInsertedTask: InstanceType;\n private _isFlushingInserted = false;\n\n private readonly _deletedIndices: number[] = [];\n private readonly _flushDeletedTask: InstanceType;\n private _isFlushingDeleted = false;\n\n constructor(\n private readonly _getKey: (value: T) => number,\n logService: ILogService\n ) {\n this._flushInsertedTask = new IdleTaskQueue(logService);\n this._flushDeletedTask = new IdleTaskQueue(logService);\n }\n\n public clear(): void {\n this._array.length = 0;\n this._insertedValues.length = 0;\n this._flushInsertedTask.clear();\n this._isFlushingInserted = false;\n this._deletedIndices.length = 0;\n this._flushDeletedTask.clear();\n this._isFlushingDeleted = false;\n }\n\n public insert(value: T): void {\n this._flushCleanupDeleted();\n if (this._insertedValues.length === 0) {\n this._flushInsertedTask.enqueue(() => this._flushInserted());\n }\n this._insertedValues.push(value);\n }\n\n private _flushInserted(): void {\n const sortedAddedValues = this._insertedValues.sort((a, b) => this._getKey(a) - this._getKey(b));\n let sortedAddedValuesIndex = 0;\n let arrayIndex = 0;\n\n const newArray = new Array(this._array.length + this._insertedValues.length);\n\n for (let newArrayIndex = 0; newArrayIndex < newArray.length; newArrayIndex++) {\n if (arrayIndex >= this._array.length || this._getKey(sortedAddedValues[sortedAddedValuesIndex]) <= this._getKey(this._array[arrayIndex])) {\n newArray[newArrayIndex] = sortedAddedValues[sortedAddedValuesIndex];\n sortedAddedValuesIndex++;\n } else {\n newArray[newArrayIndex] = this._array[arrayIndex++];\n }\n }\n\n this._array = newArray;\n this._insertedValues.length = 0;\n }\n\n private _flushCleanupInserted(): void {\n if (!this._isFlushingInserted && this._insertedValues.length > 0) {\n this._flushInsertedTask.flush();\n }\n }\n\n public delete(value: T): boolean {\n this._flushCleanupInserted();\n if (this._array.length === 0) {\n return false;\n }\n const key = this._getKey(value);\n if (key === undefined) {\n return false;\n }\n if (this._deleteAtKey(value, key)) {\n return true;\n }\n // A pending deletion whose key mutated after `delete()` (disposing a marker\n // resets `line` to -1, and `line` is the sort key) leaves `_array` out of\n // order, so the binary search above can miss a value that is present.\n // Compacting those entries out restores the order; retry before reporting\n // the value absent, else its `onDecorationRemoved` never fires and the\n // decoration paints forever. Miss path only, so the common bulk delete\n // keeps its O(log n) search and deferred-compaction batching.\n if (this._deletedIndices.length === 0) {\n return false;\n }\n this._flushCleanupDeleted();\n return this._deleteAtKey(value, key);\n }\n\n private _deleteAtKey(value: T, key: number): boolean {\n i = this._search(key);\n if (i === -1) {\n return false;\n }\n if (this._getKey(this._array[i]) !== key) {\n return false;\n }\n do {\n if (this._array[i] === value) {\n if (this._deletedIndices.length === 0) {\n this._flushDeletedTask.enqueue(() => this._flushDeleted());\n }\n this._deletedIndices.push(i);\n return true;\n }\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n return false;\n }\n\n private _flushDeleted(): void {\n this._isFlushingDeleted = true;\n const sortedDeletedIndices = this._deletedIndices.sort((a, b) => a - b);\n let sortedDeletedIndicesIndex = 0;\n const newArray = new Array(this._array.length - sortedDeletedIndices.length);\n let newArrayIndex = 0;\n for (let i = 0; i < this._array.length; i++) {\n if (sortedDeletedIndices[sortedDeletedIndicesIndex] === i) {\n sortedDeletedIndicesIndex++;\n } else {\n newArray[newArrayIndex++] = this._array[i];\n }\n }\n this._array = newArray;\n this._deletedIndices.length = 0;\n this._isFlushingDeleted = false;\n }\n\n private _flushCleanupDeleted(): void {\n if (!this._isFlushingDeleted && this._deletedIndices.length > 0) {\n this._flushDeletedTask.flush();\n }\n }\n\n public *getKeyIterator(key: number): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n yield this._array[i];\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public forEachByKey(key: number, callback: (value: T) => void): void {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n if (this._array.length === 0) {\n return;\n }\n i = this._search(key);\n if (i < 0 || i >= this._array.length) {\n return;\n }\n if (this._getKey(this._array[i]) !== key) {\n return;\n }\n do {\n callback(this._array[i]);\n } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n }\n\n public values(): IterableIterator {\n this._flushCleanupInserted();\n this._flushCleanupDeleted();\n // Duplicate the array to avoid issues when _array changes while iterating\n return [...this._array].values();\n }\n\n private _search(key: number): number {\n let min = 0;\n let max = this._array.length - 1;\n while (max >= min) {\n let mid = (min + max) >> 1;\n const midKey = this._getKey(this._array[mid]);\n if (midKey > key) {\n max = mid - 1;\n } else if (midKey < key) {\n min = mid + 1;\n } else {\n // key in list, walk to lowest duplicate\n while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n mid--;\n }\n return mid;\n }\n }\n // key not in list\n // still return closest min (also used as insert position)\n return min;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ICircularList, IDeleteEvent, IInsertEvent } from '../CircularList';\nimport { MicrotaskTimer } from '../Async';\nimport { css } from '../Color';\nimport { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration, ILogService } from './Services';\nimport { SortedList } from '../SortedList';\nimport { IColor } from '../Types';\nimport { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';\nimport { Emitter } from '../Event';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n public serviceBrand: any;\n\n /**\n * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n * while marker line values do change, they should all change by the same amount so this should\n * never become out of order.\n */\n private readonly _decorations: SortedList;\n\n private readonly _lineCache = this._register(new DecorationLineCache());\n\n private readonly _onDecorationRegistered = this._register(new Emitter());\n public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n private readonly _onDecorationRemoved = this._register(new Emitter());\n public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n public get decorations(): IterableIterator { return this._decorations.values(); }\n\n constructor(\n @ILogService private readonly _logService: ILogService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n\n this._decorations = new SortedList(e => e?.marker.line, this._logService);\n\n this._register(toDisposable(() => this.reset()));\n this._register(this._bufferService.buffers.onBufferActivate(() => {\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }));\n this._lineCache.attachToBufferLines(this._bufferService.buffer.lines);\n }\n\n public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n if (options.marker.isDisposed) {\n return undefined;\n }\n const decoration = new Decoration(options);\n if (decoration) {\n const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n const listener = decoration.onDispose(() => {\n listener.dispose();\n if (decoration) {\n if (this._decorations.delete(decoration)) {\n this._lineCache.remove(decoration);\n this._onDecorationRemoved.fire(decoration);\n }\n markerDispose.dispose();\n }\n });\n this._decorations.insert(decoration);\n this._lineCache.add(decoration);\n this._onDecorationRegistered.fire(decoration);\n }\n return decoration;\n }\n\n public reset(): void {\n for (const d of this._decorations.values()) {\n d.dispose();\n }\n this._decorations.clear();\n this._lineCache.clear();\n }\n\n public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n yield d;\n }\n }\n }\n\n public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n const bucket = this._lineCache.getDecorationsOnLine(line);\n if (!bucket) {\n return;\n }\n for (const d of bucket) {\n $xmin = d.options.x ?? 0;\n $xmax = $xmin + (d.options.width ?? 1);\n if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n callback(d);\n }\n }\n }\n}\n\n/**\n * Per-logical-line index of decorations for fast cell lookup.\n *\n * Keys are marker.line coordinates (logical buffer lines), not CircularList ring slots.\n * Multi-line decorations appear in every line bucket they span. The index is kept aligned\n * with marker.line updates via buffer line trim/insert/delete events.\n */\nexport class DecorationLineCache extends Disposable {\n private readonly _decorationsByLine: Map = new Map();\n private readonly _decorations = new Set();\n private readonly _bufferLineListeners = this._register(new MutableDisposable());\n private readonly _lineIndexSyncTimer = this._register(new MicrotaskTimer());\n private _lineIndexSyncCallbacks: (() => void)[] = [];\n\n public clear(): void {\n this._lineIndexSyncCallbacks.length = 0;\n this._lineIndexSyncTimer.cancel();\n this._decorationsByLine.clear();\n this._decorations.clear();\n }\n\n public add(decoration: IInternalDecoration): void {\n this._decorations.add(decoration);\n this._addToLineBuckets(decoration);\n }\n\n public remove(decoration: IInternalDecoration): void {\n this._decorations.delete(decoration);\n this._removeFromLineBuckets(decoration);\n }\n\n public getDecorationsOnLine(line: number): ReadonlyArray | undefined {\n return this._decorationsByLine.get(line);\n }\n\n public attachToBufferLines(lines: ICircularList): void {\n const store = new DisposableStore();\n this._bufferLineListeners.value = store;\n store.add(lines.onTrim(amount => this._handleBufferLinesTrim(amount)));\n store.add(lines.onInsert(event => this._handleBufferLinesInsert(event)));\n store.add(lines.onDelete(event => this._handleBufferLinesDelete(event)));\n }\n\n private _getDecorationHeight(decoration: IInternalDecoration): number {\n return decoration.options.height ?? 1;\n }\n\n private _addToLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration.marker.line;\n if (start < 0) {\n return;\n }\n decoration._indexedStartLine = start;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n let bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n bucket = [];\n this._decorationsByLine.set(line, bucket);\n }\n bucket.push(decoration);\n }\n }\n\n private _removeFromLineBuckets(decoration: IInternalDecoration): void {\n const start = decoration._indexedStartLine;\n const height = this._getDecorationHeight(decoration);\n for (let line = start; line < start + height; line++) {\n const bucket = this._decorationsByLine.get(line);\n if (!bucket) {\n continue;\n }\n const index = bucket.indexOf(decoration);\n if (index !== -1) {\n bucket.splice(index, 1);\n }\n if (bucket.length === 0) {\n this._decorationsByLine.delete(line);\n }\n }\n }\n\n private _reindexDecoration(decoration: IInternalDecoration): void {\n this._removeFromLineBuckets(decoration);\n if (!decoration.marker.isDisposed && decoration.marker.line >= 0) {\n this._addToLineBuckets(decoration);\n }\n }\n\n /** Re-index after marker line updates (buffer listeners may run before markers). */\n private _scheduleLineIndexSync(callback: () => void): void {\n this._lineIndexSyncCallbacks.push(callback);\n this._lineIndexSyncTimer.set(() => {\n const callbacks = this._lineIndexSyncCallbacks;\n this._lineIndexSyncCallbacks = [];\n for (const cb of callbacks) {\n cb();\n }\n });\n }\n\n private _handleBufferLinesTrim(amount: number): void {\n if (amount <= 0 || !this._decorationsByLine.size) {\n return;\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line - amount;\n if (newLine < 0) {\n continue;\n }\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (!d.marker.isDisposed) {\n d._indexedStartLine -= amount;\n }\n }\n }\n\n private _handleBufferLinesInsert(event: IInsertEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesInsert(event));\n }\n\n private _handleBufferLinesDelete(event: IDeleteEvent): void {\n this._scheduleLineIndexSync(() => this._applyBufferLinesDelete(event));\n }\n\n private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void {\n const existing = newMap.get(line);\n if (existing) {\n for (let i = 0, len = bucket.length; i < len; i++) {\n existing.push(bucket[i]);\n }\n } else {\n newMap.set(line, bucket.slice());\n }\n }\n\n /**\n * Shift indexed line keys and sync start lines. O(unique indexed lines), not O(decoration count).\n * Decorations that span the insert point are re-indexed individually (rare vs single-line hits).\n */\n private _applyBufferLinesInsert(event: IInsertEvent): void {\n const { index, amount } = event;\n const spanCrossers: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n if (start < index && start + this._getDecorationHeight(d) > index) {\n spanCrossers.push(d);\n this._removeFromLineBuckets(d);\n }\n }\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n const newLine = line >= index ? line + amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n if (d._indexedStartLine >= index) {\n d._indexedStartLine = d.marker.line;\n }\n }\n for (const d of spanCrossers) {\n this._addToLineBuckets(d);\n }\n }\n\n /**\n * Drop deleted line keys, shift keys below, sync start lines. Full re-index only when a\n * multi-line decoration spans across the deleted range but survives.\n */\n private _applyBufferLinesDelete(event: IDeleteEvent): void {\n const deleteEnd = event.index + event.amount;\n const newMap = new Map();\n for (const [line, bucket] of this._decorationsByLine) {\n if (line >= event.index && line < deleteEnd) {\n continue;\n }\n const newLine = line >= deleteEnd ? line - event.amount : line;\n this._mergeLineBucket(newMap, newLine, bucket);\n }\n this._decorationsByLine.clear();\n for (const [line, bucket] of newMap) {\n this._decorationsByLine.set(line, bucket);\n }\n const toReindex: IInternalDecoration[] = [];\n for (const d of this._decorations) {\n if (d.marker.isDisposed) {\n continue;\n }\n const start = d._indexedStartLine;\n const height = this._getDecorationHeight(d);\n if (start >= deleteEnd) {\n d._indexedStartLine = d.marker.line;\n } else if (start < event.index && start + height > deleteEnd) {\n toReindex.push(d);\n }\n }\n for (const d of toReindex) {\n this._reindexDecoration(d);\n }\n }\n}\n\nclass Decoration extends DisposableStore implements IInternalDecoration {\n public readonly marker: IMarker;\n public element: HTMLElement | undefined;\n\n /** Start line used for line-index removal when marker.line is cleared on dispose. */\n public _indexedStartLine: number;\n\n public readonly onRenderEmitter = this.add(new Emitter());\n public readonly onRender = this.onRenderEmitter.event;\n private readonly _onDispose = this.add(new Emitter());\n public readonly onDispose = this._onDispose.event;\n\n private _cachedBg: IColor | undefined | null = null;\n public get backgroundColorRGB(): IColor | undefined {\n if (this._cachedBg === null) {\n if (this.options.backgroundColor) {\n this._cachedBg = css.toColor(this.options.backgroundColor);\n } else {\n this._cachedBg = undefined;\n }\n }\n return this._cachedBg;\n }\n\n private _cachedFg: IColor | undefined | null = null;\n public get foregroundColorRGB(): IColor | undefined {\n if (this._cachedFg === null) {\n if (this.options.foregroundColor) {\n this._cachedFg = css.toColor(this.options.foregroundColor);\n } else {\n this._cachedFg = undefined;\n }\n }\n return this._cachedFg;\n }\n\n constructor(\n public readonly options: IDecorationOptions\n ) {\n super();\n this.marker = options.marker;\n this._indexedStartLine = options.marker.line;\n if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n this.options.overviewRulerOptions.position = 'full';\n }\n }\n\n public override dispose(): void {\n this._onDispose.fire();\n super.dispose();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncer } from './Types';\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n\n // The last moment that the Terminal was refreshed at\n private _lastRefreshMs = 0;\n // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n private _additionalRefreshRequested = false;\n\n private _refreshTimeoutID: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void,\n private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n ) {\n }\n\n public dispose(): void {\n if (this._refreshTimeoutID) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n }\n this._additionalRefreshRequested = false;\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart ?? 0;\n rowEnd = rowEnd ?? this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n // enough time to pass before refreshing again.\n const refreshRequestTime: number = performance.now();\n if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n // Enough time has elapsed since the last refresh; refresh immediately\n if (this._refreshTimeoutID !== undefined) {\n clearTimeout(this._refreshTimeoutID);\n this._refreshTimeoutID = undefined;\n this._additionalRefreshRequested = false;\n }\n this._lastRefreshMs = refreshRequestTime;\n this._innerRefresh();\n } else if (!this._additionalRefreshRequested) {\n // This is the first additional request throttled; set up trailing refresh\n const elapsed = refreshRequestTime - this._lastRefreshMs;\n const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n this._additionalRefreshRequested = true;\n\n this._refreshTimeoutID = window.setTimeout(() => {\n this._lastRefreshMs = performance.now();\n this._innerRefresh();\n this._additionalRefreshRequested = false;\n this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n }, waitPeriodBeforeTrailingRefresh);\n }\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from './LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from './Types';\nimport { TimeBasedDebouncer } from './TimeBasedDebouncer';\nimport { Disposable, toDisposable } from '../common/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from './services/Services';\nimport { IBuffer } from '../common/buffer/Types';\nimport { IInstantiationService } from '../common/services/Services';\nimport { addDisposableListener } from './Dom';\n\nconst enum Constants {\n MAX_ROWS_TO_READ = 20\n}\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\n// Turn this on to unhide the accessibility tree and display it under\n// (instead of overlapping with) the terminal.\nconst DEBUG = false;\n\nexport class AccessibilityManager extends Disposable {\n private _debugRootContainer: HTMLElement | undefined;\n private _accessibilityContainer: HTMLElement;\n\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _rowColumns: WeakMap = new WeakMap();\n\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n private _liveRegionDebouncer: IRenderDebouncer;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n @IInstantiationService instantiationService: IInstantiationService,\n @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n const doc = this._coreBrowserService.mainDocument;\n this._accessibilityContainer = doc.createElement('div');\n this._accessibilityContainer.classList.add('xterm-accessibility');\n\n this._rowContainer = doc.createElement('div');\n this._rowContainer.setAttribute('role', 'list');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._accessibilityContainer.appendChild(this._rowContainer);\n\n this._liveRegion = doc.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityContainer.appendChild(this._liveRegion);\n this._liveRegionDebouncer = this._register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n\n if (DEBUG) {\n this._accessibilityContainer.classList.add('debug');\n this._rowContainer.classList.add('debug');\n\n // Use a `
` container so that the css will still apply.\n this._debugRootContainer = doc.createElement('div');\n this._debugRootContainer.classList.add('xterm');\n\n this._debugRootContainer.appendChild(doc.createTextNode('------start a11y------'));\n this._debugRootContainer.appendChild(this._accessibilityContainer);\n this._debugRootContainer.appendChild(doc.createTextNode('------end a11y------'));\n\n this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer);\n } else {\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n }\n\n this._register(this._terminal.onResize(e => this._handleResize(e.rows)));\n this._register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this._register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this._register(this._terminal.onA11yChar(char => this._handleChar(char)));\n this._register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n this._register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n this._register(this._terminal.onKey(e => this._handleKey(e.key)));\n this._register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this._register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n this._register(addDisposableListener(doc, 'selectionchange', () => this._handleSelectionChange()));\n this._register(this._coreBrowserService.onDprChange(() => this._refreshRowsDimensions()));\n\n this._refreshRowsDimensions();\n this._refreshRows();\n this._register(toDisposable(() => {\n if (DEBUG) {\n this._debugRootContainer!.remove();\n } else {\n this._accessibilityContainer.remove();\n }\n this._rowElements.length = 0;\n }));\n }\n\n private _handleTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._handleChar(' ');\n }\n }\n\n private _handleChar(char: string): void {\n if (this._liveRegionLineCount < Constants.MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === Constants.MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent = Strings.tooMuchOutput.get();\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n }\n\n private _handleKey(keyChar: string): void {\n this._clearLiveRegion();\n // Only add the char if there is no control character.\n if (!/\\p{Control}/u.test(keyChar)) {\n this._charsToConsume.push(keyChar);\n }\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const line = buffer.lines.get(buffer.ydisp + i);\n const columns: number[] = [];\n const lineData = line?.translateToString(true, undefined, undefined, columns) || '';\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.textContent = '\\u00a0';\n this._rowColumns.set(element, [0, 1]);\n } else {\n element.textContent = lineData;\n this._rowColumns.set(element, columns);\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n this._alignRowWidth(element);\n }\n }\n this._announceCharacters();\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n if (this._liveRegion.textContent === Strings.tooMuchOutput.get()) {\n this._clearLiveRegion();\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n\n private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = e.target as HTMLElement;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _handleSelectionChange(): void {\n if (this._rowElements.length === 0) {\n return;\n }\n\n const selection = this._coreBrowserService.mainDocument.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.isCollapsed) {\n // Only do something when the anchorNode is inside the row container. This\n // behavior mirrors what we do with mouse --- if the mouse clicks\n // somewhere outside of the terminal, we don't clear the selection.\n if (this._rowContainer.contains(selection.anchorNode)) {\n this._terminal.clearSelection();\n }\n return;\n }\n\n if (!selection.anchorNode || !selection.focusNode) {\n console.error('anchorNode and/or focusNode are null');\n return;\n }\n\n // Sort the two selection points in document order.\n let begin = { node: selection.anchorNode, offset: selection.anchorOffset };\n let end = { node: selection.focusNode, offset: selection.focusOffset };\n if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) {\n [begin, end] = [end, begin];\n }\n\n // Clamp begin/end to the inside of the row container.\n if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) {\n begin = { node: this._rowElements[0].childNodes[0], offset: 0 };\n }\n if (!this._rowContainer.contains(begin.node)) {\n // This happens when `begin` is below the last row.\n return;\n }\n const lastRowElement = this._rowElements.slice(-1)[0];\n if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) {\n end = {\n node: lastRowElement,\n offset: lastRowElement.textContent?.length ?? 0\n };\n }\n if (!this._rowContainer.contains(end.node)) {\n // This happens when `end` is above the first row.\n return;\n }\n\n const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => {\n // `node` is either the row element or the Text node inside it.\n const rowElement: any = node instanceof Text ? node.parentNode : node;\n let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1;\n if (isNaN(row)) {\n console.warn('row is invalid. Race condition?');\n return null;\n }\n\n const columns = this._rowColumns.get(rowElement);\n if (!columns) {\n console.warn('columns is null. Race condition?');\n return null;\n }\n\n let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1;\n if (column >= this._terminal.cols) {\n ++row;\n column = 0;\n }\n return {\n row,\n column\n };\n };\n\n const beginRowColumn = toRowColumn(begin);\n const endRowColumn = toRowColumn(end);\n\n if (!beginRowColumn || !endRowColumn) {\n return;\n }\n\n if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) {\n // This should not happen unless we have some bugs.\n throw new Error('invalid range');\n }\n\n this._terminal.select(\n beginRowColumn.column,\n beginRowColumn.row,\n (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column\n );\n }\n\n private _handleResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = this._coreBrowserService.mainDocument.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.css.cell.height) {\n return;\n }\n Object.assign(this._accessibilityContainer.style, {\n width: `${this._renderService.dimensions.css.canvas.width}px`,\n fontSize: `${this._terminal.options.fontSize}px`\n });\n if (this._rowElements.length !== this._terminal.rows) {\n this._handleResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n this._alignRowWidth(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n }\n\n /**\n * Scale the width of a row so that each of the character is (mostly) aligned\n * with the actual rendering. This will allow the screen reader to draw\n * selection outline at the correct position.\n *\n * On top of using the \"monospace\" font and correct font size, the scaling\n * here is necessary to handle characters that are not covered by the font\n * (e.g. CJK).\n */\n private _alignRowWidth(element: HTMLElement): void {\n element.style.transform = '';\n const width = element.getBoundingClientRect().width;\n const lastColumn = this._rowColumns.get(element)?.slice(-1)?.[0];\n if (!lastColumn) {\n return;\n }\n const targetWidth = lastColumn * this._renderService.dimensions.css.cell.width;\n element.style.transform = `scaleX(${targetWidth / width})`;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';\nimport { Disposable, dispose, toDisposable } from '../common/Lifecycle';\nimport { IDisposable } from '../common/Types';\nimport { IBufferService } from '../common/services/Services';\nimport { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';\nimport { Emitter } from '../common/Event';\nimport { addDisposableListener } from './Dom';\n\nexport class Linkifier extends Disposable implements ILinkifier2 {\n public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n protected _currentLink: ILinkWithState | undefined;\n private _mouseDownLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _wasResized: boolean = false;\n private _activeProviderReplies: Map | undefined;\n private _activeLine: number = -1;\n\n private readonly _onShowLinkUnderline = this._register(new Emitter());\n public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n private readonly _onHideLinkUnderline = this._register(new Emitter());\n public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n constructor(\n private readonly _element: HTMLElement,\n @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService,\n @IRenderService private readonly _renderService: IRenderService,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILinkProviderService private readonly _linkProviderService: ILinkProviderService\n ) {\n super();\n this._register(toDisposable(() => {\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n this._lastMouseEvent = undefined;\n // Clear out link providers as they could easily cause an embedder memory leak\n this._activeProviderReplies?.clear();\n }));\n // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n this._register(this._bufferService.onResize(() => {\n this._clearCurrentLink();\n this._wasResized = true;\n }));\n this._register(addDisposableListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this._register(addDisposableListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n this._register(addDisposableListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n this._register(addDisposableListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n }\n\n private _handleMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._handleHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _handleHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n // should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y || this._wasResized) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n this._wasResized = false;\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies?.forEach(reply => {\n reply?.forEach(linkWithState => {\n if (linkWithState.link.dispose) {\n linkWithState.link.dispose();\n }\n });\n });\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n for (const [i, linkProvider] of this._linkProviderService.linkProviders.entries()) {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviderService.linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n }\n }\n\n private _removeIntersectingLinks(y: number, replies: Map): void {\n const occupiedCells = new Set();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviderService.linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _handleMouseDown(): void {\n this._mouseDownLink = this._currentLink;\n }\n\n private _handleMouseUp(event: MouseEvent): void {\n if (!this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element);\n if (!position) {\n return;\n }\n\n if (this._mouseDownLink && linkEquals(this._mouseDownLink.link, this._currentLink.link) && this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n dispose(this._linkCacheDisposables);\n this._linkCacheDisposables.length = 0;\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._lastMouseEvent) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Listen to viewport changes to re-render the link under the cursor (only when the line the\n // link is on changes)\n this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n // Sanity check, this shouldn't happen in practice as this listener would be disposed\n if (!this._currentLink) {\n return;\n }\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n const end = this._bufferService.buffer.ydisp + 1 + e.end;\n // Only clear the link if the viewport change happened on this line\n if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n this._clearCurrentLink(start, end);\n if (this._lastMouseEvent) {\n // re-eval previously active link after changes\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element);\n if (position) {\n this._askForLink(position, false);\n }\n }\n }\n }));\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n const current = position.y * this._bufferService.cols + position.x;\n return (lower <= current && current <= upper);\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined {\n const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nfunction linkEquals(a: ILink, b: ILink): boolean {\n return (\n a.text === b.text &&\n a.range.start.x === b.range.start.x &&\n a.range.start.y === b.range.start.y &&\n a.range.end.x === b.range.end.x &&\n a.range.end.y === b.range.end.y\n );\n}\n", "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';\nimport * as Strings from './LocalizableStrings';\nimport { OscLinkProvider } from './OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';\nimport { Viewport } from './Viewport';\nimport { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from './input/CompositionHelper';\nimport { DomRenderer } from './renderer/dom/DomRenderer';\nimport { IRenderer } from './renderer/shared/Types';\nimport { CharSizeService } from './services/CharSizeService';\nimport { CharacterJoinerService } from './services/CharacterJoinerService';\nimport { CoreBrowserService } from './services/CoreBrowserService';\nimport { LinkProviderService } from './services/LinkProviderService';\nimport { MouseCoordsService } from './services/MouseCoordsService';\nimport { MouseEventCssClasses, MouseService } from './services/MouseService';\nimport { RenderService } from './services/RenderService';\nimport { SelectionService } from './services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';\nimport { ThemeService } from './services/ThemeService';\nimport { KeyboardService } from './services/KeyboardService';\nimport { channels, color, rgb } from '../common/Color';\nimport { CoreTerminal } from '../common/CoreTerminal';\nimport * as Browser from '../common/Platform';\nimport { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';\nimport { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';\nimport { IBuffer } from '../common/buffer/Types';\nimport { C0, C1ESCAPED } from '../common/data/EscapeSequences';\nimport { toRgbString } from '../common/input/XParseColor';\nimport { DecorationService } from '../common/services/DecorationService';\nimport { IDecorationService } from '../common/services/Services';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { Linkifier } from './Linkifier';\nimport { Emitter, EventUtils, type IEvent } from '../common/Event';\nimport { addDisposableListener } from './Dom';\nimport { MutableDisposable, toDisposable } from '../common/Lifecycle';\n\nexport class CoreBrowserTerminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n private readonly _linkifier: MutableDisposable = this._register(new MutableDisposable());\n public get linkifier(): ILinkifier2 | undefined { return this._linkifier.value; }\n private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n private _viewport: Viewport | undefined;\n\n public browser: IBrowser = Browser as any;\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // Browser services\n private readonly _decorationService: DecorationService;\n private readonly _keyboardService: IKeyboardService;\n private readonly _linkProviderService: ILinkProviderService;\n\n // Optional browser services\n private _charSizeService: ICharSizeService | undefined;\n private _coreBrowserService: ICoreBrowserService | undefined;\n private _mouseCoordsService: IMouseCoordsService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _themeService: IThemeService | undefined;\n private _characterJoinerService: ICharacterJoinerService | undefined;\n private _selectionService: ISelectionService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n /**\n * Records whether a keydown event has occurred since the last keyup event, i.e. whether a key\n * is currently \"pressed\".\n */\n private _keyDownSeen: boolean = false;\n\n /**\n * Records whether the keypress event has already been handled and triggered a data event, if so\n * the input event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyPressHandled: boolean = false;\n\n /**\n * Records whether there has been a keydown event for a dead key without a corresponding keydown\n * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n * no events will be emitted for the final character.\n */\n private _unprocessedDeadKey: boolean = false;\n\n private _compositionHelper: ICompositionHelper | undefined;\n private _accessibilityManager: MutableDisposable = this._register(new MutableDisposable());\n\n private readonly _onCursorMove = this._register(new Emitter());\n public readonly onCursorMove = this._onCursorMove.event;\n private readonly _onKey = this._register(new Emitter<{ key: string, domEvent: KeyboardEvent }>());\n public readonly onKey = this._onKey.event;\n private readonly _onSelectionChange = this._register(new Emitter());\n public readonly onSelectionChange = this._onSelectionChange.event;\n private readonly _onTitleChange = this._register(new Emitter());\n public readonly onTitleChange = this._onTitleChange.event;\n private readonly _onBell = this._register(new Emitter());\n public readonly onBell = this._onBell.event;\n\n private _onFocus = this._register(new Emitter());\n public get onFocus(): IEvent { return this._onFocus.event; }\n private _onBlur = this._register(new Emitter());\n public get onBlur(): IEvent { return this._onBlur.event; }\n private _onA11yCharEmitter = this._register(new Emitter());\n public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = this._register(new Emitter());\n public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }\n private _onWillOpen = this._register(new Emitter());\n public get onWillOpen(): IEvent { return this._onWillOpen.event; }\n private readonly _onDimensionsChange = this._register(new Emitter());\n public readonly onDimensionsChange = this._onDimensionsChange.event;\n\n public get dimensions(): IRenderDimensionsApi | undefined {\n if (!this._renderService) {\n return undefined;\n }\n const dimensions = this._renderService.dimensions;\n return {\n css: {\n canvas: { ...dimensions.css.canvas },\n cell: { ...dimensions.css.cell }\n },\n device: {\n canvas: { ...dimensions.device.canvas },\n cell: { ...dimensions.device.cell },\n char: { ...dimensions.device.char }\n }\n };\n }\n\n constructor(\n options: Partial = {}\n ) {\n super(options);\n\n this._setup();\n\n this._decorationService = this._instantiationService.createInstance(DecorationService);\n this._instantiationService.setService(IDecorationService, this._decorationService);\n this._keyboardService = this._instantiationService.createInstance(KeyboardService);\n this._instantiationService.setService(IKeyboardService, this._keyboardService);\n this._linkProviderService = this._instantiationService.createInstance(LinkProviderService);\n this._instantiationService.setService(ILinkProviderService, this._linkProviderService);\n this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n\n // Setup InputHandler listeners\n this._register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n this._register(this._inputHandler.onRequestRefreshRows((e) => this.refresh(e?.start ?? 0, e?.end ?? (this.rows - 1))));\n this._register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n this._register(this._inputHandler.onRequestReset(() => this.reset()));\n this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove));\n this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange));\n this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n this._register(toDisposable(() => {\n this._customKeyEventHandler = undefined;\n this.element?.parentNode?.removeChild(this.element);\n }));\n }\n\n /**\n * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n * or none restore requests (resetting all),\n * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n */\n private _handleColorEvent(event: IColorEvent): void {\n if (!this._themeService) return;\n for (const req of event) {\n let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n let ident: string;\n switch (req.index) {\n case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n acc = 'foreground';\n ident = '10';\n break;\n case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n acc = 'background';\n ident = '11';\n break;\n case SpecialColorIndex.CURSOR: // OSC 12 | 112\n acc = 'cursor';\n ident = '12';\n break;\n default: // OSC 4 | 104\n // we can skip the [0..255] range check here (already done in inputhandler)\n acc = 'ansi';\n ident = '4;' + req.index;\n }\n switch (req.type) {\n case ColorRequestType.REPORT:\n const colorRgb = color.toColorRGB(acc === 'ansi'\n ? this._themeService.colors.ansi[req.index]\n : this._themeService.colors[acc]);\n this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(colorRgb)}${C1ESCAPED.ST}`);\n break;\n case ColorRequestType.SET:\n if (acc === 'ansi') {\n this._themeService.modifyColors(colors => colors.ansi[req.index] = channels.toColor(...req.color));\n } else {\n const narrowedAcc = acc;\n this._themeService.modifyColors(colors => colors[narrowedAcc] = channels.toColor(...req.color));\n }\n break;\n case ColorRequestType.RESTORE:\n this._themeService.restoreColor(req.index);\n break;\n }\n }\n }\n\n /**\n * Reports the current color scheme (dark or light) based on the relative luminance\n * of the background and foreground theme colors.\n * Sends CSI ? 997 ; 1 n for dark mode or CSI ? 997 ; 2 n for light mode.\n */\n private _reportColorScheme(): void {\n if (!this._themeService) return;\n const bgLuminance = rgb.relativeLuminance(this._themeService.colors.background.rgba >> 8);\n const fgLuminance = rgb.relativeLuminance(this._themeService.colors.foreground.rgba >> 8);\n // Dark mode = background is darker than foreground (lower luminance)\n const colorSchemeMode = bgLuminance < fgLuminance ? 1 : 2;\n this.coreService.triggerDataEvent(`${C0.ESC}[?997;${colorSchemeMode}n`);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n private _handleScreenReaderModeOptionChange(value: boolean): void {\n if (value) {\n if (!this._accessibilityManager.value && this._renderService) {\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n } else {\n this._accessibilityManager.clear();\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _handleTextAreaFocus(ev: FocusEvent): void {\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _handleTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.blur();\n }\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this.coreService.decPrivateModes.sendFocus) {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n private _syncTextArea(): void {\n if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n return;\n }\n const cursorY = this.buffer.ybase + this.buffer.y;\n const bufferLine = this.buffer.lines.get(cursorY);\n if (!bufferLine) {\n return;\n }\n const cursorX = Math.min(this.buffer.x, this.cols - 1);\n const cellHeight = this._renderService.dimensions.css.cell.height;\n const width = bufferLine.getWidth(cursorX);\n const cellWidth = this._renderService.dimensions.css.cell.width * width;\n const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n this.textarea.style.left = cursorLeft + 'px';\n this.textarea.style.top = cursorTop + 'px';\n this.textarea.style.width = cellWidth + 'px';\n this.textarea.style.height = cellHeight + 'px';\n this.textarea.style.lineHeight = cellHeight + 'px';\n this.textarea.style.zIndex = '-5';\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this._register(addDisposableListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n this._register(addDisposableListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this._register(addDisposableListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this._register(addDisposableListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this._register(addDisposableListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this._register(addDisposableListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this._register(addDisposableListener(this.textarea!, 'compositionstart', () => {\n // Ensure the textarea is synced to the latest cursor location before composition begins. This\n // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively\n // would cause the IME to appear in the wrong position. The theory is that when the IME is\n // triggered during a partial render the textarea position becomes locked and will not move\n // until it is hidden and a custom move occurs.\n this._syncTextArea();\n this._compositionHelper!.compositionstart();\n this._compositionHelper!.updateCompositionElements();\n }));\n this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this._register(addDisposableListener(this.textarea!, 'compositionend', (e: CompositionEvent) => {\n if (this._compositionHelper instanceof CompositionHelper) {\n if (this._compositionHelper.compositionend(e)) {\n this.textarea!.dispatchEvent(new CustomEvent(\n 'xterm-composition-transaction-accepted',\n { bubbles: true }\n ));\n }\n } else {\n this._compositionHelper!.compositionend();\n }\n }));\n this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!parent.isConnected) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n // If the terminal is already opened\n if (this.element?.ownerDocument.defaultView && this._coreBrowserService) {\n // Adjust the window if needed\n if (this.element.ownerDocument.defaultView !== this._coreBrowserService.window) {\n this._coreBrowserService.window = this.element.ownerDocument.defaultView;\n }\n return;\n }\n\n this._document = parent.ownerDocument;\n if (this.options.documentOverride && this.options.documentOverride instanceof Document) {\n this._document = this.optionsService.rawOptions.documentOverride as Document;\n }\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.classList.toggle('allow-transparency', this.options.allowTransparency);\n this._register(this.optionsService.onSpecificOptionChange('allowTransparency', value => this.element!.classList.toggle('allow-transparency', value)));\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = this._document.createDocumentFragment();\n this._viewportElement = this._document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n\n this.screenElement = this._document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n this._register(addDisposableListener(this.screenElement, 'mousemove', (ev: MouseEvent) => this.updateCursorStyle(ev)));\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = this._document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n const textarea = this.textarea = this._document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel.get());\n if (!Browser.isChromeOS) {\n // ChromeVox on ChromeOS does not like this. See\n // https://issuetracker.google.com/issues/260170397\n this.textarea.setAttribute('aria-multiline', 'false');\n }\n this.textarea.setAttribute('autocomplete', 'off');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this._register(this.optionsService.onSpecificOptionChange('disableStdin', () => textarea.readOnly = this.optionsService.rawOptions.disableStdin));\n this.textarea.readOnly = this.optionsService.rawOptions.disableStdin;\n\n // Register the core browser service before the generic textarea handlers are registered so it\n // handles them first. Otherwise the renderers may use the wrong focus state.\n this._coreBrowserService = this._register(this._instantiationService.createInstance(CoreBrowserService,\n this.textarea,\n parent.ownerDocument.defaultView ?? window,\n // Force unsafe null in node.js environment for tests\n this._document ?? ((typeof window !== 'undefined') ? window.document : null as any)\n ));\n this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n this._register(addDisposableListener(this.textarea, 'focus', (ev: FocusEvent) => this._handleTextAreaFocus(ev)));\n this._register(addDisposableListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._themeService = this._instantiationService.createInstance(ThemeService);\n this._instantiationService.setService(IThemeService, this._themeService);\n\n // CSI ? 996 n - color scheme query (https://contour-terminal.org/vt-extensions/color-palette-update-notifications/)\n this._register(this._inputHandler.onRequestColorSchemeQuery(() => this._reportColorScheme()));\n\n // Emit unsolicited color scheme notification on theme change when DECSET 2031 is enabled\n this._register(this._themeService.onChangeColors(() => {\n if (this.coreService.decPrivateModes.colorSchemeUpdates) {\n this._reportColorScheme();\n }\n }));\n\n this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n this._renderService = this._register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this._register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n this._register(this._renderService.onDimensionsChange(e => this._onDimensionsChange.fire({\n css: {\n canvas: { ...e.css.canvas },\n cell: { ...e.css.cell }\n },\n device: {\n canvas: { ...e.device.canvas },\n cell: { ...e.device.cell },\n char: { ...e.device.char }\n }\n })));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._compositionView = this._document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._register(toDisposable(() => {\n if (this._compositionHelper instanceof CompositionHelper) {\n this._compositionHelper.dispose();\n }\n }));\n this._helperContainer.appendChild(this._compositionView);\n\n this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService);\n this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService);\n\n const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement));\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n try {\n this._onWillOpen.fire(this.element);\n } catch (e) {\n this._logService.error('onWillOpen handler threw an exception', e);\n }\n if (!this._renderService.hasRenderer()) {\n this._renderService.setRenderer(this._createRenderer());\n }\n\n this._register(this.onCursorMove(() => {\n this._renderService!.handleCursorMove();\n this._syncTextArea();\n }));\n this._register(this.onResize(() => {\n this._renderService!.handleResize(this.cols, this.rows);\n this._syncTextArea();\n }));\n this._register(this.onBlur(() => this._renderService!.handleBlur()));\n this._register(this.onFocus(() => this._renderService!.handleFocus()));\n\n this._viewport = this._register(this._instantiationService.createInstance(Viewport, this.element, this.screenElement));\n this._register(this._viewport.onRequestScrollLines(e => {\n super.scrollLines(e, false);\n this.refresh(0, this.rows - 1);\n }));\n\n this._selectionService = this._register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement,\n linkifier\n ));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this._register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this._register(EventUtils.any(\n this._onScroll.event,\n this._inputHandler.onScroll\n )(() => {\n this._selectionService!.refresh();\n this._viewport?.queueSync();\n }));\n\n this._register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this.mouseStateService.areMouseEventsActive && !this.options.mouseEventsRequireAlt) {\n this._selectionService.disable();\n this.element.classList.add(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n } else {\n this._selectionService.enable();\n this.element.classList.remove(MouseEventCssClasses.ENABLE_MOUSE_EVENTS);\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n }\n this._register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n const showScrollbar = this.options.scrollbar?.showScrollbar ?? true;\n const overviewRulerWidth = this.options.scrollbar?.width;\n if (showScrollbar && overviewRulerWidth) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n this.optionsService.onSpecificOptionChange('scrollbar', value => {\n const shouldShow = (value?.showScrollbar ?? true) && !!value?.width;\n if (!this._overviewRulerRenderer && shouldShow && this._viewportElement && this.screenElement) {\n this._overviewRulerRenderer = this._register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n }\n });\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this._mouseService.bindMouse({\n element: this.element!,\n screenElement: this.screenElement!,\n document: this._document!,\n handleTouchScroll: amount => this._viewport?.handleTouchScroll(amount)\n }, disposable => this._register(disposable), () => this.focus());\n }\n\n private _createRenderer(): IRenderer {\n return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!);\n }\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number, sync: boolean = false): void {\n this._renderService?.refreshRows(start, end, sync);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent | MouseEvent): void {\n if (this._selectionService?.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this.coreService.isCursorInitialized) {\n this.coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n // All scrollLines methods need to go via the viewport in order to support smooth scroll\n if (this._viewport) {\n this._viewport.scrollLines(disp);\n } else {\n super.scrollLines(disp, suppressScrollEvent);\n }\n this.refresh(0, this.rows - 1);\n }\n\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n public scrollToBottom(disableSmoothScroll?: boolean): void {\n if (disableSmoothScroll && this._viewport) {\n this._viewport.scrollToLine(this.buffer.ybase, true);\n } else {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this.coreService, this.optionsService);\n }\n\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void {\n this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler);\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._linkProviderService.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n const joinerId = this._characterJoinerService.register(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (!this._characterJoinerService) {\n throw new Error('Terminal must be opened first');\n }\n if (this._characterJoinerService.deregister(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public registerMarker(cursorYOffset: number): IMarker {\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n return this._decorationService.registerDecoration(decorationOptions);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): IBufferRange | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n start: {\n x: this._selectionService.selectionStart![0],\n y: this._selectionService.selectionStart![1]\n },\n end: {\n x: this._selectionService.selectionEnd![0],\n y: this._selectionService.selectionEnd![1]\n }\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown [KeyboardEvent].\n *\n * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n this._keyDownSeen = true;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom(true);\n }\n return false;\n }\n\n if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n this._unprocessedDeadKey = true;\n }\n\n const result = this._keyboardService.evaluateKeyDown(event);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (!result.key) {\n return true;\n }\n\n // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n // letters cannot be input while caps lock is on. Skip this hack when using kitty protocol\n // or Win32 input mode as they need to send proper sequences for all key events.\n if (!this._keyboardService.useKitty && !this._keyboardService.useWin32InputMode && event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n return true;\n }\n }\n\n if (this._unprocessedDeadKey) {\n this._unprocessedDeadKey = false;\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(event);\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n // reader to read it.\n if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.getModifierState('AltGraph'));\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n this._keyDownSeen = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n // Handle key release for Kitty keyboard protocol\n const result = this._keyboardService.evaluateKeyUp(ev);\n if (result?.key) {\n const wasModifierOnly = this._keyboardService.useWin32InputMode && wasModifierKeyOnlyEvent(ev);\n this.coreService.triggerDataEvent(result.key, !wasModifierOnly);\n }\n\n this.updateCursorStyle(ev);\n this._keyPressHandled = false;\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n this._keyPressHandled = false;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n if (!this._compositionHelper!.keypress?.(key)) {\n this.coreService.triggerDataEvent(key, true);\n }\n\n this._keyPressHandled = true;\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n return true;\n }\n\n /**\n * Handle an input event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n * @param ev The input event to be handled.\n */\n protected _inputEvent(ev: InputEvent): boolean {\n if (\n ev.data &&\n ev.inputType === 'insertText' &&\n !this.optionsService.rawOptions.screenReaderMode &&\n this._compositionHelper instanceof CompositionHelper &&\n this._compositionHelper.input(ev.data)\n ) {\n return true;\n }\n // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n // support reading out character input which can doubling up input characters\n // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n if (this._keyPressHandled) {\n return false;\n }\n\n // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n // keys could be ignored\n this._unprocessedDeadKey = false;\n\n const text = ev.data;\n this.coreService.triggerDataEvent(text, true);\n return true;\n }\n\n return false;\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n this.buffer.clearAllMarkers();\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n // scroll event and that the viewport's state will be valid for immediate writes.\n this._onScroll.fire({ position: this.buffer.ydisp });\n this.refresh(0, this.rows - 1);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._mouseService?.reset();\n this._selectionService?.reset();\n this._decorationService.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1, true);\n }\n\n public clearTextureAtlas(): void {\n this._renderService?.clearTextureAtlas();\n }\n\n private _reportFocus(): void {\n if (this.element?.classList.contains('focus')) {\n this.coreService.triggerDataEvent(C0.ESC + '[I');\n } else {\n this.coreService.triggerDataEvent(C0.ESC + '[O');\n }\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18 || // Alt\n ev.keyCode === 91 || // Meta (Left)\n ev.keyCode === 92 || // Meta (Right)\n ev.keyCode === 93 || // Meta (Menu)\n ev.keyCode === 224 || // Meta (Firefox)\n ev.key === 'Meta';\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(terminal as any);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from '../buffer/CellData';\nimport { IBufferLine, ICellData } from '../buffer/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, cell as unknown as ICellData);\n return cell;\n }\n return this._line.loadCell(x, new CellData()) as unknown as IBufferCellApi;\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm';\nimport { IBuffer } from '../buffer/Types';\nimport { BufferLineApiView } from './BufferLineApiView';\nimport { CellData } from '../buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';\nimport { BufferApiView } from './BufferApiView';\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { Disposable } from '../Lifecycle';\nimport { Emitter } from '../Event';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n\n private readonly _onBufferChange = this._register(new Emitter());\n public readonly onBufferChange = this._onBufferChange.event;\n\n constructor(private _core: ICoreTerminal) {\n super();\n this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n this._register(this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active)));\n }\n public get active(): IBufferApi {\n if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._core.buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._core.buffers.alt);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from '../parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm';\nimport { ICoreTerminal } from '../CoreTerminal';\n\nexport class ParserApi implements IParser {\n constructor(private _core: ICoreTerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this._core.registerEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean | Promise): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n public registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise): IDisposable {\n return this._core.registerApcHandler(id, callback);\n }\n}\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from '../CoreTerminal';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ICoreTerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from '../LocalizableStrings';\nimport { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';\nimport { IBufferRange, ITerminal } from '../Types';\nimport { Disposable } from '../../common/Lifecycle';\nimport { ITerminalOptions } from '../../common/Types';\nimport { AddonManager } from '../../common/public/AddonManager';\nimport { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';\nimport { ParserApi } from '../../common/public/ParserApi';\nimport { UnicodeApi } from '../../common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';\nimport type { IEvent } from '../../common/Event';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nlet $value = 0;\n\nexport class Terminal extends Disposable implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n private _buffer: BufferNamespaceApi | undefined;\n private _publicOptions: Required;\n\n constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n super();\n\n this._core = this._register(new TerminalCore(options));\n this._addonManager = this._register(new AddonManager());\n\n this._publicOptions = { ... this._core.options };\n const getter = (propName: string): any => {\n return this._core.options[propName];\n };\n const setter = (propName: string, value: any): void => {\n this._checkReadonlyOptions(propName);\n this._core.options[propName] = value;\n };\n\n for (const propName in this._core.options) {\n const desc = {\n get: getter.bind(this, propName),\n set: setter.bind(this, propName)\n };\n Object.defineProperty(this._publicOptions, propName, desc);\n }\n }\n\n private _checkReadonlyOptions(propName: string): void {\n // Throw an error if any constructor only option is modified\n // from terminal.options\n // Modifications from anywhere else are allowed\n if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n }\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.rawOptions.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onBell(): IEvent { return this._core.onBell; }\n public get onBinary(): IEvent { return this._core.onBinary; }\n public get onCursorMove(): IEvent { return this._core.onCursorMove; }\n public get onData(): IEvent { return this._core.onData; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onLineFeed(): IEvent { return this._core.onLineFeed; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n public get onScroll(): IEvent { return this._core.onScroll; }\n public get onSelectionChange(): IEvent { return this._core.onSelectionChange; }\n public get onTitleChange(): IEvent { return this._core.onTitleChange; }\n public get onWriteParsed(): IEvent { return this._core.onWriteParsed; }\n public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get screenElement(): HTMLElement | undefined { return this._core.screenElement; }\n public get parser(): IParser {\n return this._parser ??= new ParserApi(this._core);\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n return this._buffer ??= this._register(new BufferNamespaceApi(this._core));\n }\n public get markers(): ReadonlyArray {\n return this._core.markers;\n }\n public get modes(): IModes {\n const m = this._core.coreService.decPrivateModes;\n let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n switch (this._core.mouseStateService.activeProtocol) {\n case 'X10': mouseTrackingMode = 'x10'; break;\n case 'VT200': mouseTrackingMode = 'vt200'; break;\n case 'DRAG': mouseTrackingMode = 'drag'; break;\n case 'ANY': mouseTrackingMode = 'any'; break;\n }\n return {\n applicationCursorKeysMode: m.applicationCursorKeys,\n applicationKeypadMode: m.applicationKeypad,\n bracketedPasteMode: m.bracketedPasteMode,\n insertMode: this._core.coreService.modes.insertMode,\n mouseTrackingMode: mouseTrackingMode,\n originMode: m.origin,\n reverseWraparoundMode: m.reverseWraparound,\n sendFocusMode: m.sendFocus,\n showCursor: !this._core.coreService.isCursorHidden,\n synchronizedOutputMode: m.synchronizedOutput,\n win32InputMode: m.win32InputMode,\n wraparoundMode: m.wraparound\n };\n }\n public get dimensions(): IRenderDimensions | undefined {\n return this._core.dimensions;\n }\n public get options(): Required {\n return this._publicOptions;\n }\n public set options(options: ITerminalOptions) {\n for (const propName in options) {\n this._publicOptions[propName] = options[propName];\n }\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public input(data: string, wasUserInput: boolean = true): void {\n this._core.input(data, wasUserInput);\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public attachCustomWheelEventHandler(customWheelEventHandler: (event: WheelEvent) => boolean): void {\n this._core.attachCustomWheelEventHandler(customWheelEventHandler);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number = 0): IMarker {\n this._verifyIntegers(cursorYOffset);\n return this._core.registerMarker(cursorYOffset);\n }\n public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n return this._core.registerDecoration(decorationOptions);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): IBufferRange | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n super.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public clearTextureAtlas(): void {\n this._core.clearTextureAtlas();\n }\n public loadAddon(addon: ITerminalAddon): void {\n this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n // A wrapper is required here because esbuild prevents setting an `export let`\n return {\n get promptLabel(): string { return Strings.promptLabel.get(); },\n set promptLabel(value: string) { Strings.promptLabel.set(value); },\n get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); },\n set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); }\n };\n }\n\n private _verifyIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value === Infinity || isNaN($value) || $value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n\n private _verifyPositiveIntegers(...values: number[]): void {\n for ($value of values) {\n if ($value && ($value === Infinity || isNaN($value) || $value % 1 !== 0 || $value < 0)) {\n throw new Error('This API only accepts positive integers');\n }\n }\n }\n}\n"], ++ "mappings": "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Q,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EACnD,CAAC,KAAQ,IAAM,EAAG,CAAC,KAAQ,IAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EACnD,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,EAAG,CAAC,MAAQ,KAAM,CACrD,EACMC,GA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", ++ "names": ["promptLabelInternal", "promptLabel", "value", "tooMuchOutputInternal", "tooMuchOutput", "prepareTextForTerminal", "text", "bracketTextForPaste", "bracketedPasteMode", "copyHandler", "ev", "selectionService", "handlePasteEvent", "textarea", "coreService", "optionsService", "paste", "moveTextAreaUnderMouseCursor", "screenElement", "pos", "left", "top", "rightClickHandler", "shouldSelectWord", "stringFromCodePoint", "codePoint", "utf32ToString", "data", "start", "end", "result", "i", "codepoint", "StringToUtf32", "input", "target", "length", "size", "startPos", "second", "code", "Utf8ToUtf32", "byte1", "byte2", "byte3", "byte4", "discardInterim", "cp", "pos", "tmp", "type", "missing", "fourStop", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "other", "thisDefault", "otherDefault", "serviceRegistry", "getServiceDependencies", "ctor", "createDecorator", "id", "decorator", "target", "key", "index", "storeServiceDependency", "IBufferService", "createDecorator", "IMouseStateService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "OscLinkProvider", "_bufferService", "_optionsService", "_oscLinkService", "CellData", "y", "callback", "line", "result", "linkHandler", "cell", "lineLength", "currentLinkId", "currentStart", "finishLink", "x", "text", "endX", "range", "ignoreLink", "parsed", "e", "defaultActivate", "startX", "linkId", "startY", "finalStartX", "endY", "finalEndX", "previousLine", "previousLineLength", "previousStartX", "currentLine", "currentLineLength", "nextLine", "nextLineLength", "nextEndX", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "IOscLinkService", "uri", "newWindow", "ICharSizeService", "createDecorator", "ICoreBrowserService", "IMouseCoordsService", "IMouseService", "IRenderService", "ISelectionService", "ICharacterJoinerService", "IThemeService", "ILinkProviderService", "IKeyboardService", "toDisposable", "fn", "dispose", "arg", "d", "DisposableStore", "o", "d", "Disposable", "MutableDisposable", "value", "TimeoutTimer", "runner", "timeout", "MicrotaskTimer", "IntervalTimer", "interval", "context", "handle", "getWindow", "e", "candidateNode", "candidateEvent", "DomListener", "node", "type", "handler", "options", "addDisposableListener", "useCaptureOrOptions", "addStandardDisposableListener", "useCapture", "eventType", "getDomNodePagePosition", "domNode", "bb", "win", "AnimationFrameQueueItem", "_runner", "priority", "a", "b", "animationFrameState", "getAnimationFrameState", "targetWindow", "state", "animationFrameRunner", "scheduleAtNextAnimationFrame", "runner", "item", "WindowIntervalTimer", "IntervalTimer", "interval", "FastDomNode", "domNode", "_width", "width", "numberAsPixels", "_height", "height", "_top", "top", "_left", "left", "_bottom", "bottom", "_right", "right", "className", "shouldHaveIt", "position", "layerHint", "contain", "name", "value", "Platform_exports", "__export", "getSafariVersion", "getZoomFactor", "isChrome", "isChromeOS", "isFirefox", "isLegacyEdge", "isLinux", "isMac", "isNode", "isSafari", "isWindows", "userAgent", "platform", "_targetWindow", "majorVersion", "sameOriginWindowChainCache", "getParentWindowIfSameOrigin", "w", "location", "parentLocation", "IframeUtils", "targetWindow", "windowChainCache", "parent", "childWindow", "ancestorWindow", "top", "left", "windowChain", "windowChainEl", "windowInChain", "boundingRect", "StandardMouseEvent", "iframeOffsets", "StandardWheelEvent", "e", "deltaX", "deltaY", "shouldFactorDPR", "isChrome", "chromeVersionMatch", "e1", "e2", "devicePixelRatio", "ev", "isFirefox", "isMac", "isSafari", "isWindows", "GlobalPointerMoveMonitor", "DisposableStore", "invokeStopCallback", "onStopCallback", "initialElement", "pointerId", "initialButtons", "pointerMoveCallback", "eventSource", "toDisposable", "getWindow", "addDisposableListener", "eventType", "e", "Widget", "Disposable", "domNode", "listener", "addDisposableListener", "eventType", "e", "StandardMouseEvent", "getWindow", "ScrollbarArrow", "Widget", "opts", "arrowSize", "GlobalPointerMoveMonitor", "addStandardDisposableListener", "eventType", "e", "WindowIntervalTimer", "TimeoutTimer", "scheduleRepeater", "getWindow", "pointerMoveData", "Emitter", "listener", "thisArgs", "disposables", "toDisposable", "entry", "result", "idx", "event", "listeners", "len", "EventUtils", "forward", "from", "to", "e", "map", "i", "any", "events", "store", "DisposableStore", "runAndSubscribe", "handler", "initial", "ScrollState", "_ScrollState", "_forceIntegerValues", "width", "scrollWidth", "scrollLeft", "height", "scrollHeight", "scrollTop", "other", "update", "useRawScrollPositions", "previous", "inSmoothScrolling", "widthChanged", "scrollWidthChanged", "scrollLeftChanged", "heightChanged", "scrollHeightChanged", "scrollTopChanged", "Scrollable", "Disposable", "options", "Emitter", "smoothScrollDuration", "scrollPosition", "dimensions", "newState", "reuseAnimation", "validTarget", "newSmoothScrolling", "SmoothScrollingOperation", "oldState", "SmoothScrollingUpdate", "isDone", "createEaseOutCubic", "from", "to", "delta", "completion", "easeOutCubic", "createComposed", "a", "b", "cut", "_SmoothScrollingOperation", "startTime", "duration", "viewportSize", "stop1", "stop2", "state", "now", "newScrollLeft", "newScrollTop", "easeInCubic", "t", "ScrollbarVisibilityController", "Disposable", "visibility", "visibleClassName", "invisibleClassName", "TimeoutTimer", "rawShouldBeVisible", "shouldBeVisible", "isNeeded", "domNode", "withFadeAway", "POINTER_DRAG_RESET_DISTANCE", "AbstractScrollbar", "Widget", "opts", "ScrollbarVisibilityController", "GlobalPointerMoveMonitor", "FastDomNode", "addDisposableListener", "eventType", "arrow", "ScrollbarArrow", "top", "left", "width", "height", "e", "visibleSize", "elementScrollSize", "elementScrollPosition", "domTop", "sliderStart", "sliderStop", "pointerPos", "offsetX", "offsetY", "domNodePosition", "getDomNodePagePosition", "offset", "initialPointerPosition", "initialPointerOrthogonalPosition", "initialScrollbarState", "pointerMoveData", "pointerOrthogonalPosition", "pointerOrthogonalDelta", "isWindows", "pointerDelta", "_desiredScrollPosition", "desiredScrollPosition", "scrollbarSize", "ScrollbarState", "_ScrollbarState", "arrowSize", "scrollbarSize", "oppositeScrollbarSize", "visibleSize", "scrollSize", "scrollPosition", "iVisibleSize", "iScrollSize", "iScrollPosition", "iArrowSize", "computedAvailableSize", "computedRepresentableSize", "computedIsNeeded", "computedSliderSize", "computedSliderRatio", "computedSliderPosition", "r", "offset", "desiredSliderPosition", "correctedOffset", "desiredScrollPosition", "delta", "HorizontalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "e", "offsetX", "offsetY", "size", "target", "VerticalScrollbar", "AbstractScrollbar", "scrollable", "options", "host", "scrollDimensions", "scrollPosition", "hasArrows", "ScrollbarState", "sliderSize", "sliderPosition", "largeSize", "smallSize", "offsetX", "offsetY", "size", "target", "delta", "currentPosition", "showArrows", "display", "arrow", "arrowSize", "MouseWheelClassifierItem", "timestamp", "deltaX", "deltaY", "_MouseWheelClassifier", "remainingInfluence", "score", "iteration", "index", "influence", "e", "isChrome", "targetWindow", "getWindow", "pageZoomFactor", "getZoomFactor", "previousItem", "item", "absDeltaX", "absDeltaY", "absPreviousDeltaX", "absPreviousDeltaY", "minDeltaX", "minDeltaY", "maxDeltaX", "maxDeltaY", "value", "MouseWheelClassifier", "SmoothScrollableElement", "Widget", "element", "options", "scrollable", "Emitter", "resolvedScrollable", "ownsScrollable", "Scrollable", "callback", "scheduleAtNextAnimationFrame", "resolveOptions", "scrollbarHost", "mouseWheelEvent", "VerticalScrollbar", "HorizontalScrollbar", "FastDomNode", "TimeoutTimer", "dispose", "dimensions", "update", "newClassName", "isMac", "newOptions", "browserEvent", "StandardWheelEvent", "shouldListen", "onMouseWheel", "addDisposableListener", "eventType", "classifier", "didScroll", "shiftConvert", "futureScrollPosition", "desiredScrollPosition", "deltaScrollTop", "desiredScrollTop", "deltaScrollLeft", "desiredScrollLeft", "consumeMouseWheel", "scrollState", "enableTop", "enableLeft", "leftClassName", "topClassName", "topLeftClassName", "opts", "result", "Viewport", "Disposable", "element", "screenElement", "_bufferService", "coreBrowserService", "_coreService", "mouseStateService", "themeService", "_optionsService", "_renderService", "Emitter", "scrollable", "Scrollable", "cb", "scheduleAtNextAnimationFrame", "SmoothScrollableElement", "type", "EventUtils", "toDisposable", "e", "disp", "pos", "line", "disableSmoothScroll", "showScrollbar", "showArrows", "verticalScrollbarSize", "ydisp", "newRow", "diff", "translationY", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "ICoreService", "IMouseStateService", "IThemeService", "IOptionsService", "IRenderService", "BufferDecorationRenderer", "Disposable", "_screenElement", "_bufferService", "_coreBrowserService", "_decorationService", "_renderService", "decoration", "toDisposable", "element", "x", "line", "__decorateClass", "__decorateParam", "IBufferService", "ICoreBrowserService", "IDecorationService", "IRenderService", "ColorZoneStore", "decoration", "z", "padding", "zone", "line", "position", "drawHeight", "drawWidth", "drawX", "OverviewRulerRenderer", "Disposable", "_viewportElement", "_screenElement", "_bufferService", "_decorationService", "_renderService", "_optionsService", "_themeService", "_coreBrowserService", "ColorZoneStore", "toDisposable", "ctx", "scrollbar", "outerWidth", "innerWidth", "pixelsPerLine", "nonFullHeight", "cssCanvasHeight", "deviceCanvasHeight", "decoration", "zones", "zone", "updateCanvasDimensions", "updateAnchor", "__decorateClass", "__decorateParam", "IBufferService", "IDecorationService", "IRenderService", "IOptionsService", "IThemeService", "ICoreBrowserService", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "g", "b", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "r", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "XTERM_COMPOSITION_SESSION_START_EVENT", "XTERM_COMPOSITION_SESSION_END_EVENT", "XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT", "CompositionHelper", "_textarea", "_compositionView", "_bufferService", "_optionsService", "_coreService", "_renderService", "_themeService", "start", "end", "ev", "transactionId", "pending", "endData", "timer", "text", "repeatsPendingTextareaInput", "waitForPropagation", "wasComposing", "input", "includeFollowingInput", "textareaInput", "observedInput", "candidate", "observed", "findShortestOrder", "candidateFirstOverlap", "observedFirstOverlap", "overlap", "value", "suffixEnd", "compositionLength", "observedEnd", "suffix", "valueEnd", "dataAlreadySent", "settlesPending", "dispatchSessionEnd", "prevented", "event", "hadPreedit", "callback", "oldValue", "newValue", "diff", "data", "rowRemainder", "preeditText", "doc", "preedit", "caret", "children", "remainder", "buffer", "line", "width", "cellHeight", "colors", "cursor", "color", "background", "dontRecurse", "cursorX", "cursorTop", "cursorLeft", "maxWidth", "anchorBounds", "anchorLeft", "showsRemainder", "__decorateClass", "__decorateParam", "IBufferService", "IOptionsService", "ICoreService", "IRenderService", "IThemeService", "JoinedCellData", "AttributeData", "firstCell", "chars", "width", "value", "CharacterJoinerService", "_bufferService", "CellData", "handler", "joiner", "joinerId", "i", "row", "line", "ranges", "lineStr", "trimmedLength", "rangeStartColumn", "currentStringIndex", "rangeStartStringIndex", "rangeAttrFG", "rangeAttrBG", "x", "joinedRanges", "startIndex", "endIndex", "lineData", "startCol", "text", "allJoinedRanges", "error", "joinerRanges", "j", "currentRangeIndex", "currentRangeStarted", "currentRange", "length", "newRange", "inRange", "range", "__decorateClass", "__decorateParam", "IBufferService", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isBoxOrBlockGlyph", "codepoint", "treatGlyphAsBackgroundColor", "codepoint", "isPowerlineGlyph", "isBoxOrBlockGlyph", "createRenderDimensions", "createDimension", "DomRendererRowFactory", "_document", "_characterJoinerService", "_optionsService", "_coreBrowserService", "_coreService", "_decorationService", "_themeService", "CellData", "start", "end", "columnSelectMode", "lineData", "row", "isCursorRow", "cursorStyle", "cursorInactiveStyle", "cursorX", "cursorBlink", "blinkOn", "cellWidth", "widthCache", "linkStart", "linkEnd", "rowInfo", "elements", "joinedRanges", "colors", "lineLength", "charElement", "cellAmount", "text", "i", "oldBg", "oldFg", "oldExt", "oldLinkHover", "oldSpacing", "oldIsInSelection", "spacing", "skipJoinedCheckUntilX", "classes", "hasHover", "x", "width", "isJoined", "isValidJoinRange", "lastCharX", "cell", "range", "firstSelectionState", "JoinedCellData", "isInSelection", "isCursorCell", "isLinkHover", "isDecorated", "d", "chars", "AttributeData", "fg", "fgColorMode", "bg", "bgColorMode", "isInverse", "temp", "temp2", "bgOverride", "fgOverride", "isTop", "resolvedBg", "channels", "color", "element", "treatGlyphAsBackgroundColor", "cache", "adjustedColor", "ratio", "style", "y", "__decorateClass", "__decorateParam", "ICharacterJoinerService", "IOptionsService", "ICoreBrowserService", "ICoreService", "IDecorationService", "IThemeService", "WidthCache", "canvasFactory", "WidthCacheFontVariantCanvas", "font", "fontSize", "weight", "weightBold", "c", "bold", "italic", "cp", "width", "key", "variant", "throwIfFalsy", "fontFamily", "fontWeight", "fontStyle", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "TextBlinkStateManager", "Disposable", "_renderCallback", "_coreBrowserService", "_optionsService", "duration", "toDisposable", "needsBlinkInViewport", "isVisible", "wasBlinkOn", "nextTerminalId", "DomRenderer", "Disposable", "_terminal", "_document", "_element", "_screenElement", "_viewportElement", "_helperContainer", "_linkifier2", "instantiationService", "_charSizeService", "_optionsService", "_bufferService", "_coreService", "_coreBrowserService", "_themeService", "createSelectionRenderModel", "Emitter", "createRenderDimensions", "e", "DomRendererRowFactory", "CursorBlinkStateManager", "addDisposableListener", "toDisposable", "TextBlinkStateManager", "WidthCache", "dpr", "element", "styles", "colors", "color", "blinkAnimationUnderlineId", "blinkAnimationBarId", "blinkAnimationBlockId", "i", "c", "spacing", "cols", "rows", "row", "isVisible", "start", "end", "columnSelectMode", "oldViewportStart", "oldViewportEnd", "newViewportStart", "newViewportEnd", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "documentFragment", "isXFlipped", "startCol", "endCol", "middleRowsCount", "finalEndCol", "renderStartRow", "renderEndRow", "cursorViewportRow", "colStart", "colEnd", "rowCount", "left", "width", "buffer", "cursorAbsoluteY", "cursorX", "cursorBlink", "cursorStyle", "cursorInactiveStyle", "rowInfo", "y", "rowElement", "lineData", "x", "x2", "y2", "enabled", "maxY", "bufferline", "hasBlinkingCells", "__decorateClass", "__decorateParam", "IInstantiationService", "ICharSizeService", "IOptionsService", "IBufferService", "ICoreService", "ICoreBrowserService", "IThemeService", "_rowContainer", "CharSizeService", "Disposable", "document", "parentElement", "_optionsService", "Emitter", "TextMetricsMeasureStrategy", "DomMeasureStrategy", "result", "__decorateClass", "__decorateParam", "IOptionsService", "BaseMeasureStategy", "Disposable", "width", "height", "DomMeasureStrategy", "_document", "_parentElement", "_optionsService", "TextMetricsMeasureStrategy", "a", "metrics", "CoreBrowserService", "Disposable", "_textarea", "_window", "mainDocument", "Emitter", "ScreenDprMonitor", "w", "EventUtils", "addDisposableListener", "value", "_parentWindow", "MutableDisposable", "toDisposable", "parentWindow", "LinkProviderService", "Disposable", "toDisposable", "linkProvider", "providerIndex", "getCoordsRelativeToElement", "window", "event", "element", "rect", "elementStyle", "leftPadding", "topPadding", "getCoords", "colCount", "rowCount", "hasValidCharSize", "cssCellWidth", "cssCellHeight", "isSelection", "coords", "MouseCoordsService", "_charSizeService", "_renderService", "event", "element", "colCount", "rowCount", "isSelection", "getCoords", "getWindow", "coords", "getCoordsRelativeToElement", "__decorateClass", "__decorateParam", "ICharSizeService", "IRenderService", "mainWindow", "tail", "array", "n", "memoize", "_target", "key", "descriptor", "fnKey", "fn", "memoizeKey", "descriptorAny", "args", "_LinkedListNode", "element", "LinkedListNode", "LinkedList", "atTheEnd", "newNode", "oldLast", "oldFirst", "didRemove", "node", "anchor", "EventType", "_Gesture", "Disposable", "targetWindow", "addDisposableListener", "e", "remove", "toDisposable", "timestamp", "i", "len", "touch", "evt", "activeTouchCount", "data", "holdTime", "finalX", "finalY", "deltaT", "deltaX", "deltaY", "dispatchTo", "t", "type", "initialTarget", "event", "currentTime", "setTapCount", "ignoreTarget", "targets", "target", "depth", "now", "a", "b", "t1", "vX", "dirX", "x", "vY", "dirY", "y", "scheduleAtNextAnimationFrame", "deltaPosX", "deltaPosY", "stopped", "d", "__decorateClass", "Gesture", "MouseService", "_renderService", "_mouseCoordsService", "_mouseStateService", "_coreService", "_bufferService", "_optionsService", "_selectionService", "_logService", "_coreBrowserService", "target", "register", "focus", "element", "document", "requestedEvents", "mouseupListener", "MutableDisposable", "mousedragListener", "ctx", "eventListeners", "ev", "AltMouseCursorController", "events", "addDisposableListener", "Gesture", "EventType", "e", "pos", "but", "action", "deltaY", "stripAltFromReport", "targetDocument", "listenerDocument", "sequence", "cellHeight", "lines", "i", "amount", "dpr", "targetWheelEventPixels", "report", "e1", "e2", "pixels", "__decorateClass", "__decorateParam", "IRenderService", "IMouseCoordsService", "IMouseStateService", "ICoreService", "IBufferService", "IOptionsService", "ISelectionService", "ILogService", "ICoreBrowserService", "_element", "_document", "_isActive", "store", "DisposableStore", "syncFromModifier", "targetWindow", "altHeld", "RenderDebouncer", "_renderCallback", "_coreBrowserService", "callback", "rowStart", "rowEnd", "rowCount", "start", "end", "TaskQueue", "logService", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "DebouncedIdleTask", "RenderService", "Disposable", "_rowCount", "screenElement", "_optionsService", "_logService", "_charSizeService", "_coreService", "decorationService", "bufferService", "_coreBrowserService", "themeService", "MutableDisposable", "Emitter", "DebouncedIdleTask", "RenderDebouncer", "start", "end", "SynchronizedOutputHandler", "toDisposable", "w", "observer", "e", "entry", "sync", "isRedrawOnly", "buffered", "cols", "rows", "renderer", "callback", "columnSelectMode", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "ICharSizeService", "ICoreService", "IDecorationService", "IBufferService", "ICoreBrowserService", "IThemeService", "_onTimeout", "result", "moveToCellSequence", "targetX", "targetY", "bufferService", "applicationCursor", "startX", "startY", "resetStartingRow", "moveToRequestedRow", "moveToRequestedCol", "direction", "repeat", "sequence", "rowDifference", "cellsToMove", "colsFromRowEnd", "colsFromRowBeginning", "currX", "bufferLine", "wrappedRowsForRow", "startRow", "endRow", "rowsToMove", "wrappedRowsCount", "verticalDirection", "horizontalDirection", "wrappedRows", "i", "currentRow", "rowCount", "line", "lineWraps", "startCol", "endCol", "forward", "currentCol", "bufferStr", "mod", "count", "str", "rpt", "SelectionModel", "_bufferService", "startPlusLength", "start", "end", "amount", "getRangeLength", "range", "bufferCols", "NON_BREAKING_SPACE_CHAR", "ALL_NON_BREAKING_SPACE_REGEX", "SelectionService", "Disposable", "_element", "_screenElement", "_linkifier", "_bufferService", "_coreService", "_mouseCoordsService", "_optionsService", "_mouseStateService", "_renderService", "_coreBrowserService", "MutableDisposable", "CellData", "Emitter", "event", "amount", "e", "SelectionModel", "toDisposable", "start", "end", "buffer", "result", "startCol", "endCol", "i", "lineText", "startRowEndCol", "bufferLine", "line", "ALL_NON_BREAKING_SPACE_REGEX", "isWindows", "isLinuxMouseSelection", "isLinux", "coords", "x", "y", "allowWhitespaceOnlySelection", "range", "getRangeLength", "offset", "getCoordsRelativeToElement", "terminalHeight", "isMac", "hadSelection", "previousSelectionEnd", "timeElapsed", "coordinates", "sequence", "moveToCellSequence", "hasSelection", "charIndex", "length", "col", "row", "ev", "followWrappedLinesAbove", "followWrappedLinesBelow", "startIndex", "endIndex", "charOffset", "leftWideCharCount", "rightWideCharCount", "leftLongCharOffset", "rightLongCharOffset", "previousBufferLine", "previousLineWordPosition", "nextBufferLine", "nextLineWordPosition", "wordPosition", "endRow", "cell", "wrappedRange", "__decorateClass", "__decorateParam", "IBufferService", "ICoreService", "IMouseCoordsService", "IOptionsService", "IMouseStateService", "IRenderService", "ICoreBrowserService", "TwoKeyMap", "first", "second", "value", "ColorContrastCache", "TwoKeyMap", "bg", "fg", "value", "DEFAULT_ANSI_COLORS", "colors", "css", "v", "i", "r", "g", "b", "channels", "c", "DEFAULT_FOREGROUND", "css", "DEFAULT_BACKGROUND", "DEFAULT_CURSOR", "DEFAULT_CURSOR_ACCENT", "DEFAULT_SELECTION", "DEFAULT_OVERVIEW_RULER_BORDER", "ThemeService", "Disposable", "_optionsService", "ColorContrastCache", "Emitter", "color", "DEFAULT_ANSI_COLORS", "theme", "colors", "parseColor", "NULL_COLOR", "colorCount", "i", "slot", "callback", "__decorateClass", "__decorateParam", "IOptionsService", "cssString", "fallback", "KEYCODE_KEY_MAPPINGS", "evaluateKeyboardEvent", "ev", "applicationCursorMode", "isMac", "macOptionIsMeta", "result", "modifiers", "key", "keyCode", "keyString", "KittyKeyboard", "ev", "suffix", "mods", "macOptionAsAlt", "numpadCode", "modifierCode", "funcCode", "digit", "code", "letter", "modifiers", "eventType", "reportEventTypes", "needsEventType", "seq", "number", "keyCode", "flags", "isFunc", "isMod", "reportAlternateKeys", "shiftedKey", "textCode", "result", "csiLetter", "ss3Letter", "tildeCode", "specialKey", "legacyByte", "Win32InputMode", "ev", "vk", "controlChar", "codePoint", "state", "isKeyDown", "sc", "uc", "kd", "cs", "KeyboardService", "_coreService", "_optionsService", "Win32InputMode", "KittyKeyboard", "event", "kittyFlags", "isMac", "evaluateKeyboardEvent", "__decorateClass", "__decorateParam", "ICoreService", "IOptionsService", "ServiceCollection", "entries", "id", "service", "instance", "result", "callback", "key", "value", "InstantiationService", "IInstantiationService", "ctor", "args", "serviceDependencies", "getServiceDependencies", "a", "b", "serviceArgs", "dependency", "firstServiceArgPos", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "optionalParams", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "CircularList", "Disposable", "_maxLength", "Emitter", "newMaxLength", "newArray", "i", "newLength", "index", "value", "start", "deleteCount", "items", "countToTrim", "count", "offset", "expandListBy", "DEFAULT_ATTR_DATA", "AttributeData", "$startIndex", "$workCell", "CellData", "$extended", "BufferLine", "_BufferLine", "cols", "fillCellData", "isWrapped", "cell", "i", "index", "content", "cp", "stringFromCodePoint", "value", "codePoint", "width", "attrs", "$idx", "pos", "n", "start", "end", "respectProtect", "uint32Cells", "data", "keys", "key", "extKeys", "line", "blank", "newLine", "src", "srcCol", "destCol", "length", "applyInReverse", "srcData", "trimRight", "startCol", "endCol", "outColumns", "isCanonical", "cellContents", "chars", "result", "srcStart", "reflowLargerGetLinesToRemove", "lines", "oldCols", "newCols", "bufferAbsoluteY", "nullCell", "reflowCursorLine", "toRemove", "y", "i", "nextLine", "wrappedLines", "destLineIndex", "destCol", "getWrappedLineTrimmedLength", "srcLineIndex", "srcCol", "srcTrimmedTineLength", "srcRemainingCells", "destRemainingCells", "cellsToCopy", "countToRemove", "reflowLargerCreateNewLayout", "layout", "nextToRemoveIndex", "nextToRemoveStart", "countRemovedSoFar", "reflowLargerApplyNewLayout", "newLayout", "newLayoutLines", "reflowSmallerGetNewLineLengths", "newLineLengths", "cellsNeeded", "srcLine", "cellsAvailable", "oldTrimmedLength", "endsWithWide", "lineLength", "cols", "endsInNull", "followingLineStartsWithWide", "_Marker", "line", "Emitter", "dispose", "disposable", "Marker", "CHARSETS", "DEFAULT_CHARSET", "MAX_BUFFER_SIZE", "Buffer", "Disposable", "_hasScrollback", "_optionsService", "_bufferService", "_logService", "DEFAULT_ATTR_DATA", "DEFAULT_CHARSET", "CellData", "CircularList", "IdleTaskQueue", "toDisposable", "attr", "ExtendedAttrs", "isWrapped", "BufferLine", "relativeY", "rows", "correctBufferLength", "fillAttr", "newCols", "newRows", "nullCell", "dirtyMemoryLines", "newMaxLength", "i", "addToY", "y", "amountToTrim", "maxY", "normalRun", "counted", "windowsPty", "reflowCursorLine", "toRemove", "reflowLargerGetLinesToRemove", "newLayoutResult", "reflowLargerCreateNewLayout", "reflowLargerApplyNewLayout", "countRemoved", "viewportAdjustments", "toInsert", "countToInsert", "nextLine", "wrappedLines", "absoluteY", "lastLineLength", "destLineLengths", "reflowSmallerGetNewLineLengths", "linesToAdd", "trimmedLines", "newLines", "newLine", "destLineIndex", "destCol", "srcLineIndex", "srcCol", "cellsToCopy", "wrappedLinesIndex", "getWrappedLineTrimmedLength", "insertEvents", "originalLines", "originalLinesLength", "originalLineIndex", "nextToInsertIndex", "nextToInsert", "countInsertedSoFar", "nextI", "insertCountEmitted", "lineIndex", "trimRight", "startCol", "endCol", "line", "first", "last", "x", "marker", "Marker", "amount", "event", "BufferSet", "Disposable", "_optionsService", "_bufferService", "_logService", "MutableDisposable", "Emitter", "Buffer", "fillAttr", "newCols", "newRows", "i", "BufferService", "Disposable", "optionsService", "logService", "Emitter", "BufferSet", "e", "cols", "rows", "colsChanged", "rowsChanged", "eraseAttr", "isWrapped", "buffer", "newLine", "topRow", "bottomRow", "willBufferBeTrimmed", "scrollRegionHeight", "disp", "suppressScrollEvent", "oldYdisp", "__decorateClass", "__decorateParam", "IOptionsService", "ILogService", "DEFAULT_OPTIONS", "isMac", "FONT_WEIGHT_OPTIONS", "OptionsService", "Disposable", "options", "Emitter", "defaultOptions", "key", "newValue", "e", "toDisposable", "listener", "eventKey", "keys", "getter", "propName", "setter", "value", "desc", "isCursorStyle", "DEFAULT_MODES", "DEFAULT_DEC_PRIVATE_MODES", "DEFAULT_KITTY_KEYBOARD_STATE", "CoreService", "Disposable", "_bufferService", "_logService", "_optionsService", "Emitter", "data", "wasUserInput", "buffer", "e", "__decorateClass", "__decorateParam", "IBufferService", "ILogService", "IOptionsService", "DEFAULT_PROTOCOLS", "e", "eventCode", "e", "isSGR", "code", "S", "DEFAULT_ENCODINGS", "params", "final", "MouseStateService", "Disposable", "Emitter", "name", "DEFAULT_PROTOCOLS", "protocol", "encoding", "customWheelEventHandler", "ev", "UnicodeService", "_UnicodeService", "Emitter", "value", "state", "width", "shouldJoin", "version", "provider", "num", "s", "result", "precedingInfo", "length", "i", "code", "second", "currentInfo", "chWidth", "codepoint", "preceding", "BMP_COMBINING", "HIGH_COMBINING", "table", "bisearch", "ucs", "data", "min", "max", "mid", "UnicodeV6", "r", "num", "codepoint", "preceding", "width", "shouldJoin", "oldWidth", "UnicodeService", "CharsetService", "g", "charset", "updateWindowsModeWrappedState", "bufferService", "lastChar", "nextLine", "Params", "_Params", "maxLength", "maxSubParamsLength", "values", "params", "value", "k", "newParams", "res", "i", "start", "end", "idx", "result", "length", "store", "cur", "StringBuilder", "chunk", "LimitedStringBuilder", "_limit", "EMPTY_HANDLERS", "OscParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "code", "success", "promiseResult", "handlerResult", "fallThrough", "_OscHandler", "_handler", "LimitedStringBuilder", "ret", "res", "OscHandler", "EMPTY_HANDLERS", "DcsParser", "ident", "handler", "handlerList", "handlerIndex", "j", "params", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "EMPTY_PARAMS", "Params", "_DcsHandler", "_handler", "LimitedStringBuilder", "ret", "res", "DcsHandler", "EMPTY_HANDLERS", "ApcParser", "ident", "handler", "handlerList", "handlerIndex", "j", "data", "start", "end", "utf32ToString", "success", "promiseResult", "handlerResult", "fallThrough", "_ApcHandler", "_handler", "LimitedStringBuilder", "ret", "res", "ApcHandler", "TransitionTable", "length", "action", "next", "code", "state", "codes", "i", "NON_ASCII_PRINTABLE", "VT500_TRANSITION_TABLE", "table", "blueprint", "unused", "r", "start", "end", "PRINTABLES", "EXECUTABLES", "states", "EscapeSequenceParser", "Disposable", "_transitions", "Params", "data", "ident", "params", "toDisposable", "OscParser", "DcsParser", "ApcParser", "id", "finalRange", "res", "intermediate", "finalCode", "handler", "handlerList", "handlerIndex", "flag", "callback", "handlers", "handlerPos", "transition", "chunkPos", "promiseResult", "handlerResult", "k", "ch", "csiDone", "j", "c", "l4", "handlersEsc", "jj", "RGB_REX", "HASH_REX", "parseColor", "data", "low", "m", "base", "adv", "result", "i", "c", "pad", "bits", "s", "s2", "toRgbString", "color", "r", "g", "b", "XTERM_VERSION", "GLEVEL", "paramToWindowOption", "opts", "$temp", "InputHandler", "Disposable", "_bufferService", "_charsetService", "_coreService", "_logService", "_optionsService", "_oscLinkService", "_mouseStateService", "_unicodeService", "_parser", "EscapeSequenceParser", "StringToUtf32", "Utf8ToUtf32", "DEFAULT_ATTR_DATA", "Emitter", "DirtyRowTracker", "e", "ident", "params", "code", "identifier", "action", "data", "payload", "start", "end", "OscHandler", "flag", "CHARSETS", "state", "DcsHandler", "cursorStartX", "cursorStartY", "decodedLength", "position", "p", "slowTimeout", "slowPromise", "_res", "rej", "err", "promiseResult", "result", "wasPaused", "i", "len", "viewportEnd", "viewportStart", "chWidth", "charset", "screenReaderMode", "cols", "wraparoundMode", "insertMode", "curAttr", "bufferRow", "precedingJoinState", "pos", "ch", "currentInfo", "UnicodeService", "shouldJoin", "oldWidth", "stringFromCodePoint", "linkId", "oldRow", "oldCol", "BufferLine", "offset", "delta", "id", "callback", "paramToWindowOption", "ApcHandler", "line", "originalX", "maxCol", "x", "y", "diffToTop", "diffToBottom", "param", "clearWrap", "respectProtect", "j", "nextLine", "scrollBackSize", "row", "scrollBottomRowsOffset", "scrollBottomAbsolute", "joinState", "length", "text", "idata", "itext", "tlength", "XTERM_VERSION", "term", "DEFAULT_CHARSET", "ansi", "V", "dm", "mouseProtocol", "mouseEncoding", "cs", "buffers", "active", "alt", "opts", "f", "m", "v", "b2v", "value", "color", "mode", "c1", "c2", "c3", "AttributeData", "attr", "accu", "cSpace", "advance", "subparams", "style", "l", "isBlinking", "top", "bottom", "second", "event", "slots", "idx", "spec", "index", "isValidColorIndex", "parseColor", "uri", "parsedParams", "idParamIndex", "collectAndFlag", "GLEVEL", "scrollRegionHeight", "level", "cell", "CellData", "yOffset", "s", "b", "STYLES", "y1", "y2", "flags", "stack", "count", "__decorateClass", "__decorateParam", "IBufferService", "WriteBuffer", "Disposable", "_action", "TimeoutTimer", "Emitter", "toDisposable", "chunk", "didProcess", "cb", "data", "maxSubsequentCalls", "callback", "lastTime", "promiseResult", "startTime", "result", "continuation", "r", "err", "OscLinkService", "_bufferService", "data", "buffer", "marker", "entry", "castData", "key", "match", "linkId", "y", "e", "linkData", "index", "__decorateClass", "__decorateParam", "IBufferService", "hasWriteSyncWarnHappened", "CoreTerminal", "Disposable", "options", "MutableDisposable", "Emitter", "InstantiationService", "OptionsService", "IOptionsService", "LogService", "ILogService", "BufferService", "IBufferService", "CoreService", "ICoreService", "MouseStateService", "IMouseStateService", "UnicodeService", "UnicodeV6", "IUnicodeService", "CharsetService", "ICharsetService", "OscLinkService", "IOscLinkService", "InputHandler", "EventUtils", "WriteBuffer", "data", "promiseResult", "ev", "key", "callback", "maxSubsequentCalls", "wasUserInput", "x", "y", "eraseAttr", "isWrapped", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "id", "ident", "value", "windowsPty", "disposables", "updateWindowsModeWrappedState", "toDisposable", "d", "i", "SortedList", "_getKey", "logService", "IdleTaskQueue", "value", "sortedAddedValues", "a", "b", "sortedAddedValuesIndex", "arrayIndex", "newArray", "newArrayIndex", "key", "sortedDeletedIndices", "sortedDeletedIndicesIndex", "callback", "min", "max", "mid", "midKey", "$xmin", "$xmax", "DecorationService", "Disposable", "_logService", "_bufferService", "DecorationLineCache", "Emitter", "SortedList", "e", "toDisposable", "options", "decoration", "Decoration", "markerDispose", "listener", "d", "x", "line", "layer", "bucket", "callback", "__decorateClass", "__decorateParam", "ILogService", "IBufferService", "MutableDisposable", "MicrotaskTimer", "lines", "store", "DisposableStore", "amount", "event", "start", "height", "index", "callbacks", "cb", "newMap", "newLine", "existing", "i", "len", "spanCrossers", "deleteEnd", "toReindex", "css", "RENDER_DEBOUNCE_THRESHOLD_MS", "TimeBasedDebouncer", "_renderCallback", "_debounceThresholdMS", "rowStart", "rowEnd", "rowCount", "refreshRequestTime", "elapsed", "waitPeriodBeforeTrailingRefresh", "start", "end", "DEBUG", "AccessibilityManager", "Disposable", "_terminal", "instantiationService", "_coreBrowserService", "_renderService", "doc", "i", "e", "TimeBasedDebouncer", "char", "spaceCount", "addDisposableListener", "toDisposable", "tooMuchOutput", "keyChar", "start", "end", "buffer", "setSize", "line", "columns", "lineData", "posInSet", "element", "position", "boundaryElement", "beforeBoundaryElement", "lastRowPos", "topBoundaryElement", "bottomBoundaryElement", "newElement", "selection", "begin", "lastRowElement", "toRowColumn", "node", "offset", "rowElement", "row", "column", "beginRowColumn", "endRowColumn", "rows", "width", "lastColumn", "targetWidth", "__decorateClass", "__decorateParam", "IInstantiationService", "ICoreBrowserService", "IRenderService", "Linkifier", "Disposable", "_element", "_mouseCoordsService", "_renderService", "_bufferService", "_linkProviderService", "Emitter", "toDisposable", "dispose", "addDisposableListener", "event", "position", "composedPath", "i", "target", "useLineCache", "reply", "linkWithState", "linkProvided", "linkProvider", "links", "linksWithState", "link", "y", "replies", "occupiedCells", "providerReply", "startX", "endX", "x", "index", "hasLinkBefore", "j", "linkAtPosition", "currentLink", "linkEquals", "startRow", "endRow", "v", "e", "start", "end", "element", "showEvent", "range", "scrollOffset", "lower", "upper", "current", "coords", "x1", "y1", "x2", "y2", "fg", "__decorateClass", "__decorateParam", "IMouseCoordsService", "IRenderService", "IBufferService", "ILinkProviderService", "a", "b", "CoreBrowserTerminal", "CoreTerminal", "options", "MutableDisposable", "Platform_exports", "Emitter", "DecorationService", "IDecorationService", "KeyboardService", "IKeyboardService", "LinkProviderService", "ILinkProviderService", "OscLinkProvider", "e", "type", "event", "EventUtils", "toDisposable", "dimensions", "req", "acc", "ident", "colorRgb", "color", "toRgbString", "colors", "channels", "narrowedAcc", "bgLuminance", "rgb", "fgLuminance", "colorSchemeMode", "value", "AccessibilityManager", "ev", "CompositionHelper", "cursorY", "bufferLine", "cursorX", "cellHeight", "width", "cellWidth", "cursorTop", "cursorLeft", "addDisposableListener", "copyHandler", "pasteHandlerWrapper", "handlePasteEvent", "isFirefox", "rightClickHandler", "isLinux", "moveTextAreaUnderMouseCursor", "parent", "fragment", "textarea", "promptLabel", "isChromeOS", "CoreBrowserService", "ICoreBrowserService", "CharSizeService", "ICharSizeService", "ThemeService", "IThemeService", "CharacterJoinerService", "ICharacterJoinerService", "RenderService", "IRenderService", "MouseCoordsService", "IMouseCoordsService", "linkifier", "Linkifier", "Viewport", "SelectionService", "ISelectionService", "MouseService", "IMouseService", "text", "BufferDecorationRenderer", "showScrollbar", "overviewRulerWidth", "OverviewRulerRenderer", "shouldShow", "amount", "disposable", "DomRenderer", "start", "end", "sync", "disp", "suppressScrollEvent", "pageCount", "disableSmoothScroll", "line", "scrollAmount", "data", "paste", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "shouldIgnoreComposition", "result", "scrollCount", "wasModifierOnly", "wasModifierKeyOnlyEvent", "browser", "thirdLevelKey", "key", "x", "y", "i", "DEFAULT_ATTR_DATA", "canvasWidth", "canvasHeight", "AddonManager", "i", "terminal", "instance", "loadedAddon", "index", "BufferLineApiView", "_line", "x", "cell", "CellData", "trimRight", "startColumn", "endColumn", "BufferApiView", "_buffer", "type", "buffer", "y", "line", "BufferLineApiView", "CellData", "BufferNamespaceApi", "Disposable", "_core", "Emitter", "BufferApiView", "ParserApi", "_core", "id", "callback", "params", "data", "handler", "ident", "UnicodeApi", "_core", "provider", "version", "CONSTRUCTOR_ONLY_OPTIONS", "$value", "Terminal", "Disposable", "options", "CoreBrowserTerminal", "AddonManager", "getter", "propName", "setter", "value", "desc", "ParserApi", "UnicodeApi", "BufferNamespaceApi", "m", "mouseTrackingMode", "data", "wasUserInput", "columns", "rows", "parent", "customKeyEventHandler", "customWheelEventHandler", "linkProvider", "handler", "joinerId", "cursorYOffset", "decorationOptions", "column", "row", "length", "start", "end", "amount", "pageCount", "line", "callback", "addon", "promptLabel", "tooMuchOutput", "values"] } diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts -index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1e931791d 100644 +index 67893b7966eb095db4459b8837de9766921f36c5..0abf7ecac1aa108f7caf711d0a5c610a688d34fd 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -325,6 +325,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { @@ -93,7 +93,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true)); this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements())); } -@@ -551,6 +565,11 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -552,6 +566,11 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._compositionView = this._document.createElement('div'); this._compositionView.classList.add('composition-view'); this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView); @@ -105,7 +105,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._helperContainer.appendChild(this._compositionView); this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService); -@@ -1008,7 +1027,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -1009,7 +1028,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._onKey.fire({ key, domEvent: ev }); this._showCursor(); @@ -116,7 +116,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._keyPressHandled = true; -@@ -1026,6 +1047,15 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -1027,6 +1048,15 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { * @param ev The input event to be handled. */ protected _inputEvent(ev: InputEvent): boolean { @@ -149,7 +149,7 @@ index 497afcf535f3eaca00889525a77e15eb633ccd96..96d499b34605f860608382114c3fbdc0 export interface IBrowser { diff --git a/src/browser/input/CompositionHelper.ts b/src/browser/input/CompositionHelper.ts -index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f01bd98554 100644 +index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..d4d5106d8dd723eceed87310c193ccfe0c516b06 100644 --- a/src/browser/input/CompositionHelper.ts +++ b/src/browser/input/CompositionHelper.ts @@ -3,8 +3,9 @@ @@ -636,7 +636,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 // Since composition* events happen before the changes take place in the textarea on most // browsers, use a setTimeout with 0ms time to allow the native compositionend event to -@@ -172,37 +479,310 @@ export class CompositionHelper { +@@ -172,37 +479,315 @@ export class CompositionHelper { // - The last compositionupdate event's data property does not always accurately describe // the character, a counter example being Korean where an ending consonsant can move to // the following character if the following input is a vowel. @@ -670,11 +670,11 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 + pending.finalizerTimer = undefined; + if (this._compositionTransactionId === pending.transactionId) { + this._isAwaitingCompositionEnd = false; -+ } -+ if (this._pendingComposition === pending) { -+ this._sendPendingComposition(pending, true); } - }, 0); ++ if (this._pendingComposition === pending) { ++ this._sendPendingComposition(pending, true); ++ } + }); } } @@ -891,12 +891,17 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 + if ( + this._compositionEndTimer !== timer || + !this._isComposing || -+ this._compositionTransactionId !== transactionId || -+ !this._compositionEndBelongsToCurrentTransaction(endData) ++ this._compositionTransactionId !== transactionId + ) { + return; + } + this._compositionEndTimer = undefined; ++ if (!this._compositionEndBelongsToCurrentTransaction(endData)) { ++ if (endData.length === 0 && !this._hasCompositionProgress()) { ++ this._cancelComposition(); ++ } ++ return; ++ } + this._finalizeComposition(true, endData); + this._dispatchCompositionSessionEvent(new CustomEvent( + XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT, @@ -974,7 +979,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 /** * Apply any changes made to the textarea after the current event chain is allowed to complete. * This should be called when not currently composing but a keydown event with the "composition -@@ -222,6 +802,9 @@ export class CompositionHelper { +@@ -222,6 +807,9 @@ export class CompositionHelper { const diff = newValue.replace(oldValue, ''); @@ -984,7 +989,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 this._dataAlreadySent = diff; if (newValue.length > oldValue.length) { -@@ -236,6 +819,101 @@ export class CompositionHelper { +@@ -236,6 +824,101 @@ export class CompositionHelper { }, 0); } @@ -1086,7 +1091,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 /** * Positions the composition view on top of the cursor and the textarea just below it (so the * IME helper dialog is positioned correctly). -@@ -243,10 +921,23 @@ export class CompositionHelper { +@@ -243,10 +926,23 @@ export class CompositionHelper { * necessary as the IME events across browsers are not consistently triggered. */ public updateCompositionElements(dontRecurse?: boolean): void { @@ -1111,7 +1116,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 if (this._bufferService.buffer.isCursorInViewport) { const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1); -@@ -265,20 +956,38 @@ export class CompositionHelper { +@@ -265,20 +961,38 @@ export class CompositionHelper { const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft; this._compositionView.style.maxWidth = maxWidth + 'px'; this._compositionView.style.overflow = 'hidden'; diff --git a/config/patches/xterm-src/@xterm__addon-serialize@0.15.0-beta.300.src.patch b/config/patches/xterm-src/@xterm__addon-serialize@0.15.0-beta.300.src.patch new file mode 100644 index 00000000000..00e8abcfa1d --- /dev/null +++ b/config/patches/xterm-src/@xterm__addon-serialize@0.15.0-beta.300.src.patch @@ -0,0 +1,212 @@ +diff --git a/src/SerializeAddon.ts b/src/SerializeAddon.ts +index e1728feb219c362dfa2ecb602ff99f830d520757..957da98c8b30835cc2d114b4b66b228b01fdff0a 100644 +--- a/src/SerializeAddon.ts ++++ b/src/SerializeAddon.ts +@@ -12,6 +12,36 @@ import { IAttributeData } from 'common/buffer/Types'; + import { DEFAULT_ANSI_COLORS } from 'browser/Types'; + import { UnderlineStyle } from 'common/buffer/Constants'; + ++type OscLinkData = { id?: string; uri: string }; ++type OscLinkedCell = { extended?: { urlId?: number } }; ++type TerminalWithOscLinks = Terminal & { ++ _core?: { ++ _inputHandler?: { _curAttrData?: IAttributeData & OscLinkedCell }; ++ _oscLinkService?: { getLinkData: (linkId: number) => OscLinkData | undefined }; ++ }; ++}; ++ ++function getOscLinkId(cell: IBufferCell | IAttributeData): number { ++ return (cell as typeof cell & OscLinkedCell).extended?.urlId ?? 0; ++} ++ ++function getOscLinkOpenSequence(terminal: Terminal, linkId: number): string { ++ if (!linkId) { ++ return ''; ++ } ++ const data = (terminal as TerminalWithOscLinks)._core?._oscLinkService?.getLinkData(linkId); ++ if (!data) { ++ return ''; ++ } ++ const params = data.id === undefined ? '' : `id=${data.id}`; ++ return `\u001b]8;${params};${data.uri}\u001b\\`; ++} ++ ++function getActiveOscLinkSequence(terminal: Terminal): string { ++ const attrs = (terminal as TerminalWithOscLinks)._core?._inputHandler?._curAttrData; ++ return attrs ? getOscLinkOpenSequence(terminal, getOscLinkId(attrs)) : ''; ++} ++ + function constrain(value: number, low: number, high: number): number { + return Math.max(low, Math.min(value, high)); + } +@@ -148,12 +178,14 @@ class StringSerializeHandler extends BaseSerializeHandler { + + // this is a null cell for reference for checking whether background is empty or not + private _backgroundCell: IBufferCell = this._buffer.getNullCell(); ++ private _defaultCell: IBufferCell = this._buffer.getNullCell(); + + private _firstRow: number = 0; + private _lastCursorRow: number = 0; + private _lastCursorCol: number = 0; + private _lastContentCursorRow: number = 0; + private _lastContentCursorCol: number = 0; ++ private _activeOscLinkId: number = 0; + + constructor( + buffer: IBuffer, +@@ -214,7 +246,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + if ( + // you must output character to cause overflow, control sequence can't do this + nextRowFirstChar.getChars() && +- isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0 ++ (isNextRowFirstCharDoubleWidth ? this._nullCellCount <= 1 : this._nullCellCount <= 0) + ) { + if ( + // the last character can't be null, +@@ -251,9 +283,14 @@ class StringSerializeHandler extends BaseSerializeHandler { + if (this._nullCellCount > 0) { + // do these because we filled the last several null slot, which we shouldn't + rowSeparator += '\u001b[A'; +- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}C`; ++ const contentCellCount = currentLine.length - this._nullCellCount; ++ if (contentCellCount > 0) { ++ rowSeparator += `\u001b[${contentCellCount}C`; ++ } + rowSeparator += `\u001b[${this._nullCellCount}X`; +- rowSeparator += `\u001b[${currentLine.length - this._nullCellCount}D`; ++ if (contentCellCount > 0) { ++ rowSeparator += `\u001b[${contentCellCount}D`; ++ } + rowSeparator += '\u001b[B'; + } + +@@ -310,7 +347,20 @@ class StringSerializeHandler extends BaseSerializeHandler { + } + if (flagsChanged) { + if (cell.isInverse() !== oldCell.isInverse()) { sgrSeq.push(cell.isInverse() ? 7 : 27); } +- if (cell.isBold() !== oldCell.isBold()) { sgrSeq.push(cell.isBold() ? 1 : 22); } ++ // PATCH(orca): bold (1) and dim (2) share the single reset param 22, so ++ // they must be diffed as one intensity group with the clearing 22 emitted ++ // BEFORE any re-set. Upstream's independent per-flag diff could emit ++ // "1;22" (bold set, then wiped by dim's clear — \x1b[2mA\x1b[22m\x1b[1mB ++ // loses B's bold on round-trip) or a bare "22" that drops a still-set ++ // bold/dim, garbling Orca's hidden-terminal snapshot restores. ++ const boldChanged = cell.isBold() !== oldCell.isBold(); ++ const dimChanged = cell.isDim() !== oldCell.isDim(); ++ if (boldChanged || dimChanged) { ++ const clearsIntensity = (boldChanged && !cell.isBold()) || (dimChanged && !cell.isDim()); ++ if (clearsIntensity) { sgrSeq.push(22); } ++ if (cell.isBold() && (boldChanged || clearsIntensity)) { sgrSeq.push(1); } ++ if (cell.isDim() && (dimChanged || clearsIntensity)) { sgrSeq.push(2); } ++ } + if (!equalUnderline(cell, oldCell)) { + const style = cell.getUnderlineStyle(); + if (style === UnderlineStyle.NONE) { +@@ -337,7 +387,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + if (cell.isBlink() !== oldCell.isBlink()) { sgrSeq.push(cell.isBlink() ? 5 : 25); } + if (cell.isInvisible() !== oldCell.isInvisible()) { sgrSeq.push(cell.isInvisible() ? 8 : 28); } + if (cell.isItalic() !== oldCell.isItalic()) { sgrSeq.push(cell.isItalic() ? 3 : 23); } +- if (cell.isDim() !== oldCell.isDim()) { sgrSeq.push(cell.isDim() ? 2 : 22); } ++ // PATCH(orca): dim handled in the intensity group above. + if (cell.isStrikethrough() !== oldCell.isStrikethrough()) { sgrSeq.push(cell.isStrikethrough() ? 9 : 29); } + } + } +@@ -346,6 +396,20 @@ class StringSerializeHandler extends BaseSerializeHandler { + return sgrSeq; + } + ++ private _setOscLink(linkId: number): string { ++ if (linkId === this._activeOscLinkId) { ++ return ''; ++ } ++ let sequence = this._activeOscLinkId ? '\u001b]8;;\u001b\\' : ''; ++ this._activeOscLinkId = 0; ++ const openSequence = getOscLinkOpenSequence(this._terminal, linkId); ++ if (openSequence) { ++ this._activeOscLinkId = linkId; ++ sequence += openSequence; ++ } ++ return sequence; ++ } ++ + protected _nextCell(cell: IBufferCell, oldCell: IBufferCell, row: number, col: number): void { + // a width 0 cell don't need to be count because it is just a placeholder after a CJK character; + const isPlaceHolderCell = cell.getWidth() === 0; +@@ -356,12 +420,21 @@ class StringSerializeHandler extends BaseSerializeHandler { + + // this cell don't have content + const isEmptyCell = cell.getChars() === ''; ++ const nextLine = isEmptyCell && cell.isInverse() ? this._buffer.getLine(row + 1) : undefined; ++ const nextRowFirstCell = nextLine?.getCell(0, this._nextRowFirstChar); ++ // A pending wide glyph recreates its own final-column padding during replay. ++ const isWideWrapPadding = col === this._terminal.cols - 1 && ++ nextLine?.isWrapped && ++ (nextRowFirstCell?.getWidth() ?? 0) > 1 && ++ !!nextRowFirstCell && attributesEquals(cell, nextRowFirstCell); ++ // Cursor movement cannot reproduce an inverse cell's visible background. ++ const materializeEmptyCell = isEmptyCell && !!cell.isInverse() && !isWideWrapPadding; + + const sgrSeq = this._diffStyle(cell, this._cursorStyle); + +- // the empty cell style is only assumed to be changed when background changed, because +- // foreground is always 0. +- const styleChanged = isEmptyCell ? !equalBg(this._cursorStyle, cell) : sgrSeq.length > 0; ++ const styleChanged = isEmptyCell ++ ? materializeEmptyCell ? sgrSeq.length > 0 : !equalBg(this._cursorStyle, cell) ++ : sgrSeq.length > 0; + + /** + * handles style change +@@ -395,7 +468,7 @@ class StringSerializeHandler extends BaseSerializeHandler { + /** + * handles actual content + */ +- if (isEmptyCell) { ++ if (isEmptyCell && !materializeEmptyCell) { + this._nullCellCount += cell.getWidth(); + } else { + if (this._nullCellCount > 0) { +@@ -411,7 +484,22 @@ class StringSerializeHandler extends BaseSerializeHandler { + this._nullCellCount = 0; + } + +- this._currentRow += cell.getChars(); ++ // PATCH(orca): styling alone leaves restored OSC 8 links looking live but unclickable. ++ this._currentRow += this._setOscLink(getOscLinkId(cell)); ++ ++ if (materializeEmptyCell) { ++ const hasDecoration = !!cell.isUnderline() || !!cell.isStrikethrough() || !!cell.isOverline(); ++ if (hasDecoration) { ++ this._currentRow += '\u001b[24;29;55m'; ++ } ++ this._currentRow += ' '.repeat(cell.getWidth()); ++ if (hasDecoration) { ++ const restoreSgrSeq = this._diffStyle(cell, this._defaultCell); ++ this._currentRow += `\u001b[0m\u001b[${restoreSgrSeq.join(';')}m`; ++ } ++ } else { ++ this._currentRow += cell.getChars(); ++ } + + // update cursor + this._lastContentCursorRow = this._lastCursorRow = row; +@@ -439,6 +527,9 @@ class StringSerializeHandler extends BaseSerializeHandler { + } + } + ++ // Each buffer is self-contained so links cannot leak into a following buffer. ++ content += this._setOscLink(0); ++ + // restore the cursor + if (!excludeFinalCursorPosition) { + const realCursorRow = this._buffer.baseY + this._buffer.cursorY; +@@ -616,6 +707,9 @@ export class SerializeAddon implements ITerminalAddon, ISerializeApi { + content += this._serializeScrollRegion(this._terminal); + } + ++ // Restore the source terminal's live OSC pen only after all buffers are complete. ++ content += getActiveOscLinkSequence(this._terminal); ++ + return content; + } + diff --git a/config/patches/xterm-src/@xterm__addon-webgl@0.20.0-beta.299.src.patch b/config/patches/xterm-src/@xterm__addon-webgl@0.20.0-beta.299.src.patch new file mode 100644 index 00000000000..4b6cfb0aef0 --- /dev/null +++ b/config/patches/xterm-src/@xterm__addon-webgl@0.20.0-beta.299.src.patch @@ -0,0 +1,131 @@ +diff --git a/src/GlyphRenderer.ts b/src/GlyphRenderer.ts +index 742f0879ff4f04509e4a07c8efdf0d5743fe8ee5..885a206a394fff783737a412c0b75bf935dd0eca 100644 +--- a/src/GlyphRenderer.ts ++++ b/src/GlyphRenderer.ts +@@ -61,6 +61,8 @@ function createFragmentShaderSource(maxFragmentShaderTextureUnits: number): stri + for (let i = 1; i < maxFragmentShaderTextureUnits; i++) { + textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`; + } ++ // A v_texpage beyond the sampler budget matches no branch above. Leaving outColor unwritten ++ // is undefined behaviour in GLSL ES and paints garbage, so fall through to transparent. + return (`#version 300 es + precision lowp float; + +@@ -74,7 +76,7 @@ out vec4 outColor; + void main() { + if (v_texpage == 0) { + outColor = texture(u_texture[0], v_texcoord); +- } ${textureConditionals} ++ } ${textureConditionals} else { outColor = vec4(0.0, 0.0, 0.0, 0.0); } + }`); + } + +diff --git a/src/TextureAtlas.ts b/src/TextureAtlas.ts +index 4977ad741065e26bbfd35bc50e7558a033b13340..f55805ddc3f266415f7f8e81e5b8c318e7db194c 100644 +--- a/src/TextureAtlas.ts ++++ b/src/TextureAtlas.ts +@@ -3,6 +3,7 @@ + * @license MIT + */ + ++import { FontWeight } from '@xterm/xterm'; + import { IColorContrastCache } from 'browser/Types'; + import { DIM_OPACITY, TEXT_BASELINE } from './Constants'; + import { tryDrawCustomGlyph } from './customGlyphs/CustomGlyphRasterizer'; +@@ -135,21 +136,23 @@ export class TextureAtlas implements ITextureAtlas { + private _pageLayoutVersion = 0; + public get pageLayoutVersion(): number { return this._pageLayoutVersion; } + ++ // Orca diagnostics: read by terminal-render-desync-weight-probe.ts to tell a real ++ // bold-collapse from a repaint problem. Canvas silently keeps its previous font when an ++ // assignment fails to parse, which rasterizes glyphs at a stale weight. ++ public fontProbeMismatchCount = 0; ++ public fontProbeLastMismatch: { desired: string, actual: string } | undefined; ++ + public clearTexture(): void { +- if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) { ++ // Guard on every page rather than pages[0]: a merged page is never written through ++ // currentRow, so once one lands at index 0 the old check made every later clear a no-op. ++ if (this._pages.every(page => page.glyphs.length === 0 && page.currentRow.x === 0 && page.currentRow.y === 0)) { + return; + } +- for (const page of this._pages) { +- page.clear(); +- } +- this._cacheMap.clear(); +- this._cacheMapCombined.clear(); +- this._didWarmUp = false; +- +- // Invalidate renderer models so all texture pages are refreshed. The atlas may be shared, in +- // which case the clearing renderer has cleared only its own model and every other owner still +- // holds texture coords into the rows just wiped. +- this._pageLayoutVersion++; ++ // Return the atlas to its constructor state instead of clearing in place: page.clear() leaves ++ // page.glyphs populated, which would keep the guard above from ever firing again. Eviction ++ // also bumps _pageLayoutVersion, so every renderer sharing this atlas rebuilds its model. ++ this._evictAllPages(); ++ this._createNewPage(); + } + + private _createNewPage(): AtlasPage { +@@ -465,6 +468,36 @@ export class TextureAtlas implements ITextureAtlas { + return this._config.colors.contrastCache; + } + ++ /** ++ * Orca diagnostic. Canvas ignores a font assignment it cannot parse and silently keeps the ++ * previous value, so a bad family or weight rasterizes every glyph at a stale weight. Record ++ * the mismatch rather than correcting it: the goal is to tell that failure apart from a ++ * repaint bug when a terminal renders bold-collapsed. ++ */ ++ private _probeRasterizationFontWeight(fontWeight: FontWeight): void { ++ const desired = String(fontWeight); ++ // Only numeric weights are comparable; keywords round-trip through Canvas unchanged. ++ if (!/^(?:[1-8]\d{2}|900)$/.test(desired)) { ++ return; ++ } ++ // Canvas normalizes font serialization: Chromium omits 400 and emits the keyword bold for 700. ++ const token = this._tmpCtx.font.match( ++ /(?:^|\s)(normal|bold|[1-9]\d{0,3})(?=\s+\d+(?:\.\d+)?px(?:\s|$))/ ++ )?.[1] ?? '400'; ++ const actual = token === 'normal' ? '400' : token === 'bold' ? '700' : token; ++ if (actual === desired) { ++ return; ++ } ++ this.fontProbeMismatchCount++; ++ this.fontProbeLastMismatch = { desired, actual: this._tmpCtx.font }; ++ try { ++ (globalThis as { __orcaAtlasFontProbe?: (mismatch: { desired: string, actual: string }) => void }) ++ .__orcaAtlasFontProbe?.(this.fontProbeLastMismatch); ++ } catch { ++ // Diagnostics only; a throwing listener must never break rasterization. ++ } ++ } ++ + private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean, domContainer: HTMLElement | undefined): IRasterizedGlyph { + const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars; + +@@ -536,6 +569,7 @@ export class TextureAtlas implements ITextureAtlas { + const fontStyle = italic ? 'italic' : ''; + this._tmpCtx.font = + `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`; ++ this._probeRasterizationFontWeight(fontWeight); + this._tmpCtx.textBaseline = TEXT_BASELINE; + + const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0)); +diff --git a/src/WebglRenderer.ts b/src/WebglRenderer.ts +index a951efba5c75e82735cd39b6b22c4b5d5fad5928..e7f80c3a8c14dd65a16a97f1d17e3da1d65ed8bf 100644 +--- a/src/WebglRenderer.ts ++++ b/src/WebglRenderer.ts +@@ -386,7 +386,10 @@ export class WebglRenderer extends Disposable implements IRenderer { + // page's version, so re-run the update and force a full texture rebind. + let merged = false; + let mergeRetries = 0; +- while (this._charAtlas && this._glyphRenderer.value.beginFrame() && mergeRetries++ < Constants.MERGE_RETRY_LIMIT) { ++ // Test the retry budget before beginFrame: beginFrame latches the page layout version it ++ // observed, so tripping the limit after consuming it would strand a stale model with no ++ // later frame able to notice it needs rebuilding. ++ while (this._charAtlas && mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()) { + merged = true; + this._clearModel(true); + this._updateModel(0, this._terminal.rows - 1); diff --git a/config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch b/config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch similarity index 98% rename from config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch rename to config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch index e3ec0390c54..e804a77bccb 100644 --- a/config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch +++ b/config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch @@ -1,5 +1,5 @@ diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts -index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1e931791d 100644 +index 67893b7966eb095db4459b8837de9766921f36c5..0abf7ecac1aa108f7caf711d0a5c610a688d34fd 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -325,6 +325,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { @@ -32,7 +32,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true)); this._register(this.onRender(() => this._compositionHelper!.updateCompositionElements())); } -@@ -551,6 +565,11 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -552,6 +566,11 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._compositionView = this._document.createElement('div'); this._compositionView.classList.add('composition-view'); this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView); @@ -44,7 +44,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._helperContainer.appendChild(this._compositionView); this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService); -@@ -1008,7 +1027,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -1009,7 +1028,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._onKey.fire({ key, domEvent: ev }); this._showCursor(); @@ -55,7 +55,7 @@ index 4557e1652c34737fdf853436bd9328d9918eee2b..aff6ba624523849c2a39878a2181cbd1 this._keyPressHandled = true; -@@ -1026,6 +1047,15 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { +@@ -1027,6 +1048,15 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { * @param ev The input event to be handled. */ protected _inputEvent(ev: InputEvent): boolean { @@ -88,7 +88,7 @@ index 497afcf535f3eaca00889525a77e15eb633ccd96..96d499b34605f860608382114c3fbdc0 export interface IBrowser { diff --git a/src/browser/input/CompositionHelper.ts b/src/browser/input/CompositionHelper.ts -index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f01bd98554 100644 +index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..d4d5106d8dd723eceed87310c193ccfe0c516b06 100644 --- a/src/browser/input/CompositionHelper.ts +++ b/src/browser/input/CompositionHelper.ts @@ -3,8 +3,9 @@ @@ -575,7 +575,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 // Since composition* events happen before the changes take place in the textarea on most // browsers, use a setTimeout with 0ms time to allow the native compositionend event to -@@ -172,37 +479,310 @@ export class CompositionHelper { +@@ -172,37 +479,315 @@ export class CompositionHelper { // - The last compositionupdate event's data property does not always accurately describe // the character, a counter example being Korean where an ending consonsant can move to // the following character if the following input is a vowel. @@ -609,11 +609,11 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 + pending.finalizerTimer = undefined; + if (this._compositionTransactionId === pending.transactionId) { + this._isAwaitingCompositionEnd = false; -+ } -+ if (this._pendingComposition === pending) { -+ this._sendPendingComposition(pending, true); } - }, 0); ++ if (this._pendingComposition === pending) { ++ this._sendPendingComposition(pending, true); ++ } + }); } } @@ -830,12 +830,17 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 + if ( + this._compositionEndTimer !== timer || + !this._isComposing || -+ this._compositionTransactionId !== transactionId || -+ !this._compositionEndBelongsToCurrentTransaction(endData) ++ this._compositionTransactionId !== transactionId + ) { + return; + } + this._compositionEndTimer = undefined; ++ if (!this._compositionEndBelongsToCurrentTransaction(endData)) { ++ if (endData.length === 0 && !this._hasCompositionProgress()) { ++ this._cancelComposition(); ++ } ++ return; ++ } + this._finalizeComposition(true, endData); + this._dispatchCompositionSessionEvent(new CustomEvent( + XTERM_COMPOSITION_TRANSACTION_ACCEPTED_EVENT, @@ -913,7 +918,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 /** * Apply any changes made to the textarea after the current event chain is allowed to complete. * This should be called when not currently composing but a keydown event with the "composition -@@ -222,6 +802,9 @@ export class CompositionHelper { +@@ -222,6 +807,9 @@ export class CompositionHelper { const diff = newValue.replace(oldValue, ''); @@ -923,7 +928,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 this._dataAlreadySent = diff; if (newValue.length > oldValue.length) { -@@ -236,6 +819,101 @@ export class CompositionHelper { +@@ -236,6 +824,101 @@ export class CompositionHelper { }, 0); } @@ -1025,7 +1030,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 /** * Positions the composition view on top of the cursor and the textarea just below it (so the * IME helper dialog is positioned correctly). -@@ -243,10 +921,23 @@ export class CompositionHelper { +@@ -243,10 +926,23 @@ export class CompositionHelper { * necessary as the IME events across browsers are not consistently triggered. */ public updateCompositionElements(dontRecurse?: boolean): void { @@ -1050,7 +1055,7 @@ index c9ec396ab66cb966d49aa63bed09cdf9cd6c4246..cf3e685c7e1b29a6e9d0d4747e1b30f0 if (this._bufferService.buffer.isCursorInViewport) { const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1); -@@ -265,20 +956,38 @@ export class CompositionHelper { +@@ -265,20 +961,38 @@ export class CompositionHelper { const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft; this._compositionView.style.maxWidth = maxWidth + 'px'; this._compositionView.style.overflow = 'hidden'; diff --git a/config/patches/xterm-upstream.json b/config/patches/xterm-upstream.json index 44328ba8eee..ec36f65c71d 100644 --- a/config/patches/xterm-upstream.json +++ b/config/patches/xterm-upstream.json @@ -2,7 +2,7 @@ "$schemaNote": "Consumed by config/scripts/regenerate-xterm-patches.mjs. See docs/reference/xterm-patch-regeneration.md.", "upstream": { "repository": "https://github.com/xtermjs/xterm.js.git", - "commit": "53a98a720ae4a973e384fa2440880d09537132f3", + "commit": "d3e32b344dfe7dd6015cff6a9aeaaeaeccdc2789", "commitSource": "bin/publish.js stamps package.json.commit before npm publish, so the published tarball names its own commit. The generator asserts the two agree." }, "sourcemaps": { @@ -19,17 +19,75 @@ "packages": [ { "name": "@xterm/xterm", - "version": "6.1.0-beta.287", + "version": "6.1.0-beta.303", "packageDir": ".", "versionStampFile": "src/common/Version.ts", - "sourcePatch": "config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch", - "patch": "config/patches/@xterm__xterm@6.1.0-beta.287.patch", + "sourcePatch": "config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch", + "patch": "config/patches/@xterm__xterm@6.1.0-beta.303.patch", "generatedPaths": ["lib/"], - "build": [{ "cwd": ".", "command": "npm", "args": ["run", "package"] }] + "build": [ + { + "cwd": ".", + "command": "npm", + "args": ["run", "package"] + } + ] + }, + { + "name": "@xterm/addon-webgl", + "version": "0.20.0-beta.299", + "packageDir": "addons/addon-webgl", + "$note": "No versionStampFile: publish.js stamps the addon's package.json, which overlayBuildOutput never patches. The root `build` is required because the addon's own tsgo -p . has empty files/include and only project references, so it emits nothing on its own; `package` is the addon's webpack (CJS half) and the root `esbuild-package` emits the ESM half.", + "sourcePatch": "config/patches/xterm-src/@xterm__addon-webgl@0.20.0-beta.299.src.patch", + "patch": "config/patches/@xterm__addon-webgl@0.20.0-beta.299.patch", + "generatedPaths": ["lib/"], + "build": [ + { + "cwd": "../..", + "command": "npm", + "args": ["run", "build"] + }, + { + "cwd": ".", + "command": "npm", + "args": ["run", "package"] + }, + { + "cwd": "../..", + "command": "npm", + "args": ["run", "esbuild-package"] + } + ] + }, + { + "name": "@xterm/addon-serialize", + "version": "0.15.0-beta.300", + "packageDir": "addons/addon-serialize", + "$note": "No versionStampFile: publish.js stamps the addon's package.json, which overlayBuildOutput never patches. The root `build` is required because the addon's own tsgo -p . has empty files/include and only project references, so it emits nothing on its own; `package` is the addon's webpack (CJS half) and the root `esbuild-package` emits the ESM half.", + "sourcePatch": "config/patches/xterm-src/@xterm__addon-serialize@0.15.0-beta.300.src.patch", + "patch": "config/patches/@xterm__addon-serialize@0.15.0-beta.300.patch", + "generatedPaths": ["lib/"], + "build": [ + { + "cwd": "../..", + "command": "npm", + "args": ["run", "build"] + }, + { + "cwd": ".", + "command": "npm", + "args": ["run", "package"] + }, + { + "cwd": "../..", + "command": "npm", + "args": ["run", "esbuild-package"] + } + ] } ], "forbiddenBuildScripts": { - "why": "`npm run setup` runs a development esbuild (minify:false), so calling it after the packaging build overwrites lib/*.mjs with an unminified bundle and a mismatched map. Publish order is: stamp Version.ts, then `npm run package` only.", + "why": "`npm run setup` runs a development esbuild (minify:false), so calling it after the packaging build overwrites lib/*.mjs with an unminified bundle and a mismatched map. The packaging scripts are `package` and `esbuild-package`; nothing here may run a development pass after them.", "scripts": ["setup", "presetup", "postsetup", "esbuild", "esbuild-watch", "dev"] } } diff --git a/config/scripts/codex-index-heal-contract-workflow.test.mjs b/config/scripts/codex-index-heal-contract-workflow.test.mjs new file mode 100644 index 00000000000..62c9787a12e --- /dev/null +++ b/config/scripts/codex-index-heal-contract-workflow.test.mjs @@ -0,0 +1,37 @@ +import { readFileSync } from 'node:fs' +import { parse } from 'yaml' +import { describe, expect, it } from 'vitest' + +describe('Codex index-heal contract PR gate', () => { + const workflow = parse(readFileSync('.github/workflows/pr.yml', 'utf8')) + const job = workflow.jobs.codex_index_heal_contract + + it('installs and verifies against one pinned Codex version', () => { + const install = job.steps.find((step) => step.name === 'Install pinned Codex CLI') + const verify = job.steps.find((step) => step.name === 'Verify Codex index-heal contract') + + // Why one source: the install and the runtime version assertion drifting apart is + // the failure that would leave this job verifying a Codex nobody declared. + expect(job.env.CODEX_CLI_VERSION).toMatch(/^\d+\.\d+\.\d+$/) + expect(install.run).toContain('"@openai/codex@$CODEX_CLI_VERSION"') + expect(verify.env.ORCA_CODEX_CONTRACT_VERSION).toBe('${{ env.CODEX_CLI_VERSION }}') + + // The install prefix and the binary the test is pointed at must be the same tree. + expect(install.run).toContain('--prefix "$RUNNER_TEMP/codex-cli"') + expect(verify.run).toContain( + 'ORCA_CODEX_CONTRACT_BINARY="$RUNNER_TEMP/codex-cli/node_modules/.bin/codex"' + ) + expect(verify.run).toContain('src/main/codex/codex-index-heal-binary-contract.test.ts') + }) + + it('fails rather than skipping when the Codex binary is missing', () => { + const verify = job.steps.find((step) => step.name === 'Verify Codex index-heal contract') + + // Why asserted: the contract skips itself without a binary, so a failed install + // would otherwise turn this job into a green no-op that verifies nothing. + expect(verify.env.ORCA_CODEX_CONTRACT_REQUIRED).toBe('1') + expect(job.steps.find((step) => step.name === 'Install pinned Codex CLI').run).toContain( + 'set -euo pipefail' + ) + }) +}) diff --git a/config/scripts/package-electron-runtime-contract.test.mjs b/config/scripts/package-electron-runtime-contract.test.mjs index 05ad5bd47d7..8945c7b9f8a 100644 --- a/config/scripts/package-electron-runtime-contract.test.mjs +++ b/config/scripts/package-electron-runtime-contract.test.mjs @@ -13,16 +13,6 @@ const packageJson = JSON.parse(readProject('package.json')) const pnpmWorkspace = parse(readProject('pnpm-workspace.yaml')) describe('Electron runtime package contract', () => { - it('keeps shared WebGL atlas invalidation reproducible from vendored source', () => { - const patch = readProject('config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch') - - expect(patch).toContain('readonly clearModelGeneration: number') - expect(patch).toContain('const generation = this._atlas.clearModelGeneration') - expect(patch).toContain('this.clearModelGeneration++') - expect(patch).toContain('this._atlas._clearModelGeneration||0') - expect(patch.match(/\^\(\?:\[1-8\]\\d\{2\}\|900\)\$/g)).toHaveLength(3) - }) - it('keeps root postinstall as the single Electron binary install owner', () => { expect(packageJson.scripts.postinstall).toBe('node config/scripts/rebuild-native-deps.mjs') expect(pnpmWorkspace.allowBuilds).not.toHaveProperty('electron') diff --git a/config/scripts/pr-code-change-scope.mjs b/config/scripts/pr-code-change-scope.mjs index 4fa54ec0829..18de497ea8b 100644 --- a/config/scripts/pr-code-change-scope.mjs +++ b/config/scripts/pr-code-change-scope.mjs @@ -19,6 +19,7 @@ export const PR_CHECK_JOBS = [ 'static_analysis', 'typecheck', 'git_compatibility', + 'codex_index_heal_contract', 'xterm_patch_sync', 'shell_contracts', 'test', @@ -47,6 +48,24 @@ const GIT_COMPAT_PREFIXES = [ 'config/scripts/git-binary-compatibility' ] +// Why narrow: the contract pins Codex's read-repair, so it runs when the heal that +// depends on it, its app-server transport, or the contract itself changes. +const CODEX_INDEX_HEAL_CONTRACT_PREFIXES = [ + 'src/main/codex/codex-index-heal-binary-contract', + 'src/main/codex/codex-session-index-heal', + 'src/main/codex/codex-app-server-session', + 'src/main/codex/codex-state-db', + 'src/main/sqlite/sync-database', + 'src/main/codex/codex-app-server-capability-signal', + 'src/main/codex/codex-process-exit-deadline', + 'src/main/codex/codex-session-backfill', + 'src/main/codex/codex-session-index-heal-state', + 'src/main/codex-cli/command', + 'src/main/win32-utils', + 'src/shared/node-cli-command-resolution', + 'src/shared/windows-batch-spawn' +] + const XTERM_PREFIXES = [ 'config/patches/xterm-upstream.json', 'config/patches/@xterm', @@ -267,6 +286,9 @@ function jobDetector(job) { switch (job) { case 'git_compatibility': return (files) => files.some((file) => matchesPrefix(file, GIT_COMPAT_PREFIXES)) + case 'codex_index_heal_contract': + return (files) => + files.some((file) => matchesPrefix(file, CODEX_INDEX_HEAL_CONTRACT_PREFIXES)) case 'xterm_patch_sync': return (files) => files.some((file) => matchesPrefix(file, XTERM_PREFIXES)) case 'shell_contracts': diff --git a/config/scripts/pr-code-change-scope.test.mjs b/config/scripts/pr-code-change-scope.test.mjs index 67490727627..37f18587ee9 100644 --- a/config/scripts/pr-code-change-scope.test.mjs +++ b/config/scripts/pr-code-change-scope.test.mjs @@ -19,6 +19,7 @@ const expensiveJobs = [ 'static_analysis', 'typecheck', 'git_compatibility', + 'codex_index_heal_contract', 'xterm_patch_sync', 'shell_contracts', 'test', @@ -132,6 +133,49 @@ describe('per-job path classification', () => { }) }) + it('runs the Codex index-heal contract only when the heal or its transport changes', () => { + expectClassification(['src/main/codex/codex-session-index-heal.ts'], { + codex_index_heal_contract: true, + package: true, + package_windows: true + }) + expectClassification(['src/main/sqlite/sync-database.ts'], { + codex_index_heal_contract: true, + package: true, + package_windows: true + }) + expectClassification(['src/main/codex/codex-app-server-session.ts'], { + codex_index_heal_contract: true, + package: true, + package_windows: true + }) + expectClassification(['src/main/codex/codex-index-heal-binary-contract.test.ts'], { + codex_index_heal_contract: true + }) + // Keep the real-binary gate live when a transport or launch dependency changes. + for (const file of [ + 'src/main/codex/codex-app-server-capability-signal.ts', + 'src/main/codex/codex-process-exit-deadline.ts', + 'src/main/codex/codex-session-backfill.ts', + 'src/main/codex/codex-session-index-heal-state.ts', + 'src/main/codex-cli/command.ts', + 'src/main/win32-utils.ts', + 'src/shared/node-cli-command-resolution.ts', + 'src/shared/windows-batch-spawn.ts' + ]) { + expectClassification([file], { + codex_index_heal_contract: true, + package: true, + package_windows: true + }) + } + // A neighbouring Codex module must not drag the real-binary job in. + expectClassification(['src/main/codex/codex-home-paths.ts'], { + package: true, + package_windows: true + }) + }) + it('runs xterm patch sync only when xterm inputs change', () => { expectClassification(['config/patches/xterm-upstream.json'], { xterm_patch_sync: true diff --git a/config/scripts/pr-e2e-gate-contract.test.mjs b/config/scripts/pr-e2e-gate-contract.test.mjs index c7454e172b7..40bd4b27f60 100644 --- a/config/scripts/pr-e2e-gate-contract.test.mjs +++ b/config/scripts/pr-e2e-gate-contract.test.mjs @@ -373,7 +373,9 @@ describe('PR E2E gate contract', () => { const unreachableSpecs = new Set([ 'tests/e2e/ssh-docker-relay-perf.spec.ts', 'tests/e2e/ssh-codex-display-artifacts-repro.spec.ts', - 'tests/e2e/ssh-docker-bulk-open-freeze-repro.spec.ts' + 'tests/e2e/ssh-docker-bulk-open-freeze-repro.spec.ts', + // Hosted mobile WebView SSH requires a macOS iOS simulator; the Docker lane is Linux. + 'tests/e2e/hosted-mobile-webview-ssh.spec.ts' ]) // Why comments are stripped: this file's own runner lists the two exempt specs by name in a // prose comment. A substring scan over raw text would count any spec merely *discussed* in a diff --git a/config/scripts/pr-workflow-parallelism.test.mjs b/config/scripts/pr-workflow-parallelism.test.mjs index a3623d39df5..006df626dc9 100644 --- a/config/scripts/pr-workflow-parallelism.test.mjs +++ b/config/scripts/pr-workflow-parallelism.test.mjs @@ -412,6 +412,7 @@ describe('PR workflow parallelism', () => { 'root_directory_guard', 'typecheck', 'git_compatibility', + 'codex_index_heal_contract', 'xterm_patch_sync', 'shell_contracts', 'test', diff --git a/config/scripts/regenerate-xterm-patches.mjs b/config/scripts/regenerate-xterm-patches.mjs index a2da6d9da2d..672be8bee61 100644 --- a/config/scripts/regenerate-xterm-patches.mjs +++ b/config/scripts/regenerate-xterm-patches.mjs @@ -17,129 +17,19 @@ import { import { tmpdir } from 'node:os' import path from 'node:path' import { pathToFileURL } from 'node:url' +import { + CHECKOUT_DIFF_FLAGS, + PNPM_DIFF_FLAGS, + assertSourceDerivationsAgree, + escapeRegExp, + formatCheckFailure, + normalizePnpmDiff, + pnpmDiffEnvironment +} from './xterm-patch-text.mjs' const DEFAULT_REPO_ROOT = path.resolve(import.meta.dirname, '..', '..') const MANIFEST_RELATIVE_PATH = path.join('config', 'patches', 'xterm-upstream.json') -/** - * Flags pnpm@12 passes to `git diff` in its own `diff_folders()`. A patch built - * with anything else is a patch pnpm may re-diff differently on the next - * `pnpm patch-commit`, so the byte-comparison gate would never settle. - */ -export const PNPM_DIFF_FLAGS = [ - '-c', - 'core.safecrlf=false', - '-c', - 'core.quotePath=false', - 'diff', - '--src-prefix=a/', - '--dst-prefix=b/', - '--ignore-cr-at-eol', - '--irreversible-delete', - '--full-index', - '--no-index', - '--text', - '--no-ext-diff', - '--no-color', - '--' -] - -/** - * The same formatting as PNPM_DIFF_FLAGS minus `--no-index`, so a diff taken - * inside the upstream checkout is byte-comparable with the emitted patch. - */ -export const CHECKOUT_DIFF_FLAGS = PNPM_DIFF_FLAGS.filter((flag) => flag !== '--no-index') - -/** Applies pnpm's git config isolation so local machine settings cannot change the patch. */ -export function pnpmDiffEnvironment(baseEnvironment = process.env) { - return { - ...baseEnvironment, - GIT_CONFIG_NOSYSTEM: '1', - GIT_CONFIG_GLOBAL: '/dev/null' - } -} - -function escapeRegExp(value) { - return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') -} - -function trimSurroundingSlashes(value) { - return value[0] === '/' || value.endsWith('/') ? value.replace(/^\/|\/$/g, '') : value -} - -/** - * Reproduces pnpm's post-processing of the raw `git diff` output: strip the two - * scratch folder prefixes, drop a trailing no-newline marker, and remove - * .DS_Store entries a macOS run would otherwise smuggle in. - */ -export function normalizePnpmDiff(stdout, folderA, folderB) { - const a = folderA.replace(/\\/g, '/') - const b = folderB.replace(/\\/g, '/') - return stdout - .replace(new RegExp(`(a|b)(${escapeRegExp(`/${trimSurroundingSlashes(a)}/`)})`, 'g'), '$1/') - .replace(new RegExp(`(a|b)${escapeRegExp(`/${trimSurroundingSlashes(b)}/`)}`, 'g'), '$1/') - .replace(new RegExp(escapeRegExp(`${a}/`), 'g'), '') - .replace(new RegExp(escapeRegExp(`${b}/`), 'g'), '') - .replace(/\n\\ No newline at end of file\n$/, '\n') - .replace(/^diff --git a\/.*\.DS_Store b\/.*\.DS_Store[\s\S]+?(?=^diff --git)/gm, '') - .replace(/^diff --git a\/.*\.DS_Store b\/.*\.DS_Store[\s\S]*$/gm, '') -} - -/** Splits a patch into one entry per `diff --git` stanza, keeping the raw text. */ -export function splitPatchEntries(patchText) { - return patchText - .split(/^(?=diff --git )/m) - .filter((entry) => entry.startsWith('diff --git ')) - .map((text) => { - const header = text.slice(0, text.indexOf('\n')) - const match = /^diff --git a\/(.+) b\/\1$/.exec(header) - if (!match) { - throw new Error(`Unsupported diff header (renames are not supported): ${header}`) - } - return { path: match[1], text } - }) -} - -export function selectPatchEntries(patchText, matches) { - return splitPatchEntries(patchText) - .filter((entry) => matches(entry.path)) - .map((entry) => entry.text) - .join('') -} - -/** The hand-editable half of a patch: everything under `src/`. */ -export function sourceHunks(patchText) { - return selectPatchEntries(patchText, (file) => file.startsWith('src/')) -} - -/** - * The source patch and the emitted patch are the same edits diffed two ways, so - * they must produce the same bytes. A source hunk the emitted patch cannot carry - * would be deleted by the next `--write`, so this fails instead of shipping one. - */ -export function assertSourceDerivationsAgree(checkoutSource, patchText) { - const checkout = sourceHunks(checkoutSource) - const emitted = sourceHunks(patchText) - if (checkout === emitted) { - return - } - throw new Error( - [ - 'The checkout diff and the emitted patch disagree on a source file.', - ` from checkout: [${splitPatchEntries(checkout) - .map((e) => e.path) - .join(', ')}]`, - ` from patch: [${splitPatchEntries(emitted) - .map((e) => e.path) - .join(', ')}]`, - ` first difference at character ${firstDifferenceIndex(checkout, emitted)}`, - '', - 'A hunk the emitted patch cannot name is never installed, so it cannot ship', - 'here; upstream .npmignore strips `src/**/*.test.ts`.' - ].join('\n') - ) -} - export function stampVersionSource(source, version) { const stamped = source.replace( /export const XTERM_VERSION = '[^']+';/, @@ -249,6 +139,11 @@ export function readLockfileResolutionHashes(lockfileText, packageKey) { ) } +/** False for a key the lockfile has never seen, which is the normal state mid version bump. */ +export function lockfileHasPatchEntry(lockfileText, packageKey) { + return lockfilePatchHashPattern(packageKey).test(lockfileText) +} + export function lockfilePatchHashIsStale(lockfileText, packageKey, hash) { return ( readLockfilePatchHash(lockfileText, packageKey) !== hash || @@ -265,35 +160,6 @@ export function updateLockfilePatchHash(lockfileText, packageKey, hash) { ) } -export function firstDifferenceIndex(left, right) { - const limit = Math.min(left.length, right.length) - for (let index = 0; index < limit; index += 1) { - if (left[index] !== right[index]) { - return index - } - } - return left.length === right.length ? -1 : limit -} - -export function formatCheckFailure({ name, patchPath, committed, regenerated }) { - const index = firstDifferenceIndex(committed, regenerated) - const committedFiles = splitPatchEntries(committed).map((entry) => entry.path) - const regeneratedFiles = splitPatchEntries(regenerated).map((entry) => entry.path) - return [ - `${name}: ${patchPath} is not what the pinned upstream build produces.`, - ` committed: ${Buffer.byteLength(committed)} bytes, files [${committedFiles.join(', ')}]`, - ` regenerated: ${Buffer.byteLength(regenerated)} bytes, files [${regeneratedFiles.join(', ')}]`, - ` first difference at character ${index}`, - '', - 'The bundle hunks are generated. Do not edit them. Change the source patch', - 'instead and regenerate both files:', - '', - ' node config/scripts/regenerate-xterm-patches.mjs --write', - '', - 'See docs/reference/xterm-patch-regeneration.md.' - ].join('\n') -} - // npm ships as `npm.cmd` on Windows, and execFile applies no PATHEXT and refuses // a `.cmd` target without a shell (CVE-2024-27980). git and tar are real .exe. const WINDOWS_SHIM_COMMANDS = new Set(['npm', 'npx', 'pnpm', 'yarn']) @@ -431,11 +297,13 @@ function buildPackage(upstreamRoot, packageEntry, manifest) { for (const directory of ['lib', 'out', 'out-esbuild']) { rmSync(path.join(packageRoot, directory), { recursive: true, force: true }) } - const stampPath = path.join(packageRoot, packageEntry.versionStampFile) - writeFileSync( - stampPath, - stampVersionSource(readFileSync(stampPath, 'utf8'), packageEntry.version) - ) + if (packageEntry.versionStampFile) { + const stampPath = path.join(packageRoot, packageEntry.versionStampFile) + writeFileSync( + stampPath, + stampVersionSource(readFileSync(stampPath, 'utf8'), packageEntry.version) + ) + } assertBuildStepsAllowed(manifest) for (const step of packageEntry.build) { run(step.command, step.args, { cwd: path.join(packageRoot, step.cwd), stdio: 'inherit' }) @@ -529,9 +397,17 @@ function regeneratePackage(packageEntry, manifest, context) { assertReproducesPristineBundles(pristineDir, upstreamRoot, packageEntry) run('git', ['reset', '--quiet', '--hard', manifest.upstream.commit], { cwd: upstreamRoot }) - run('git', ['apply', '--whitespace=nowarn', path.join(repoRoot, packageEntry.sourcePatch)], { - cwd: path.join(upstreamRoot, packageEntry.packageDir) - }) + const packageDir = toPosix(packageEntry.packageDir) + run( + 'git', + [ + 'apply', + '--whitespace=nowarn', + ...(packageDir === '.' ? [] : [`--directory=${packageDir}`]), + path.join(repoRoot, packageEntry.sourcePatch) + ], + { cwd: upstreamRoot } + ) buildPackage(upstreamRoot, packageEntry, manifest) const patchedDir = path.join(workDir, 'patched', packageEntry.name.replace(/[@/]/g, '_')) @@ -540,11 +416,20 @@ function regeneratePackage(packageEntry, manifest, context) { // Leave the checkout diffable: the pinned commit plus the source patch, with // no publish-time version stamp mixed in, so `git diff` there is the source // patch and nothing else. - run('git', ['checkout', '--', packageEntry.versionStampFile], { - cwd: path.join(upstreamRoot, packageEntry.packageDir) - }) + if (packageEntry.versionStampFile) { + run('git', ['checkout', '--', packageEntry.versionStampFile], { + cwd: path.join(upstreamRoot, packageEntry.packageDir) + }) + } const source = diffCheckoutSource(path.join(upstreamRoot, packageEntry.packageDir)) + if (source.trim().length === 0) { + throw new Error( + `${packageEntry.name}: applying ${packageEntry.sourcePatch} left the checkout unchanged. ` + + 'git apply reports success when it skips every hunk, so this is a path-rooting bug, ' + + 'not an empty patch.' + ) + } const patch = diffFolders(pristineDir, patchedDir) assertSourceDerivationsAgree(source, patch) return { patch, source } @@ -566,6 +451,7 @@ export function regenerateXtermPatches({ let lockfileChanged = false const failures = [] + const pendingInstall = [] for (const packageEntry of manifest.packages) { const shortCommit = manifest.upstream.commit.slice(0, 12) log(`${packageEntry.name}@${packageEntry.version}: regenerating from ${shortCommit}`) @@ -584,7 +470,10 @@ export function regenerateXtermPatches({ writeFileSync(sourcePatchPath, canonicalSource) log(` wrote ${packageEntry.patch} (${Buffer.byteLength(regenerated)} bytes)`) log(` wrote ${packageEntry.sourcePatch} (${Buffer.byteLength(canonicalSource)} bytes)`) - if (lockfilePatchHashIsStale(lockfile, packageKey, hash)) { + if (!lockfileHasPatchEntry(lockfile, packageKey)) { + pendingInstall.push(packageKey) + log(` pnpm-lock.yaml has no entry for ${packageKey} yet; run pnpm install`) + } else if (lockfilePatchHashIsStale(lockfile, packageKey, hash)) { lockfile = updateLockfilePatchHash(lockfile, packageKey, hash) lockfileChanged = true log(` updated pnpm-lock.yaml patch hash to ${hash}`) @@ -592,7 +481,11 @@ export function regenerateXtermPatches({ continue } - if (lockfilePatchHashIsStale(lockfile, packageKey, hash)) { + if (!lockfileHasPatchEntry(lockfile, packageKey)) { + failures.push( + `${packageKey}: pnpm-lock.yaml has no patchedDependencies entry. Run pnpm install.` + ) + } else if (lockfilePatchHashIsStale(lockfile, packageKey, hash)) { const stale = Array.from( new Set(readLockfileResolutionHashes(lockfile, packageKey).filter((v) => v !== hash)) ) @@ -639,6 +532,12 @@ export function regenerateXtermPatches({ if (lockfileChanged) { writeFileSync(lockfilePath, lockfile) } + if (pendingInstall.length > 0) { + log( + `\nRun pnpm install to key the lockfile to the new patches: ${pendingInstall.join(', ')}\n` + + 'Then rerun with --check, which is the authority on the lockfile.' + ) + } if (failures.length > 0) { throw new Error(failures.join('\n\n')) } diff --git a/config/scripts/regenerate-xterm-patches.test.mjs b/config/scripts/regenerate-xterm-patches.test.mjs index 2c4a34dc501..5261d0c74cd 100644 --- a/config/scripts/regenerate-xterm-patches.test.mjs +++ b/config/scripts/regenerate-xterm-patches.test.mjs @@ -5,25 +5,29 @@ import { tmpdir } from 'node:os' import path from 'node:path' import { afterEach, describe, expect, it } from 'vitest' import { - CHECKOUT_DIFF_FLAGS, - PNPM_DIFF_FLAGS, assertBuildStepsAllowed, assertPublishedCommit, - assertSourceDerivationsAgree, assertSourcemapPolicy, - firstDifferenceIndex, - formatCheckFailure, + lockfileHasPatchEntry, lockfilePatchHashIsStale, - normalizePnpmDiff, patchHash, - pnpmDiffEnvironment, readLockfilePatchHash, readLockfileResolutionHashes, - sourceHunks, - splitPatchEntries, stampVersionSource, updateLockfilePatchHash } from './regenerate-xterm-patches.mjs' +import { + CHECKOUT_DIFF_FLAGS, + PNPM_DIFF_FLAGS, + assertSourceDerivationsAgree, + firstDifferenceIndex, + formatCheckFailure, + normalizePnpmDiff, + pnpmDiffEnvironment, + selectPatchEntries, + sourceHunks, + splitPatchEntries +} from './xterm-patch-text.mjs' // Only the tests need to slice the generated half out of a patch; the generator // reads `generatedPaths` directly where it compares against the pristine build. @@ -278,10 +282,20 @@ describe('source derivation agreement', () => { }) it('diffs the checkout with pnpm formatting so the two halves stay comparable', () => { - expect(CHECKOUT_DIFF_FLAGS).toEqual(PNPM_DIFF_FLAGS.filter((flag) => flag !== '--no-index')) + expect(CHECKOUT_DIFF_FLAGS.filter((flag) => flag !== '--relative')).toEqual( + PNPM_DIFF_FLAGS.filter((flag) => flag !== '--no-index') + ) expect(CHECKOUT_DIFF_FLAGS).toContain('--full-index') expect(CHECKOUT_DIFF_FLAGS).not.toContain('--no-index') }) + + it('passes --relative as a flag, not as a pathspec', () => { + // After `--` git reads it as a path, silently leaving addon diffs rooted at the + // repo instead of the package, which drops every source hunk from the patch. + expect(CHECKOUT_DIFF_FLAGS.indexOf('--relative')).toBeLessThan( + CHECKOUT_DIFF_FLAGS.indexOf('--') + ) + }) }) describe('manifest guards', () => { @@ -409,6 +423,13 @@ describe('lockfile coupling', () => { /no patchedDependencies entry/ ) }) + + it('reports a missing key without throwing, which is the state mid version bump', () => { + // A bump renames the key, so --write has nothing to rewrite until pnpm install + // creates it. Aborting there would strand the run before the later packages. + expect(lockfileHasPatchEntry(lockfile, '@xterm/xterm@6.1.0-beta.287')).toBe(true) + expect(lockfileHasPatchEntry(lockfile, '@xterm/xterm@6.1.0-beta.303')).toBe(false) + }) }) describe('check-mode reporting', () => { @@ -435,18 +456,20 @@ describe('check-mode reporting', () => { // These run without network or a build, so ordinary `pnpm test` catches the two // desyncs that would otherwise only surface in the heavy xterm_patch_sync job. describe('committed xterm patch artifacts', () => { - it('normalizes Chromium font-weight serialization in every WebGL runtime copy', async () => { - const patch = await readFile( - path.join(REPO_ROOT, 'config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch'), - 'utf8' - ) - expect(patch).not.toMatch(/desiredWeight !== '400'|orcaProbeWeight!=="400"/) - expect( - patch.match(/(?:actualWeightToken === 'normal'|orcaActualWeightToken==="normal")/g) - ).toHaveLength(3) - expect( - patch.match(/(?:actualWeight !== desiredWeight|orcaActualWeight!==orcaProbeWeight)/g) - ).toHaveLength(3) + it('carries the font-weight probe into every WebGL runtime copy', async () => { + const manifest = JSON.parse(await readFile(MANIFEST_PATH, 'utf8')) + const webgl = manifest.packages.find((entry) => entry.name === '@xterm/addon-webgl') + const patch = await readFile(path.join(REPO_ROOT, webgl.patch), 'utf8') + // The ESM and CJS bundles mangle locals differently, so anchor on the global the + // renderer diagnostics read; a copy missing it reports a font mismatch as a repaint bug. + for (const file of ['src/TextureAtlas.ts', 'lib/addon-webgl.js', 'lib/addon-webgl.mjs']) { + const stanza = selectPatchEntries(patch, (candidate) => candidate === file) + expect(stanza, file).not.toBe('') + expect(stanza, file).toContain('__orcaAtlasFontProbe') + } + // The probe must compare the rasterized weight against the requested one; comparing + // against a literal '400' would call every non-default weight a mismatch. + expect(sourceHunks(patch)).toContain('actual === desired') }) it('records the lockfile hash pnpm derives from the patch file', async () => { diff --git a/config/scripts/run-ssh-docker-e2e.mjs b/config/scripts/run-ssh-docker-e2e.mjs index a723a9a6ad0..6396981eabe 100644 --- a/config/scripts/run-ssh-docker-e2e.mjs +++ b/config/scripts/run-ssh-docker-e2e.mjs @@ -42,6 +42,8 @@ if (runtime.status !== 0) { // gained a direction, so it cannot compile, let alone pass. Repairing it needs two // semantic decisions (which ptyId to capture, which split direction) that change // what the repro measures. Tracked in stablyai/orca#16764. +// hosted-mobile-webview-ssh.spec.ts — requires a macOS iOS simulator and cannot run on the +// Linux Docker runner. Run test:e2e:hosted-mobile-webview:ssh on macOS before release. // // Why both projects: ssh-port-forward-lifecycle is @headful, which the headless project // grep-inverts away. @@ -80,6 +82,7 @@ const result = spawnSync( 'tests/e2e/ssh-restart-tab-accumulation.spec.ts', 'tests/e2e/ssh-skill-installation.spec.ts', 'tests/e2e/ssh-terminal-window-wake-stale-grid-repro.spec.ts', + 'tests/e2e/ssh-docker-native-chat-transcript.spec.ts', '--config', 'tests/playwright.config.ts', '--project', diff --git a/config/scripts/xterm-patch-text.mjs b/config/scripts/xterm-patch-text.mjs new file mode 100644 index 00000000000..6be57e4a26c --- /dev/null +++ b/config/scripts/xterm-patch-text.mjs @@ -0,0 +1,161 @@ +/** + * How an xterm patch is formatted, split and compared. + * + * Split out of regenerate-xterm-patches.mjs, which orchestrates the clone and the + * builds. Everything here is pure text: it needs no upstream checkout, so the unit + * tests exercise it with no network and no build. + */ + +/** + * Flags pnpm@12 passes to `git diff` in its own `diff_folders()`. A patch built + * with anything else is a patch pnpm may re-diff differently on the next + * `pnpm patch-commit`, so the byte-comparison gate would never settle. + */ +export const PNPM_DIFF_FLAGS = [ + '-c', + 'core.safecrlf=false', + '-c', + 'core.quotePath=false', + 'diff', + '--src-prefix=a/', + '--dst-prefix=b/', + '--ignore-cr-at-eol', + '--irreversible-delete', + '--full-index', + '--no-index', + '--text', + '--no-ext-diff', + '--no-color', + '--' +] + +/** + * The same formatting as PNPM_DIFF_FLAGS minus `--no-index`, so a diff taken + * inside the upstream checkout is byte-comparable with the emitted patch. + * `--relative` scopes paths to the package directory, which is what the published + * tarball is rooted at; it is a no-op for a package whose packageDir is the repo root. + */ +export const CHECKOUT_DIFF_FLAGS = PNPM_DIFF_FLAGS.filter((flag) => flag !== '--no-index').flatMap( + // Ahead of the `--` separator, or git reads it as a pathspec and silently keeps + // repo-root-relative paths. + (flag) => (flag === '--' ? ['--relative', '--'] : [flag]) +) + +/** Applies pnpm's git config isolation so local machine settings cannot change the patch. */ +export function pnpmDiffEnvironment(baseEnvironment = process.env) { + return { + ...baseEnvironment, + GIT_CONFIG_NOSYSTEM: '1', + GIT_CONFIG_GLOBAL: '/dev/null' + } +} + +export function escapeRegExp(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') +} + +function trimSurroundingSlashes(value) { + return value[0] === '/' || value.endsWith('/') ? value.replace(/^\/|\/$/g, '') : value +} + +/** + * Reproduces pnpm's post-processing of the raw `git diff` output: strip the two + * scratch folder prefixes, drop a trailing no-newline marker, and remove + * .DS_Store entries a macOS run would otherwise smuggle in. + */ +export function normalizePnpmDiff(stdout, folderA, folderB) { + const a = folderA.replace(/\\/g, '/') + const b = folderB.replace(/\\/g, '/') + return stdout + .replace(new RegExp(`(a|b)(${escapeRegExp(`/${trimSurroundingSlashes(a)}/`)})`, 'g'), '$1/') + .replace(new RegExp(`(a|b)${escapeRegExp(`/${trimSurroundingSlashes(b)}/`)}`, 'g'), '$1/') + .replace(new RegExp(escapeRegExp(`${a}/`), 'g'), '') + .replace(new RegExp(escapeRegExp(`${b}/`), 'g'), '') + .replace(/\n\\ No newline at end of file\n$/, '\n') + .replace(/^diff --git a\/.*\.DS_Store b\/.*\.DS_Store[\s\S]+?(?=^diff --git)/gm, '') + .replace(/^diff --git a\/.*\.DS_Store b\/.*\.DS_Store[\s\S]*$/gm, '') +} + +/** Splits a patch into one entry per `diff --git` stanza, keeping the raw text. */ +export function splitPatchEntries(patchText) { + return patchText + .split(/^(?=diff --git )/m) + .filter((entry) => entry.startsWith('diff --git ')) + .map((text) => { + const header = text.slice(0, text.indexOf('\n')) + const match = /^diff --git a\/(.+) b\/\1$/.exec(header) + if (!match) { + throw new Error(`Unsupported diff header (renames are not supported): ${header}`) + } + return { path: match[1], text } + }) +} + +export function selectPatchEntries(patchText, matches) { + return splitPatchEntries(patchText) + .filter((entry) => matches(entry.path)) + .map((entry) => entry.text) + .join('') +} + +/** The hand-editable half of a patch: everything under `src/`. */ +export function sourceHunks(patchText) { + return selectPatchEntries(patchText, (file) => file.startsWith('src/')) +} + +/** + * The source patch and the emitted patch are the same edits diffed two ways, so + * they must produce the same bytes. A source hunk the emitted patch cannot carry + * would be deleted by the next `--write`, so this fails instead of shipping one. + */ +export function assertSourceDerivationsAgree(checkoutSource, patchText) { + const checkout = sourceHunks(checkoutSource) + const emitted = sourceHunks(patchText) + if (checkout === emitted) { + return + } + throw new Error( + [ + 'The checkout diff and the emitted patch disagree on a source file.', + ` from checkout: [${splitPatchEntries(checkout) + .map((e) => e.path) + .join(', ')}]`, + ` from patch: [${splitPatchEntries(emitted) + .map((e) => e.path) + .join(', ')}]`, + ` first difference at character ${firstDifferenceIndex(checkout, emitted)}`, + '', + 'A hunk the emitted patch cannot name is never installed, so it cannot ship', + 'here; upstream .npmignore strips `src/**/*.test.ts`.' + ].join('\n') + ) +} + +export function firstDifferenceIndex(left, right) { + const limit = Math.min(left.length, right.length) + for (let index = 0; index < limit; index += 1) { + if (left[index] !== right[index]) { + return index + } + } + return left.length === right.length ? -1 : limit +} + +export function formatCheckFailure({ name, patchPath, committed, regenerated }) { + const index = firstDifferenceIndex(committed, regenerated) + const committedFiles = splitPatchEntries(committed).map((entry) => entry.path) + const regeneratedFiles = splitPatchEntries(regenerated).map((entry) => entry.path) + return [ + `${name}: ${patchPath} is not what the pinned upstream build produces.`, + ` committed: ${Buffer.byteLength(committed)} bytes, files [${committedFiles.join(', ')}]`, + ` regenerated: ${Buffer.byteLength(regenerated)} bytes, files [${regeneratedFiles.join(', ')}]`, + ` first difference at character ${index}`, + '', + 'The bundle hunks are generated. Do not edit them. Change the source patch', + 'instead and regenerate both files:', + '', + ' node config/scripts/regenerate-xterm-patches.mjs --write', + '', + 'See docs/reference/xterm-patch-regeneration.md.' + ].join('\n') +} diff --git a/config/scripts/xterm-webgl-runtime-contract.test.mjs b/config/scripts/xterm-webgl-runtime-contract.test.mjs new file mode 100644 index 00000000000..5b234c805ea --- /dev/null +++ b/config/scripts/xterm-webgl-runtime-contract.test.mjs @@ -0,0 +1,53 @@ +import { readFileSync } from 'node:fs' +import { createRequire } from 'node:module' +import { join, resolve } from 'node:path' +import { describe, expect, it } from 'vitest' + +const projectDir = resolve(import.meta.dirname, '../..') +const require = createRequire(import.meta.url) +const readProject = (file) => readFileSync(join(projectDir, file), 'utf8') +const xtermManifest = JSON.parse(readProject('config/patches/xterm-upstream.json')) +const readInstalled = (name, file) => + readFileSync(join(resolve(require.resolve(`${name}/package.json`), '..'), file), 'utf8') + +describe('vendored xterm WebGL runtime contract', () => { + it('keeps shared WebGL atlas invalidation per renderer', () => { + // Orca panes with the same font share one atlas, so a page merge or a clear in one + // pane invalidates cached texture coords in all of them. Recovery has to be observed + // per renderer: a consume-once flag lets whichever pane draws first eat the + // notification and leaves its siblings drawing from a stale model. + // + // Upstream owns this since addon-webgl 0.20.0-beta.299, as a monotonic + // pageLayoutVersion each renderer latches independently, so it is no longer something + // Orca patches in. Assert it on the resolved dependency rather than on the patch. + const atlas = readInstalled('@xterm/addon-webgl', 'src/TextureAtlas.ts') + expect(atlas).toContain('public get pageLayoutVersion(): number') + expect(atlas).toContain('this._pageLayoutVersion++') + + const glyphRenderer = readInstalled('@xterm/addon-webgl', 'src/GlyphRenderer.ts') + expect(glyphRenderer).toContain( + 'this._atlas.pageLayoutVersion !== this._lastSeenPageLayoutVersion' + ) + + // Both shipped bundles have to carry it, not just the source beside them. + for (const bundle of ['lib/addon-webgl.js', 'lib/addon-webgl.mjs']) { + const contents = readInstalled('@xterm/addon-webgl', bundle) + expect(contents, bundle).toContain('pageLayoutVersion') + expect(contents, bundle).toContain('_lastSeenPageLayoutVersion') + } + }) + + it('keeps the Orca-only WebGL hunks in the generated patch', () => { + const webgl = xtermManifest.packages.find((entry) => entry.name === '@xterm/addon-webgl') + const patch = readProject(webgl.patch) + + // A v_texpage past the sampler budget must resolve to a defined colour. + expect(patch).toContain('else { outColor = vec4(0.0, 0.0, 0.0, 0.0); }') + // clearTexture must not no-op once a merged page occupies index 0. + expect(patch).toContain('this._pages.every(page => page.glyphs.length === 0') + // The merge retry budget is spent before beginFrame latches the version it saw. + expect(patch).toContain( + 'mergeRetries++ < Constants.MERGE_RETRY_LIMIT && this._glyphRenderer.value.beginFrame()' + ) + }) +}) diff --git a/docs/reference/xterm-patch-regeneration.md b/docs/reference/xterm-patch-regeneration.md index b2da865406d..bd49dd8ca3d 100644 --- a/docs/reference/xterm-patch-regeneration.md +++ b/docs/reference/xterm-patch-regeneration.md @@ -24,13 +24,15 @@ truth. Everything else is derived from it by `config/scripts/regenerate-xterm-patches.mjs`, which is pinned to the exact upstream commit the published tarball was built from. -This policy covers `@xterm/xterm` only. The addon patches -(`@xterm/addon-webgl`, `@xterm/addon-serialize`) are still hand-edited bundles -and are tracked separately; see [Known Gaps](#known-gaps). +`@xterm/addon-webgl` and `@xterm/addon-serialize` are generated the same way, +from their own source patches under `config/patches/xterm-src/`. Their entries +differ only in `packageDir` and build steps; everything below applies to all +three. `@xterm/addon-ligatures` is the one patch still written by hand — see +[Known Gaps](#known-gaps). ## Rules -1. Never edit `config/patches/@xterm__xterm@.patch`. Edit the source +1. Never edit `config/patches/@xterm__*@.patch`. Edit the source patch and regenerate. 2. Never edit `lib/` inside a patched `node_modules` tree and re-run `pnpm patch-commit`. That is how bundle hunks stop matching their sources. @@ -51,14 +53,16 @@ and are tracked separately; see [Known Gaps](#known-gaps). patch hash in two places — `patchedDependencies` and every resolution key that depends on the patched package — and on a warm store it will leave the resolution keys at their previous value while reporting success. That installs - locally and drifts on CI's cold store. Always finish on step 4, and if it - reports a stale hash after an install, rerun `--write`. + locally and drifts on CI's cold store. For a version bump, follow the **Version + Bumps** workflow through step 5 (the final `--check`); if it reports a stale hash + after an install, rerun `--write`. For a source-only edit, the four-step workflow + above ends at `--check`. ## Workflow ```sh # 1. Edit the source hunks. -$EDITOR config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch +$EDITOR config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch # 2. Rebuild the bundle hunks, the full patch, and the lockfile hash. node config/scripts/regenerate-xterm-patches.mjs --write @@ -77,10 +81,20 @@ any run it is left at the pinned commit with the source patch applied: ```sh node config/scripts/regenerate-xterm-patches.mjs --check --work-dir=/tmp/xterm $EDITOR /tmp/xterm/upstream/src/browser/input/CompositionHelper.ts -git -C /tmp/xterm/upstream diff -- src/ > config/patches/xterm-src/@xterm__xterm@6.1.0-beta.287.src.patch +git -C /tmp/xterm/upstream diff -- src/ > config/patches/xterm-src/@xterm__xterm@6.1.0-beta.303.src.patch node config/scripts/regenerate-xterm-patches.mjs --write --work-dir=/tmp/xterm ``` +For an addon, edit under `addons//` and take the diff from that directory +with `--relative`, so the patch is rooted at the package the way the published +tarball is: + +```sh +$EDITOR /tmp/xterm/upstream/addons/addon-webgl/src/TextureAtlas.ts +git -C /tmp/xterm/upstream/addons/addon-webgl diff --relative -- src/ \ + > config/patches/xterm-src/@xterm__addon-webgl@0.20.0-beta.299.src.patch +``` + `--write` rewrites the source patch into the canonical form it would emit on a re-diff, so a hand-produced `git diff` gets normalized on the first run rather than fighting `--check` forever. @@ -107,6 +121,18 @@ Upstream's publish path is `npm ci` → stamp `Version.ts` → `npm run package` `npm run package` runs webpack for `lib/xterm.js` and then, via `postpackage`, `bin/esbuild_all.mjs --prod` for `lib/xterm.mjs`. +An addon needs three steps, in this order, and the first is easy to miss: + +1. **root `npm run build`.** The addon's own `npm run build` is + `tsgo -p .` against a tsconfig whose `files` and `include` are both empty and + which only lists project references. In `-p` mode tsgo does not build + references, so it succeeds while emitting nothing, and the addon's webpack + then fails on a missing `./out/`. The root build is what populates it. +2. **addon `npm run package`** — the addon's own webpack, which emits the CJS + `lib/addon-*.js`. The root `package` script never builds this. +3. **root `npm run esbuild-package`** — `bin/esbuild_all.mjs --prod`, which emits + the ESM `lib/addon-*.mjs` for every addon at once. + **Do not run `npm run setup` after the packaging build.** `setup` is the development esbuild pass with `minify: false`. Running it afterwards overwrites `lib/xterm.mjs` with an unminified bundle and a map that no longer matches, and @@ -171,8 +197,30 @@ error naming it. Recovery is to move the pin to the next upstream commit whose published bundles, and regenerate. The committed patch keeps working the whole time — only regeneration is blocked, so this is never an outage. +## Patch Path Rooting + +A published tarball is rooted at the package, so an addon's patch names +`src/TextureAtlas.ts`, not `addons/addon-webgl/src/TextureAtlas.ts`. Two places +have to agree with that, and both fail silently if they do not: + +- The checkout diff passes `--relative`, which must sit **before** the `--` + separator in `CHECKOUT_DIFF_FLAGS`. After it, git reads it as a pathspec and + keeps repo-root-relative paths, and every source hunk then falls out of the + emitted patch. +- `git apply` runs from the repo root with `--directory=`. Run from + a subdirectory instead, git still resolves patch paths from the repo root, + skips every hunk, and **exits 0**. The generator guards this by failing when + applying a source patch leaves the checkout unchanged. + ## Version Bumps +Upstream publishes each package only when its own output changes, so the four +packages carry different beta numbers while sharing one commit — at the time of +writing `@xterm/xterm@6.1.0-beta.303` and `@xterm/headless@6.1.0-beta.302` are +both built from `d3e32b3`. Match on `package.json.commit`, never on the version +string; `xterm-user-scrolling-contract.test.ts` asserts that pairing for +headless and core. + Bumping `@xterm/xterm` is: 1. Update the version in `package.json` and run `pnpm install`. @@ -182,6 +230,9 @@ Bumping `@xterm/xterm` is: `package.json`, and `toolchain` to whatever the new `package-lock.json` resolves. 4. `node config/scripts/regenerate-xterm-patches.mjs --write`. +5. `pnpm install`, then `--check`. On a bump the lockfile has no entry under the + new key yet, so `--write` reports the gap and leaves the hash to `pnpm +install`; `--check` is what proves the two agree afterwards. Step 4 is where a real upstream conflict shows up: `git apply` of the source patch fails against the new tree. Resolve it in the checkout, re-diff, and @@ -220,25 +271,22 @@ no build, so they run in the ordinary test shards. ## Known Gaps -`@xterm/addon-webgl` and `@xterm/addon-serialize` are still hand-edited minified -bundles. Their patches carry a literal `/* PATCH(orca): ... */` comment inside -minified code and parser round-trip artifacts, and neither patch touches its -`.map` file, so both addons currently ship sourcemaps whose offsets do not match -the shipped bundle — the defect `sourcemaps.policy` rules out for `@xterm/xterm` -and which folding them into this manifest would also fix. +`@xterm/addon-ligatures` is still patched by hand, and can stay that way: the +patch is a fifteen-line `package.json` edit that repoints `module` and adds an +`exports` block, touching no bundle and no sourcemap. Nothing about it is +generated, so there is nothing for this harness to verify. -Both addons do build from the pinned commit: the registry stamps -`53a98a720ae4a973e384fa2440880d09537132f3` on `addon-webgl@0.20.0-beta.286` and -`addon-serialize@0.15.0-beta.287` alike, despite the mismatched version numbers. -On 2026-08-17 their published `lib/*.mjs` and `lib/*.mjs.map` reproduced byte for -byte from that commit. That was a one-off measurement, not an invariant: no check -in this repo re-runs it, so treat it as a starting point to re-measure rather than -as something the harness holds true. +The addons were folded into this manifest on 2026-08-29. Before that they were +hand-edited minified bundles carrying a literal `/* PATCH(orca): ... */` comment +inside minified code, parser round-trip artifacts (`!0` printed back as `true`, +locals renamed `i` → `i5`), and no `.map` hunks at all — so both shipped +sourcemaps whose offsets did not match the bundle beside them. All four +`@xterm/addon-webgl` artifacts and all four `@xterm/addon-serialize` artifacts +now reproduce byte for byte from the pinned commit, which is what closed it. -What blocks folding them in is the other half of their published output. Both -also ship a CJS `lib/addon-*.js`, and the root `package` script does not build -it — upstream's webpack entry is core's `Terminal.js` only, and `postpackage` -emits ESM. So a manifest entry for either addon needs a build step this harness -does not have, and the CJS halves are **unverified**: nothing here has yet -reproduced them from source. Until that exists, folding them in would emit a -patch whose CJS stanza came from the current hand-edited bundle. +The one thing still unproven is that this holds across upstream revisions rather +than at this commit. `addon-serialize.js.map` did not reproduce on the first +attempt here; the cause was a stale `out/` from a wrong build order, not +upstream nondeterminism, and it reproduced exactly once the root build ran +first. Treat a future non-reproducing artifact as a build-order bug until proven +otherwise. diff --git a/mobile/package.json b/mobile/package.json index 7e34c188194..1b7982ef00f 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -105,7 +105,7 @@ "@expo/dom-webview@55.0.5": "patches/@expo__dom-webview@55.0.5.patch", "@expo/log-box@55.0.12": "patches/@expo__log-box@55.0.12.patch", "react-native-webview@13.16.1": "patches/react-native-webview@13.16.1.patch", - "react-native@0.83.9": "patches/react-native@0.83.9.patch" + "react-native@0.83.10": "patches/react-native@0.83.10.patch" } } } diff --git a/mobile/src/components/use-new-workspace-creation.ts b/mobile/src/components/use-new-workspace-creation.ts index 8c64fe138ce..ed5e66e74b4 100644 --- a/mobile/src/components/use-new-workspace-creation.ts +++ b/mobile/src/components/use-new-workspace-creation.ts @@ -10,9 +10,9 @@ import { isMobileTuiAgentEnabled } from '../tasks/mobile-tui-agents' import { normalizeWorkspaceAgent } from '../tasks/workspace-agent-selection' import type { HostWorkspaceCreationOperations, - NewWorkspaceRepository + NewWorkspaceRepository, + NewWorkspaceRuntimeSettings } from '../worktree/host-workspace-creation-operations' -import type { NewWorkspaceRuntimeSettings } from '../worktree/host-workspace-creation-operations' import type { RetiredNameRegistry } from '../../../src/shared/worktree/retired-name-registry' import type { useMobileComposerSource } from '../tasks/use-mobile-composer-source' import type { WorkspaceCreateSetupDecision } from '../tasks/workspace-create-params' diff --git a/mobile/src/host-screen/use-hybrid-host-screen-controller.ts b/mobile/src/host-screen/use-hybrid-host-screen-controller.ts index e30e3de8d58..3deebf46d59 100644 --- a/mobile/src/host-screen/use-hybrid-host-screen-controller.ts +++ b/mobile/src/host-screen/use-hybrid-host-screen-controller.ts @@ -1,4 +1,4 @@ -import { useEffect, useMemo } from 'react' +import { useEffect, useMemo, useState } from 'react' import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useHostProtocolGates } from '../components/host-protocol-gates-context' import { useHostClient } from '../transport/client-context' @@ -13,7 +13,6 @@ import { applyWorktreeRowDisplayState } from '../worktree/worktree-host-row-iden import { useWorkspaceSections } from '../worktree/use-workspace-sections' import { resolveHostRouteActionState } from '../host-route-action-state' import { visibleHostRouteNotice } from '../host-route-notice' -import { useState } from 'react' import { useActiveWorktreeScroll } from '../hooks/use-active-worktree-scroll' import { useNow } from '../hooks/use-now' import type { HostWorkspaceOperations } from '../worktree/host-workspace-operations' diff --git a/package.json b/package.json index 03cdc0b44f6..9b784253b25 100644 --- a/package.json +++ b/package.json @@ -160,8 +160,8 @@ "@linear/sdk": "^82.1.0", "@noble/hashes": "1.8.0", "@parcel/watcher": "^2.5.6", - "@xterm/addon-serialize": "0.15.0-beta.287", - "@xterm/headless": "6.1.0-beta.287", + "@xterm/addon-serialize": "0.15.0-beta.300", + "@xterm/headless": "6.1.0-beta.302", "agent-browser": "~0.27.0", "electron-updater": "^6.8.9", "i18next": "^26.3.1", @@ -221,13 +221,13 @@ "@types/ssh2": "^1.15.5", "@types/ws": "^8.18.1", "@vitejs/plugin-react": "^5.2.0", - "@xterm/addon-fit": "0.12.0-beta.287", - "@xterm/addon-ligatures": "0.11.0-beta.287", - "@xterm/addon-search": "0.17.0-beta.287", - "@xterm/addon-unicode11": "0.10.0-beta.287", - "@xterm/addon-web-links": "0.13.0-beta.287", - "@xterm/addon-webgl": "0.20.0-beta.286", - "@xterm/xterm": "6.1.0-beta.287", + "@xterm/addon-fit": "0.12.0-beta.300", + "@xterm/addon-ligatures": "0.11.0-beta.300", + "@xterm/addon-search": "0.17.0-beta.300", + "@xterm/addon-unicode11": "0.10.0-beta.300", + "@xterm/addon-web-links": "0.13.0-beta.300", + "@xterm/addon-webgl": "0.20.0-beta.299", + "@xterm/xterm": "6.1.0-beta.303", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75650d8e3de..f8a553afa00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,10 +110,10 @@ overrides: patchedDependencies: '@vscode/windows-process-tree@0.8.0': 9217ef36c01ed74127fef5512b0c92089cdbf820fd6c109dd671137eebdc7585 - '@xterm/addon-ligatures@0.11.0-beta.287': 47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920 - '@xterm/addon-serialize@0.15.0-beta.287': af3b156143ed2ee9903b753145b63dd4a2ee72cadd7ef333ab0f4d5d3ebfc32c - '@xterm/addon-webgl@0.20.0-beta.286': 2c301a06ad9caa635d746147dcb2b1c69aa026904f65e1183564f08a0e601b91 - '@xterm/xterm@6.1.0-beta.287': 0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356 + '@xterm/addon-ligatures@0.11.0-beta.300': 47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920 + '@xterm/addon-serialize@0.15.0-beta.300': 851eac3d75e6d8c013b9f4c053e61d824b23965cb19ecc28e335e05059f3a294 + '@xterm/addon-webgl@0.20.0-beta.299': 94687e89a0115e6e6aa102837f986debdc029c091527ee5eb4a4e17ceaf9473e + '@xterm/xterm@6.1.0-beta.303': 98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d lint-staged@16.4.0: 7333b3837f80a7fbd045964db6d76ba4fc118e49134bdbabb00585b6b7b60673 node-pty@1.1.0: 9a2eedbf2448b8ff1387a8a740ee5e4e968bf8484d7d80e12a3f6a2dc26b0e17 @@ -140,11 +140,11 @@ importers: specifier: ^2.5.6 version: 2.5.6 '@xterm/addon-serialize': - specifier: 0.15.0-beta.287 - version: 0.15.0-beta.287(patch_hash=af3b156143ed2ee9903b753145b63dd4a2ee72cadd7ef333ab0f4d5d3ebfc32c)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.15.0-beta.300 + version: 0.15.0-beta.300(patch_hash=851eac3d75e6d8c013b9f4c053e61d824b23965cb19ecc28e335e05059f3a294)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/headless': - specifier: 6.1.0-beta.287 - version: 6.1.0-beta.287 + specifier: 6.1.0-beta.302 + version: 6.1.0-beta.302 agent-browser: specifier: ~0.27.0 version: 0.27.0 @@ -318,26 +318,26 @@ importers: specifier: ^5.2.0 version: 5.2.0(rolldown-vite@7.3.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@types/node@25.9.5)(jiti@2.7.0)(yaml@2.8.4)) '@xterm/addon-fit': - specifier: 0.12.0-beta.287 - version: 0.12.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.12.0-beta.300 + version: 0.12.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/addon-ligatures': - specifier: 0.11.0-beta.287 - version: 0.11.0-beta.287(patch_hash=47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.11.0-beta.300 + version: 0.11.0-beta.300(patch_hash=47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/addon-search': - specifier: 0.17.0-beta.287 - version: 0.17.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.17.0-beta.300 + version: 0.17.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/addon-unicode11': - specifier: 0.10.0-beta.287 - version: 0.10.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.10.0-beta.300 + version: 0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/addon-web-links': - specifier: 0.13.0-beta.287 - version: 0.13.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.13.0-beta.300 + version: 0.13.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/addon-webgl': - specifier: 0.20.0-beta.286 - version: 0.20.0-beta.286(patch_hash=2c301a06ad9caa635d746147dcb2b1c69aa026904f65e1183564f08a0e601b91)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)) + specifier: 0.20.0-beta.299 + version: 0.20.0-beta.299(patch_hash=94687e89a0115e6e6aa102837f986debdc029c091527ee5eb4a4e17ceaf9473e)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)) '@xterm/xterm': - specifier: 6.1.0-beta.287 - version: 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + specifier: 6.1.0-beta.303 + version: 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -3502,47 +3502,47 @@ packages: resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - '@xterm/addon-fit@0.12.0-beta.287': - resolution: {integrity: sha512-2MDj+J4x67bjOS/SuBPxSYEWH38NbX6ENV18RbKVOhfRYCX3yERnuHBOrgH9hYdY8rCtsLQmuVgF6cmvCJiV2w==} + '@xterm/addon-fit@0.12.0-beta.300': + resolution: {integrity: sha512-geBeBBKqHe0Dmf+rT79wU/rglFJFja1QmKfcgmnQQhJTvAlrP+yHT2s+yy5PBeP8CtGPDvh5UcoWmunR9fBCuQ==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-ligatures@0.11.0-beta.287': - resolution: {integrity: sha512-NiCDOnrzgQe7Dkpab4QtQ8VpkcLC7p8WjyLbn1EcZxhbuNO4NmiXgiMbXYnzhyPTkdz9xOarwDRKB8ulMMTLTQ==} + '@xterm/addon-ligatures@0.11.0-beta.300': + resolution: {integrity: sha512-f+Uol/BSxHSLnqGDjixstqYHwI/cPgUOfCqP5Lc591xe/MlAgaFIBd8xMEAlUnJnz6/jIVoQMSNNhpk8a4asrQ==} engines: {node: '>8.0.0'} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-search@0.17.0-beta.287': - resolution: {integrity: sha512-nFyUwT/i7i4i1BgqYhQsHIuUGhE18g0KiuoxU6e78n63zGN6RVw5jExvZ8PPa3zVuu/vf8pJ9G9gQs2OmekX4g==} + '@xterm/addon-search@0.17.0-beta.300': + resolution: {integrity: sha512-D3kPBm0qB+AWP+qzgq7JUSCMZOjYxAX9g+bbmLiCBKhgt6dWk40GVG2YgFQRuS55Guj0ooVu93Y/nKEZ7jKxQQ==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-serialize@0.15.0-beta.287': - resolution: {integrity: sha512-UPN1vUaDabYmRr3LU4uQdGzsIJ8/+zJH8OQ+kTOPWtKG3ETkwu3z2tDtSZslDSSg/LtAUfUVtrQdbsxAl5KlLQ==} + '@xterm/addon-serialize@0.15.0-beta.300': + resolution: {integrity: sha512-OCcnMMOCP+p5pIuXIro+u+wfNkSD8J2CZUqmyfTULxgs7jc+vyDL6UiaKmbs2q6MUcq4F9P5Oju3J8d4SEKOmQ==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-unicode11@0.10.0-beta.287': - resolution: {integrity: sha512-79JP5qtNh/+emyqW/1TPcFtPrmMIUgypCcx2g6Eo/vQrZF6YNaQrKkJTovMg2RoxbbRy72Oe1SZcpU2b37hzrw==} + '@xterm/addon-unicode11@0.10.0-beta.300': + resolution: {integrity: sha512-Q678teiannkxiDQtMrr/MtuYAZXc+pou7BWVlL68DTvWdYZqYVrLNjwb1E4PCzO1arEZzO9zaTOhsXfDoiz+gw==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-web-links@0.13.0-beta.287': - resolution: {integrity: sha512-1+5+zWtIGBOygy4yB9is0V9PwEZSz2NsRzQyNqGb+7hnTW2PXqvUCjq6GLvyUflHQw8VQ7jXtUuFE+ETVzcx+A==} + '@xterm/addon-web-links@0.13.0-beta.300': + resolution: {integrity: sha512-9RsQJadgK6cRBIC+k3P9MSTbzRB+/mF229K/shxI9vAV6DYmxRSgmxSGtoOY4MHw7nHuPUC0FxH82eK+GKQPEA==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/addon-webgl@0.20.0-beta.286': - resolution: {integrity: sha512-Nvk9Jic7OCXtL1lS1/Ryurkpd2VElO7PCBOf+DEB3ODs9yU+F31sJwQD+LIdZ6GAJ+Atp7LuWHjSNhRv/xSY0w==} + '@xterm/addon-webgl@0.20.0-beta.299': + resolution: {integrity: sha512-Buf/Qyff1rzbYAhH3Wb96wkhH73XzQ0b0j/JZUqss0TlXmPGen1anA35jDR0FYpNCCXE41KKM39ZrQSBG2P3OQ==} peerDependencies: - '@xterm/xterm': ^6.1.0-beta.287 + '@xterm/xterm': ^6.1.0-beta.303 - '@xterm/headless@6.1.0-beta.287': - resolution: {integrity: sha512-3Jjh1uM9r+euj8Qosm/9SuZIVIZKMMus/Ekk9Spav842WVoFH3F1APTeHl3VynHNi1uHdEbb6QrnHzKA/iJlBQ==} + '@xterm/headless@6.1.0-beta.302': + resolution: {integrity: sha512-UZTvl9zme7wu4q8H5dvudJ7jDYk2BkXbDpiuhbDj0eDg0smoDHk5vcHDfy8zokwDCIHCZXV5Yzy45Wi7DC7dXQ==} - '@xterm/xterm@6.1.0-beta.287': - resolution: {integrity: sha512-3aOHVlxlRVb3tOHI4b/z2O/OsRnqpW5u0qq8OqpqbwLVTbUhThmQ7mBKaehGdbsmcCCBTP1cBwhG0qcvuOjowA==} + '@xterm/xterm@6.1.0-beta.303': + resolution: {integrity: sha512-tqzB2bLPxbRCxQfAdP9K7v0RoS4NgqGWKHAtS4WxqOH9dFgApDojwx5WSD173OomClx40l0cpKDfERMsLPYShA==} abbrev@4.0.0: resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} @@ -9757,39 +9757,39 @@ snapshots: '@xmldom/xmldom@0.8.13': {} - '@xterm/addon-fit@0.12.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-fit@0.12.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/addon-ligatures@0.11.0-beta.287(patch_hash=47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-ligatures@0.11.0-beta.300(patch_hash=47405b9994b5acf1b4e90b49250358c1ca03649854d59560e7732b72fe336920)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) lru-cache: 11.5.1 opentype.js: 2.0.0 - '@xterm/addon-search@0.17.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-search@0.17.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/addon-serialize@0.15.0-beta.287(patch_hash=af3b156143ed2ee9903b753145b63dd4a2ee72cadd7ef333ab0f4d5d3ebfc32c)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-serialize@0.15.0-beta.300(patch_hash=851eac3d75e6d8c013b9f4c053e61d824b23965cb19ecc28e335e05059f3a294)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/addon-unicode11@0.10.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-unicode11@0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/addon-web-links@0.13.0-beta.287(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-web-links@0.13.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/addon-webgl@0.20.0-beta.286(patch_hash=2c301a06ad9caa635d746147dcb2b1c69aa026904f65e1183564f08a0e601b91)(@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356))': + '@xterm/addon-webgl@0.20.0-beta.299(patch_hash=94687e89a0115e6e6aa102837f986debdc029c091527ee5eb4a4e17ceaf9473e)(@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d))': dependencies: - '@xterm/xterm': 6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356) + '@xterm/xterm': 6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d) - '@xterm/headless@6.1.0-beta.287': {} + '@xterm/headless@6.1.0-beta.302': {} - '@xterm/xterm@6.1.0-beta.287(patch_hash=0139c8795bd015a024045e24fa5dfb6fdadb17912c495f9aa9594e50061a0356)': {} + '@xterm/xterm@6.1.0-beta.303(patch_hash=98756bcedc402bcdb7c6ab7b015d2e59cd18e97b03a2c06a27e95bb3ba429d9d)': {} abbrev@4.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7c62496133c..903588e880f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -40,9 +40,9 @@ overrides: patchedDependencies: node-pty@1.1.0: config/patches/node-pty@1.1.0.patch - '@xterm/addon-ligatures@0.11.0-beta.287': config/patches/@xterm__addon-ligatures@0.11.0-beta.287.patch - '@xterm/addon-webgl@0.20.0-beta.286': config/patches/@xterm__addon-webgl@0.20.0-beta.286.patch - '@xterm/addon-serialize@0.15.0-beta.287': config/patches/@xterm__addon-serialize@0.15.0-beta.287.patch - '@xterm/xterm@6.1.0-beta.287': config/patches/@xterm__xterm@6.1.0-beta.287.patch + '@xterm/addon-ligatures@0.11.0-beta.300': config/patches/@xterm__addon-ligatures@0.11.0-beta.300.patch + '@xterm/addon-webgl@0.20.0-beta.299': config/patches/@xterm__addon-webgl@0.20.0-beta.299.patch + '@xterm/addon-serialize@0.15.0-beta.300': config/patches/@xterm__addon-serialize@0.15.0-beta.300.patch + '@xterm/xterm@6.1.0-beta.303': config/patches/@xterm__xterm@6.1.0-beta.303.patch lint-staged@16.4.0: config/patches/lint-staged@16.4.0.patch '@vscode/windows-process-tree@0.8.0': config/patches/@vscode__windows-process-tree@0.8.0.patch diff --git a/src/cli/selectors.ts b/src/cli/selectors.ts index cfc2dd68749..86ed2157ea2 100644 --- a/src/cli/selectors.ts +++ b/src/cli/selectors.ts @@ -4,7 +4,8 @@ import type { RuntimeWorktreeListResult, RuntimeWorktreeRecord } from '../shared/runtime-types' -import { isPathInsideOrEqual } from '../shared/cross-platform-path' +import { isPathInsideOrEqual, isWslUncPathForCallerLinuxPath } from '../shared/cross-platform-path' +import { parseWslUncPath } from '../shared/wsl-paths' import type { RuntimeClient } from './runtime-client' import { RuntimeClientError } from './runtime/types' import { getOptionalStringFlag, getRequiredStringFlag } from './flags' @@ -31,6 +32,56 @@ export function normalizeWorktreeSelector(selector: string, cwd: string): string return selector } +/** + * Rewrites the Linux path a WSL shell prints into the UNC path the runtime stored (#16628). + * + * Why here and not in the runtime: only the CLI sits in the distro, so only it can + * prove which distro the typed path belongs to. Translating once at this chokepoint + * covers `worktree show`, `terminal list --worktree` and `worktree rm --worktree`. + */ +export async function resolveCallerDistroPathSelector( + selector: string, + cwd: string, + client: RuntimeClient +): Promise { + // Why not WSL_DISTRO_NAME: it is also set for a Linux-native CLI whose runtime stores + // POSIX paths, so it would name a distro for a caller that has none. ORCA_CLI_CWD, which + // the WSL launcher always sets and which arrives here as the invocation cwd, proves it. + const callerDistro = parseWslUncPath(cwd)?.distro + const linuxPath = selector.startsWith('path:') ? selector.slice(5) : '' + if ( + !callerDistro || + client.isRemote || + !linuxPath.startsWith('/') || + linuxPath.startsWith('//') || + // Backslash is a legal Linux filename character but a separator once a path reads as UNC. + linuxPath.includes('\\') + ) { + return selector + } + const worktrees = await client.call('worktree.list', { + limit: 10_000 + }) + const match = worktrees.result.worktrees.find((worktree) => + isWslUncPathForCallerLinuxPath(worktree.path, linuxPath, callerDistro) + ) + // Why the stored spelling rather than a synthesized UNC path: an unmatched selector must + // reach the runtime verbatim and fail as the caller typed it, never as a guessed distro. + return match ? `path:${match.path}` : selector +} + +export async function normalizeWorktreeSelectorForCaller( + selector: string, + cwd: string, + client: RuntimeClient +): Promise { + return await resolveCallerDistroPathSelector( + normalizeWorktreeSelector(selector, cwd), + cwd, + client + ) +} + function assertLocalCwdWorktreeSelector(selector: string, client: RuntimeClient): void { if (!client.isRemote) { return @@ -95,7 +146,7 @@ export async function getOptionalWorktreeSelector( assertLocalCwdWorktreeSelector(value, client) return await resolveCurrentWorktreeSelector(cwd, client) } - return normalizeWorktreeSelector(value, cwd) + return await normalizeWorktreeSelectorForCaller(value, cwd, client) } export async function getRequiredWorktreeSelector( @@ -109,7 +160,7 @@ export async function getRequiredWorktreeSelector( assertLocalCwdWorktreeSelector(value, client) return await resolveCurrentWorktreeSelector(cwd, client) } - return normalizeWorktreeSelector(value, cwd) + return await normalizeWorktreeSelectorForCaller(value, cwd, client) } // Why: local browser commands default to the current worktree by auto-resolving @@ -128,7 +179,7 @@ export async function getBrowserWorktreeSelector( assertLocalCwdWorktreeSelector(value, client) return await resolveCurrentWorktreeSelector(cwd, client) } - return normalizeWorktreeSelector(value, cwd) + return await normalizeWorktreeSelectorForCaller(value, cwd, client) } if (client.isRemote) { return undefined @@ -184,7 +235,7 @@ export async function getBrowserCommandTarget( } return { page, - worktree: normalizeWorktreeSelector(explicitWorktree, cwd) + worktree: await normalizeWorktreeSelectorForCaller(explicitWorktree, cwd, client) } } diff --git a/src/cli/worktree-selector-wsl-posix-path.test.ts b/src/cli/worktree-selector-wsl-posix-path.test.ts new file mode 100644 index 00000000000..10d71c8e9ed --- /dev/null +++ b/src/cli/worktree-selector-wsl-posix-path.test.ts @@ -0,0 +1,120 @@ +/** + * The CLI half of #16628: inside WSL the user types `/home/neil/qa-repo`, the runtime stored the + * UNC path Windows sees. Only this process sits in the distro, so only it may translate — and the + * same selector reaches `worktree rm`, so an unprovable distro must leave the path alone. + */ +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { RuntimeWorktreeRecord } from '../shared/runtime-types' +import type { RuntimeClient } from './runtime-client' +import { normalizeWorktreeSelectorForCaller } from './selectors' + +const UBUNTU = 'Ubuntu-24.04' +const DEBIAN = 'Debian' +const LINUX_PATH = '/home/neil/qa-repo' + +function uncPath(distro: string, linuxPath: string): string { + return `\\\\wsl.localhost\\${distro}${linuxPath.replace(/\//g, '\\')}` +} + +function worktreeRecord(path: string): RuntimeWorktreeRecord { + return { id: `repo::${path}`, path } as RuntimeWorktreeRecord +} + +function makeClient(paths: readonly string[], isRemote = false) { + const call = vi.fn(async (method: string) => { + if (method !== 'worktree.list') { + throw new Error(`unexpected method ${method}`) + } + return { + result: { worktrees: paths.map(worktreeRecord), totalCount: paths.length, truncated: false } + } + }) + return { client: { isRemote, call } as unknown as RuntimeClient, call } +} + +afterEach(() => { + vi.unstubAllEnvs() +}) + +describe('normalizeWorktreeSelectorForCaller in a WSL shell (#16628)', () => { + it.each([ + ['a backslash UNC registration', uncPath(UBUNTU, LINUX_PATH)], + ['a forward-slash UNC registration', `//wsl.localhost/${UBUNTU}${LINUX_PATH}`], + ['the wsl$ alias', `\\\\wsl$\\${UBUNTU}${LINUX_PATH.replace(/\//g, '\\')}`] + ])('resolves the typed Linux path to %s', async (_label, storedPath) => { + const { client } = makeClient([storedPath]) + + await expect( + normalizeWorktreeSelectorForCaller( + `path:${LINUX_PATH}`, + uncPath(UBUNTU, '/home/neil'), + client + ) + ).resolves.toBe(`path:${storedPath}`) + }) + + it('leaves the path alone when only another distro spells it', async () => { + const { client } = makeClient([uncPath(UBUNTU, LINUX_PATH)]) + // Interop forwards WSL_DISTRO_NAME, so it must not outvote the cwd that proves the distro. + vi.stubEnv('WSL_DISTRO_NAME', UBUNTU) + + await expect( + normalizeWorktreeSelectorForCaller( + `path:${LINUX_PATH}`, + uncPath(DEBIAN, '/home/neil'), + client + ) + ).resolves.toBe(`path:${LINUX_PATH}`) + }) + + it('picks the caller-distro worktree when two distros spell the same Linux path', async () => { + const { client } = makeClient([uncPath(UBUNTU, LINUX_PATH), uncPath(DEBIAN, LINUX_PATH)]) + + await expect( + normalizeWorktreeSelectorForCaller( + `path:${LINUX_PATH}`, + uncPath(DEBIAN, '/home/neil'), + client + ) + ).resolves.toBe(`path:${uncPath(DEBIAN, LINUX_PATH)}`) + }) + + it.each([ + ['a Linux-native cwd', '/home/neil', `path:${LINUX_PATH}`], + ['a Windows drive cwd', 'C:\\Users\\neil', `path:${LINUX_PATH}`] + ])('never lists worktrees for %s', async (_label, cwd, selector) => { + const { client, call } = makeClient([uncPath(UBUNTU, LINUX_PATH)]) + vi.stubEnv('WSL_DISTRO_NAME', UBUNTU) + + await expect(normalizeWorktreeSelectorForCaller(selector, cwd, client)).resolves.toBe(selector) + expect(call).not.toHaveBeenCalled() + }) + + it.each([ + ['a branch selector', 'branch:qa'], + ['a relative path', 'path:qa-repo'], + // A UNC path is already the runtime's spelling; a backslash inside a Linux path has no UNC form. + ['a UNC path selector', `path:${uncPath(UBUNTU, LINUX_PATH)}`], + ['a Linux path containing a backslash', 'path:/home/neil/qa\\repo'] + ])('leaves %s untranslated', async (_label, selector) => { + const { client, call } = makeClient([uncPath(UBUNTU, LINUX_PATH)]) + + await expect( + normalizeWorktreeSelectorForCaller(selector, uncPath(UBUNTU, '/home/neil'), client) + ).resolves.toBe(selector) + expect(call).not.toHaveBeenCalled() + }) + + it('leaves a remote runtime alone, whose worktrees the caller cwd cannot name', async () => { + const { client, call } = makeClient([uncPath(UBUNTU, LINUX_PATH)], true) + + await expect( + normalizeWorktreeSelectorForCaller( + `path:${LINUX_PATH}`, + uncPath(UBUNTU, '/home/neil'), + client + ) + ).resolves.toBe(`path:${LINUX_PATH}`) + expect(call).not.toHaveBeenCalled() + }) +}) diff --git a/src/main/codex/codex-index-heal-binary-contract.test.ts b/src/main/codex/codex-index-heal-binary-contract.test.ts new file mode 100644 index 00000000000..5580fc02d1d --- /dev/null +++ b/src/main/codex/codex-index-heal-binary-contract.test.ts @@ -0,0 +1,213 @@ +import { execFile } from 'node:child_process' +import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { promisify } from 'node:util' +import { afterEach, beforeAll, describe, expect, it } from 'vitest' +import SyncDatabase from '../sqlite/sync-database' +import { runCodexAppServerSession, type CodexAppServerRpc } from './codex-app-server-session' +import { findNewestCodexStateDbPath } from './codex-state-db' + +// Why this file exists: every other index-heal test drives a stub app-server and +// asserts "healed" as "the `thread/read` call did not error". That pins Orca's half +// of the contract and nothing about Codex's. The behavior Orca actually depends on +// lives in the Codex binary — a read of an unindexed rollout performs a read-repair +// that inserts the `threads` row. If Codex ever dropped that repair, the stub-driven +// tests would all stay green while the subsystem went silently inert. This is the +// real-binary backstop, built to the same shape as the Git binary compatibility +// contract in src/shared/git-binary-compatibility.test.ts. +// +// Keep it narrow. It pins the four arms that ablation established Orca relies on, +// and deliberately asserts nothing else about the app-server, so an unrelated Codex +// release does not redden it into being disabled. + +const execFileAsync = promisify(execFile) +const binary = process.env.ORCA_CODEX_CONTRACT_BINARY +const expectedVersion = process.env.ORCA_CODEX_CONTRACT_VERSION +const describeCodexContract = binary ? describe : describe.skip + +// Why this guard: skipping is the right local-dev default, but a CI job whose whole +// purpose is the real binary must not pass by reporting zero assertions. The job sets +// ORCA_CODEX_CONTRACT_REQUIRED=1, which turns a missing binary into a red test. +describe.runIf(process.env.ORCA_CODEX_CONTRACT_REQUIRED === '1' && !binary)( + 'codex binary index-heal contract prerequisites', + () => { + it('was given a Codex binary to run against', () => { + expect.fail( + 'ORCA_CODEX_CONTRACT_REQUIRED=1 but ORCA_CODEX_CONTRACT_BINARY is unset, so the contract would have silently skipped' + ) + }) + } +) + +// Why fixed: `thread/read` never reaches the network, and a whole session is +// spawn + initialize + one RPC. A generous ceiling still fails fast on a wedged child. +const SESSION_TIMEOUT_MS = 60_000 +// Why: each contract case can use three bounded app-server sessions; keep Vitest's +// watchdog longer than both child deadlines so cleanup cannot race a test timeout. +const CONTRACT_TEST_TIMEOUT_MS = SESSION_TIMEOUT_MS * 3 + 10_000 + +type ThreadRow = { id: string; archived: number } + +describeCodexContract( + 'codex binary index-heal contract', + { timeout: CONTRACT_TEST_TIMEOUT_MS }, + () => { + const disposableHomes: string[] = [] + + beforeAll(async () => { + // Why assert the version: the whole point of a real-binary check is that the + // binary drifts. A job that quietly ran some other Codex would report a + // contract this repo never verified. + const { stdout } = await execFileAsync(binary!, ['--version'], { + timeout: SESSION_TIMEOUT_MS + }) + expect(stdout.trim()).toBe(`codex-cli ${expectedVersion}`) + }) + + afterEach(() => { + while (disposableHomes.length > 0) { + rmSync(disposableHomes.pop() as string, { recursive: true, force: true }) + } + }) + + /** + * Builds a disposable CODEX_HOME in the state Orca actually heals from: Codex's + * own one-shot sqlite backfill has already run and stamped itself `complete`, so + * rollouts that appear afterwards are exactly the ones it will never index on its + * own. Never points at the user's real ~/.codex. + */ + async function createBackfilledCodexHome(): Promise { + const home = mkdtempSync(join(tmpdir(), 'orca-codex-heal-contract-')) + disposableHomes.push(home) + mkdirSync(join(home, 'sessions'), { recursive: true }) + // An app-server session over an empty sessions tree is what stamps the backfill complete. + await runAppServerSession(home, async () => undefined) + expect(readThreadRows(home)).toEqual([]) + return home + } + + function writeRollout(home: string, threadId: string, stamp: string): void { + const dayDir = join(home, 'sessions', '2026', '08', '29') + mkdirSync(dayDir, { recursive: true }) + const meta = { + timestamp: '2026-08-29T21:17:33.760Z', + ordinal: 0, + type: 'session_meta', + payload: { + session_id: threadId, + id: threadId, + timestamp: '2026-08-29T21:17:26.840Z', + cwd: tmpdir(), + originator: 'codex-tui', + cli_version: expectedVersion, + source: 'cli', + thread_source: 'user', + model_provider: 'openai' + } + } + const userMessage = { + timestamp: '2026-08-29T21:17:40.000Z', + ordinal: 1, + type: 'event_msg', + payload: { type: 'user_message', message: 'index-heal contract fixture' } + } + writeFileSync( + join(dayDir, `rollout-${stamp}-${threadId}.jsonl`), + `${JSON.stringify(meta)}\n${JSON.stringify(userMessage)}\n` + ) + } + + // Why reuse runCodexAppServerSession rather than a local JSON-RPC client: it is the + // transport the heal itself uses, so a framing or handshake regression that would + // break the heal breaks this check too. + async function runAppServerSession( + home: string, + body: (rpc: CodexAppServerRpc) => Promise + ): Promise { + return runCodexAppServerSession( + { + command: binary!, + args: ['app-server'], + cliPath: binary!, + env: { CODEX_HOME: home }, + timeoutMs: SESSION_TIMEOUT_MS + }, + body + ) + } + + function readThreadRows(home: string): ThreadRow[] { + const stateDbPath = findNewestCodexStateDbPath(home) + if (!stateDbPath) { + return [] + } + const db = new SyncDatabase(stateDbPath, { readonly: true, fileMustExist: true }) + try { + return db + .prepare('SELECT id, archived FROM threads ORDER BY id') + .all() as unknown as ThreadRow[] + } finally { + db.close() + } + } + + // Arms 1 and 2 are one test on purpose: the "no read" pass is the negative control + // that makes the insert causal rather than incidental. Split across two tests they + // would run against two different homes and prove nothing about each other. + it('inserts the state row because of the read, not because the server ran', async () => { + const home = await createBackfilledCodexHome() + const threadId = '01a04f62-715e-7830-9371-50db585caa71' + writeRollout(home, threadId, '2026-08-29T14-17-26') + + // Control: a complete app-server session that issues no `thread/read`. + await runAppServerSession(home, async () => undefined) + expect(readThreadRows(home)).toEqual([]) + + await runAppServerSession(home, async (rpc) => { + await rpc.request('thread/read', { threadId }) + }) + + expect(readThreadRows(home)).toEqual([{ id: threadId, archived: 0 }]) + }) + + it('leaves an already-indexed thread as a single row', async () => { + const home = await createBackfilledCodexHome() + const threadId = '01a04f62-715e-7830-9371-50db585caa72' + writeRollout(home, threadId, '2026-08-29T15-00-00') + + await runAppServerSession(home, async (rpc) => { + await rpc.request('thread/read', { threadId }) + }) + expect(readThreadRows(home)).toEqual([{ id: threadId, archived: 0 }]) + + await runAppServerSession(home, async (rpc) => { + await rpc.request('thread/read', { threadId }) + }) + + expect(readThreadRows(home)).toEqual([{ id: threadId, archived: 0 }]) + }) + + // Why this arm: the heal reads tens of thousands of rollouts. If a read cleared + // `archived`, the pass would silently resurrect every thread the user had archived. + it('stamps an archived thread archived rather than resurrecting it', async () => { + const home = await createBackfilledCodexHome() + const threadId = '01a04f62-715e-7830-9371-50db585caa73' + writeRollout(home, threadId, '2026-08-29T16-00-00') + + // The archived state is created here, never assumed: a real Codex home may + // never have had a thread archived, and this arm would then pass vacuously. + await runAppServerSession(home, async (rpc) => { + await rpc.request('thread/read', { threadId }) + await rpc.request('thread/archive', { threadId }) + }) + expect(readThreadRows(home)).toEqual([{ id: threadId, archived: 1 }]) + + await runAppServerSession(home, async (rpc) => { + await rpc.request('thread/read', { threadId }) + }) + + expect(readThreadRows(home)).toEqual([{ id: threadId, archived: 1 }]) + }) + } +) diff --git a/src/main/git/admission-tier-plumbing.test.ts b/src/main/git/admission-tier-plumbing.test.ts new file mode 100644 index 00000000000..aba8c4a9c35 --- /dev/null +++ b/src/main/git/admission-tier-plumbing.test.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from 'vitest' +import { hostedReviewOptionArgs } from '../github/pr-refresh-candidate-policy' +import { getHostedReviewLocalGitOptions } from '../source-control/hosted-review-git-options' +import { gitOptionsForWorktree, gitReadOptionsForWorktree } from './git-runtime-options' + +describe('git admission tier plumbing', () => { + it('preserves tiers through both runtime option constructors', () => { + expect( + gitOptionsForWorktree('/repo', { wslDistro: 'Ubuntu', admissionTier: 'interactive' }) + ).toEqual({ cwd: '/repo', wslDistro: 'Ubuntu', admissionTier: 'interactive' }) + expect( + gitReadOptionsForWorktree('/repo', { wslDistro: 'Ubuntu', admissionTier: 'background' }) + ).toEqual({ + cwd: '/repo', + wslDistro: 'Ubuntu', + admissionTier: 'background', + preferWslDirectGit: true + }) + }) + + it('preserves the hosted-review execution tier beside WSL routing', () => { + expect( + getHostedReviewLocalGitOptions({ + localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } + }) + ).toEqual({ wslDistro: 'Ubuntu', admissionTier: 'interactive' }) + }) + + it.each([ + ['manual', 'interactive'], + ['visible', 'background'], + ['active', 'background'], + ['post-push', 'background'], + ['swr', 'background'] + ] as const)('maps PR refresh reason %s to %s admission', (reason, admissionTier) => { + const [options] = hostedReviewOptionArgs( + { + localGitOptions: { wslDistro: 'Ubuntu' }, + linkedPRNumber: null, + fallbackPRNumber: null, + fallbackPRSource: null, + currentHeadOid: null + }, + reason + ) + expect(options?.localGitExecOptions).toEqual({ wslDistro: 'Ubuntu', admissionTier }) + }) +}) diff --git a/src/main/git/command-runner/exec-file-capture.ts b/src/main/git/command-runner/exec-file-capture.ts index 96812284c34..b1b9c664176 100644 --- a/src/main/git/command-runner/exec-file-capture.ts +++ b/src/main/git/command-runner/exec-file-capture.ts @@ -6,11 +6,15 @@ import type { WslProcessGroupTermination } from '../wsl-process-group-terminatio import { createAbortError } from './abort-error' import { killSpawnedCommandTree } from './spawned-command-tree-kill' import { DEFAULT_GIT_MAX_BUFFER } from './git-exec-options' +import type { GitAdmissionTier } from './git-exec-options' type ExecFileCaptureOptions = Omit & { timeout?: number stdin?: string terminationBarrier?: boolean + onChildTerminated?: () => void + admissionTier?: GitAdmissionTier + createTimeoutError?: () => Error } const GIT_TERMINATION_BARRIER_FALLBACK_TIMEOUT_MS = 2_147_000_000 @@ -30,6 +34,7 @@ export async function execFileCaptureToTermination( maxOutputBytes: options.maxBuffer ?? DEFAULT_GIT_MAX_BUFFER, signal: options.signal, terminationBarrier: termination ?? true, + onChildTerminated: options.onChildTerminated, ...(options.stdin === undefined ? {} : { input: options.stdin }) }) const stdout = options.encoding === 'buffer' ? Buffer.from(result.stdout) : result.stdout @@ -38,13 +43,13 @@ export async function execFileCaptureToTermination( if (result.code === 0 && !result.timedOut && !options.signal?.aborted) { return { stdout, stderr } } - const error = new Error( - result.timedOut - ? `${command} timed out.` - : options.signal?.aborted - ? 'The operation was aborted.' - : cleanStderr.trim() || `${command} exited with ${result.code}.` - ) + const error = result.timedOut + ? (options.createTimeoutError?.() ?? new Error(`${command} timed out.`)) + : new Error( + options.signal?.aborted + ? 'The operation was aborted.' + : cleanStderr.trim() || `${command} exited with ${result.code}.` + ) if (options.signal?.aborted) { error.name = 'AbortError' } @@ -80,6 +85,7 @@ export function execFileCapture( ): Promise<{ stdout: string | Buffer; stderr: string | Buffer }> { return new Promise((resolve, reject) => { if (options.signal?.aborted) { + options.onChildTerminated?.() reject(createAbortError()) return } @@ -88,6 +94,14 @@ export function execFileCapture( let terminating = false let child: ChildProcess | null = null let timer: NodeJS.Timeout | null = null + let terminationReported = false + const reportChildTerminated = (): void => { + if (terminationReported) { + return + } + terminationReported = true + options.onChildTerminated?.() + } const cleanup = (): void => { if (timer) { clearTimeout(timer) @@ -160,15 +174,20 @@ export function execFileCapture( ) recordSubprocessSpawn(command, args, performance.now() - spawnStartedAt) } catch (error) { + reportChildTerminated() finish(error instanceof Error ? error : new Error(String(error))) return } child.once('error', (error) => { + if (!child?.pid) { + reportChildTerminated() + } if (!terminating) { finish(error) } }) + child.once('close', reportChildTerminated) if (options.stdin !== undefined) { endSubprocessStdin(child.stdin, options.stdin) @@ -181,7 +200,7 @@ export function execFileCapture( return } terminating = true - const timeoutError = new Error(`${command} timed out.`) + const timeoutError = options.createTimeoutError?.() ?? new Error(`${command} timed out.`) if (!child) { terminating = false finish(timeoutError) diff --git a/src/main/git/command-runner/git-admission-candidate-heap.ts b/src/main/git/command-runner/git-admission-candidate-heap.ts new file mode 100644 index 00000000000..ca22cac6097 --- /dev/null +++ b/src/main/git/command-runner/git-admission-candidate-heap.ts @@ -0,0 +1,85 @@ +import type { AdmissionWaiter } from './git-admission-state' + +export type WaiterLane = { + items: AdmissionWaiter[] + head: number + count: number + baseEligible: boolean + headroomEligible: boolean + version: number +} + +export type Candidate = { lane: WaiterLane; waiter: AdmissionWaiter; version: number } + +const CANDIDATE_HEAP_COMPACTION_SLACK = 64 + +export class CandidateHeap { + private items: Candidate[] = [] + + get size(): number { + return this.items.length + } + + push(candidate: Candidate): void { + this.items.push(candidate) + let index = this.items.length - 1 + while (index > 0) { + const parent = Math.floor((index - 1) / 2) + if (this.items[parent].waiter.id <= candidate.waiter.id) { + break + } + this.items[index] = this.items[parent] + index = parent + } + this.items[index] = candidate + } + + peek(valid: (candidate: Candidate) => boolean): Candidate | null { + // Eligibility changes invalidate by version so route updates stay O(log N). + while (this.items.length > 0 && !valid(this.items[0])) { + this.pop() + } + return this.items[0] ?? null + } + + compactIfOversized(maxLiveCandidates: number, valid: (candidate: Candidate) => boolean): void { + if (this.items.length <= maxLiveCandidates * 2 + CANDIDATE_HEAP_COMPACTION_SLACK) { + return + } + this.items = this.items.filter(valid) + for (let index = Math.floor(this.items.length / 2) - 1; index >= 0; index -= 1) { + this.siftDown(index) + } + } + + private pop(): void { + const last = this.items.pop() + if (!last || this.items.length === 0) { + return + } + this.items[0] = last + this.siftDown(0) + } + + private siftDown(index: number): void { + const candidate = this.items[index] + let cursor = index + while (true) { + const left = cursor * 2 + 1 + if (left >= this.items.length) { + break + } + const right = left + 1 + const child = + right < this.items.length && this.items[right].waiter.id < this.items[left].waiter.id + ? right + : left + if (this.items[child].waiter.id >= candidate.waiter.id) { + break + } + this.items[cursor] = this.items[child] + cursor = child + } + this.items[cursor] = candidate + } +} diff --git a/src/main/git/command-runner/git-admission-output-parity.test.ts b/src/main/git/command-runner/git-admission-output-parity.test.ts new file mode 100644 index 00000000000..c75519cfc7c --- /dev/null +++ b/src/main/git/command-runner/git-admission-output-parity.test.ts @@ -0,0 +1,60 @@ +// Runs on every platform: parity against real git is the Windows-relevant half of +// the admission evidence, so it must not share the storm harness's POSIX gate. +import { execFileSync } from 'node:child_process' +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { afterEach, expect, it } from 'vitest' +import { gitExecFileAsync, gitExecFileAsyncBuffer } from './git-exec-file' +import { _resetGitAdmissionForTests } from './git-subprocess-admission' + +const tempRoots: string[] = [] +const originalAdmissionDisabled = process.env.ORCA_GIT_ADMISSION_DISABLED + +afterEach(async () => { + if (originalAdmissionDisabled === undefined) { + delete process.env.ORCA_GIT_ADMISSION_DISABLED + } else { + process.env.ORCA_GIT_ADMISSION_DISABLED = originalAdmissionDisabled + } + _resetGitAdmissionForTests() + await Promise.all(tempRoots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +function setAdmissionDisabled(disabled: boolean): void { + if (disabled) { + process.env.ORCA_GIT_ADMISSION_DISABLED = '1' + } else { + delete process.env.ORCA_GIT_ADMISSION_DISABLED + } +} + +it('keeps real git output byte-identical with admission on and bypassed', async () => { + const root = await mkdtemp(path.join(tmpdir(), 'orca-git-output-parity-')) + tempRoots.push(root) + execFileSync('git', ['init', '-q'], { cwd: root }) + execFileSync('git', ['config', 'user.email', 'test@example.com'], { cwd: root }) + execFileSync('git', ['config', 'user.name', 'Orca Test'], { cwd: root }) + await writeFile(path.join(root, 'tracked.txt'), 'line one\nline two\n') + await writeFile(path.join(root, 'blob.bin'), Buffer.from([0, 1, 2, 3, 255])) + execFileSync('git', ['add', '.'], { cwd: root }) + execFileSync('git', ['commit', '-q', '-m', 'fixture'], { cwd: root }) + await writeFile(path.join(root, 'tracked.txt'), 'line one\nchanged\n') + + const runBattery = async (disabled: boolean): Promise<(string | Buffer)[]> => { + setAdmissionDisabled(disabled) + return [ + (await gitExecFileAsync(['status', '--porcelain=v2'], { cwd: root })).stdout, + (await gitExecFileAsync(['diff', '--numstat'], { cwd: root })).stdout, + (await gitExecFileAsync(['branch', '-a'], { cwd: root })).stdout, + (await gitExecFileAsync(['rev-parse', 'HEAD'], { cwd: root })).stdout, + (await gitExecFileAsyncBuffer(['show', 'HEAD:blob.bin'], { cwd: root })).stdout + ] + } + + const enabled = await runBattery(false) + const bypassed = await runBattery(true) + expect(bypassed).toEqual(enabled) + expect(await readFile(path.join(root, 'blob.bin'))).toEqual(enabled.at(-1)) + console.info('GIT_ADMISSION_OUTPUT_PARITY=byte-identical') +}) diff --git a/src/main/git/command-runner/git-admission-span.test.ts b/src/main/git/command-runner/git-admission-span.test.ts new file mode 100644 index 00000000000..de74c00ec2e --- /dev/null +++ b/src/main/git/command-runner/git-admission-span.test.ts @@ -0,0 +1,168 @@ +import { EventEmitter } from 'node:events' +import type { ChildProcess } from 'node:child_process' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const { execFileMock, spawnMock, span, withGitSpanMock, startGitSpanMock } = vi.hoisted(() => { + const span = { + setAttribute: vi.fn(), + end: vi.fn(), + fail: vi.fn() + } + return { + execFileMock: vi.fn(), + spawnMock: vi.fn(), + span, + withGitSpanMock: vi.fn(async (_attributes: unknown, run: (value: typeof span) => unknown) => { + try { + const result = await run(span) + span.end() + return result + } catch (error) { + span.fail(error) + throw error + } + }), + startGitSpanMock: vi.fn(() => span) + } +}) + +vi.mock('node:child_process', async (importOriginal) => ({ + ...(await importOriginal()), + execFile: execFileMock, + spawn: spawnMock +})) +vi.mock('../../observability/instrumentation', () => ({ + withGitSpan: withGitSpanMock, + startGitSpan: startGitSpanMock +})) + +import { gitExecFileAsync, gitExecFileAsyncBuffer } from './git-exec-file' +import { withGitAdmission } from './git-spawn' +import { gitStreamStdout } from './git-stream-stdout' +import { + GitAdmissionScheduler, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests +} from './git-subprocess-admission' + +type ExecCallback = (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void + +function mockChild(): ChildProcess { + const child = new EventEmitter() as EventEmitter & Record + child.pid = 1234 + child.kill = vi.fn(() => true) + child.stdin = Object.assign(new EventEmitter(), { end: vi.fn() }) + child.stdout = new EventEmitter() + child.stderr = new EventEmitter() + return child as unknown as ChildProcess +} + +async function queueBehindBlocker(): Promise<{ + release: () => void + advance: () => void +}> { + let now = 0 + const scheduler = new GitAdmissionScheduler({ + generalCap: 1, + generalHeadroom: 0, + now: () => now + }) + _resetGitAdmissionForTests(scheduler) + const blocker = await scheduler.acquire({ args: ['status'], cwd: '/blocker' }) + return { + release: blocker.release, + advance: () => { + now = 37 + } + } +} + +async function releaseQueued(blocker: { release: () => void; advance: () => void }): Promise { + await vi.waitFor(() => expect(_gitAdmissionSnapshotForTests().queued).toBe(1)) + blocker.advance() + blocker.release() +} + +describe('git admission span coverage', () => { + beforeEach(() => { + execFileMock.mockReset() + spawnMock.mockReset() + span.setAttribute.mockReset() + span.end.mockReset() + span.fail.mockReset() + withGitSpanMock.mockClear() + startGitSpanMock.mockClear() + }) + + afterEach(() => _resetGitAdmissionForTests()) + + it('records queue wait for string exec inside its span', async () => { + const blocker = await queueBehindBlocker() + const child = mockChild() + let callback: ExecCallback | undefined + execFileMock.mockImplementation( + (_command: string, _args: string[], _options: unknown, received: ExecCallback) => { + callback = received + return child + } + ) + const pending = gitExecFileAsync(['status'], { cwd: '/repo' }) + await releaseQueued(blocker) + await vi.waitFor(() => expect(callback).toBeTypeOf('function')) + + child.emit('close', 0, null) + callback?.(null, 'ok', '') + await expect(pending).resolves.toEqual({ stdout: 'ok', stderr: '' }) + expect(span.setAttribute).toHaveBeenCalledWith('git.queue_wait_ms', 37) + expect(span.end).toHaveBeenCalledOnce() + }) + + it('records queue wait for buffer exec inside its span', async () => { + const blocker = await queueBehindBlocker() + const child = mockChild() + let callback: ExecCallback | undefined + execFileMock.mockImplementation( + (_command: string, _args: string[], _options: unknown, received: ExecCallback) => { + callback = received + return child + } + ) + const pending = gitExecFileAsyncBuffer(['show', 'HEAD:file'], { cwd: '/repo' }) + await releaseQueued(blocker) + await vi.waitFor(() => expect(callback).toBeTypeOf('function')) + + child.emit('close', 0, null) + callback?.(null, Buffer.from('blob'), Buffer.alloc(0)) + await expect(pending).resolves.toEqual({ stdout: Buffer.from('blob') }) + expect(span.setAttribute).toHaveBeenCalledWith('git.queue_wait_ms', 37) + expect(span.end).toHaveBeenCalledOnce() + }) + + it('records queue wait for stream exec inside its span', async () => { + const blocker = await queueBehindBlocker() + const child = mockChild() + spawnMock.mockReturnValue(child) + const pending = gitStreamStdout(['status'], { cwd: '/repo', onStdout: () => {} }) + await releaseQueued(blocker) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) + + child.emit('close', 0, null) + await expect(pending).resolves.toEqual({ stoppedEarly: false }) + expect(span.setAttribute).toHaveBeenCalledWith('git.queue_wait_ms', 37) + expect(span.end).toHaveBeenCalledOnce() + }) + + it('keeps the manual spawn span open through queue wait and child close', async () => { + const blocker = await queueBehindBlocker() + const child = mockChild() + const pending = withGitAdmission(['status'], { cwd: '/repo' }, () => child) + await releaseQueued(blocker) + await expect(pending).resolves.toBe(child) + + expect(span.setAttribute).toHaveBeenCalledWith('git.queue_wait_ms', 37) + expect(span.end).not.toHaveBeenCalled() + child.emit('close', 0, null) + expect(span.end).toHaveBeenCalledOnce() + expect(span.fail).not.toHaveBeenCalled() + }) +}) diff --git a/src/main/git/command-runner/git-admission-state.ts b/src/main/git/command-runner/git-admission-state.ts new file mode 100644 index 00000000000..60b198660cb --- /dev/null +++ b/src/main/git/command-runner/git-admission-state.ts @@ -0,0 +1,141 @@ +import { availableParallelism } from 'node:os' +import type { GitAdmissionTier } from './git-exec-options' + +export const GENERAL_CAP = Math.max(2, Math.min(4, availableParallelism() - 4)) +export const NETWORK_CAP = 3 +export const GENERAL_HEADROOM = 2 +export const NETWORK_HEADROOM = 1 +export const ROUTE_CAP = 2 +export const ROUTE_HEADROOM = 1 +export const GIT_ADMISSION_AGING_MS = 15_000 +// General 4+2 and network 3+1 are disjoint, so at most ten git children run globally. +export const MAX_GIT_CHILDREN = 10 + +export type AdmissionClass = 'general' | 'network' +export type AdmissionSlotKind = 'base' | 'headroom' + +export type GitAdmissionRequest = { + args: readonly string[] + cwd: string + wslDistro?: string + tier?: GitAdmissionTier + signal?: AbortSignal +} + +export type GitAdmissionGrant = { + queueWaitMs: number + release: () => void +} + +export type AdmissionBudgetSnapshot = { + key: string + baseCapacity: number + headroomCapacity: number + baseUsed: number + headroomUsed: number +} + +export type GitAdmissionEvent = { + sequence: number + phase: 'grant' | 'release' + waiterId: number + args: readonly string[] + tier: GitAdmissionTier + admissionClass: AdmissionClass + route: string | null + slotKind: AdmissionSlotKind + queueWaitMs: number + queued: number + budgets: AdmissionBudgetSnapshot[] +} + +export type AdmissionSchedulerConfig = { + generalCap: number + networkCap: number + generalHeadroom: number + networkHeadroom: number + routeCap: number + routeHeadroom: number + agingMs: number + now: () => number + onAdmissionEvent?: (event: GitAdmissionEvent) => void +} + +export const DEFAULT_ADMISSION_SCHEDULER_CONFIG: AdmissionSchedulerConfig = { + generalCap: GENERAL_CAP, + networkCap: NETWORK_CAP, + generalHeadroom: GENERAL_HEADROOM, + networkHeadroom: NETWORK_HEADROOM, + routeCap: ROUTE_CAP, + routeHeadroom: ROUTE_HEADROOM, + agingMs: GIT_ADMISSION_AGING_MS, + now: () => performance.now() +} + +export type AdmissionBudget = { + baseCapacity: number + headroomCapacity: number + baseUsed: number + headroomUsed: number +} + +export type AdmissionWaiter = { + id: number + args: readonly string[] + tier: GitAdmissionTier + admissionClass: AdmissionClass + route: string | null + enqueuedAt: number + budgetKeys: readonly string[] + signal?: AbortSignal + state: 'queued' | 'granted' | 'settled' + slotKind?: AdmissionSlotKind + resolve: (grant: GitAdmissionGrant) => void + reject: (error: Error) => void + onAbort: () => void +} + +type AdmissionEventDetails = { + waiter: AdmissionWaiter + slotKind: AdmissionSlotKind + phase: GitAdmissionEvent['phase'] + queueWaitMs: number + queued: number + budgets: ReadonlyMap +} + +export class AdmissionEventPublisher { + private nextSequence = 0 + + constructor(private readonly listener?: (event: GitAdmissionEvent) => void) {} + + publish(details: AdmissionEventDetails): void { + if (!this.listener) { + return + } + const event: GitAdmissionEvent = { + sequence: this.nextSequence++, + phase: details.phase, + waiterId: details.waiter.id, + args: details.waiter.args, + tier: details.waiter.tier, + admissionClass: details.waiter.admissionClass, + route: details.waiter.route, + slotKind: details.slotKind, + queueWaitMs: details.queueWaitMs, + queued: details.queued, + budgets: [...details.budgets].map(([key, budget]) => ({ key, ...budget })) + } + try { + this.listener(event) + } catch { + // Measurement must never affect admission. + } + } +} + +export const ADMISSION_TIER_VALUE: Record = { + interactive: 0, + status: 1, + background: 2 +} diff --git a/src/main/git/command-runner/git-admission-storm-measurement.test.ts b/src/main/git/command-runner/git-admission-storm-measurement.test.ts new file mode 100644 index 00000000000..2fb3e896b20 --- /dev/null +++ b/src/main/git/command-runner/git-admission-storm-measurement.test.ts @@ -0,0 +1,250 @@ +/** + * POSIX-only measurement: a PATH-injected git fixture exercises the real spawn path. + * Timing distributions are reported for field comparison; CI assertions stay structural. + */ +import { chmod, mkdtemp, mkdir, readdir, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { gitExecFileAsync } from './git-exec-file' +import { + GIT_ADMISSION_AGING_MS, + GitAdmissionScheduler, + MAX_GIT_CHILDREN, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests, + type GitAdmissionEvent +} from './git-subprocess-admission' + +type StormMeasurement = { + mode: 'disabled' | 'enabled' + maxConcurrentChildren: number + eventLoopMaxDriftMs: number + eventLoopP99DriftMs: number + interactiveP50Ms: number + interactiveP95Ms: number + totalWallMs: number + admissionEvents: GitAdmissionEvent[] + interactiveQueueSnapshots: InteractiveQueueSnapshot[] +} + +type InteractiveQueueSnapshot = { + commandLabel: string + backgroundWaiterIds: number[] +} + +const tempRoots: string[] = [] +const originalAdmissionDisabled = process.env.ORCA_GIT_ADMISSION_DISABLED + +afterEach(async () => { + if (originalAdmissionDisabled === undefined) { + delete process.env.ORCA_GIT_ADMISSION_DISABLED + } else { + process.env.ORCA_GIT_ADMISSION_DISABLED = originalAdmissionDisabled + } + _resetGitAdmissionForTests() + await Promise.all(tempRoots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +function percentile(values: readonly number[], percentileValue: number): number { + if (values.length === 0) { + return 0 + } + const sorted = [...values].sort((a, b) => a - b) + return sorted[Math.min(sorted.length - 1, Math.ceil(sorted.length * percentileValue) - 1)] +} + +async function liveChildCount(stateDir: string): Promise { + return (await readdir(stateDir)).filter((name) => name.endsWith('.live')).length +} + +async function createStubGit(root: string): Promise { + const binDir = path.join(root, 'bin') + await mkdir(binDir) + const stubPath = path.join(binDir, 'git') + await writeFile( + stubPath, + `#!/bin/sh +set -eu +live="$ORCA_STUB_STATE_DIR/$ORCA_STUB_ID.live" +: > "$live" +trap 'rm -f "$live"' EXIT HUP INT TERM +sleep "$(awk "BEGIN { print $ORCA_STUB_SLEEP_MS / 1000 }")" +printf 'stub:%s\\n' "$*" +` + ) + await chmod(stubPath, 0o755) + return binDir +} + +function setAdmissionMode(mode: StormMeasurement['mode']): void { + if (mode === 'disabled') { + process.env.ORCA_GIT_ADMISSION_DISABLED = '1' + } else { + delete process.env.ORCA_GIT_ADMISSION_DISABLED + } +} + +async function measureStorm(mode: StormMeasurement['mode']): Promise { + setAdmissionMode(mode) + const admissionEvents: GitAdmissionEvent[] = [] + const admissionClockStartedAt = performance.now() + _resetGitAdmissionForTests( + new GitAdmissionScheduler({ + now: () => Math.min(performance.now() - admissionClockStartedAt, GIT_ADMISSION_AGING_MS - 1), + onAdmissionEvent: (event) => admissionEvents.push(event) + }) + ) + const root = await mkdtemp(path.join(tmpdir(), `orca-git-storm-${mode}-`)) + tempRoots.push(root) + const stateDir = path.join(root, 'state') + await mkdir(stateDir) + const binDir = await createStubGit(root) + const repoDirs = await Promise.all( + Array.from({ length: 6 }, async (_, index) => { + const repoDir = path.join(root, `repo-${index}`) + await mkdir(repoDir) + return repoDir + }) + ) + const baseEnv = { ...process.env, PATH: `${binDir}${path.delimiter}${process.env.PATH ?? ''}` } + const startedAt = performance.now() + const drifts: number[] = [] + let nextJankSample = performance.now() + 50 + const jankTimer = setInterval(() => { + const now = performance.now() + drifts.push(Math.max(0, now - nextJankSample)) + nextJankSample = now + 50 + }, 50) + let maxConcurrentChildren = 0 + const censusTimer = setInterval(() => { + void liveChildCount(stateDir).then((count) => { + maxConcurrentChildren = Math.max(maxConcurrentChildren, count) + }) + }, 5) + + const background = Array.from({ length: 60 }, (_, index) => + gitExecFileAsync(['status', '--porcelain=v2', `storm-${index}`], { + cwd: repoDirs[index % repoDirs.length], + env: { + ...baseEnv, + ORCA_STUB_ID: `background-${index}`, + ORCA_STUB_SLEEP_MS: index % 10 === 0 ? '5000' : '200', + ORCA_STUB_STATE_DIR: stateDir + }, + admissionTier: 'background' + }) + ) + const interactiveQueueSnapshots: InteractiveQueueSnapshot[] = [] + const interactiveLatencies = await Promise.all( + Array.from( + { length: 10 }, + (_, index) => + new Promise((resolve, reject) => { + setTimeout( + () => { + void (async () => { + const concurrentAtInjection = await liveChildCount(stateDir) + const commandStartedAt = performance.now() + const commandLabel = `interactive-${index}` + interactiveQueueSnapshots.push({ + commandLabel, + backgroundWaiterIds: _gitAdmissionSnapshotForTests() + .queuedWaiters.filter((waiter) => waiter.tier === 'background') + .map((waiter) => waiter.id) + }) + await gitExecFileAsync(['rev-parse', commandLabel], { + cwd: repoDirs[index % repoDirs.length], + env: { + ...baseEnv, + ORCA_STUB_ID: `interactive-${index}`, + ORCA_STUB_SLEEP_MS: String(Math.max(10, concurrentAtInjection * 12)), + ORCA_STUB_STATE_DIR: stateDir + }, + admissionTier: 'interactive' + }) + resolve(performance.now() - commandStartedAt) + })().catch(reject) + }, + 50 * (index + 1) + ) + }) + ) + ) + await Promise.all(background) + clearInterval(censusTimer) + clearInterval(jankTimer) + maxConcurrentChildren = Math.max(maxConcurrentChildren, await liveChildCount(stateDir)) + const totalWallMs = performance.now() - startedAt + return { + mode, + maxConcurrentChildren, + eventLoopMaxDriftMs: Math.max(0, ...drifts), + eventLoopP99DriftMs: percentile(drifts, 0.99), + interactiveP50Ms: percentile(interactiveLatencies, 0.5), + interactiveP95Ms: percentile(interactiveLatencies, 0.95), + totalWallMs, + admissionEvents, + interactiveQueueSnapshots + } +} + +function formatMeasurementTable(rows: readonly StormMeasurement[]): string { + const rounded = rows.map((row) => ({ + mode: row.mode, + maxConcurrentChildren: row.maxConcurrentChildren, + eventLoopMaxDriftMs: row.eventLoopMaxDriftMs.toFixed(1), + eventLoopP99DriftMs: row.eventLoopP99DriftMs.toFixed(1), + interactiveP50Ms: row.interactiveP50Ms.toFixed(1), + interactiveP95Ms: row.interactiveP95Ms.toFixed(1), + totalWallMs: row.totalWallMs.toFixed(1) + })) + return JSON.stringify(rounded) +} + +function assertAdmissionLedger(measurement: StormMeasurement): void { + const activeWaiters = new Set() + const grantSequenceByWaiter = new Map() + const grantByLabel = new Map() + + measurement.admissionEvents.forEach((event, index) => { + expect(event.sequence).toBe(index) + if (event.phase === 'grant') { + activeWaiters.add(event.waiterId) + grantSequenceByWaiter.set(event.waiterId, event.sequence) + const label = event.args.find((arg) => arg.startsWith('interactive-')) + if (label) { + grantByLabel.set(label, event) + } + } else { + expect(activeWaiters.delete(event.waiterId)).toBe(true) + } + expect(activeWaiters.size).toBeLessThanOrEqual(MAX_GIT_CHILDREN) + for (const budget of event.budgets) { + expect(budget.baseUsed).toBeLessThanOrEqual(budget.baseCapacity) + expect(budget.headroomUsed).toBeLessThanOrEqual(budget.headroomCapacity) + } + }) + expect(activeWaiters.size).toBe(0) + + for (const snapshot of measurement.interactiveQueueSnapshots) { + const interactiveGrant = grantByLabel.get(snapshot.commandLabel) + expect(interactiveGrant).toBeDefined() + const preceded = snapshot.backgroundWaiterIds.filter( + (waiterId) => interactiveGrant!.sequence < (grantSequenceByWaiter.get(waiterId) ?? Infinity) + ).length + expect(preceded).toBeGreaterThanOrEqual(Math.ceil(snapshot.backgroundWaiterIds.length * 0.9)) + } +} + +describe.skipIf(process.platform === 'win32')('git admission storm measurement', () => { + it('reports bounded-concurrency before and after measurements', async () => { + const disabled = await measureStorm('disabled') + const enabled = await measureStorm('enabled') + console.info(`GIT_ADMISSION_STORM_MEASUREMENT=${formatMeasurementTable([disabled, enabled])}`) + assertAdmissionLedger(enabled) + }) + + // Output parity lives in git-admission-output-parity.test.ts: it needs real git, + // not the PATH stub, so it runs on win32 too and cannot share this file's gate. +}) diff --git a/src/main/git/command-runner/git-admission-waiter-queue.ts b/src/main/git/command-runner/git-admission-waiter-queue.ts new file mode 100644 index 00000000000..1f0e9a55cde --- /dev/null +++ b/src/main/git/command-runner/git-admission-waiter-queue.ts @@ -0,0 +1,249 @@ +import type { AdmissionClass, AdmissionSlotKind, AdmissionWaiter } from './git-admission-state' +import { CandidateHeap, type Candidate, type WaiterLane } from './git-admission-candidate-heap' +import type { GitAdmissionTier } from './git-exec-options' + +type SelectedWaiter = { + waiter: AdmissionWaiter + slotKind: AdmissionSlotKind +} + +const TIERS = ['interactive', 'status', 'background'] as const +const createLane = (): WaiterLane => ({ + items: [], + head: 0, + count: 0, + baseEligible: false, + headroomEligible: false, + version: 0 +}) +type TierLanes = Record> +const createTierLanes = (): TierLanes => ({ + interactive: new Map(), + status: new Map(), + background: new Map() +}) +export class GitAdmissionWaiterQueue { + private readonly lanes: Record = { + general: createTierLanes(), + network: createTierLanes() + } + private readonly countsByBudget = new Map() + private readonly baseCandidates: Record> = + { + general: { + interactive: new CandidateHeap(), + status: new CandidateHeap(), + background: new CandidateHeap() + }, + network: { + interactive: new CandidateHeap(), + status: new CandidateHeap(), + background: new CandidateHeap() + } + } + private readonly headroomCandidates: Record = { + general: new CandidateHeap(), + network: new CandidateHeap() + } + private totalCount = 0 + + get count(): number { + return this.totalCount + } + + /** @internal - exposed for bounded-storage regression tests only. */ + get candidateCountForTests(): number { + let count = this.headroomCandidates.general.size + this.headroomCandidates.network.size + for (const admissionClass of ['general', 'network'] as const) { + for (const tier of TIERS) { + count += this.baseCandidates[admissionClass][tier].size + } + } + return count + } + + enqueue(waiter: AdmissionWaiter): void { + const lanes = this.lanes[waiter.admissionClass][waiter.tier] + let lane = lanes.get(waiter.route) + if (!lane) { + lane = createLane() + lanes.set(waiter.route, lane) + } + lane.items.push(waiter) + lane.count += 1 + this.totalCount += 1 + for (const key of waiter.budgetKeys) { + this.countsByBudget.set(key, (this.countsByBudget.get(key) ?? 0) + 1) + } + if (lane.count === 1) { + this.publishLaneHead(waiter.admissionClass, waiter.tier, lane) + } + } + + dequeue(waiter: AdmissionWaiter): void { + const lanes = this.lanes[waiter.admissionClass][waiter.tier] + const lane = lanes.get(waiter.route) + if (!lane) { + return + } + lane.count -= 1 + this.totalCount -= 1 + for (const key of waiter.budgetKeys) { + const current = this.countsByBudget.get(key) + if (current === 1) { + this.countsByBudget.delete(key) + } else if (current !== undefined) { + this.countsByBudget.set(key, current - 1) + } + } + const previousHead = lane.items[lane.head] + this.compact(lane) + if (lane.count === 0) { + lane.version += 1 + lanes.delete(waiter.route) + this.compactCandidateHeaps(waiter.admissionClass, waiter.tier) + } else if (lane.items[lane.head] !== previousHead) { + lane.version += 1 + this.publishLaneHead(waiter.admissionClass, waiter.tier, lane) + this.compactCandidateHeaps(waiter.admissionClass, waiter.tier) + } + } + + updateRouteEligibility( + admissionClass: AdmissionClass, + route: string | null, + baseEligible: boolean, + headroomEligible: boolean + ): void { + for (const tier of TIERS) { + const lane = this.lanes[admissionClass][tier].get(route) + if ( + !lane || + (lane.baseEligible === baseEligible && lane.headroomEligible === headroomEligible) + ) { + continue + } + lane.baseEligible = baseEligible + lane.headroomEligible = headroomEligible + lane.version += 1 + this.publishLaneHead(admissionClass, tier, lane) + this.compactCandidateHeaps(admissionClass, tier) + } + } + + hasBudget(key: string): boolean { + return this.countsByBudget.has(key) + } + + snapshot(): AdmissionWaiter[] { + return (['general', 'network'] as const) + .flatMap((admissionClass) => + TIERS.flatMap((tier) => { + return [...this.lanes[admissionClass][tier].values()].flatMap((lane) => + lane.items.slice(lane.head).filter((waiter) => waiter.state === 'queued') + ) + }) + ) + .sort((left, right) => left.id - right.id) + } + + nextFitting( + admissionClass: AdmissionClass, + effectiveTier: (waiter: AdmissionWaiter) => number, + allowBase: boolean, + allowHeadroom: boolean, + abort: (waiter: AdmissionWaiter) => void + ): SelectedWaiter | null { + while (true) { + const candidates: SelectedWaiter[] = [] + if (allowBase) { + // Aging preserves order within a raw tier, so only its oldest eligible head can win. + for (const tier of TIERS) { + const candidate = this.peekValid(this.baseCandidates[admissionClass][tier], 'base') + if (candidate) { + candidates.push({ waiter: candidate.waiter, slotKind: 'base' }) + } + } + } + if (allowHeadroom) { + const candidate = this.peekValid(this.headroomCandidates[admissionClass], 'headroom') + if (candidate) { + candidates.push({ waiter: candidate.waiter, slotKind: 'headroom' }) + } + } + const selected = candidates.sort( + (left, right) => + effectiveTier(left.waiter) - effectiveTier(right.waiter) || + left.waiter.id - right.waiter.id || + (left.slotKind === 'base' ? -1 : 1) + )[0] + if (!selected || !selected.waiter.signal?.aborted) { + return selected ?? null + } + abort(selected.waiter) + } + } + + private publishLaneHead( + admissionClass: AdmissionClass, + tier: GitAdmissionTier, + lane: WaiterLane + ): void { + const waiter = lane.items[lane.head] + if (!waiter || waiter.state !== 'queued') { + return + } + const candidate = { lane, waiter, version: lane.version } + if (lane.baseEligible) { + this.baseCandidates[admissionClass][tier].push(candidate) + } + if (tier === 'interactive' && lane.headroomEligible) { + this.headroomCandidates[admissionClass].push(candidate) + } + } + + private peekValid(heap: CandidateHeap, slotKind: AdmissionSlotKind): Candidate | null { + return heap.peek((candidate) => this.candidateIsValid(candidate, slotKind)) + } + + private candidateIsValid(candidate: Candidate, slotKind: AdmissionSlotKind): boolean { + const { lane, waiter, version } = candidate + return ( + version === lane.version && + waiter === lane.items[lane.head] && + waiter.state === 'queued' && + (slotKind === 'base' ? lane.baseEligible : lane.headroomEligible) + ) + } + + private compactCandidateHeaps(admissionClass: AdmissionClass, tier: GitAdmissionTier): void { + const liveLaneCount = this.lanes[admissionClass][tier].size + this.baseCandidates[admissionClass][tier].compactIfOversized(liveLaneCount, (candidate) => + this.candidateIsValid(candidate, 'base') + ) + if (tier === 'interactive') { + this.headroomCandidates[admissionClass].compactIfOversized(liveLaneCount, (candidate) => + this.candidateIsValid(candidate, 'headroom') + ) + } + } + + private compact(lane: WaiterLane): void { + let head = lane.head + while (head < lane.items.length && lane.items[head].state !== 'queued') { + head += 1 + } + lane.head = head + if (lane.count === 0) { + lane.items.length = 0 + lane.head = 0 + return + } + const tombstones = lane.items.length - head - lane.count + if (head < 256 && (lane.items.length < 256 || tombstones <= lane.count)) { + return + } + lane.items = lane.items.slice(head).filter((candidate) => candidate.state === 'queued') + lane.head = 0 + } +} diff --git a/src/main/git/command-runner/git-command-timeout-behavior.test.ts b/src/main/git/command-runner/git-command-timeout-behavior.test.ts new file mode 100644 index 00000000000..95330da9666 --- /dev/null +++ b/src/main/git/command-runner/git-command-timeout-behavior.test.ts @@ -0,0 +1,144 @@ +import { chmod, mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { gitExecFileAsync, gitExecFileAsyncBuffer } from './git-exec-file' +import { GitCommandTimeoutError } from './git-command-timeout' +import { gitStreamStdout } from './git-stream-stdout' + +const tempRoots: string[] = [] + +afterEach(async () => { + await Promise.all(tempRoots.splice(0).map((root) => rm(root, { recursive: true, force: true }))) +}) + +async function createTimedGitFixture(): Promise<{ + cwd: string + env: NodeJS.ProcessEnv +}> { + const root = await mkdtemp(path.join(tmpdir(), 'orca-git-timeout-')) + tempRoots.push(root) + const binDir = path.join(root, 'bin') + const cwd = path.join(root, 'repo') + await mkdir(binDir) + await mkdir(cwd) + const script = path.join(binDir, 'git') + await writeFile( + script, + `#!/usr/bin/env node +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) +async function run() { + if (process.env.ORCA_STUB_PROGRESSIVE === '1') { + const remaining = Math.max(0, Number(process.env.ORCA_STUB_EXIT_AT_MS) - Date.now()) + const step = remaining / 3 + await sleep(step) + process.stdout.write('one') + await sleep(step) + process.stdout.write('two') + await sleep(step) + process.stdout.write('three') + return + } + await sleep(Number(process.env.ORCA_STUB_SLEEP_MS)) + process.stdout.write('done') +} +void run() +` + ) + await chmod(script, 0o755) + return { + cwd, + env: { ...process.env, PATH: `${binDir}${path.delimiter}${process.env.PATH ?? ''}` } + } +} + +describe.skipIf(process.platform === 'win32')('git read timeout behavior', () => { + it('allows a progressively streaming read that exits at 0.9 times the deadline', async () => { + const fixture = await createTimedGitFixture() + let output = '' + await expect( + gitStreamStdout(['status', '--porcelain=v2'], { + ...fixture, + env: { + ...fixture.env, + ORCA_STUB_PROGRESSIVE: '1', + ORCA_STUB_EXIT_AT_MS: String(Date.now() + 900) + }, + timeoutMsForTest: 1000, + onStdout: (chunk) => { + output += chunk + } + }) + ).resolves.toEqual({ stoppedEarly: false }) + expect(output).toBe('onetwothree') + }) + + it('rejects a silent read at 1.1 times the deadline with a typed error', async () => { + const fixture = await createTimedGitFixture() + await expect( + gitExecFileAsync(['status', '--porcelain=v2'], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '110' }, + timeoutMsForTest: 100 + }) + ).rejects.toBeInstanceOf(GitCommandTimeoutError) + }) + + it('times out a silent streaming read with the same typed error', async () => { + const fixture = await createTimedGitFixture() + await expect( + gitStreamStdout(['status'], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '110' }, + timeoutMsForTest: 100, + onStdout: () => {} + }) + ).rejects.toBeInstanceOf(GitCommandTimeoutError) + }) + + it('applies the read default to binary blob reads', async () => { + const fixture = await createTimedGitFixture() + await expect( + gitExecFileAsyncBuffer(['show', 'HEAD:file.bin'], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '110' }, + timeoutMsForTest: 100 + }) + ).rejects.toBeInstanceOf(GitCommandTimeoutError) + }) + + it.each([['fetch'], ['checkout'], ['unrecognized-command']])( + 'does not default-timeout the fail-safe %s class', + async (subcommand) => { + const fixture = await createTimedGitFixture() + await expect( + gitExecFileAsync([subcommand], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '110' }, + timeoutMsForTest: 100 + }) + ).resolves.toMatchObject({ stdout: 'done' }) + } + ) +}) + +describe.skipIf(process.platform === 'win32' || process.env.ORCA_RUN_SLOW_GIT_SMOKE !== '1')( + 'slow git read timeout smoke', + () => { + it('allows a 90 second read and terminates a 130 second wedge', async () => { + const fixture = await createTimedGitFixture() + await expect( + gitExecFileAsync(['status'], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '90000' } + }) + ).resolves.toMatchObject({ stdout: 'done' }) + await expect( + gitExecFileAsync(['status'], { + ...fixture, + env: { ...fixture.env, ORCA_STUB_SLEEP_MS: '130000' } + }) + ).rejects.toBeInstanceOf(GitCommandTimeoutError) + }, 230_000) + } +) diff --git a/src/main/git/command-runner/git-command-timeout.test.ts b/src/main/git/command-runner/git-command-timeout.test.ts new file mode 100644 index 00000000000..1768198a81a --- /dev/null +++ b/src/main/git/command-runner/git-command-timeout.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, it } from 'vitest' +import { + GIT_READ_TIMEOUT_MS, + GitCommandTimeoutError, + gitCommandTimeoutMs +} from './git-command-timeout' + +describe('gitCommandTimeoutMs', () => { + it('pins the production read deadline', () => { + expect(GIT_READ_TIMEOUT_MS).toBe(120_000) + }) + + it.each([ + [['status', '--porcelain=v2'], 120_000], + [['show', 'HEAD:file'], 120_000], + [['fetch', 'origin'], undefined], + [['checkout', 'main'], undefined], + [['unknown'], undefined] + ] as const)('selects the fail-safe default for %j', (args, expected) => { + expect(gitCommandTimeoutMs(args, undefined)).toBe(expected) + }) + + it('preserves every explicit timeout', () => { + expect(gitCommandTimeoutMs(['status'], 7)).toBe(7) + expect(gitCommandTimeoutMs(['fetch'], 7)).toBe(7) + }) + + it('provides a deterministic read-timeout seam', () => { + expect(gitCommandTimeoutMs(['status'], undefined, 25)).toBe(25) + }) +}) + +describe('GitCommandTimeoutError', () => { + it('is typed and retains its deadline', () => { + const error = new GitCommandTimeoutError(25) + expect(error).toBeInstanceOf(Error) + expect(error).toMatchObject({ name: 'GitCommandTimeoutError', timeoutMs: 25 }) + }) +}) diff --git a/src/main/git/command-runner/git-command-timeout.ts b/src/main/git/command-runner/git-command-timeout.ts new file mode 100644 index 00000000000..da8acd61bc9 --- /dev/null +++ b/src/main/git/command-runner/git-command-timeout.ts @@ -0,0 +1,23 @@ +import { classifyGitCommand } from '../wsl-direct-git-read-commands' + +export const GIT_READ_TIMEOUT_MS = 120_000 + +export class GitCommandTimeoutError extends Error { + readonly timeoutMs: number + + constructor(timeoutMs: number) { + super('git timed out.') + this.name = 'GitCommandTimeoutError' + this.timeoutMs = timeoutMs + } +} + +export function gitCommandTimeoutMs( + args: readonly string[], + explicitTimeoutMs: number | undefined, + defaultReadTimeoutMs = GIT_READ_TIMEOUT_MS +): number | undefined { + return ( + explicitTimeoutMs ?? (classifyGitCommand(args) === 'read' ? defaultReadTimeoutMs : undefined) + ) +} diff --git a/src/main/git/command-runner/git-exec-admission-lifetime.test.ts b/src/main/git/command-runner/git-exec-admission-lifetime.test.ts new file mode 100644 index 00000000000..bba29a4adaa --- /dev/null +++ b/src/main/git/command-runner/git-exec-admission-lifetime.test.ts @@ -0,0 +1,237 @@ +import { EventEmitter } from 'node:events' +import type { ChildProcess } from 'node:child_process' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const { + execFileMock, + spawnMock, + killSpawnedCommandTreeMock, + signalProcessTreeMock, + forceTerminateProcessTreeMock +} = vi.hoisted(() => ({ + execFileMock: vi.fn(), + spawnMock: vi.fn(), + killSpawnedCommandTreeMock: vi.fn().mockResolvedValue(undefined), + signalProcessTreeMock: vi.fn().mockResolvedValue(false), + forceTerminateProcessTreeMock: vi.fn().mockResolvedValue(false) +})) + +vi.mock('node:child_process', async (importOriginal) => ({ + ...(await importOriginal()), + execFile: execFileMock, + spawn: spawnMock +})) +vi.mock('./spawned-command-tree-kill', () => ({ + killSpawnedCommandTree: killSpawnedCommandTreeMock +})) +vi.mock('../../../shared/child-process/process-tree-termination', () => ({ + signalProcessTree: signalProcessTreeMock, + forceTerminateProcessTree: forceTerminateProcessTreeMock +})) + +import { gitExecFileAsync, gitExecFileAsyncBuffer } from './git-exec-file' +import { execFileCapture } from './exec-file-capture' +import { + GitAdmissionScheduler, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests +} from './git-subprocess-admission' + +type ExecCallback = (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void + +function mockChild(pid: number | undefined = 1234): ChildProcess { + const child = new EventEmitter() as EventEmitter & Record + child.pid = pid + child.kill = vi.fn(() => true) + child.stdin = Object.assign(new EventEmitter(), { end: vi.fn() }) + child.stdout = new EventEmitter() + child.stderr = new EventEmitter() + return child as unknown as ChildProcess +} + +describe('git exec admission lifetime', () => { + beforeEach(() => { + vi.useFakeTimers() + execFileMock.mockReset() + spawnMock.mockReset() + killSpawnedCommandTreeMock.mockClear() + _resetGitAdmissionForTests(new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 1 })) + }) + + afterEach(() => { + vi.useRealTimers() + _resetGitAdmissionForTests() + }) + + it('retains the string-exec permit after timeout settlement until close', async () => { + const child = mockChild() + execFileMock.mockReturnValue(child) + const pending = gitExecFileAsync(['status'], { cwd: '/repo', timeout: 10 }) + const rejection = expect(pending).rejects.toThrow('timed out') + await vi.waitFor(() => expect(execFileMock).toHaveBeenCalledOnce()) + + await vi.advanceTimersByTimeAsync(10) + await rejection + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', null, 'SIGKILL') + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('retains the buffer-exec permit after maxBuffer settlement until close', async () => { + const child = mockChild() + let callback: ExecCallback | undefined + execFileMock.mockImplementation( + (_command: string, _args: string[], _options: unknown, received: ExecCallback) => { + callback = received + return child + } + ) + const pending = gitExecFileAsyncBuffer(['show', 'HEAD:file'], { cwd: '/repo' }) + await vi.waitFor(() => expect(callback).toBeTypeOf('function')) + + callback?.(new Error('maxBuffer exceeded'), Buffer.alloc(0), Buffer.alloc(0)) + await expect(pending).rejects.toThrow('maxBuffer exceeded') + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', null, 'SIGTERM') + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('does not admit a same-repo fetch while it waits for the FETCH_HEAD lock', async () => { + _resetGitAdmissionForTests(new GitAdmissionScheduler({ networkCap: 2, networkHeadroom: 0 })) + const children = [mockChild(1001), mockChild(1002)] + const callbacks: ExecCallback[] = [] + execFileMock.mockImplementation( + (_command: string, _args: string[], _options: unknown, callback: ExecCallback) => { + callbacks.push(callback) + return children[callbacks.length - 1] + } + ) + + const first = gitExecFileAsync(['fetch', 'origin'], { cwd: '/same-repo' }) + await vi.waitFor(() => expect(execFileMock).toHaveBeenCalledOnce()) + const second = gitExecFileAsync(['fetch', 'origin'], { cwd: '/same-repo' }) + await Promise.resolve() + + expect(execFileMock).toHaveBeenCalledOnce() + expect(_gitAdmissionSnapshotForTests()).toMatchObject({ + queued: 0, + budgets: { network: { baseUsed: 1, headroomUsed: 0 } } + }) + + callbacks[0]?.(null, '', '') + children[0].emit('close', 0, null) + await expect(first).resolves.toEqual({ stdout: '', stderr: '' }) + await vi.waitFor(() => expect(execFileMock).toHaveBeenCalledTimes(2)) + callbacks[1]?.(null, '', '') + children[1].emit('close', 0, null) + await expect(second).resolves.toEqual({ stdout: '', stderr: '' }) + expect(_gitAdmissionSnapshotForTests().budgets.network?.baseUsed).toBe(0) + }) + + it('reports pre-aborted capture as a no-child termination', async () => { + const controller = new AbortController() + const onChildTerminated = vi.fn() + controller.abort() + + await expect( + execFileCapture('git', ['status'], { + signal: controller.signal, + onChildTerminated + }) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(execFileMock).not.toHaveBeenCalled() + expect(onChildTerminated).toHaveBeenCalledOnce() + }) + + it('releases termination-barrier admission on confirmed close', async () => { + const child = mockChild() + spawnMock.mockReturnValue(child) + const pending = gitExecFileAsync(['status'], { + cwd: '/repo', + terminationBarrier: true + }) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', 0, null) + await expect(pending).resolves.toEqual({ stdout: '', stderr: '' }) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('retains barrier admission past bounded settlement until termination is observed', async () => { + const child = mockChild() + spawnMock.mockReturnValue(child) + const pending = gitExecFileAsync(['status'], { + cwd: '/repo', + terminationBarrier: true, + timeout: 10 + }) + const rejection = expect(pending).rejects.toThrow('timed out') + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) + + await vi.advanceTimersByTimeAsync(2010) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + await vi.advanceTimersByTimeAsync(10_000) + await rejection + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', null, 'SIGKILL') + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('serializes FETCH_HEAD callers before they enter admission', async () => { + _resetGitAdmissionForTests(new GitAdmissionScheduler({ networkCap: 1, networkHeadroom: 1 })) + const children = new Map() + const callbacks = new Map() + execFileMock.mockImplementation( + (_command: string, args: string[], _options: unknown, callback: ExecCallback) => { + const label = args[1] ?? '' + const child = mockChild() + children.set(label, child) + callbacks.set(label, callback) + return child + } + ) + + const first = gitExecFileAsync(['fetch', 'first'], { + cwd: '/repo', + admissionTier: 'background' + }) + await vi.waitFor(() => expect(callbacks.has('first')).toBe(true)) + const background = gitExecFileAsync(['fetch', 'background'], { + cwd: '/repo', + admissionTier: 'background' + }) + const interactive = gitExecFileAsync(['fetch', 'interactive'], { + cwd: '/repo', + admissionTier: 'interactive' + }) + + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().queued).toBe(0) + expect([...callbacks.keys()]).toEqual(['first']) + + callbacks.get('first')?.(null, '', '') + await expect(first).resolves.toEqual({ stdout: '', stderr: '' }) + await vi.waitFor(() => expect(_gitAdmissionSnapshotForTests().queued).toBe(1)) + expect([...callbacks.keys()]).toEqual(['first']) + + children.get('first')?.emit('close', 0, null) + await vi.waitFor(() => expect(callbacks.has('background')).toBe(true)) + expect([...callbacks.keys()]).toEqual(['first', 'background']) + + callbacks.get('background')?.(null, '', '') + await expect(background).resolves.toEqual({ stdout: '', stderr: '' }) + await vi.waitFor(() => expect(callbacks.has('interactive')).toBe(true)) + + children.get('background')?.emit('close', 0, null) + callbacks.get('interactive')?.(null, '', '') + await expect(interactive).resolves.toEqual({ stdout: '', stderr: '' }) + children.get('interactive')?.emit('close', 0, null) + }) +}) diff --git a/src/main/git/command-runner/git-exec-file.ts b/src/main/git/command-runner/git-exec-file.ts index d9762030813..4fb28760d61 100644 --- a/src/main/git/command-runner/git-exec-file.ts +++ b/src/main/git/command-runner/git-exec-file.ts @@ -10,7 +10,7 @@ import { prepareWslLinkedWorktreeGitRouting } from '../wsl-linked-worktree-git-routing' import { resolveCommand, type ResolvedCommand } from './wsl-command-resolution' -import type { GitExecOptions } from './git-exec-options' +import type { GitAdmissionTier, GitExecOptions } from './git-exec-options' import { execFileCapture, execFileCaptureToTermination } from './exec-file-capture' import { pendingWslDirectGitReadEnvironment, @@ -22,6 +22,8 @@ import { import { prepareWindowsHostGitEnvironment } from './windows-host-git-environment' import { buildNetworkSshPolicyEnv } from './git-ssh-policy-env' import { nonInteractiveGitEnv, untranslatedGitOutputEnv } from './git-process-env' +import { acquireGitAdmission } from './git-subprocess-admission' +import { GitCommandTimeoutError, gitCommandTimeoutMs } from './git-command-timeout' /** * Async git command execution. Drop-in replacement for @@ -34,7 +36,7 @@ async function gitExecFileAsyncUnlocked( // Why: span the user-visible `git ` form, not the resolved binary, so dashboards group by intent. return withGitSpan( { args, ...(options.cwd !== undefined ? { cwd: options.cwd } : {}) }, - async () => { + async (span) => { if (isWslLinkedWorktreeGitRoutingCandidate(options.cwd, options.wslDistro)) { await prepareWslLinkedWorktreeGitRouting(options.cwd, options.wslDistro, { signal: options.signal @@ -61,18 +63,37 @@ async function gitExecFileAsyncUnlocked( const policy = effectiveOptions.useConfiguredSshCommandForNetwork ? await buildNetworkSshPolicyEnv(effectiveOptions) : { env: nonInteractiveGitEnv(effectiveOptions.env), mode: 'default' as const } + const grant = await acquireGitAdmission({ + args, + cwd: options.cwd, + wslDistro: options.wslDistro, + tier: options.admissionTier, + signal: options.signal + }) + span?.setAttribute('git.queue_wait_ms', grant.queueWaitMs) + const timeoutMs = gitCommandTimeoutMs(args, options.timeout, options.timeoutMsForTest) + const terminationState: { current: Promise | null } = { current: null } const capture = ( command: ResolvedCommand ): Promise<{ stdout: string | Buffer; stderr: string | Buffer }> => { + let reportTerminated: () => void = () => {} + terminationState.current = new Promise((resolve) => { + reportTerminated = resolve + }) const captureOptions = { cwd: command.cwd, encoding: (options.encoding ?? 'utf-8') as BufferEncoding, maxBuffer: options.maxBuffer, - timeout: options.timeout, + timeout: timeoutMs, stdin: options.stdin, env: policy.env, signal: options.signal, - terminationBarrier: options.terminationBarrier + terminationBarrier: options.terminationBarrier, + admissionTier: options.admissionTier, + onChildTerminated: reportTerminated, + ...(timeoutMs === undefined + ? {} + : { createTimeoutError: () => new GitCommandTimeoutError(timeoutMs) }) } return options.terminationBarrier ? execFileCaptureToTermination( @@ -83,34 +104,50 @@ async function gitExecFileAsyncUnlocked( ) : execFileCapture(command.binary, command.args, captureOptions) } - let result: { stdout: string | Buffer; stderr: string | Buffer } - try { - result = await capture(resolved) - } catch (error) { - if (directWslGitExitCode(error, resolved) !== null && !options.signal?.aborted) { - const wasMissing = invalidateMissingDirectWslGit(error, resolved) - const fallback = resolveGitCommand( - args, - effectiveOptions, - true, - effectiveOptions.captureWslLoginShellOutput - ) - result = await capture(fallback) - // Why: matching failures can be normal Git control flow; only a successful login retry proves the direct environment was insufficient. - disableDirectWslGitAfterSuccessfulFallback(wasMissing, resolved) - const { stdout, stderr } = result - return { - stdout: readCapturedGitString(stdout as string, fallback), - stderr: stderr as string + const runCapturedCommand = async (): Promise<{ stdout: string; stderr: string }> => { + let result: { stdout: string | Buffer; stderr: string | Buffer } + try { + result = await capture(resolved) + } catch (error) { + if (directWslGitExitCode(error, resolved) !== null && !options.signal?.aborted) { + await terminationState.current + const wasMissing = invalidateMissingDirectWslGit(error, resolved) + const fallback = resolveGitCommand( + args, + effectiveOptions, + true, + effectiveOptions.captureWslLoginShellOutput + ) + result = await capture(fallback) + // Why: matching failures can be normal Git control flow; only a successful login retry proves the direct environment was insufficient. + disableDirectWslGitAfterSuccessfulFallback(wasMissing, resolved) + const { stdout, stderr } = result + return { + stdout: readCapturedGitString(stdout as string, fallback), + stderr: stderr as string + } } + if (options.useConfiguredSshCommandForNetwork && error && typeof error === 'object') { + Object.assign(error, { gitSshPolicyMode: policy.mode }) + } + throw error } - if (options.useConfiguredSshCommandForNetwork && error && typeof error === 'object') { - Object.assign(error, { gitSshPolicyMode: policy.mode }) + const { stdout, stderr } = result + return { + stdout: readCapturedGitString(stdout as string, resolved), + stderr: stderr as string + } + } + try { + return await runCapturedCommand() + } finally { + const termination = terminationState.current + if (termination) { + void termination.then(grant.release) + } else { + grant.release() } - throw error } - const { stdout, stderr } = result - return { stdout: readCapturedGitString(stdout as string, resolved), stderr: stderr as string } } ) } @@ -119,11 +156,15 @@ export function gitExecFileAsync( args: string[], options: GitExecOptions ): Promise<{ stdout: string; stderr: string }> { - const run = () => gitExecFileAsyncUnlocked(args, options) const command = resolveGitFetchHeadCommand(args, options.cwd) return command.needsLock - ? runWithGitFetchHeadLock(command.cwd, options.signal, run, command.gitDir) - : run() + ? runWithGitFetchHeadLock( + command.cwd, + options.signal, + () => gitExecFileAsyncUnlocked(args, options), + command.gitDir + ) + : gitExecFileAsyncUnlocked(args, options) } /** @@ -132,31 +173,69 @@ export function gitExecFileAsync( */ export async function gitExecFileAsyncBuffer( args: string[], - options: { cwd: string; maxBuffer?: number; wslDistro?: string; preferWslDirectGit?: boolean } + options: { + cwd: string + maxBuffer?: number + timeout?: number + timeoutMsForTest?: number + env?: NodeJS.ProcessEnv + wslDistro?: string + preferWslDirectGit?: boolean + admissionTier?: GitAdmissionTier + } ): Promise<{ stdout: Buffer }> { - if (isWslLinkedWorktreeGitRoutingCandidate(options.cwd, options.wslDistro)) { - await prepareWslLinkedWorktreeGitRouting(options.cwd, options.wslDistro) - } - const readEnvironmentReady = pendingWslDirectGitReadEnvironment(args, options) - if (readEnvironmentReady) { - await readEnvironmentReady - } - // `git show` is a read, so this normally runs with no shell at all. The fence - // still matters for the login-shell fallback: these are raw blob bytes going - // straight to the diff/blob viewer, where a banner becomes file content. - let resolved = resolveGitCommand(args, options, false, true) - const environmentReady = prepareWindowsHostGitEnvironment(resolved, undefined) - if (environmentReady) { - await environmentReady - } - resolved = resolveGitCommand(args, options, false, true) - const { stdout } = (await execFileCapture(resolved.binary, resolved.args, { - cwd: resolved.cwd, - encoding: 'buffer', - maxBuffer: options.maxBuffer, - env: untranslatedGitOutputEnv() - })) as { stdout: Buffer } - return { stdout: readCapturedGitBuffer(stdout, resolved) } + return withGitSpan({ args, cwd: options.cwd }, async (span) => { + if (isWslLinkedWorktreeGitRoutingCandidate(options.cwd, options.wslDistro)) { + await prepareWslLinkedWorktreeGitRouting(options.cwd, options.wslDistro) + } + const readEnvironmentReady = pendingWslDirectGitReadEnvironment(args, options) + if (readEnvironmentReady) { + await readEnvironmentReady + } + // `git show` is a read, so this normally runs with no shell at all. The fence + // still matters for the login-shell fallback: these are raw blob bytes going + // straight to the diff/blob viewer, where a banner becomes file content. + let resolved = resolveGitCommand(args, options, false, true) + const environmentReady = prepareWindowsHostGitEnvironment(resolved, undefined) + if (environmentReady) { + await environmentReady + } + resolved = resolveGitCommand(args, options, false, true) + const grant = await acquireGitAdmission({ + args, + cwd: options.cwd, + wslDistro: options.wslDistro, + tier: options.admissionTier + }) + span?.setAttribute('git.queue_wait_ms', grant.queueWaitMs) + const timeoutMs = gitCommandTimeoutMs(args, options.timeout, options.timeoutMsForTest) + let termination: Promise | null = null + try { + let reportTerminated: () => void = () => {} + termination = new Promise((resolve) => { + reportTerminated = resolve + }) + const { stdout } = (await execFileCapture(resolved.binary, resolved.args, { + cwd: resolved.cwd, + encoding: 'buffer', + maxBuffer: options.maxBuffer, + timeout: timeoutMs, + env: untranslatedGitOutputEnv(options.env), + admissionTier: options.admissionTier, + onChildTerminated: reportTerminated, + ...(timeoutMs === undefined + ? {} + : { createTimeoutError: () => new GitCommandTimeoutError(timeoutMs) }) + })) as { stdout: Buffer } + return { stdout: readCapturedGitBuffer(stdout, resolved) } + } finally { + if (termination) { + void termination.then(grant.release) + } else { + grant.release() + } + } + }) } /** diff --git a/src/main/git/command-runner/git-exec-options.ts b/src/main/git/command-runner/git-exec-options.ts index 1055721475c..4390d84658d 100644 --- a/src/main/git/command-runner/git-exec-options.ts +++ b/src/main/git/command-runner/git-exec-options.ts @@ -1,11 +1,15 @@ // Why: cap execFile output to prevent an uncatchable V8 string overflow; match relay MAX_GIT_BUFFER. export const DEFAULT_GIT_MAX_BUFFER = 10 * 1024 * 1024 +export type GitAdmissionTier = 'interactive' | 'status' | 'background' + export type GitExecOptions = { cwd: string encoding?: BufferEncoding | 'buffer' maxBuffer?: number timeout?: number + /** Overrides only the default read deadline in tests; explicit timeout still wins. */ + timeoutMsForTest?: number stdin?: string env?: NodeJS.ProcessEnv signal?: AbortSignal @@ -14,4 +18,6 @@ export type GitExecOptions = { useConfiguredSshCommandForNetwork?: boolean terminationBarrier?: boolean captureWslLoginShellOutput?: boolean + /** Scheduler priority for this child; status is the safe default. */ + admissionTier?: GitAdmissionTier } diff --git a/src/main/git/command-runner/git-spawn-admission-lifetime.test.ts b/src/main/git/command-runner/git-spawn-admission-lifetime.test.ts new file mode 100644 index 00000000000..1648894ad61 --- /dev/null +++ b/src/main/git/command-runner/git-spawn-admission-lifetime.test.ts @@ -0,0 +1,79 @@ +import { EventEmitter } from 'node:events' +import type { ChildProcess } from 'node:child_process' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { withGitAdmission } from './git-spawn' +import { + GitAdmissionScheduler, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests +} from './git-subprocess-admission' + +function mockChild(pid: number | undefined = 1234): ChildProcess { + const child = new EventEmitter() as EventEmitter & Record + child.pid = pid + child.kill = vi.fn(() => true) + return child as unknown as ChildProcess +} + +describe('git spawn admission lifetime', () => { + beforeEach(() => { + _resetGitAdmissionForTests(new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 1 })) + }) + + afterEach(() => _resetGitAdmissionForTests()) + + it('releases a normally closed child exactly once', async () => { + const child = mockChild() + await withGitAdmission(['status'], { cwd: '/repo' }, () => child) + + child.emit('close', 0, null) + child.emit('close', 0, null) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('retains an early-killed child until eventual close', async () => { + const child = mockChild() + await withGitAdmission(['status'], { cwd: '/repo' }, () => child) + + child.kill() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + child.emit('close', null, 'SIGTERM') + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('retains a live child error until eventual close and releases once', async () => { + const child = mockChild() + await withGitAdmission(['status'], { cwd: '/repo' }, () => child) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('error', new Error('kill delivery failed')) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + child.emit('close', null, 'SIGKILL') + child.emit('close', null, 'SIGKILL') + + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('releases a no-PID spawn error without waiting for close', async () => { + const child = mockChild(0) + await withGitAdmission(['status'], { cwd: '/repo' }, () => child) + child.emit('error', new Error('ENOENT')) + + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('aborts while queued without releasing the running child', async () => { + const scheduler = new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 0 }) + _resetGitAdmissionForTests(scheduler) + const running = await scheduler.acquire({ args: ['status'], cwd: '/repo' }) + const controller = new AbortController() + const pending = withGitAdmission(['status'], { cwd: '/repo', signal: controller.signal }, () => + mockChild() + ) + controller.abort() + + await expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + running.release() + }) +}) diff --git a/src/main/git/command-runner/git-spawn.ts b/src/main/git/command-runner/git-spawn.ts index 47d761b9964..47ccb501019 100644 --- a/src/main/git/command-runner/git-spawn.ts +++ b/src/main/git/command-runner/git-spawn.ts @@ -1,15 +1,22 @@ import { spawn, type ChildProcess, type SpawnOptions } from 'node:child_process' import { recordSubprocessSpawn } from '../../diagnostics/main-thread-churn-probe' +import { startGitSpan } from '../../observability/instrumentation' import { createAbortError } from './abort-error' import { resolveGitCommand } from './git-command-resolution' import { untranslatedGitOutputEnv } from './git-process-env' import { prepareWindowsHostGitEnvironment } from './windows-host-git-environment' +import type { GitAdmissionTier } from './git-exec-options' +import { acquireGitAdmission } from './git-subprocess-admission' /** * Spawn a git child process. Drop-in replacement for * `spawn('git', args, { cwd, stdio, ... })`. */ -export type GitSpawnOptions = SpawnOptions & { cwd: string; wslDistro?: string } +export type GitSpawnOptions = SpawnOptions & { + cwd: string + wslDistro?: string + admissionTier?: GitAdmissionTier +} export async function gitSpawnAfterWindowsEnvironmentReady( args: string[], @@ -28,11 +35,74 @@ export async function gitSpawnAfterWindowsEnvironmentReady( if (options.signal?.aborted) { throw createAbortError() } - return gitSpawn(args, env === options.env ? options : { ...options, env }) + return withGitAdmission(args, env === options.env ? options : { ...options, env }) +} + +export async function withGitAdmission( + args: string[], + options: GitSpawnOptions, + spawnChild: () => ChildProcess = () => gitSpawn(args, options) +): Promise { + const span = startGitSpan({ args, cwd: options.cwd }) + let grant: Awaited> | null = null + try { + grant = await acquireGitAdmission({ + args, + cwd: options.cwd, + wslDistro: options.wslDistro, + tier: options.admissionTier, + signal: options.signal + }) + span.setAttribute('git.queue_wait_ms', grant.queueWaitMs) + if (options.signal?.aborted) { + grant.release() + span.fail(createAbortError()) + throw createAbortError() + } + const child = spawnChild() + let finalized = false + let liveError: Error | null = null + const finalize = (error?: Error): void => { + if (finalized) { + return + } + finalized = true + child.off('error', handleError) + child.off('close', handleClose) + grant?.release() + if (error) { + span.fail(error) + } else { + span.end() + } + } + const handleError = (error: Error): void => { + if (!child.pid) { + finalize(error) + } else { + liveError = error + } + } + const handleClose = (code: number | null, signal: NodeJS.Signals | null): void => { + const exitError = + liveError ?? + (code === 0 && signal === null + ? undefined + : new Error(`git exited with ${code ?? signal ?? 'unknown'}.`)) + finalize(exitError) + } + child.on('error', handleError) + child.once('close', handleClose) + return child + } catch (error) { + grant?.release() + span.fail(error instanceof Error ? error : new Error(String(error))) + throw error + } } export function gitSpawn(args: string[], options: GitSpawnOptions): ChildProcess { - const { wslDistro, ...spawnOptions } = options + const { wslDistro, admissionTier: _admissionTier, ...spawnOptions } = options const resolved = resolveGitCommand(args, { cwd: options.cwd, ...(wslDistro ? { wslDistro } : {}), diff --git a/src/main/git/command-runner/git-ssh-policy-env.ts b/src/main/git/command-runner/git-ssh-policy-env.ts index faece9ab141..a5d8637bf9e 100644 --- a/src/main/git/command-runner/git-ssh-policy-env.ts +++ b/src/main/git/command-runner/git-ssh-policy-env.ts @@ -4,6 +4,7 @@ import { execFileCapture } from './exec-file-capture' import { resolveGitCommand } from './git-command-resolution' import { DEFAULT_GIT_MAX_BUFFER, type GitExecOptions } from './git-exec-options' import { promptGuardGitEnv } from './git-process-env' +import { acquireGitAdmission } from './git-subprocess-admission' export type GitSshPolicyMode = | 'default' @@ -131,6 +132,18 @@ export async function buildNetworkSshPolicyEnv(options: GitExecOptions): Promise // Why fenced: a login-shell banner here reads as a user-configured sshCommand, // which skips the BatchMode fallback below and disarms the no-prompt guard. const resolved = resolveGitCommand(['config', '--get', 'core.sshCommand'], options, true, true) + const probeArgs = ['config', '--get', 'core.sshCommand'] + const grant = await acquireGitAdmission({ + args: probeArgs, + cwd: options.cwd, + wslDistro: options.wslDistro, + tier: options.admissionTier, + signal: options.signal + }) + let reportTerminated: () => void = () => {} + const terminated = new Promise((resolve) => { + reportTerminated = resolve + }) let configuredCommand = '' try { const { stdout } = await execFileCapture(resolved.binary, resolved.args, { @@ -139,12 +152,15 @@ export async function buildNetworkSshPolicyEnv(options: GitExecOptions): Promise maxBuffer: DEFAULT_GIT_MAX_BUFFER, timeout: CORE_SSH_COMMAND_PROBE_TIMEOUT_MS, env: promptEnv, - signal: options.signal + signal: options.signal, + onChildTerminated: reportTerminated }) const payload = resolved.captured?.readStdout(String(stdout)) ?? String(stdout) configuredCommand = payload.trim() } catch { configuredCommand = '' + } finally { + void terminated.then(grant.release) } if (!configuredCommand) { diff --git a/src/main/git/command-runner/git-stream-admission-lifetime.test.ts b/src/main/git/command-runner/git-stream-admission-lifetime.test.ts new file mode 100644 index 00000000000..b4694fc7075 --- /dev/null +++ b/src/main/git/command-runner/git-stream-admission-lifetime.test.ts @@ -0,0 +1,79 @@ +import { EventEmitter } from 'node:events' +import type { ChildProcess } from 'node:child_process' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const { gitSpawnMock, killSpawnedCommandTreeMock } = vi.hoisted(() => ({ + gitSpawnMock: vi.fn(), + killSpawnedCommandTreeMock: vi.fn().mockResolvedValue(undefined) +})) + +vi.mock('./git-spawn', () => ({ gitSpawn: gitSpawnMock })) +vi.mock('./spawned-command-tree-kill', () => ({ + killSpawnedCommandTree: killSpawnedCommandTreeMock +})) + +import { gitStreamStdout } from './git-stream-stdout' +import { + GitAdmissionScheduler, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests +} from './git-subprocess-admission' + +function mockChild(): ChildProcess { + const child = new EventEmitter() as EventEmitter & Record + child.pid = 1234 + child.kill = vi.fn(() => true) + child.stdin = null + child.stdout = new EventEmitter() + child.stderr = new EventEmitter() + return child as unknown as ChildProcess +} + +describe('git stream admission lifetime', () => { + beforeEach(() => { + gitSpawnMock.mockReset() + killSpawnedCommandTreeMock.mockClear() + _resetGitAdmissionForTests(new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 1 })) + }) + + afterEach(() => _resetGitAdmissionForTests()) + + it('retains the permit after maxBuffer settlement until close', async () => { + const child = mockChild() + gitSpawnMock.mockReturnValue(child) + const pending = gitStreamStdout(['status'], { + cwd: '/repo', + maxBuffer: 1, + onStdout: () => {} + }) + await vi.waitFor(() => expect(gitSpawnMock).toHaveBeenCalledOnce()) + + child.stdout?.emit('data', Buffer.from('xx')) + await expect(pending).rejects.toThrow('maxBuffer') + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', null, 'SIGKILL') + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) + + it('retains the permit after abort settlement until close', async () => { + const child = mockChild() + const controller = new AbortController() + gitSpawnMock.mockReturnValue(child) + const pending = gitStreamStdout(['status'], { + cwd: '/repo', + signal: controller.signal, + onStdout: () => {} + }) + await vi.waitFor(() => expect(gitSpawnMock).toHaveBeenCalledOnce()) + + controller.abort() + await expect(pending).rejects.toMatchObject({ name: 'AbortError' }) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(1) + + child.emit('close', null, 'SIGKILL') + await Promise.resolve() + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) + }) +}) diff --git a/src/main/git/command-runner/git-stream-stdout.ts b/src/main/git/command-runner/git-stream-stdout.ts index 7f33308d747..283459757ba 100644 --- a/src/main/git/command-runner/git-stream-stdout.ts +++ b/src/main/git/command-runner/git-stream-stdout.ts @@ -9,7 +9,11 @@ import { import { createAbortError } from './abort-error' import { killSpawnedCommandTree } from './spawned-command-tree-kill' import type { ResolvedCommand } from './wsl-command-resolution' -import { DEFAULT_GIT_MAX_BUFFER, type GitExecOptions } from './git-exec-options' +import { + DEFAULT_GIT_MAX_BUFFER, + type GitAdmissionTier, + type GitExecOptions +} from './git-exec-options' import { pendingWslDirectGitReadEnvironment, directWslGitExitCode, @@ -21,6 +25,8 @@ import { import { prepareWindowsHostGitEnvironment } from './windows-host-git-environment' import { nonInteractiveGitEnv, untranslatedGitOutputEnv } from './git-process-env' import { gitSpawn } from './git-spawn' +import { acquireGitAdmission } from './git-subprocess-admission' +import { GitCommandTimeoutError, gitCommandTimeoutMs } from './git-command-timeout' /** Result of a streamed git command; `stoppedEarly` is true when onStdout asked to stop before the child exited. */ export type GitStreamResult = { stoppedEarly: boolean } @@ -33,6 +39,11 @@ export type GitStreamOptions = { signal?: AbortSignal /** Byte backstop; defaults to DEFAULT_GIT_MAX_BUFFER. */ maxBuffer?: number + /** Explicit wall-clock deadline; read commands default to the production backstop. */ + timeoutMs?: number + /** Overrides only the default read deadline in tests. */ + timeoutMsForTest?: number + admissionTier?: GitAdmissionTier /** * Called for each decoded stdout chunk. Return true to stop: the child is * killed and the promise resolves with stoppedEarly=true. @@ -52,7 +63,8 @@ export async function gitStreamStdout( options: GitStreamOptions ): Promise { const maxBuffer = options.maxBuffer ?? DEFAULT_GIT_MAX_BUFFER - return withGitSpan({ args, cwd: options.cwd }, async () => { + const timeoutMs = gitCommandTimeoutMs(args, options.timeoutMs, options.timeoutMsForTest) + return withGitSpan({ args, cwd: options.cwd }, async (span) => { if (isWslLinkedWorktreeGitRoutingCandidate(options.cwd, options.wslDistro)) { await prepareWslLinkedWorktreeGitRouting(options.cwd, options.wslDistro, { signal: options.signal @@ -63,7 +75,8 @@ export async function gitStreamStdout( ...(options.env ? { env: options.env } : {}), ...(options.wslDistro ? { wslDistro: options.wslDistro } : {}), ...(options.preferWslDirectGit ? { preferWslDirectGit: true } : {}), - ...(options.signal ? { signal: options.signal } : {}) + ...(options.signal ? { signal: options.signal } : {}), + ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}) } const readEnvironmentReady = pendingWslDirectGitReadEnvironment(args, gitOptions) if (readEnvironmentReady) { @@ -79,6 +92,15 @@ export async function gitStreamStdout( gitOptions.env = await environmentReady } resolved = resolveGitCommand(args, gitOptions) + const grant = await acquireGitAdmission({ + args, + cwd: options.cwd, + wslDistro: options.wslDistro, + tier: options.admissionTier, + signal: options.signal + }) + span?.setAttribute('git.queue_wait_ms', grant.queueWaitMs) + const terminationState: { current: Promise | null } = { current: null } const stream = (command: ResolvedCommand): Promise => new Promise((resolve, reject) => { if (options.signal?.aborted) { @@ -106,8 +128,25 @@ export async function gitStreamStdout( } else { child = gitSpawn(args, spawnOptions) } + let terminationReported = false + terminationState.current = new Promise((resolveTermination) => { + const reportTermination = (): void => { + if (terminationReported) { + return + } + terminationReported = true + resolveTermination() + } + child.once('close', reportTermination) + child.once('error', () => { + if (!child.pid) { + reportTermination() + } + }) + }) let settled = false + let timeoutTimer: ReturnType | null = null let stoppedEarly = false let stdoutBytes = 0 let stderr = '' @@ -117,6 +156,10 @@ export async function gitStreamStdout( const stderrDecoder = new StringDecoder('utf8') const cleanup = (): void => { + if (timeoutTimer) { + clearTimeout(timeoutTimer) + timeoutTimer = null + } child.stdout?.off('data', onStdoutData) child.stderr?.off('data', onStderrData) child.off('error', onError) @@ -194,32 +237,52 @@ export async function gitStreamStdout( finish(createAbortError()) } + function onTimeout(): void { + void killSpawnedCommandTree(child) + finish(new GitCommandTimeoutError(timeoutMs as number)) + } + child.stdout?.on('data', onStdoutData) child.stderr?.on('data', onStderrData) child.on('error', onError) child.on('close', onClose) options.signal?.addEventListener('abort', onAbort, { once: true }) + if (timeoutMs !== undefined && timeoutMs > 0) { + timeoutTimer = setTimeout(onTimeout, timeoutMs) + } if (options.signal?.aborted) { onAbort() } }) try { - return await stream(resolved) - } catch (error) { - const stdoutBytes = - error && typeof error === 'object' ? (error as { stdoutBytes?: unknown }).stdoutBytes : null - if ( - stdoutBytes === 0 && - directWslGitExitCode(error, resolved) !== null && - !options.signal?.aborted - ) { - const wasMissing = invalidateMissingDirectWslGit(error, resolved) - resolved = resolveGitCommandWithoutProbe(args, gitOptions) - const result = await stream(resolved) - disableDirectWslGitAfterSuccessfulFallback(wasMissing, resolved) - return result + try { + return await stream(resolved) + } catch (error) { + const stdoutBytes = + error && typeof error === 'object' + ? (error as { stdoutBytes?: unknown }).stdoutBytes + : null + if ( + stdoutBytes === 0 && + directWslGitExitCode(error, resolved) !== null && + !options.signal?.aborted + ) { + await terminationState.current + const wasMissing = invalidateMissingDirectWslGit(error, resolved) + resolved = resolveGitCommandWithoutProbe(args, gitOptions) + const result = await stream(resolved) + disableDirectWslGitAfterSuccessfulFallback(wasMissing, resolved) + return result + } + throw error + } + } finally { + const termination = terminationState.current + if (termination) { + void termination.then(grant.release) + } else { + grant.release() } - throw error } }) } diff --git a/src/main/git/command-runner/git-subprocess-admission.test.ts b/src/main/git/command-runner/git-subprocess-admission.test.ts new file mode 100644 index 00000000000..0e5bfa808ee --- /dev/null +++ b/src/main/git/command-runner/git-subprocess-admission.test.ts @@ -0,0 +1,558 @@ +import { afterEach, describe, expect, it } from 'vitest' +import { + GENERAL_CAP, + GitAdmissionScheduler, + MAX_GIT_CHILDREN, + NETWORK_CAP, + _gitAdmissionSnapshotForTests, + _resetGitAdmissionForTests, + acquireGitAdmission +} from './git-subprocess-admission' +import type { GitAdmissionEvent } from './git-admission-state' + +const local = (tier: 'interactive' | 'status' | 'background' = 'status') => ({ + args: ['status'], + cwd: '/repo', + tier +}) + +const schedulerWithOneSlot = (now: () => number = () => 0): GitAdmissionScheduler => + new GitAdmissionScheduler({ + generalCap: 1, + networkCap: 1, + generalHeadroom: 1, + networkHeadroom: 1, + routeCap: 1, + routeHeadroom: 1, + now + }) + +afterEach(() => { + delete process.env.ORCA_GIT_ADMISSION_DISABLED + _resetGitAdmissionForTests() +}) + +describe('GitAdmissionScheduler', () => { + it('pins the global base budgets and absolute maximum', () => { + expect(GENERAL_CAP).toBeGreaterThanOrEqual(2) + expect(GENERAL_CAP).toBeLessThanOrEqual(4) + expect(NETWORK_CAP).toBe(3) + expect(MAX_GIT_CHILDREN).toBe(10) + }) + + it('keeps base and headroom counters separate and grants interactive all-headroom', async () => { + const scheduler = schedulerWithOneSlot() + const base = await scheduler.acquire(local('background')) + const interactive = await scheduler.acquire({ + ...local('interactive'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + + expect(scheduler.snapshot().budgets).toMatchObject({ + general: { baseUsed: 1, headroomUsed: 1 }, + 'route:general:wsl:ubuntu': { baseUsed: 0, headroomUsed: 1 } + }) + + base.release() + expect(scheduler.snapshot().budgets.general).toEqual({ baseUsed: 0, headroomUsed: 1 }) + interactive.release() + expect(scheduler.snapshot().budgets.general).toEqual({ baseUsed: 0, headroomUsed: 0 }) + }) + + it('partitions network and general budgets globally and per route', async () => { + const scheduler = schedulerWithOneSlot() + const fetch = await scheduler.acquire({ + args: ['fetch'], + cwd: 'C:\\repo', + wslDistro: 'Ubuntu', + tier: 'background' + }) + const status = await scheduler.acquire({ + args: ['status'], + cwd: 'C:\\repo', + wslDistro: 'Ubuntu', + tier: 'status' + }) + + expect(scheduler.snapshot().budgets).toMatchObject({ + network: { baseUsed: 1, headroomUsed: 0 }, + general: { baseUsed: 1, headroomUsed: 0 }, + 'route:network:wsl:ubuntu': { baseUsed: 1, headroomUsed: 0 }, + 'route:general:wsl:ubuntu': { baseUsed: 1, headroomUsed: 0 } + }) + fetch.release() + status.release() + }) + + it('uses network and route headroom for an interactive push', async () => { + const scheduler = schedulerWithOneSlot() + const fetch = await scheduler.acquire({ + args: ['fetch'], + cwd: '\\\\server\\repo', + tier: 'background' + }) + const push = await scheduler.acquire({ + args: ['push'], + cwd: '\\\\server\\repo', + tier: 'interactive' + }) + + expect(scheduler.snapshot().budgets).toMatchObject({ + network: { baseUsed: 1, headroomUsed: 1 }, + 'route:network:unc:server': { baseUsed: 1, headroomUsed: 1 } + }) + fetch.release() + push.release() + }) + + it('admits same-route interactive work when general and route bases are full', async () => { + const scheduler = new GitAdmissionScheduler({ + generalCap: 2, + generalHeadroom: 2, + routeCap: 2, + routeHeadroom: 1 + }) + const request = { cwd: 'C:\\repo', wslDistro: 'Ubuntu' } + const background = await Promise.all([ + scheduler.acquire({ ...request, args: ['status'], tier: 'background' }), + scheduler.acquire({ ...request, args: ['status'], tier: 'background' }) + ]) + const interactive = await scheduler.acquire({ + ...request, + args: ['status'], + tier: 'interactive' + }) + + expect(scheduler.snapshot().budgets).toMatchObject({ + general: { baseUsed: 2, headroomUsed: 1 }, + 'route:general:wsl:ubuntu': { baseUsed: 2, headroomUsed: 1 } + }) + background.forEach((grant) => grant.release()) + interactive.release() + }) + + it('keeps status isolated from wedged route fetches and reserves push headroom', async () => { + const scheduler = new GitAdmissionScheduler() + const request = { cwd: 'C:\\repo', wslDistro: 'Ubuntu' } + const fetches = await Promise.all([ + scheduler.acquire({ ...request, args: ['fetch'], tier: 'background' }), + scheduler.acquire({ ...request, args: ['fetch'], tier: 'background' }) + ]) + const thirdFetch = await scheduler.acquire({ + args: ['fetch'], + cwd: '/other-repo', + tier: 'background' + }) + const status = await scheduler.acquire({ ...request, args: ['status'], tier: 'status' }) + const push = await scheduler.acquire({ ...request, args: ['push'], tier: 'interactive' }) + + expect(scheduler.snapshot().budgets).toMatchObject({ + network: { baseUsed: 3, headroomUsed: 1 }, + general: { baseUsed: 1, headroomUsed: 0 }, + 'route:network:wsl:ubuntu': { baseUsed: 2, headroomUsed: 1 }, + 'route:general:wsl:ubuntu': { baseUsed: 1, headroomUsed: 0 } + }) + fetches.forEach((grant) => grant.release()) + thirdFetch.release() + status.release() + push.release() + }) + + it('ages background work ahead of fresh base waiters without granting it headroom', async () => { + let now = 0 + const scheduler = schedulerWithOneSlot(() => now) + const running = await scheduler.acquire(local('status')) + const order: string[] = [] + const backgroundPromise = scheduler.acquire(local('background')).then((grant) => { + order.push('background') + return grant + }) + now = 30_000 + const headroom = await scheduler.acquire(local('interactive')) + const freshPromise = scheduler.acquire(local('interactive')).then((grant) => { + order.push('fresh') + return grant + }) + + running.release() + const background = await backgroundPromise + expect(order).toEqual(['background']) + expect(scheduler.snapshot().queued).toBe(1) + + background.release() + const fresh = await freshPromise + expect(order).toEqual(['background', 'fresh']) + headroom.release() + fresh.release() + }) + + it('keeps a route base slot free when fresh interactive work needs global headroom', async () => { + let now = 0 + const scheduler = schedulerWithOneSlot(() => now) + const running = await scheduler.acquire(local('status')) + const agedPromise = scheduler.acquire({ + ...local('background'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + now = 30_000 + const interactive = await scheduler.acquire({ + ...local('interactive'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + + expect(scheduler.snapshot().budgets['route:general:wsl:ubuntu']).toEqual({ + baseUsed: 0, + headroomUsed: 1 + }) + running.release() + const aged = await agedPromise + expect(scheduler.snapshot().budgets['route:general:wsl:ubuntu']).toEqual({ + baseUsed: 1, + headroomUsed: 1 + }) + aged.release() + interactive.release() + }) + + it('does not let a saturated route delay local-disk work below the general cap', async () => { + const scheduler = new GitAdmissionScheduler({ + generalCap: 3, + generalHeadroom: 1, + routeCap: 1, + routeHeadroom: 1 + }) + const routed = await scheduler.acquire({ + ...local('background'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + const queuedRoute = scheduler.acquire({ + ...local('background'), + cwd: 'C:\\other', + wslDistro: 'Ubuntu' + }) + const localDisk = await scheduler.acquire({ ...local('status'), cwd: 'C:\\local' }) + + expect(scheduler.snapshot().queued).toBe(1) + localDisk.release() + routed.release() + const secondRoute = await queuedRoute + secondRoute.release() + }) + + it('admits local-disk work beside two saturated-route children below the cap', async () => { + const scheduler = new GitAdmissionScheduler({ generalCap: 4, routeCap: 2 }) + const routed = await Promise.all([ + scheduler.acquire({ + ...local('background'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }), + scheduler.acquire({ + ...local('background'), + cwd: 'C:\\other', + wslDistro: 'Ubuntu' + }) + ]) + const localDisk = await scheduler.acquire({ ...local('status'), cwd: 'C:\\local' }) + + expect(scheduler.snapshot()).toMatchObject({ + queued: 0, + budgets: { + general: { baseUsed: 3, headroomUsed: 0 }, + 'route:general:wsl:ubuntu': { baseUsed: 2, headroomUsed: 0 } + } + }) + routed.forEach((grant) => grant.release()) + localDisk.release() + }) + + it('removes an aborted queued waiter without changing occupancy', async () => { + const scheduler = schedulerWithOneSlot() + const running = await scheduler.acquire(local()) + const controller = new AbortController() + const queued = scheduler.acquire({ ...local(), signal: controller.signal }) + controller.abort() + + await expect(queued).rejects.toMatchObject({ name: 'AbortError' }) + expect(scheduler.snapshot()).toMatchObject({ + queued: 0, + budgets: { general: { baseUsed: 1, headroomUsed: 0 } } + }) + running.release() + }) + + it('bounds canceled candidate storage while the only permit stays saturated', async () => { + const scheduler = schedulerWithOneSlot() + const running = await scheduler.acquire(local()) + const canceled: Promise[] = [] + + for (let index = 0; index < 4_000; index += 1) { + const controller = new AbortController() + const request = scheduler.acquire({ ...local(), signal: controller.signal }).then( + () => undefined, + (error) => expect(error).toMatchObject({ name: 'AbortError' }) + ) + controller.abort() + canceled.push(request) + } + await Promise.all(canceled) + + expect(scheduler.snapshot().queued).toBe(0) + expect(scheduler.snapshot().candidateCount).toBeLessThanOrEqual(64) + running.release() + expect(scheduler.snapshot().candidateCount).toBe(0) + }) + + it('does not decrement for an already-aborted signal with a free slot', async () => { + const scheduler = schedulerWithOneSlot() + const controller = new AbortController() + controller.abort() + + await expect( + scheduler.acquire({ ...local(), signal: controller.signal }) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(scheduler.snapshot()).toEqual({ + queued: 0, + queuedWaiters: [], + candidateCount: 0, + budgets: {} + }) + }) + + it('returns a grant selected in the same tick when abort wins delivery', async () => { + const scheduler = schedulerWithOneSlot() + const running = await scheduler.acquire(local()) + const controller = new AbortController() + const queued = scheduler.acquire({ ...local(), signal: controller.signal }) + + running.release() + controller.abort() + + await expect(queued).rejects.toMatchObject({ name: 'AbortError' }) + expect(scheduler.snapshot()).toMatchObject({ + queued: 0, + budgets: { general: { baseUsed: 0, headroomUsed: 0 } } + }) + }) + + it('preserves FIFO after removing an aborted interactive waiter', async () => { + const scheduler = schedulerWithOneSlot() + const running = await scheduler.acquire(local()) + const firstController = new AbortController() + const first = scheduler.acquire({ ...local('interactive'), signal: firstController.signal }) + const second = scheduler.acquire(local('interactive')) + const third = scheduler.acquire(local('interactive')) + firstController.abort() + await expect(first).rejects.toMatchObject({ name: 'AbortError' }) + + running.release() + const secondGrant = await second + secondGrant.release() + const thirdGrant = await third + thirdGrant.release() + }) + + it('completes a background burst while interactive work uses reserved headroom', async () => { + const scheduler = new GitAdmissionScheduler({ generalCap: 2, generalHeadroom: 1 }) + const order: number[] = [] + const background = Array.from({ length: 20 }, (_, index) => + scheduler.acquire(local('background')).then((grant) => { + order.push(index) + grant.release() + }) + ) + let interactiveRan = false + const interactive = scheduler.acquire(local('interactive')).then((grant) => { + interactiveRan = true + grant.release() + }) + + await Promise.all([...background, interactive]) + expect(interactiveRan).toBe(true) + expect(order).toEqual(Array.from({ length: 20 }, (_, index) => index)) + }) + + it('drains a large saturated FIFO burst without retaining settled waiters', async () => { + const scheduler = new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 0 }) + const running = await scheduler.acquire(local('status')) + const count = 4_000 + const order: number[] = [] + const queued = Array.from({ length: count }, (_, index) => + scheduler.acquire(local('background')).then((grant) => { + order.push(index) + grant.release() + }) + ) + + expect(scheduler.snapshot().queued).toBe(count) + running.release() + await Promise.all(queued) + + expect(order).toEqual(Array.from({ length: count }, (_, index) => index)) + expect(scheduler.snapshot()).toMatchObject({ queued: 0, queuedWaiters: [] }) + }) + + it('skips a 4k saturated-route lane without rescanning its blocked prefix', async () => { + const scheduler = new GitAdmissionScheduler({ + generalCap: 2, + generalHeadroom: 0, + routeCap: 1, + routeHeadroom: 0 + }) + const routedRunning = await scheduler.acquire({ + ...local('background'), + wslDistro: 'Ubuntu' + }) + const localRunning = await scheduler.acquire(local('background')) + let abortedReads = 0 + const signal = { + get aborted() { + abortedReads += 1 + return false + }, + addEventListener: () => {}, + removeEventListener: () => {} + } as unknown as AbortSignal + const count = 4_000 + const routed = Array.from({ length: count }, () => + scheduler + .acquire({ ...local('background'), wslDistro: 'Ubuntu', signal }) + .then((grant) => grant.release()) + ) + const localWork = Array.from({ length: count }, () => + scheduler.acquire({ ...local('background'), signal }).then((grant) => grant.release()) + ) + abortedReads = 0 + + localRunning.release() + await Promise.all(localWork) + expect(scheduler.snapshot().queued).toBe(count) + + routedRunning.release() + await Promise.all(routed) + expect(abortedReads).toBeLessThan(30_000) + expect(scheduler.snapshot()).toMatchObject({ queued: 0, queuedWaiters: [] }) + }) + + it('selects one eligible route without scanning thousands of saturated routes', async () => { + const routeCount = 2_000 + const scheduler = new GitAdmissionScheduler({ + generalCap: routeCount, + generalHeadroom: 0, + routeCap: 1, + routeHeadroom: 0 + }) + const running = await Promise.all( + Array.from({ length: routeCount }, (_, index) => + scheduler.acquire({ ...local('background'), wslDistro: `distro-${index}` }) + ) + ) + let aborted = false + let abortedReads = 0 + const abortListeners = new Set<() => void>() + const signal = { + get aborted() { + abortedReads += 1 + return aborted + }, + addEventListener: (_event: string, listener: () => void) => abortListeners.add(listener), + removeEventListener: (_event: string, listener: () => void) => abortListeners.delete(listener) + } as unknown as AbortSignal + const queued = Array.from({ length: routeCount }, (_, index) => + scheduler + .acquire({ ...local('background'), wslDistro: `distro-${index}`, signal }) + .then((grant) => grant.release()) + ) + abortedReads = 0 + + running.at(-1)?.release() + await queued.at(-1) + + expect(abortedReads).toBeLessThanOrEqual(2) + expect(scheduler.snapshot().queued).toBe(routeCount - 1) + + aborted = true + for (const listener of abortListeners) { + listener() + } + await Promise.allSettled(queued.slice(0, -1)) + running.slice(0, -1).forEach((grant) => grant.release()) + expect(scheduler.snapshot()).toMatchObject({ queued: 0, queuedWaiters: [] }) + }) + + it('captures killswitch state in each release closure', async () => { + const scheduler = schedulerWithOneSlot() + _resetGitAdmissionForTests(scheduler) + process.env.ORCA_GIT_ADMISSION_DISABLED = '1' + const bypass = await acquireGitAdmission(local()) + delete process.env.ORCA_GIT_ADMISSION_DISABLED + bypass.release() + expect(_gitAdmissionSnapshotForTests().budgets.general).toBeUndefined() + + const admitted = await acquireGitAdmission(local()) + process.env.ORCA_GIT_ADMISSION_DISABLED = '1' + admitted.release() + expect(_gitAdmissionSnapshotForTests().budgets.general).toEqual({ + baseUsed: 0, + headroomUsed: 0 + }) + }) + + it('publishes monotonic grant and release events with cap metadata', async () => { + const events: GitAdmissionEvent[] = [] + const scheduler = new GitAdmissionScheduler({ + generalCap: 1, + generalHeadroom: 1, + routeCap: 1, + routeHeadroom: 1, + onAdmissionEvent: (event) => events.push(event) + }) + const background = await scheduler.acquire({ + ...local('background'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + const interactive = await scheduler.acquire({ + ...local('interactive'), + cwd: 'C:\\repo', + wslDistro: 'Ubuntu' + }) + background.release() + interactive.release() + + expect(events.map(({ sequence, phase, slotKind }) => [sequence, phase, slotKind])).toEqual([ + [0, 'grant', 'base'], + [1, 'grant', 'headroom'], + [2, 'release', 'base'], + [3, 'release', 'headroom'] + ]) + expect(events[1]).toMatchObject({ + tier: 'interactive', + admissionClass: 'general', + route: 'wsl:ubuntu', + queued: 0 + }) + expect(events[1]?.budgets).toEqual( + expect.arrayContaining([ + { + key: 'general', + baseCapacity: 1, + headroomCapacity: 1, + baseUsed: 1, + headroomUsed: 1 + }, + { + key: 'route:general:wsl:ubuntu', + baseCapacity: 1, + headroomCapacity: 1, + baseUsed: 1, + headroomUsed: 1 + } + ]) + ) + }) +}) diff --git a/src/main/git/command-runner/git-subprocess-admission.ts b/src/main/git/command-runner/git-subprocess-admission.ts new file mode 100644 index 00000000000..b23cbda170b --- /dev/null +++ b/src/main/git/command-runner/git-subprocess-admission.ts @@ -0,0 +1,325 @@ +import { uncRouteKey } from '../../providers/working-directory-validation' +import { classifyGitCommand } from '../wsl-direct-git-read-commands' +import { createAbortError } from './abort-error' +import { GitAdmissionWaiterQueue } from './git-admission-waiter-queue' +import { + ADMISSION_TIER_VALUE, + AdmissionEventPublisher, + DEFAULT_ADMISSION_SCHEDULER_CONFIG, + type AdmissionBudget, + type AdmissionClass, + type AdmissionSchedulerConfig, + type AdmissionSlotKind, + type AdmissionWaiter, + type GitAdmissionGrant, + type GitAdmissionRequest +} from './git-admission-state' + +export type { + GitAdmissionEvent, + GitAdmissionGrant, + GitAdmissionRequest +} from './git-admission-state' +export { + GENERAL_CAP, + GENERAL_HEADROOM, + GIT_ADMISSION_AGING_MS, + MAX_GIT_CHILDREN, + NETWORK_CAP, + NETWORK_HEADROOM, + ROUTE_CAP, + ROUTE_HEADROOM +} from './git-admission-state' + +function commandClass(args: readonly string[]): AdmissionClass { + return classifyGitCommand(args) === 'network' ? 'network' : 'general' +} + +function routeKey(request: GitAdmissionRequest): string | null { + const distro = request.wslDistro?.trim().toLowerCase() + return distro ? `wsl:${distro}` : uncRouteKey(request.cwd) +} + +export class GitAdmissionScheduler { + private readonly config: AdmissionSchedulerConfig + private readonly budgets = new Map() + private readonly waiters = new GitAdmissionWaiterQueue() + private nextWaiterId = 0 + private readonly eventPublisher: AdmissionEventPublisher + + constructor(config: Partial = {}) { + this.config = { ...DEFAULT_ADMISSION_SCHEDULER_CONFIG, ...config } + this.eventPublisher = new AdmissionEventPublisher(this.config.onAdmissionEvent) + } + + acquire(request: GitAdmissionRequest): Promise { + if (request.signal?.aborted) { + return Promise.reject(createAbortError()) + } + const enqueuedAt = this.config.now() + const { admissionClass, route, budgetKeys } = this.resolveBudgets(request) + return new Promise((resolve, reject) => { + const waiter: AdmissionWaiter = { + id: this.nextWaiterId++, + args: request.args, + tier: request.tier ?? 'status', + admissionClass, + route, + enqueuedAt, + budgetKeys, + signal: request.signal, + state: 'queued', + resolve, + reject, + onAbort: () => this.abort(waiter) + } + this.waiters.enqueue(waiter) + this.refreshRouteEligibility(admissionClass, route) + request.signal?.addEventListener('abort', waiter.onAbort, { once: true }) + if (request.signal?.aborted) { + this.abort(waiter) + return + } + // Adding a blocked waiter cannot make an older waiter runnable. Avoid a + // queue scan for every arrival while the fixed-size budget is saturated. + if (this.slotKindFor(waiter)) { + this.drain(admissionClass) + } + }) + } + + snapshot(): { + queued: number + queuedWaiters: { id: number; args: readonly string[]; tier: AdmissionWaiter['tier'] }[] + budgets: Record + candidateCount: number + } { + const queuedWaiters = this.waiters.snapshot() + return { + queued: this.waiters.count, + queuedWaiters: queuedWaiters.map(({ id, args, tier }) => ({ id, args, tier })), + candidateCount: this.waiters.candidateCountForTests, + budgets: Object.fromEntries( + [...this.budgets].map(([key, budget]) => [ + key, + { baseUsed: budget.baseUsed, headroomUsed: budget.headroomUsed } + ]) + ) + } + } + + private resolveBudgets(request: GitAdmissionRequest): { + admissionClass: AdmissionClass + route: string | null + budgetKeys: readonly string[] + } { + const admissionClass = commandClass(request.args) + const route = routeKey(request) + const keys: string[] = [admissionClass] + if (route) { + keys.push(`route:${admissionClass}:${route}`) + } + for (const key of keys) { + this.ensureBudget(key) + } + return { admissionClass, route, budgetKeys: keys } + } + + private ensureBudget(key: string): AdmissionBudget { + let budget = this.budgets.get(key) + if (budget) { + return budget + } + const isRoute = key.startsWith('route:') + const isNetwork = key === 'network' + budget = { + baseCapacity: isRoute + ? this.config.routeCap + : isNetwork + ? this.config.networkCap + : this.config.generalCap, + headroomCapacity: isRoute + ? this.config.routeHeadroom + : isNetwork + ? this.config.networkHeadroom + : this.config.generalHeadroom, + baseUsed: 0, + headroomUsed: 0 + } + this.budgets.set(key, budget) + return budget + } + + private effectiveTier(waiter: AdmissionWaiter, now: number): number { + const promotions = Math.floor((now - waiter.enqueuedAt) / this.config.agingMs) + return Math.max(0, ADMISSION_TIER_VALUE[waiter.tier] - promotions) + } + + private fits(waiter: AdmissionWaiter, slotKind: AdmissionSlotKind): boolean { + return waiter.budgetKeys.every((key) => { + const budget = this.ensureBudget(key) + return slotKind === 'base' + ? budget.baseUsed < budget.baseCapacity + : budget.headroomUsed < budget.headroomCapacity + }) + } + + private slotKindFor(waiter: AdmissionWaiter): AdmissionSlotKind | null { + return this.fits(waiter, 'base') + ? 'base' + : waiter.tier === 'interactive' && this.fits(waiter, 'headroom') + ? 'headroom' + : null + } + + private drain(admissionClass: AdmissionClass): void { + while (true) { + const now = this.config.now() + const globalBudget = this.ensureBudget(admissionClass) + const selected = this.waiters.nextFitting( + admissionClass, + (waiter) => this.effectiveTier(waiter, now), + globalBudget.baseUsed < globalBudget.baseCapacity, + globalBudget.headroomUsed < globalBudget.headroomCapacity, + (waiter) => this.abort(waiter) + ) + if (!selected) { + return + } + this.grant(selected.waiter, selected.slotKind, now) + } + } + + private grant(waiter: AdmissionWaiter, slotKind: AdmissionSlotKind, now: number): void { + waiter.state = 'granted' + waiter.slotKind = slotKind + for (const key of waiter.budgetKeys) { + const budget = this.ensureBudget(key) + if (slotKind === 'base') { + budget.baseUsed += 1 + } else { + budget.headroomUsed += 1 + } + } + this.refreshRouteEligibility(waiter.admissionClass, waiter.route) + this.waiters.dequeue(waiter) + const queueWaitMs = Math.max(0, now - waiter.enqueuedAt) + this.publishEvent(waiter, slotKind, 'grant', queueWaitMs) + queueMicrotask(() => { + if (waiter.state !== 'granted') { + return + } + waiter.state = 'settled' + waiter.signal?.removeEventListener('abort', waiter.onAbort) + waiter.resolve({ + queueWaitMs, + release: this.releaseOnce(waiter, slotKind, queueWaitMs) + }) + }) + } + + private releaseOnce( + waiter: AdmissionWaiter, + slotKind: AdmissionSlotKind, + queueWaitMs: number + ): () => void { + let released = false + return () => { + if (released) { + return + } + released = true + for (const key of waiter.budgetKeys) { + const budget = this.ensureBudget(key) + if (slotKind === 'base') { + budget.baseUsed -= 1 + } else { + budget.headroomUsed -= 1 + } + } + this.refreshRouteEligibility(waiter.admissionClass, waiter.route) + this.publishEvent(waiter, slotKind, 'release', queueWaitMs) + this.pruneRouteBudgets(waiter.budgetKeys) + this.drain(waiter.admissionClass) + } + } + + private abort(waiter: AdmissionWaiter): void { + if (waiter.state === 'settled') { + return + } + if (waiter.state === 'granted' && waiter.slotKind) { + this.releaseOnce( + waiter, + waiter.slotKind, + Math.max(0, this.config.now() - waiter.enqueuedAt) + )() + } + const wasQueued = waiter.state === 'queued' + waiter.state = 'settled' + waiter.signal?.removeEventListener('abort', waiter.onAbort) + if (wasQueued) { + this.waiters.dequeue(waiter) + this.pruneRouteBudgets(waiter.budgetKeys) + } + waiter.reject(createAbortError()) + } + + private publishEvent( + waiter: AdmissionWaiter, + slotKind: AdmissionSlotKind, + phase: 'grant' | 'release', + queueWaitMs: number + ): void { + this.eventPublisher.publish({ + phase, + waiter, + slotKind, + queueWaitMs, + queued: this.waiters.count, + budgets: this.budgets + }) + } + + private pruneRouteBudgets(keys: readonly string[]): void { + for (const key of keys) { + const budget = this.budgets.get(key) + if ( + budget && + key.startsWith('route:') && + budget.baseUsed === 0 && + budget.headroomUsed === 0 && + !this.waiters.hasBudget(key) + ) { + this.budgets.delete(key) + } + } + } + + private refreshRouteEligibility(admissionClass: AdmissionClass, route: string | null): void { + const budget = route ? this.ensureBudget(`route:${admissionClass}:${route}`) : null + this.waiters.updateRouteEligibility( + admissionClass, + route, + !budget || budget.baseUsed < budget.baseCapacity, + !budget || budget.headroomUsed < budget.headroomCapacity + ) + } +} + +let scheduler = new GitAdmissionScheduler() + +export function acquireGitAdmission(request: GitAdmissionRequest): Promise { + if (process.env.ORCA_GIT_ADMISSION_DISABLED === '1') { + return Promise.resolve({ queueWaitMs: 0, release: () => {} }) + } + return scheduler.acquire(request) +} + +export function _resetGitAdmissionForTests(replacement = new GitAdmissionScheduler()): void { + scheduler = replacement +} + +export function _gitAdmissionSnapshotForTests(): ReturnType { + return scheduler.snapshot() +} diff --git a/src/main/git/git-runtime-options.ts b/src/main/git/git-runtime-options.ts index edc3bd4b30c..b1ed5ac885c 100644 --- a/src/main/git/git-runtime-options.ts +++ b/src/main/git/git-runtime-options.ts @@ -1,16 +1,20 @@ +import type { GitAdmissionTier } from './command-runner/git-exec-options' + export type GitRuntimeOptions = { wslDistro?: string signal?: AbortSignal + admissionTier?: GitAdmissionTier } export function gitOptionsForWorktree( cwd: string, options: GitRuntimeOptions = {} -): { cwd: string; wslDistro?: string; signal?: AbortSignal } { +): { cwd: string; wslDistro?: string; signal?: AbortSignal; admissionTier?: GitAdmissionTier } { return { cwd, ...(options.wslDistro ? { wslDistro: options.wslDistro } : {}), - ...(options.signal ? { signal: options.signal } : {}) + ...(options.signal ? { signal: options.signal } : {}), + ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}) } } @@ -27,6 +31,7 @@ export function gitReadOptionsForWorktree( cwd: string wslDistro?: string signal?: AbortSignal + admissionTier?: GitAdmissionTier preferWslDirectGit: true } { return { ...gitOptionsForWorktree(cwd, options), preferWslDirectGit: true } diff --git a/src/main/git/push-target-validation.ts b/src/main/git/push-target-validation.ts index 8e3375c100f..055eab8537c 100644 --- a/src/main/git/push-target-validation.ts +++ b/src/main/git/push-target-validation.ts @@ -1,10 +1,9 @@ import type { GitPushTarget } from '../../shared/worktree/types' import { assertGitPushTargetShape } from '../../shared/git-push-target-validation' import { gitExecFileAsync } from './runner' +import type { GitExecOptions as GitCommandExecOptions } from './command-runner/git-exec-options' -type GitExecOptions = { - wslDistro?: string -} +type GitExecOptions = Pick export async function validateGitPushTarget( repoPath: string, diff --git a/src/main/git/remote-ref-probe-cache.ts b/src/main/git/remote-ref-probe-cache.ts index 3bc2f676fbb..8f8255c1046 100644 --- a/src/main/git/remote-ref-probe-cache.ts +++ b/src/main/git/remote-ref-probe-cache.ts @@ -2,6 +2,7 @@ import { getSshGitProviderGeneration } from '../providers/ssh-git-dispatch' import { runCoalescedProbe, type CoalescedProbes } from './coalesced-probe' import { isTransientGitProbeError, readRemoteUrl } from './remote-url-probe' import { isStableMissingGitRemoteError } from './stable-missing-git-remote-error' +import type { GitAdmissionTier } from './command-runner/git-exec-options' /** * The "is this repo mine?" probe every forge integration runs: read the remote's @@ -25,6 +26,7 @@ type CachedRepoRef = { value: Ref | null; expiresAt: number } export type RemoteRefLocalGitOptions = { wslDistro?: string + admissionTier?: GitAdmissionTier } export type RemoteRefProbeCache = { @@ -79,7 +81,8 @@ export function createRemoteRefProbeCache( { repoPath, connectionId, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) }, remoteName ) diff --git a/src/main/git/remote-url-probe.ts b/src/main/git/remote-url-probe.ts index d237bdd98fa..02bc2a17fa7 100644 --- a/src/main/git/remote-url-probe.ts +++ b/src/main/git/remote-url-probe.ts @@ -4,6 +4,7 @@ import { } from '../providers/ssh-git-dispatch' import { gitExecFileAsync } from './runner' import { isStableMissingGitRemoteError } from './stable-missing-git-remote-error' +import type { GitAdmissionTier } from './command-runner/git-exec-options' /** * The `git remote get-url` probe every forge integration runs to decide whether @@ -23,6 +24,7 @@ export type RemoteUrlProbeContext = { repoPath: string connectionId?: string | null wslDistro?: string + admissionTier?: GitAdmissionTier } /** Reads a remote URL, or null when the repo's SSH runtime is not connected. */ @@ -43,7 +45,8 @@ export async function readRemoteUrl( const { stdout } = await gitExecFileAsync(['remote', 'get-url', remoteName], { cwd: context.repoPath, timeout: REMOTE_URL_PROBE_TIMEOUT_MS, - ...(context.wslDistro ? { wslDistro: context.wslDistro } : {}) + ...(context.wslDistro ? { wslDistro: context.wslDistro } : {}), + ...(context.admissionTier ? { admissionTier: context.admissionTier } : {}) }) return stdout } diff --git a/src/main/git/runner-command-exec.test.ts b/src/main/git/runner-command-exec.test.ts index 5274a14b15d..5706054d573 100644 --- a/src/main/git/runner-command-exec.test.ts +++ b/src/main/git/runner-command-exec.test.ts @@ -22,6 +22,12 @@ import { translateWslOutputPaths, wslAwareSpawn } from './runner' +import { + GitAdmissionScheduler, + _resetGitAdmissionForTests +} from './command-runner/git-subprocess-admission' + +afterEach(() => _resetGitAdmissionForTests()) type MockChildProcess = EventEmitter & { stdout: EventEmitter @@ -215,6 +221,7 @@ describe('runner execFile timeout handling', () => { timeout: 1000 }) const rejection = expect(promise).rejects.toThrow('git timed out.') + await vi.waitFor(() => expect(execFileMock).toHaveBeenCalledOnce()) await vi.advanceTimersByTimeAsync(1000) await rejection @@ -251,6 +258,7 @@ describe('runner execFile timeout handling', () => { } ) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalled()) controller.abort() child.emit('close', 0, null) await vi.advanceTimersByTimeAsync(1_999) @@ -432,6 +440,36 @@ describe('runner execFile timeout handling', () => { ) }) + it('admits the core.sshCommand probe before spawning it', async () => { + const scheduler = new GitAdmissionScheduler({ generalCap: 1, generalHeadroom: 0 }) + _resetGitAdmissionForTests(scheduler) + const blocker = await scheduler.acquire({ args: ['status'], cwd: '/repo', tier: 'status' }) + const calls: string[][] = [] + execFileMock.mockImplementation((_cmd, args, _opts, cb) => { + const child = createMockChildProcess(1234 + calls.length) + calls.push(args) + cb(null, '', '') + queueMicrotask(() => child.emit('close', 0, null)) + return child + }) + + const pending = gitExecFileAsync(['fetch', '--no-write-fetch-head', 'origin'], { + cwd: '/repo', + env: {}, + useConfiguredSshCommandForNetwork: true + }) + await Promise.resolve() + expect(execFileMock).not.toHaveBeenCalled() + + blocker.release() + await pending + + expect(calls).toEqual([ + ['config', '--get', 'core.sshCommand'], + ['fetch', '--no-write-fetch-head', 'origin'] + ]) + }) + it('replaces configured BatchMode for opted-in mergeable OpenSSH commands', async () => { const child = createMockChildProcess(1234) let capturedEnv: NodeJS.ProcessEnv | undefined @@ -737,6 +775,7 @@ describe('gitStreamStdout', () => { chunks.push(chunk) } }) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) child.stdout.emit('data', Buffer.from('? a.txt\n')) child.stdout.emit('data', Buffer.from('? b.txt\n')) child.emit('close', 0) @@ -759,11 +798,13 @@ describe('gitStreamStdout', () => { return true } }) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) child.stdout.emit('data', Buffer.from('? a.txt\n')) await expect(promise).resolves.toEqual({ stoppedEarly: true }) expect(child.kill).toHaveBeenCalled() expect(calls).toBe(1) + child.emit('close', null, 'SIGTERM') }) it('rejects when stdout exceeds the maxBuffer backstop', async () => { @@ -776,10 +817,12 @@ describe('gitStreamStdout', () => { onStdout: () => {} }) const rejection = expect(promise).rejects.toThrow('git stdout exceeded maxBuffer.') + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) child.stdout.emit('data', Buffer.from('way too much')) await rejection expect(child.kill).toHaveBeenCalled() + child.emit('close', null, 'SIGTERM') }) it('rejects on a non-zero exit with stderr context', async () => { @@ -788,6 +831,7 @@ describe('gitStreamStdout', () => { const promise = gitStreamStdout(['status'], { cwd: '/repo', onStdout: () => {} }) const rejection = expect(promise).rejects.toThrow('git exited with 128') + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) child.stderr.emit('data', Buffer.from('fatal: not a git repository')) child.emit('close', 128) @@ -805,10 +849,12 @@ describe('gitStreamStdout', () => { } }) const rejection = expect(promise).rejects.toThrow('parser blew up') + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) child.stdout.emit('data', Buffer.from('? a.txt\n')) await rejection expect(child.kill).toHaveBeenCalled() + child.emit('close', null, 'SIGTERM') }) it('handles a late spawn error after cancellation', async () => { @@ -821,6 +867,7 @@ describe('gitStreamStdout', () => { signal: controller.signal, onStdout: () => {} }) + await vi.waitFor(() => expect(spawnMock).toHaveBeenCalledOnce()) controller.abort() await expect(promise).rejects.toMatchObject({ name: 'AbortError' }) diff --git a/src/main/git/runner-windows-host-environment.test.ts b/src/main/git/runner-windows-host-environment.test.ts index e441b023ff4..367d830b767 100644 --- a/src/main/git/runner-windows-host-environment.test.ts +++ b/src/main/git/runner-windows-host-environment.test.ts @@ -20,6 +20,7 @@ import { gitSpawnAfterWindowsEnvironmentReady, gitStreamStdout } from './runner' +import { _resetGitAdmissionForTests } from './command-runner/git-subprocess-admission' type MockChildProcess = EventEmitter & { stdout: EventEmitter @@ -64,6 +65,7 @@ describe('Windows host Git environment readiness', () => { }) afterEach(() => { + _resetGitAdmissionForTests() configureWindowsHostGitEnvironmentReadiness(null) if (originalPath === undefined) { delete process.env.Path diff --git a/src/main/git/runner-wsl-direct-read.test.ts b/src/main/git/runner-wsl-direct-read.test.ts index 9cc43223c76..284cda55718 100644 --- a/src/main/git/runner-wsl-direct-read.test.ts +++ b/src/main/git/runner-wsl-direct-read.test.ts @@ -19,6 +19,11 @@ vi.mock('../diagnostics/main-thread-churn-probe', () => ({ recordSubprocessSpawn import { pendingWslDirectGitReadEnvironment } from './command-runner/git-command-resolution' import { gitExecFileAsync, gitSpawn, gitStreamStdout } from './runner' +import { + GitAdmissionScheduler, + _resetGitAdmissionForTests, + type GitAdmissionEvent +} from './command-runner/git-subprocess-admission' import { disableWslGitReadEnvironment, getWslGitReadEnvironment, @@ -33,6 +38,8 @@ import { type WslLinkedWorktreeRoutingFileSystem } from './wsl-linked-worktree-git-routing' +afterEach(() => _resetGitAdmissionForTests()) + const DISTRO = 'Ubuntu' const LOGIN_ENVIRONMENT = { gitPath: '/home/user/bin/git', @@ -493,36 +500,53 @@ describe('WSL direct Git reads', () => { }) }) - it('invalidates a missing direct executable and retries through the login shell', async () => { + it('waits for direct Git to close before retrying through the login shell', async () => { await withPlatform('win32', async () => { + const admissionEvents: GitAdmissionEvent[] = [] + _resetGitAdmissionForTests( + new GitAdmissionScheduler({ onAdmissionEvent: (event) => admissionEvents.push(event) }) + ) seedWslGitReadEnvironmentForTests(DISTRO, LOGIN_ENVIRONMENT) + let directChild!: ReturnType execFileMock.mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => + directChild = child + queueMicrotask(() => { callback?.( Object.assign(new Error('exit 127'), { code: 127 }), '', '/usr/bin/env: No such file or directory' ) - ) + }) return child }) execFileMock.mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => callback?.(null, 'ok', '')) + queueMicrotask(() => { + child.emit('close', 0, null) + callback?.(null, 'ok', '') + }) return child }) - await expect( - gitExecFileAsync(['status', '--short'], { - cwd: String.raw`C:\repo`, - preferWslDirectGit: true, - wslDistro: DISTRO - }) - ).resolves.toEqual({ stdout: 'ok', stderr: '' }) + const result = gitExecFileAsync(['status', '--short'], { + cwd: String.raw`C:\repo`, + preferWslDirectGit: true, + wslDistro: DISTRO + }) + + await vi.waitFor(() => expect(directChild).toBeDefined()) + await Promise.resolve() + expect(execFileMock).toHaveBeenCalledTimes(1) + directChild.emit('close', 127, null) + await expect(result).resolves.toEqual({ stdout: 'ok', stderr: '' }) expect(execFileMock.mock.calls[0]?.[1]).toContain('--exec') expect(execFileMock.mock.calls[1]?.[1]?.slice(3, 5)).toEqual(['sh', '-lc']) + expect(admissionEvents.map(({ phase, waiterId }) => [phase, waiterId])).toEqual([ + ['grant', 0], + ['release', 0] + ]) }) }) @@ -531,14 +555,18 @@ describe('WSL direct Git reads', () => { seedWslGitReadEnvironmentForTests(DISTRO, LOGIN_ENVIRONMENT) execFileMock.mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => + queueMicrotask(() => { callback?.(Object.assign(new Error('exit 128'), { code: 128 }), '', 'helper failed') - ) + child.emit('close', 128, null) + }) return child }) execFileMock.mockImplementation((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => callback?.(null, 'ok', '')) + queueMicrotask(() => { + callback?.(null, 'ok', '') + child.emit('close', 0, null) + }) return child }) const options = { @@ -562,21 +590,26 @@ describe('WSL direct Git reads', () => { execFileMock .mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => + queueMicrotask(() => { callback?.(Object.assign(new Error('exit 128'), { code: 128 }), '', 'missing ref') - ) + child.emit('close', 128, null) + }) return child }) .mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => + queueMicrotask(() => { callback?.(Object.assign(new Error('exit 128'), { code: 128 }), '', 'missing ref') - ) + child.emit('close', 128, null) + }) return child }) .mockImplementationOnce((_command, _args, _options, callback) => { const child = createMockChild() - queueMicrotask(() => callback?.(null, 'ok', '')) + queueMicrotask(() => { + callback?.(null, 'ok', '') + child.emit('close', 0, null) + }) return child }) const options = { diff --git a/src/main/git/runner-wsl-linked-gitdir-timeout.test.ts b/src/main/git/runner-wsl-linked-gitdir-timeout.test.ts index 553b07d6b38..527c5e9b99f 100644 --- a/src/main/git/runner-wsl-linked-gitdir-timeout.test.ts +++ b/src/main/git/runner-wsl-linked-gitdir-timeout.test.ts @@ -21,6 +21,9 @@ vi.mock('node:fs/promises', async (importOriginal) => ({ })) import { gitExecFileAsync } from './runner' +import { _resetGitAdmissionForTests } from './command-runner/git-subprocess-admission' + +afterEach(() => _resetGitAdmissionForTests()) import { resetWslLinkedWorktreeGitRoutingForTests, WSL_LINKED_WORKTREE_ROUTE_PROBE_TIMEOUT_MS diff --git a/src/main/git/runner-wsl-login-shell-capture.test.ts b/src/main/git/runner-wsl-login-shell-capture.test.ts index 222d64e5773..cbf7dfdd067 100644 --- a/src/main/git/runner-wsl-login-shell-capture.test.ts +++ b/src/main/git/runner-wsl-login-shell-capture.test.ts @@ -18,6 +18,9 @@ vi.mock('../observability/instrumentation', () => ({ vi.mock('../diagnostics/main-thread-churn-probe', () => ({ recordSubprocessSpawn: vi.fn() })) import { gitExecFileAsync, gitExecFileAsyncBuffer } from './runner' +import { _resetGitAdmissionForTests } from './command-runner/git-subprocess-admission' + +afterEach(() => _resetGitAdmissionForTests()) import { resetWslGitReadEnvironmentForTests } from './wsl-git-read-environment' const DISTRO = 'Ubuntu' diff --git a/src/main/git/runner-wsl-read-routing.test.ts b/src/main/git/runner-wsl-read-routing.test.ts index 21c9bc45e38..9bb957c48ef 100644 --- a/src/main/git/runner-wsl-read-routing.test.ts +++ b/src/main/git/runner-wsl-read-routing.test.ts @@ -18,6 +18,9 @@ vi.mock('../observability/instrumentation', () => ({ vi.mock('../diagnostics/main-thread-churn-probe', () => ({ recordSubprocessSpawn: vi.fn() })) import { gitExecFileAsync } from './runner' +import { _resetGitAdmissionForTests } from './command-runner/git-subprocess-admission' + +afterEach(() => _resetGitAdmissionForTests()) import { resetWslGitReadEnvironmentForTests, seedWslGitReadEnvironmentForTests diff --git a/src/main/git/runner.ts b/src/main/git/runner.ts index 7a07a3302b8..4db317f1287 100644 --- a/src/main/git/runner.ts +++ b/src/main/git/runner.ts @@ -17,6 +17,7 @@ export { configureWindowsHostGitEnvironmentReadiness } from './command-runner/windows-host-git-environment' export { DEFAULT_GIT_MAX_BUFFER } from './command-runner/git-exec-options' +export { GitCommandTimeoutError } from './command-runner/git-command-timeout' export { appendGitConfigEnv, gitOptionalLocksDisabledEnv, @@ -32,7 +33,11 @@ export { } from './command-runner/git-exec-file' export { commandExecFileAsync } from './command-runner/command-exec-file' export { gitStreamStdout, type GitStreamResult } from './command-runner/git-stream-stdout' -export { gitSpawn, gitSpawnAfterWindowsEnvironmentReady } from './command-runner/git-spawn' +export { + gitSpawn, + gitSpawnAfterWindowsEnvironmentReady, + withGitAdmission +} from './command-runner/git-spawn' export { isTransientGhError } from './command-runner/gh-retry-policy' export { applyGhHostToArgs } from './command-runner/gh-host-args' export { ghExecFileAsync } from './command-runner/gh-exec-file' diff --git a/src/main/git/source-control/get-status-options.ts b/src/main/git/source-control/get-status-options.ts index 1b69cc3eae6..d8f4099c77a 100644 --- a/src/main/git/source-control/get-status-options.ts +++ b/src/main/git/source-control/get-status-options.ts @@ -2,6 +2,7 @@ import type { GitRuntimeOptions } from '../git-runtime-options' export type GetStatusOptions = GitRuntimeOptions & { includeIgnored?: boolean + includeLineStats?: boolean reuseLineStats?: boolean /** Merge-base OID the caller wants the branch line total measured against; * omitted means the chip is hidden, so no ranged diff runs at all. */ diff --git a/src/main/git/source-control/status-read.ts b/src/main/git/source-control/status-read.ts index 7893cabde15..ae1fbbec8df 100644 --- a/src/main/git/source-control/status-read.ts +++ b/src/main/git/source-control/status-read.ts @@ -53,7 +53,9 @@ function getStatusReadKey(worktreePath: string, options: GetStatusOptions): stri return stableInFlightKey([ worktreePath, options.wslDistro ?? '', + options.admissionTier ?? 'status', options.includeIgnored === true, + options.includeLineStats !== false, options.reuseLineStats === true, // Why: the result carries a total only for callers who asked, and only for // this fork point, so a shared lease must never serve one to the other. @@ -102,7 +104,8 @@ async function runGetStatus( options: GetStatusOptions = {} ): Promise { const lineStatsCacheKey = getStatusLineStatsCacheKey(worktreePath, options) - const lineStatsWriteToken = beginGitStatusLineStatsCacheWrite(lineStatsCacheKey) + const lineStatsWriteToken = + options.includeLineStats === false ? null : beginGitStatusLineStatsCacheWrite(lineStatsCacheKey) let effectiveUpstreamStatus: GitUpstreamStatus | undefined let statusSucceeded = false // Why: a bad limit (negative/fractional/NaN) breaks early-stop; require a valid non-negative int (0 disables the cap). @@ -132,6 +135,7 @@ async function runGetStatus( const result = await gitStreamStdout(statusArgs, { cwd: worktreePath, wslDistro: options.wslDistro, + admissionTier: options.admissionTier, preferWslDirectGit: true, // Why: status polling is read-like; disable optional locks to avoid racing terminal Git on index.lock. env: gitOptionalLocksDisabledEnv(), @@ -209,7 +213,7 @@ async function runGetStatus( // Why: line counts run only for areas with entries (clean tree = 0 calls); skip past the limit to avoid numstat over a huge set. let branchLineTotal: GitBranchLineTotal | undefined - if (!didHitLimit) { + if (!didHitLimit && lineStatsWriteToken !== null) { const branchLineTotalInput = createBranchLineTotalInput( worktreePath, entries, @@ -227,7 +231,7 @@ async function runGetStatus( ...(branchLineTotalInput ? { branchLineTotal: branchLineTotalInput } : {}) }) branchLineTotal = lineStats.branchLineTotal - } else { + } else if (lineStatsWriteToken !== null) { clearGitStatusLineStatsCacheKey(lineStatsCacheKey, lineStatsWriteToken) } diff --git a/src/main/git/source-control/wsl-tracked-pathspec-banner.test.ts b/src/main/git/source-control/wsl-tracked-pathspec-banner.test.ts index fbae736e77f..6404e5deca1 100644 --- a/src/main/git/source-control/wsl-tracked-pathspec-banner.test.ts +++ b/src/main/git/source-control/wsl-tracked-pathspec-banner.test.ts @@ -35,6 +35,9 @@ vi.mock('../../../shared/git-discard-path-safety', () => ({ import { bulkDiscardChanges } from './discard-changes' import { resetWslGitReadEnvironmentForTests } from '../wsl-git-read-environment' +import { _resetGitAdmissionForTests } from '../command-runner/git-subprocess-admission' + +afterEach(() => _resetGitAdmissionForTests()) const DISTRO = 'Ubuntu-24.04' const WSL_WORKTREE = `\\\\wsl$\\${DISTRO}\\home\\emilio\\projects\\orca` diff --git a/src/main/git/status-read-coalescing.test.ts b/src/main/git/status-read-coalescing.test.ts index 6eacba1fb69..e0170f8d6a5 100644 --- a/src/main/git/status-read-coalescing.test.ts +++ b/src/main/git/status-read-coalescing.test.ts @@ -71,15 +71,19 @@ describe('getStatus', () => { gitExecFileAsyncMock.mockResolvedValue({ stdout: '' }) }) - it('opts status reads into direct WSL Git without changing mutation options', async () => { + it('preserves status admission through the direct WSL stream without changing mutation options', async () => { readFileMock.mockResolvedValue('gitdir: /repo/.git/worktrees/feature\n') existsSyncMock.mockReturnValue(false) - await getStatus('/repo', { wslDistro: 'Ubuntu' }) + await getStatus('/repo', { wslDistro: 'Ubuntu', admissionTier: 'interactive' }) await stageFile('/repo', 'src/file.ts', { wslDistro: 'Ubuntu' }) expect(gitStreamOptionsMock).toHaveBeenCalledWith( - expect.objectContaining({ preferWslDirectGit: true, wslDistro: 'Ubuntu' }) + expect.objectContaining({ + admissionTier: 'interactive', + preferWslDirectGit: true, + wslDistro: 'Ubuntu' + }) ) const addOptions = gitExecFileAsyncMock.mock.calls.find(([args]) => (args as string[]).includes('add') @@ -290,16 +294,18 @@ describe('getStatus', () => { getStatus('/other-repo'), getStatus('/repo', { wslDistro: 'Ubuntu' }), getStatus('/repo', { includeIgnored: true }), + getStatus('/repo', { includeLineStats: false }), getStatus('/repo', { reuseLineStats: true }), getStatus('/repo', { bypassEffectiveUpstreamNegativeCache: true }), getStatus('/repo', { limit: 1 }), - getStatus('/repo', { sharedLinkPaths: ['node_modules'] }) + getStatus('/repo', { sharedLinkPaths: ['node_modules'] }), + getStatus('/repo', { admissionTier: 'interactive' }) ] - await vi.waitFor(() => expect(statusCommandCalls).toBe(8)) + await vi.waitFor(() => expect(statusCommandCalls).toBe(10)) releases.splice(0).forEach((release) => release()) await Promise.all(reads) - expect(statusCommandCalls).toBe(8) + expect(statusCommandCalls).toBe(10) }) it('clears in-flight status reads when a mutation runs', async () => { diff --git a/src/main/git/status.test.ts b/src/main/git/status.test.ts index 9663becb622..b8ab930cc86 100644 --- a/src/main/git/status.test.ts +++ b/src/main/git/status.test.ts @@ -368,6 +368,35 @@ describe('getStatus', () => { ]) }) + it('omits line stats without overwriting the reusable line-stats cache', async () => { + readFileMock.mockResolvedValue('gitdir: /stats-repo/.git/worktrees/feature\n') + gitExecFileAsyncMock.mockImplementation((args: string[]) => { + if (args.includes('status')) { + return Promise.resolve({ + stdout: + '# branch.oid head-stats\n' + + '1 .M N... 100644 100644 100644 aaaa aaaa src/unstaged.ts\n' + }) + } + if (args.includes('--numstat')) { + return Promise.resolve({ stdout: '3\t4\tsrc/unstaged.ts\n' }) + } + return Promise.resolve({ stdout: '' }) + }) + + const withStats = await getStatus('/stats-repo') + const withoutStats = await getStatus('/stats-repo', { includeLineStats: false }) + const reused = await getStatus('/stats-repo', { reuseLineStats: true }) + + expect(withoutStats.entries).toEqual( + withStats.entries.map(({ added: _added, removed: _removed, ...entry }) => entry) + ) + expect(reused.entries).toEqual(withStats.entries) + expect( + gitExecFileAsyncMock.mock.calls.filter(([args]) => args.includes('--numstat')) + ).toHaveLength(1) + }) + it('reuses unchanged line stats only when the safety hint is present', async () => { readFileMock.mockResolvedValue('gitdir: /repo/.git/worktrees/feature\n') gitExecFileAsyncMock.mockImplementation((args: string[]) => { diff --git a/src/main/git/upstream.ts b/src/main/git/upstream.ts index 81f193d4f6c..18b2756a133 100644 --- a/src/main/git/upstream.ts +++ b/src/main/git/upstream.ts @@ -7,9 +7,11 @@ import { getPublishTargetStatus } from '../../shared/git-publish-target-status' import { gitExecFileAsync } from './runner' import { validateGitPushTarget } from './push-target-validation' import { nativeAndWslGitUpstreamStatusReadOwner } from './git-upstream-status-read-owner' +import type { GitAdmissionTier } from './command-runner/git-exec-options' type GitExecOptions = { wslDistro?: string + admissionTier?: GitAdmissionTier } export function invalidateGitUpstreamStatusReads(): void { @@ -19,8 +21,12 @@ export function invalidateGitUpstreamStatusReads(): void { function gitExecOptions( cwd: string, options: GitExecOptions = {} -): { cwd: string; wslDistro?: string } { - return options.wslDistro ? { cwd, wslDistro: options.wslDistro } : { cwd } +): { cwd: string; wslDistro?: string; admissionTier?: GitAdmissionTier } { + return { + cwd, + ...(options.wslDistro ? { wslDistro: options.wslDistro } : {}), + ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}) + } } async function getBehindCommitsArePatchEquivalent( diff --git a/src/main/git/worktree-common-dir-comparison.test.ts b/src/main/git/worktree-common-dir-comparison.test.ts new file mode 100644 index 00000000000..e145a582da5 --- /dev/null +++ b/src/main/git/worktree-common-dir-comparison.test.ts @@ -0,0 +1,26 @@ +// The common-dir check decides whether a create is confirmed, so a false accept adopts a foreign repo. +import { describe, expect, it } from 'vitest' +import { isSameCommonDirPath } from './worktree-listing' + +describe('isSameCommonDirPath', () => { + it('keeps WSL paths case-sensitive on a Windows host', () => { + expect(isSameCommonDirPath('/home/u/RepoA/.git', '/home/u/repoa/.git', 'win32')).toBe(false) + expect(isSameCommonDirPath('/home/u/repoa/.git', '/home/u/repoa/.git', 'win32')).toBe(true) + }) + + it('refuses to compare a Linux path against a Windows one', () => { + expect(isSameCommonDirPath('/home/u/repo/.git', 'C:\\repo\\.git', 'win32')).toBe(false) + expect( + isSameCommonDirPath('/home/u/repo/.git', '\\\\wsl.localhost\\Ubuntu\\home\\u\\repo\\.git') + ).toBe(false) + }) + + it('still folds drive-letter case and slash style for Windows paths', () => { + expect(isSameCommonDirPath('C:\\Repo\\.git', 'c:/repo/.git', 'win32')).toBe(true) + }) + + it('normalizes without folding case on a POSIX host', () => { + expect(isSameCommonDirPath('/repo/./x/../.git', '/repo/.git', 'linux')).toBe(true) + expect(isSameCommonDirPath('/repo/.GIT', '/repo/.git', 'linux')).toBe(false) + }) +}) diff --git a/src/main/git/worktree-create-preparation.ts b/src/main/git/worktree-create-preparation.ts index 626b090a0e0..8ecd41021df 100644 --- a/src/main/git/worktree-create-preparation.ts +++ b/src/main/git/worktree-create-preparation.ts @@ -191,15 +191,19 @@ export async function finalizePreparedWorktree( refreshLocalBaseRef, finalizeGitOptions ) - const { stdout: targetHeadOutput } = await gitExecFileAsync( - ['rev-parse', '--verify', `${baseContext.effectiveBase}^{commit}`], - gitExecOptions(repoPath, finalizeGitOptions) - ) + const [targetHeadResult, preparedHeadResult] = await Promise.all([ + gitExecFileAsync( + ['rev-parse', '--verify', `${baseContext.effectiveBase}^{commit}`], + gitExecOptions(repoPath, finalizeGitOptions) + ), + gitExecFileAsync( + ['rev-parse', '--verify', 'HEAD'], + gitExecOptions(preparedPath, finalizeGitOptions) + ) + ]) + const { stdout: targetHeadOutput } = targetHeadResult const targetHead = targetHeadOutput.trim() - const { stdout: preparedHeadOutput } = await gitExecFileAsync( - ['rev-parse', '--verify', 'HEAD'], - gitExecOptions(preparedPath, finalizeGitOptions) - ) + const { stdout: preparedHeadOutput } = preparedHeadResult if (preparedHeadOutput.trim() !== targetHead) { await gitExecFileAsync( [...windowsLongPathGitArgs(preparedPath), 'reset', '--hard', targetHead], diff --git a/src/main/git/worktree-created-description-real-git.test.ts b/src/main/git/worktree-created-description-real-git.test.ts new file mode 100644 index 00000000000..4a5545dd4ba --- /dev/null +++ b/src/main/git/worktree-created-description-real-git.test.ts @@ -0,0 +1,174 @@ +// Real-binary coverage for the create-verification fallback (#16520): the mocked-runner suite cannot +// prove that the row rebuilt from `rev-parse`/`symbolic-ref` is the row `git worktree list` reports. +import { execFile } from 'node:child_process' +import { mkdir, mkdtemp, realpath, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { promisify } from 'node:util' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { clearGitCapabilityStateForTests, getLocalGitCapabilityCache } from './git-capability-state' +import { describeCreatedWorktree, listWorktreesStrict } from './worktree' + +const execFileAsync = promisify(execFile) + +let scratchDir = '' +let repoPath = '' +let worktreePath = '' + +async function git(args: string[], cwd: string): Promise { + const { stdout } = await execFileAsync('git', args, { cwd }) + return stdout +} + +async function seedRepo(path: string, email: string): Promise { + await mkdir(path, { recursive: true }) + await git(['init', '-q'], path) + await git(['config', 'user.email', email], path) + await git(['config', 'user.name', 'Created Description'], path) + await writeFile(join(path, 'seed.txt'), 'seed\n') + await git(['add', '-A'], path) + await git(['commit', '-qm', 'seed'], path) +} + +beforeEach(async () => { + // realpath: macOS hands out /var/... temp paths while Git reports /private/var/... + scratchDir = await realpath(await mkdtemp(join(tmpdir(), 'orca-created-worktree-'))) + repoPath = join(scratchDir, 'repo') + worktreePath = join(scratchDir, 'workspaces', 'feature') + await seedRepo(repoPath, 'created@example.invalid') + await git(['worktree', 'add', '-q', worktreePath, '-b', 'feature'], repoPath) +}) + +afterEach(async () => { + clearGitCapabilityStateForTests() + await rm(scratchDir, { recursive: true, force: true }) +}) + +describe('describeCreatedWorktree against the real Git binary', () => { + it('rebuilds exactly the row the listing reports for the same worktree', async () => { + const listed = (await listWorktreesStrict(repoPath)).find( + (worktree) => worktree.branch === 'refs/heads/feature' + ) + expect(listed).toBeDefined() + + await expect(describeCreatedWorktree(repoPath, worktreePath, 'feature')).resolves.toEqual( + listed + ) + }) + + it('accepts a fully qualified branch ref', async () => { + await expect( + describeCreatedWorktree(repoPath, worktreePath, 'refs/heads/feature') + ).resolves.toMatchObject({ branch: 'refs/heads/feature', isMainWorktree: false }) + }) + + it('rejects a checkout owned by a different repo', async () => { + const otherRepo = join(scratchDir, 'other') + await seedRepo(otherRepo, 'other@example.invalid') + + await expect( + describeCreatedWorktree(otherRepo, worktreePath, 'feature') + ).resolves.toBeUndefined() + }) + + it('rejects a detached HEAD', async () => { + await git(['checkout', '-q', '--detach'], worktreePath) + + await expect( + describeCreatedWorktree(repoPath, worktreePath, 'feature') + ).resolves.toBeUndefined() + }) + + it('rejects a worktree whose HEAD Git cannot resolve', async () => { + // Deleting the branch ref leaves HEAD symbolic but unborn: the ref check still passes. + await rm(join(repoPath, '.git', 'refs', 'heads', 'feature')) + + await expect( + describeCreatedWorktree(repoPath, worktreePath, 'feature') + ).resolves.toBeUndefined() + }) + + it('rejects a path that is not a worktree', async () => { + const plainDir = join(scratchDir, 'not-a-worktree') + await mkdir(plainDir, { recursive: true }) + + await expect(describeCreatedWorktree(repoPath, plainDir, 'feature')).resolves.toBeUndefined() + }) + + // `ln` is absent from the Windows test PATH. + it.skipIf(process.platform === 'win32')( + 'still recovers when the repo root reaches Git through a symlink', + async () => { + const linkedRepo = join(scratchDir, 'repo-link') + await execFileAsync('ln', ['-s', repoPath, linkedRepo]) + + // Why this case: comparing a single common-dir reading rejected every symlinked root, leaving + // the recovery inert exactly where the listing is most likely to have been the only witness. + await expect( + describeCreatedWorktree(linkedRepo, worktreePath, 'feature') + ).resolves.toMatchObject({ branch: 'refs/heads/feature' }) + } + ) + + // `mkfifo` stands in for a `.git` on a hung mount: the read never rejects on its own. + it.skipIf(process.platform === 'win32')( + "still settles when the repo's .git blocks forever", + async () => { + const stalledRepo = join(scratchDir, 'stalled') + await mkdir(stalledRepo, { recursive: true }) + const stalledDotGit = join(stalledRepo, '.git') + await execFileAsync('mkfifo', [stalledDotGit]) + try { + await expect( + describeCreatedWorktree(stalledRepo, worktreePath, 'feature', { timeout: 250 }) + ).resolves.toBeUndefined() + } finally { + // Release the pending read so the fifo does not pin a threadpool thread for the whole run. + await writeFile(stalledDotGit, '') + } + } + ) + + it('recovers a worktree created from a bare repo', async () => { + const bareRepo = join(scratchDir, 'bare.git') + await execFileAsync('git', ['clone', '-q', '--bare', repoPath, bareRepo]) + const bareWorktree = join(scratchDir, 'workspaces', 'from-bare') + await git(['worktree', 'add', '-q', bareWorktree, '-b', 'from-bare'], bareRepo) + + // Why this case: a bare repo has no `.git` file to walk, so the filesystem reading is absent + // and only Git's own `--git-common-dir` can confirm the worktree belongs to this repo. + await expect( + describeCreatedWorktree(bareRepo, bareWorktree, 'from-bare') + ).resolves.toMatchObject({ branch: 'refs/heads/from-bare', isMainWorktree: false }) + }) + + it('recovers on the Git 2.25 baseline, which ignores --path-format=absolute', async () => { + // Forces the no-`--path-format` fallback against the real binary: it answers with paths Git has + // not made absolute, so the readings only agree once they are canonicalized. + getLocalGitCapabilityCache({ cwd: repoPath }).rememberUnsupported('rev-parse-path-format') + const listed = (await listWorktreesStrict(repoPath)).find( + (worktree) => worktree.branch === 'refs/heads/feature' + ) + + await expect(describeCreatedWorktree(repoPath, worktreePath, 'feature')).resolves.toEqual( + listed + ) + }) + + // `ln` is absent from the Windows test PATH. + it.skipIf(process.platform === 'win32')( + 'recovers a symlinked root on the Git 2.25 baseline', + async () => { + const linkedRepo = join(scratchDir, 'repo-link') + await execFileAsync('ln', ['-s', repoPath, linkedRepo]) + getLocalGitCapabilityCache({ cwd: linkedRepo }).rememberUnsupported('rev-parse-path-format') + + // Why this pair: without `--path-format=absolute` Git answers `.git`, which resolves against the + // symlink spelling the caller passed, while the worktree answers with the real root. Only + // canonicalizing both makes them the same object store. + await expect( + describeCreatedWorktree(linkedRepo, worktreePath, 'feature') + ).resolves.toMatchObject({ branch: 'refs/heads/feature' }) + } + ) +}) diff --git a/src/main/git/worktree-list-reader.ts b/src/main/git/worktree-list-reader.ts index 1b17cfd17c4..efef7932251 100644 --- a/src/main/git/worktree-list-reader.ts +++ b/src/main/git/worktree-list-reader.ts @@ -1,6 +1,6 @@ import { stat } from 'node:fs/promises' import type { GitWorktreeInfo } from '../../shared/worktree/types' -import { parseWslUncPath } from '../../shared/wsl-paths' +import { toWslExecutionSpace } from '../../shared/wsl-paths' import { hasUnsupportedRevParsePathFormatEcho, isUnsupportedRevParsePathFormatError, @@ -42,7 +42,7 @@ function parseRepoLocation(repoPath: string, output: string): RepoLocation | und } } -async function readRepoLocation( +export async function readRepoLocation( repoPath: string, resolveBasePath: string, options: GitWorktreeExecOptions = {} @@ -79,6 +79,88 @@ async function readRepoLocation( } } +/** + * The repo's common dir as Git reports it. + * + * Why `--git-common-dir` alone: adding `--show-toplevel` makes rev-parse fail outright on a bare repo. + * Why the Git-space base: Git < 2.31 (the 2.25 baseline) ignores `--path-format=absolute` and prints a + * relative `.git` at a main worktree root; resolving that against a UNC repoPath would compare a + * Windows path against the worktree-side Linux answer, leaving the create's recovery inert (#16520). + */ +export async function readRepoCommonDirFromGit( + repoPath: string, + options: GitWorktreeExecOptions = {} +): Promise { + const resolveBasePath = toWslExecutionSpace(repoPath) + const readCommonDir = (stdout: string): string | undefined => { + const commonDir = stdout + .split('\n') + .map((line) => (line.endsWith('\r') ? line.slice(0, -1) : line)) + .findLast((line) => line.length > 0 && !line.startsWith('-')) + return commonDir ? resolveRevParsePath(resolveBasePath, commonDir) : undefined + } + try { + return await withLocalGitCapabilityCacheForExecution( + { cwd: repoPath, wslDistro: options.wslDistro, signal: options.signal }, + (capabilities) => + capabilities.runWithFallback( + 'rev-parse-path-format', + async () => { + const { stdout } = await gitExecFileAsync( + ['rev-parse', '--path-format=absolute', '--git-common-dir'], + gitExecOptions(repoPath, options) + ) + if (hasUnsupportedRevParsePathFormatEcho(stdout)) { + capabilities.rememberUnsupported('rev-parse-path-format') + } + return readCommonDir(stdout) + }, + async () => { + const { stdout } = await gitExecFileAsync( + ['rev-parse', '--git-common-dir'], + gitExecOptions(repoPath, options) + ) + return readCommonDir(stdout) + }, + isUnsupportedRevParsePathFormatError + ) + ) + } catch { + return undefined + } +} + +/** The branch ref checked out in `worktreePath`, or undefined when HEAD is detached. */ +export async function readCheckedOutBranchRef( + worktreePath: string, + options: GitWorktreeExecOptions = {} +): Promise { + try { + const { stdout } = await gitExecFileAsync( + ['symbolic-ref', '--quiet', 'HEAD'], + gitExecOptions(worktreePath, options) + ) + return stdout.trim() || undefined + } catch { + return undefined + } +} + +export async function readWorktreeHeadOid( + worktreePath: string, + options: GitWorktreeExecOptions = {} +): Promise { + try { + const { stdout } = await gitExecFileAsync( + ['rev-parse', 'HEAD'], + gitExecOptions(worktreePath, options) + ) + return stdout.trim() + } catch { + return '' + } +} + async function normalizeMainWorktreePath( repoPath: string, worktrees: GitWorktreeInfo[], @@ -88,8 +170,7 @@ async function normalizeMainWorktreePath( const mainWorktree = worktrees[mainIndex] // Why: under WSL, porcelain/rev-parse paths are Linux but repoPath is UNC; compare in Git-output // space so the early-return matches and we skip a needless rev-parse per poll (runner still gets repoPath). - const wslRepo = parseWslUncPath(repoPath) - const comparablePath = wslRepo ? wslRepo.linuxPath : repoPath + const comparablePath = toWslExecutionSpace(repoPath) if (!mainWorktree || areWorktreePathsEqual(mainWorktree.path, comparablePath)) { return worktrees } diff --git a/src/main/git/worktree-listing.ts b/src/main/git/worktree-listing.ts index c2c293678d3..3b600143410 100644 --- a/src/main/git/worktree-listing.ts +++ b/src/main/git/worktree-listing.ts @@ -1,11 +1,26 @@ -import { stat } from 'node:fs/promises' +import { realpath, stat } from 'node:fs/promises' +import { join, posix } from 'node:path' import { isWorktreeCreatePreparation } from '../../shared/worktree/create-preparation' +import { toWslExecutionSpace } from '../../shared/wsl-paths' import type { GitWorktreeInfo } from '../../shared/worktree/types' -import { readTranslatedWorktreeGraph, readWorktreeList } from './worktree-list-reader' +import { + readCheckedOutBranchRef, + readRepoCommonDirFromGit, + readRepoLocation, + readTranslatedWorktreeGraph, + readWorktreeHeadOid, + readWorktreeList +} from './worktree-list-reader' import type { GitWorktreeExecOptions } from './worktree-operation-options' -import { getErrorCode, isNotGitRepositoryError } from './worktree-operation-options' -import { translateWorktreePath } from './worktree-path-comparison' -import { detectSparseCheckout } from './worktree-sparse-state' +import { + WORKTREE_LIST_TIMEOUT_MS, + getErrorCode, + isNotGitRepositoryError, + normalizeLocalBranchRef +} from './worktree-operation-options' +import { areWorktreePathsEqual, translateWorktreePath } from './worktree-path-comparison' +import { detectSparseCheckout, resolveGitCommonDir } from './worktree-sparse-state' +import { resolveGitDir } from './source-control/resolve-git-dir' const SPARSE_CHECKOUT_DETECTION_CONCURRENCY = 8 @@ -107,3 +122,146 @@ async function annotateSparseCheckoutStatus( await Promise.all(Array.from({ length: workerCount }, () => detectNext())) return annotated } + +/** + * The repo's common dir from the filesystem, as a second opinion on Git's own reading. + * + * Deadlined because a `.git` on a hung mount (dead NFS/SSHFS, stalled WSL 9p) never rejects, and an + * unbounded read here would leave the whole create IPC pending instead of failing like it used to. + */ +async function readRepoCommonDirFromDisk( + repoPath: string, + timeoutMs: number +): Promise { + try { + const dotGit = join(repoPath, '.git') + // A bare repo has no `.git`, and resolveGitDir would fabricate one; offer no candidate instead. + await withDeadline(stat(dotGit), timeoutMs) + const commonDir = await withDeadline( + resolveGitDir(repoPath).then(resolveGitCommonDir), + timeoutMs + ) + // Node answers in the caller's space, Git in the distro's. Without this the WSL candidate is a UNC + // path that can never equal Git's `/home/...`, leaving this witness inert on exactly the fallback + // path that needs it (realpath cannot bridge the two: a Linux path has no local inode). + return toWslExecutionSpace(commonDir) + } catch { + return undefined + } +} + +async function withDeadline(work: Promise, timeoutMs: number): Promise { + let timer: NodeJS.Timeout | undefined + try { + return await Promise.race([ + work, + new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error('deadline exceeded')), timeoutMs) + }) + ]) + } finally { + clearTimeout(timer) + } +} + +async function canonicalizeLocalPath(pathValue: string): Promise { + try { + return await realpath(pathValue) + } catch { + // A path Git reported from another execution space (WSL, SSH) has no local inode. + return pathValue + } +} + +/** + * Whether the created worktree's common dir names the same object store as the repo. + * + * Why accept any candidate: the readings come from different spaces — Git resolves symlinks and, + * under WSL, answers in Linux paths, while the filesystem walk keeps the caller's (possibly UNC) + * spelling. Comparing only one rejected every symlinked-root, WSL, and bare-repo create (#16520). + */ +async function isSameRepoCommonDir( + createdCommonDir: string, + candidates: readonly (string | undefined)[] +): Promise { + const present = candidates.filter((candidate): candidate is string => Boolean(candidate)) + if (present.some((candidate) => isSameCommonDirPath(createdCommonDir, candidate))) { + return true + } + const [canonicalCreated, ...canonicalCandidates] = await Promise.all( + [createdCommonDir, ...present].map(canonicalizeLocalPath) + ) + return canonicalCandidates.some((candidate) => isSameCommonDirPath(canonicalCreated, candidate)) +} + +/** + * Why not areWorktreePathsEqual alone: it folds case for every path once the host is Windows, so on + * a Windows desktop two WSL repos differing only in case would be accepted as the same object store. + */ +export function isSameCommonDirPath( + left: string, + right: string, + platform = process.platform +): boolean { + const leftIsPosix = isPosixAbsolutePath(left) + if (leftIsPosix || isPosixAbsolutePath(right)) { + return leftIsPosix && isPosixAbsolutePath(right) && posix.resolve(left) === posix.resolve(right) + } + return areWorktreePathsEqual(left, right, platform) +} + +function isPosixAbsolutePath(pathValue: string): boolean { + return pathValue.startsWith('/') && !pathValue.startsWith('//') +} + +/** + * Reconstruct the listing row for a worktree `git worktree add` just created, by asking Git about + * the worktree itself. Used when the listing fails or omits it, so a create does not abandon a + * worktree Git already wrote to disk (#16520). Returns undefined unless Git resolves the path into + * this repo's object store with the expected branch checked out. + */ +export async function describeCreatedWorktree( + repoPath: string, + worktreePath: string, + branch: string, + options: GitWorktreeExecOptions = {} +): Promise { + const expectedRef = `refs/heads/${normalizeLocalBranchRef(branch)}` + // Bound Git recovery after the bounded listing failed; filesystem canonicalization stays best effort. + const deadlined: GitWorktreeExecOptions = { + ...options, + timeout: options.timeout ?? WORKTREE_LIST_TIMEOUT_MS + } + const [created, repoGitCommonDir, checkedOutRef, head] = await Promise.all([ + readRepoLocation(worktreePath, toWslExecutionSpace(worktreePath), deadlined), + readRepoCommonDirFromGit(repoPath, deadlined), + readCheckedOutBranchRef(worktreePath, deadlined), + readWorktreeHeadOid(worktreePath, deadlined) + ]) + // An unreadable HEAD means Git could not confirm the worktree, so report nothing rather than a blank OID. + if (!created || checkedOutRef !== expectedRef || !head) { + return undefined + } + if (!(await isSameRepoCommonDir(created.commonDir, [repoGitCommonDir]))) { + // Only now read the second opinion from disk: a `.git` on a hung mount pins a threadpool thread + // that no deadline can reclaim, so never pay that on the path where Git already agreed. + const repoDiskCommonDir = await readRepoCommonDirFromDisk( + repoPath, + deadlined.timeout ?? WORKTREE_LIST_TIMEOUT_MS + ) + if (!(await isSameRepoCommonDir(created.commonDir, [repoDiskCommonDir]))) { + return undefined + } + } + const [described] = await annotateSparseCheckoutStatus([ + { + path: translateWorktreePath(created.topLevel, repoPath, options), + head, + branch: expectedRef, + isBare: false, + // `git worktree add` only ever produces a linked worktree. + isMainWorktree: false + } + ]) + return described +} diff --git a/src/main/git/worktree-scan-cache.ts b/src/main/git/worktree-scan-cache.ts index 325a8b92d50..9c744afeba8 100644 --- a/src/main/git/worktree-scan-cache.ts +++ b/src/main/git/worktree-scan-cache.ts @@ -50,9 +50,10 @@ export function _resetWorktreeScanCacheForTests(): void { } /** - * Share one in-flight scan per (repo, distro, deadline, generation). `run` decides whether failures - * soften or propagate; both variants must coalesce so a create overlapping a sidebar refresh does - * not spawn a second `git worktree list` (expensive on Windows). + * Share one in-flight scan per (repo, distro, deadline, generation, runner). Coalescing keeps a + * sidebar refresh from spawning a second `git worktree list` (expensive on Windows), but only + * within one failure discipline: a strict joiner must never inherit a lenient scan's softened `[]`, + * so the strict and lenient runners scan separately by design. */ function shareWorktreeScan( repoPath: string, diff --git a/src/main/git/worktree-sparse-state.ts b/src/main/git/worktree-sparse-state.ts index 1cf55fe712f..f8353d43f6a 100644 --- a/src/main/git/worktree-sparse-state.ts +++ b/src/main/git/worktree-sparse-state.ts @@ -29,7 +29,7 @@ export async function detectSparseCheckout(worktreePath: string): Promise { +export async function resolveGitCommonDir(gitDir: string): Promise { try { const raw = (await readFile(join(gitDir, 'commondir'), 'utf-8')).trim() if (raw.length > 0) { diff --git a/src/main/git/worktree.ts b/src/main/git/worktree.ts index 78562787a69..aee68fc0949 100644 --- a/src/main/git/worktree.ts +++ b/src/main/git/worktree.ts @@ -6,7 +6,7 @@ export { } from './worktree-add' export { forceDeleteLocalBranch } from './worktree-branch-removal' export { parseWorktreeList } from './worktree-list-parser' -export { listWorktreeGraph, listWorktreesStrict } from './worktree-listing' +export { describeCreatedWorktree, listWorktreeGraph, listWorktreesStrict } from './worktree-listing' export { moveWorktree } from './worktree-move' export { WORKTREE_ADD_TIMEOUT_MAX_MS, diff --git a/src/main/git/wsl-direct-git-read-commands.test.ts b/src/main/git/wsl-direct-git-read-commands.test.ts index ed8c2458f69..aa0fc9711fe 100644 --- a/src/main/git/wsl-direct-git-read-commands.test.ts +++ b/src/main/git/wsl-direct-git-read-commands.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { isWslDirectGitReadCommand } from './wsl-direct-git-read-commands' +import { classifyGitCommand, isWslDirectGitReadCommand } from './wsl-direct-git-read-commands' describe('isWslDirectGitReadCommand', () => { it.each([ @@ -49,6 +49,8 @@ describe('isWslDirectGitReadCommand', () => { [['symbolic-ref', 'HEAD', 'refs/heads/main']], [['worktree', 'add', '/tmp/wt']], [['branch', '-D', 'feature']], + [['branch', '-r', '-d', 'origin/feature']], + [['branch', '-rd', 'origin/feature']], [['branch', 'newbranch']], [[]] ])('keeps %j on the login shell', (args) => { @@ -89,3 +91,72 @@ describe('isWslDirectGitReadCommand', () => { expect(isWslDirectGitReadCommand(args)).toBe(false) }) }) + +describe('classifyGitCommand', () => { + it.each([ + [['fetch', '--all'], 'network'], + [['pull', '--rebase'], 'network'], + [['push', 'origin', 'main'], 'network'], + [['clone', 'https://example.com/repo.git'], 'network'], + [['ls-remote', '--heads', 'origin'], 'network'], + [['submodule', 'update', '--init'], 'network'], + [['remote', 'update', '--prune'], 'network'], + [['-c', 'maintenance.auto=false', 'fetch', '--all'], 'network'], + [['-C', '/repo', 'status', '--porcelain=v2'], 'read'], + [['status', '--porcelain=v2'], 'read'], + [['branch', '--show-current'], 'read'], + [['branch', '-r', '-d', 'origin/feature'], 'other'], + [['branch', '-rd', 'origin/feature'], 'other'], + [['remote', 'get-url', 'origin'], 'read'], + [['config', '--get-regexp', String.raw`^remote\.`], 'read'], + [['show', '--end-of-options', 'HEAD:file'], 'read'], + [['blame', '--', 'file'], 'read'], + [['submodule', 'status'], 'read'], + [['submodule', 'sync'], 'other'], + [['submodule', 'foreach', 'status'], 'other'], + [['remote', 'show', 'origin'], 'other'], + [['remote', 'add', 'origin', 'url'], 'other'], + [['checkout', 'main'], 'other'], + [['made-up-command'], 'other'], + [[], 'other'], + // Unparsed space-separated global values remain fail-safe. + [['--git-dir', '/repo/.git', 'log'], 'other'], + [['--work-tree', '/repo', 'status'], 'other'], + [['-c', 'key=value'], 'other'] + ] as const)('classifies %j as %s', (args, expected) => { + expect(classifyGitCommand(args)).toBe(expected) + }) + + it.each([ + [['--version'], 'other'], + [['branch', '-a'], 'read'], + [['branch', '--show-current'], 'read'], + [['check-ref-format', '--branch', 'topic'], 'read'], + [['checkout', 'topic'], 'other'], + [['commit', '-m', 'message'], 'other'], + [['config', '--get', 'remote.origin.url'], 'read'], + [['config', '--local', 'key', 'value'], 'other'], + [['diff', '--numstat', 'HEAD'], 'read'], + [['fetch', '--prune'], 'network'], + [['init'], 'other'], + [['ls-files', '-z'], 'read'], + [['ls-tree', 'HEAD'], 'read'], + [['merge', '--abort'], 'other'], + [['merge-base', 'HEAD', 'origin/main'], 'read'], + [['pull', '--rebase'], 'network'], + [['rebase', '--abort'], 'other'], + [['remote'], 'read'], + [['remote', '-v'], 'read'], + [['remote', 'get-url', 'origin'], 'read'], + [['restore', '--staged', '--', 'file'], 'other'], + [['rev-list', '--count', 'HEAD'], 'read'], + [['rev-parse', 'HEAD'], 'read'], + [['show', ':file'], 'read'], + [['status', '--porcelain=v2'], 'read'], + [['update-ref', '-d', 'refs/orca/tmp'], 'other'], + [['worktree', 'list', '--porcelain'], 'read'], + [['worktree', 'prune'], 'other'] + ] as const)('covers the production form %j as %s', (args, expected) => { + expect(classifyGitCommand(args)).toBe(expected) + }) +}) diff --git a/src/main/git/wsl-direct-git-read-commands.ts b/src/main/git/wsl-direct-git-read-commands.ts index 18bea5e46ab..1072ceb2107 100644 --- a/src/main/git/wsl-direct-git-read-commands.ts +++ b/src/main/git/wsl-direct-git-read-commands.ts @@ -16,6 +16,7 @@ const ALWAYS_READ_SUBCOMMANDS = new Set([ 'blame', 'cat-file', + 'check-ref-format', 'check-ignore', 'describe', 'diff', @@ -35,10 +36,52 @@ const ALWAYS_READ_SUBCOMMANDS = new Set([ // Read markers that appear as a flag anywhere after the subcommand. const READ_FLAG_SUBCOMMANDS: Record> = { - branch: new Set(['--list', '-l', '--show-current', '--contains', '--points-at']), + branch: new Set([ + '--list', + '-l', + '--show-current', + '--contains', + '--points-at', + '--all', + '-a', + '--remotes', + '-r' + ]), config: new Set(['--get', '--get-all', '--get-regexp', '--get-urlmatch', '--list', '-l']) } +const BRANCH_MUTATION_FLAGS = new Set([ + '--copy', + '--create-reflog', + '--delete', + '--edit-description', + '--force', + '--move', + '--no-create-reflog', + '--no-track', + '--recurse-submodules', + '--set-upstream-to', + '--track', + '--unset-upstream' +]) +const BRANCH_MUTATION_SHORT_FLAGS = new Set(['c', 'C', 'd', 'D', 'f', 'm', 'M', 't', 'u']) + +function hasBranchMutationFlag(args: readonly string[]): boolean { + return args.some((arg) => { + const flag = arg.split('=')[0] + if (BRANCH_MUTATION_FLAGS.has(flag)) { + return true + } + return ( + /^-[^-]/.test(flag) && + flag + .slice(1) + .split('') + .some((part) => BRANCH_MUTATION_SHORT_FLAGS.has(part)) + ) + }) +} + // Read markers that must be the *first non-flag* argument, i.e. the action. // Position matters here: matching them anywhere would read `worktree remove list` // as a listing, because a worktree may legitimately be named "list". @@ -52,7 +95,7 @@ const READ_ACTION_SUBCOMMANDS: Record> = { const BARE_FORM_IS_READ = new Set(['remote', 'submodule']) /** Leading `-c key=value` / `--git-dir=...` style options precede the subcommand. */ -function findSubcommandIndex(args: readonly string[]): number { +export function findGitSubcommandIndex(args: readonly string[]): number { for (let index = 0; index < args.length; index += 1) { const arg = args[index] if (arg === '-c' || arg === '-C') { @@ -68,7 +111,7 @@ function findSubcommandIndex(args: readonly string[]): number { } export function isWslDirectGitReadCommand(args: readonly string[]): boolean { - const subcommandIndex = findSubcommandIndex(args) + const subcommandIndex = findGitSubcommandIndex(args) if (subcommandIndex === -1) { return false } @@ -86,6 +129,10 @@ export function isWslDirectGitReadCommand(args: readonly string[]): boolean { return rest.filter((arg) => arg !== '--' && !arg.startsWith('-')).length <= 1 } + if (subcommand === 'branch' && hasBranchMutationFlag(rest)) { + return false + } + const readActions = READ_ACTION_SUBCOMMANDS[subcommand] if (readActions) { const action = rest.find((arg) => !arg.startsWith('-')) @@ -103,3 +150,31 @@ export function isWslDirectGitReadCommand(args: readonly string[]): boolean { const readFlags = READ_FLAG_SUBCOMMANDS[subcommand] return Boolean(readFlags && rest.some((arg) => readFlags.has(arg.split('=')[0]))) } + +export type GitCommandClass = 'network' | 'read' | 'other' + +const NETWORK_SUBCOMMANDS = new Set(['fetch', 'pull', 'push', 'clone', 'ls-remote']) + +function positionalAction(args: readonly string[], subcommandIndex: number): string | undefined { + return args.slice(subcommandIndex + 1).find((arg) => !arg.startsWith('-')) +} + +/** Classify only commands whose dominant phase is remote transfer as network work. */ +export function classifyGitCommand(args: readonly string[]): GitCommandClass { + const subcommandIndex = findGitSubcommandIndex(args) + if (subcommandIndex === -1) { + return 'other' + } + const subcommand = args[subcommandIndex] + if (NETWORK_SUBCOMMANDS.has(subcommand)) { + return 'network' + } + const action = positionalAction(args, subcommandIndex) + if ( + (subcommand === 'submodule' && action === 'update') || + (subcommand === 'remote' && action === 'update') + ) { + return 'network' + } + return isWslDirectGitReadCommand(args) ? 'read' : 'other' +} diff --git a/src/main/github/client/lookup/pull-request-lookup-data.ts b/src/main/github/client/lookup/pull-request-lookup-data.ts index 5b23c157672..14e3d92337e 100644 --- a/src/main/github/client/lookup/pull-request-lookup-data.ts +++ b/src/main/github/client/lookup/pull-request-lookup-data.ts @@ -5,6 +5,7 @@ import type { PRReviewDecision } from '../../../../shared/github/pull-request-types' import { gitExecFileAsync } from '../../gh-utils' +import type { GitAdmissionTier } from '../../../git/command-runner/git-exec-options' import { getSshGitProvider, SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE @@ -158,7 +159,7 @@ export function normalizePullRequestLookupData(data: PullRequestLookupData): Pul export async function getCurrentHeadOid( repoPath: string, connectionId?: string | null, - localGitOptions: { wslDistro?: string } = {} + localGitOptions: { wslDistro?: string; admissionTier?: GitAdmissionTier } = {} ): Promise { const provider = connectionId ? getSshGitProvider(connectionId) : null if (connectionId && !provider) { @@ -171,7 +172,8 @@ export async function getCurrentHeadOid( try { const result = await gitExecFileAsync(['rev-parse', 'HEAD'], { cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) }) return result.stdout.trim() || null } catch { diff --git a/src/main/github/client/lookup/tracked-upstream-branch.ts b/src/main/github/client/lookup/tracked-upstream-branch.ts index b13b97b6fed..c66c188d3d0 100644 --- a/src/main/github/client/lookup/tracked-upstream-branch.ts +++ b/src/main/github/client/lookup/tracked-upstream-branch.ts @@ -4,6 +4,7 @@ import { SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE } from '../../../providers/ssh-git-dispatch' import { readLocalGitConfigSignature } from '../../local-git-config-signature' +import type { GitAdmissionTier } from '../../../git/command-runner/git-exec-options' import { TRACKED_UPSTREAM_SNAPSHOT_CACHE_TTL_MS, trackedUpstreamSnapshotCache, @@ -24,7 +25,7 @@ export async function getTrackedUpstreamBranch( repoPath: string, branchName: string, connectionId?: string | null, - localGitOptions: { wslDistro?: string } = {} + localGitOptions: { wslDistro?: string; admissionTier?: GitAdmissionTier } = {} ): Promise { const cacheKey = getTrackedUpstreamBranchCacheKey(repoPath, connectionId, localGitOptions) const now = Date.now() @@ -95,7 +96,7 @@ export async function getTrackedUpstreamBranch( export async function probeTrackedUpstreamSnapshot( repoPath: string, connectionId?: string | null, - localGitOptions: { wslDistro?: string } = {} + localGitOptions: { wslDistro?: string; admissionTier?: GitAdmissionTier } = {} ): Promise { const startingGitConfigSignature = await readLocalGitConfigSignature({ repoPath, @@ -129,7 +130,7 @@ export async function probeTrackedUpstreamSnapshot( export async function probeTrackedUpstreamBranches( repoPath: string, connectionId?: string | null, - localGitOptions: { wslDistro?: string } = {} + localGitOptions: { wslDistro?: string; admissionTier?: GitAdmissionTier } = {} ): Promise<{ probeFailed: boolean upstreamsByBranchName: Map @@ -149,7 +150,8 @@ export async function probeTrackedUpstreamBranches( try { const result = await gitExecFileAsync(args, { cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) }) return { probeFailed: false, diff --git a/src/main/github/conflict-summary.test.ts b/src/main/github/conflict-summary.test.ts index 506b1c9f9ea..36d96407301 100644 --- a/src/main/github/conflict-summary.test.ts +++ b/src/main/github/conflict-summary.test.ts @@ -298,6 +298,26 @@ describe('getPRConflictSummary caching', () => { ).toHaveLength(1) }) + it('preserves background admission across the complete WSL derivation chain', async () => { + mockGitDispatch() + + await getPRConflictSummary('/repo-root', 'main', 'github-base-oid', 'head-oid-1', { + wslDistro: 'Ubuntu', + admissionTier: 'background' + }) + + expect(gitExecFileAsyncMock).toHaveBeenCalledTimes(5) + for (const [, options] of gitExecFileAsyncMock.mock.calls) { + expect(options).toEqual( + expect.objectContaining({ + cwd: '/repo-root', + wslDistro: 'Ubuntu', + admissionTier: 'background' + }) + ) + } + }) + it('keeps identities distinct when paths or ref names contain a joiner character', async () => { mockGitDispatch() diff --git a/src/main/github/conflict-summary.ts b/src/main/github/conflict-summary.ts index b6d19ce1d2a..470f8573367 100644 --- a/src/main/github/conflict-summary.ts +++ b/src/main/github/conflict-summary.ts @@ -4,6 +4,7 @@ import { isUnsupportedMergeTreeWriteTreeError } from '../../shared/git-merge-tree-capability' import { gitExecFileAsync } from '../git/runner' +import { gitOptionsForWorktree, type GitRuntimeOptions } from '../git/git-runtime-options' import { clearGitCapabilityStateForTests, withLocalGitCapabilityCacheForExecution @@ -21,9 +22,7 @@ import { storeCachedSummary } from './conflict-summary-cache' -type LocalGitExecOptions = { - wslDistro?: string -} +type LocalGitExecOptions = Pick export function __resetPRConflictSummaryCachesForTests(): void { clearGitCapabilityStateForTests() @@ -159,9 +158,8 @@ async function resolveLatestBaseOid( // Why: cap the fetch at 10 s so slow or unreachable remotes don't block // the conflict-summary derivation indefinitely. await gitExecFileAsync(['fetch', '--quiet', remoteName, baseRefName], { - cwd: repoPath, - timeout: 10_000, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions), + timeout: 10_000 }) } catch { // Why: fetching the base ref keeps the conflict list aligned with GitHub's @@ -172,8 +170,7 @@ async function resolveLatestBaseOid( for (const ref of [`refs/remotes/${remoteName}/${baseRefName}`, `${remoteName}/${baseRefName}`]) { try { const { stdout } = await gitExecFileAsync(['rev-parse', '--verify', ref], { - cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions) }) const oid = stdout.trim() if (oid) { @@ -194,8 +191,7 @@ async function resolveMergeBase( localGitOptions: LocalGitExecOptions ): Promise { const { stdout } = await gitExecFileAsync(['merge-base', headOid, baseOid], { - cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions) }) return stdout.trim() } @@ -206,8 +202,7 @@ async function countCommits( localGitOptions: LocalGitExecOptions ): Promise { const { stdout } = await gitExecFileAsync(['rev-list', '--count', range], { - cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions) }) return Number.parseInt(stdout.trim(), 10) || 0 } @@ -251,8 +246,7 @@ async function loadConflictingFiles( async () => { try { const result = await gitExecFileAsync(modernArgs, { - cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions) }) return parseMergeTreeNameOnlyOutput(result.stdout) } catch (error) { @@ -288,8 +282,7 @@ async function loadConflictingFilesWithLegacyMergeTree( ): Promise { try { const result = await gitExecFileAsync(legacyArgs, { - cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...gitOptionsForWorktree(repoPath, localGitOptions) }) return parseMergeTreeNameOnlyOutput(result.stdout) } catch (fallbackError) { diff --git a/src/main/github/github-repository-identity.ts b/src/main/github/github-repository-identity.ts index 1c2d875a56a..c601252deda 100644 --- a/src/main/github/github-repository-identity.ts +++ b/src/main/github/github-repository-identity.ts @@ -14,6 +14,7 @@ import { } from './github-remote-identity-parsing' import { classifyGitHubOwnerRepoFromRemoteUrl } from './github-ssh-host-alias-resolution' import { isStableMissingGitRemoteError } from '../git/stable-missing-git-remote-error' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' export type OwnerRepo = GitHubOwnerRepo @@ -24,10 +25,12 @@ export type GitHubRepoContext = { repoPath: string connectionId?: string | null wslDistro?: string + admissionTier?: GitAdmissionTier } export type LocalGitExecOptions = { wslDistro?: string + admissionTier?: GitAdmissionTier } export type GitHubRemoteIdentityProbeOptions = { @@ -42,7 +45,8 @@ export function githubRepoContext( return { repoPath, connectionId: connectionId ?? null, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) } } @@ -50,12 +54,14 @@ export function ghRepoExecOptions(context: GitHubRepoContext): { cwd?: string encoding?: BufferEncoding wslDistro?: string + admissionTier?: GitAdmissionTier } { return context.connectionId ? {} : { cwd: context.repoPath, - ...(context.wslDistro ? { wslDistro: context.wslDistro } : {}) + ...(context.wslDistro ? { wslDistro: context.wslDistro } : {}), + ...(context.admissionTier ? { admissionTier: context.admissionTier } : {}) } } diff --git a/src/main/github/pr-refresh-candidate-policy.ts b/src/main/github/pr-refresh-candidate-policy.ts index e2868edf051..f2edf51c676 100644 --- a/src/main/github/pr-refresh-candidate-policy.ts +++ b/src/main/github/pr-refresh-candidate-policy.ts @@ -25,11 +25,15 @@ function shouldAcceptMergedFallbackPR(candidate: PRBranchLookupCandidate): boole } export function hostedReviewOptionArgs( - candidate: PRBranchLookupCandidate + candidate: PRBranchLookupCandidate, + reason: GitHubPRRefreshReason = 'visible' ): [] | [GitHubPRBranchLookupOptions] { const options: GitHubPRBranchLookupOptions = {} - if (candidate.localGitOptions?.wslDistro) { - options.localGitExecOptions = { wslDistro: candidate.localGitOptions.wslDistro } + options.localGitExecOptions = { + ...(candidate.localGitOptions?.wslDistro + ? { wslDistro: candidate.localGitOptions.wslDistro } + : {}), + admissionTier: admissionTierForRefreshReason(reason) } if (shouldAcceptMergedFallbackPR(candidate)) { options.acceptMergedFallbackPR = true @@ -40,6 +44,12 @@ export function hostedReviewOptionArgs( return Object.keys(options).length > 0 ? [options] : [] } +export function admissionTierForRefreshReason( + reason: GitHubPRRefreshReason +): 'interactive' | 'background' { + return reason === 'manual' ? 'interactive' : 'background' +} + export function refreshKey(candidate: GitHubPRRefreshCandidate): string { const connectionScope = candidate.connectionId ?? 'local' const runtimeScope = candidate.connectionId diff --git a/src/main/github/pr-refresh-coordinator-alias-coalescing.test.ts b/src/main/github/pr-refresh-coordinator-alias-coalescing.test.ts index 78518e659a3..c1f0ccbf76d 100644 --- a/src/main/github/pr-refresh-coordinator-alias-coalescing.test.ts +++ b/src/main/github/pr-refresh-coordinator-alias-coalescing.test.ts @@ -231,7 +231,8 @@ describe('pr-refresh-coordinator', () => { 'feature/test', null, null, - null + null, + { localGitExecOptions: { admissionTier: 'background' } } ) expect(getPRForBranchOutcomeMock).toHaveBeenNthCalledWith( 2, @@ -239,7 +240,8 @@ describe('pr-refresh-coordinator', () => { 'feature/test', null, 'ssh-1', - null + null, + { localGitExecOptions: { admissionTier: 'background' } } ) }) @@ -277,7 +279,8 @@ describe('pr-refresh-coordinator', () => { 'feature/test', null, null, - null + null, + { localGitExecOptions: { admissionTier: 'background' } } ) expect(getPRForBranchOutcomeMock).toHaveBeenNthCalledWith( 2, @@ -286,7 +289,7 @@ describe('pr-refresh-coordinator', () => { null, null, null, - { localGitExecOptions: { wslDistro: 'Ubuntu' } } + { localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'background' } } ) }) diff --git a/src/main/github/pr-refresh-coordinator-refresh-events.test.ts b/src/main/github/pr-refresh-coordinator-refresh-events.test.ts index 45a026dabbd..76745cf4789 100644 --- a/src/main/github/pr-refresh-coordinator-refresh-events.test.ts +++ b/src/main/github/pr-refresh-coordinator-refresh-events.test.ts @@ -207,7 +207,29 @@ describe('pr-refresh-coordinator', () => { null, null, 12, - { acceptMergedFallbackPR: true } + { + acceptMergedFallbackPR: true, + localGitExecOptions: { admissionTier: 'interactive' } + } + ) + }) + + it('preserves an automatic fallback reason and keeps its git work background', async () => { + const { refreshPRNow } = await import('./pr-refresh-coordinator') + getPRForBranchOutcomeMock.mockResolvedValueOnce({ kind: 'no-pr', fetchedAt: Date.now() }) + + await refreshPRNow(makeCandidate(), 'swr') + + expect(getPRForBranchOutcomeMock).toHaveBeenCalledWith( + '/repo', + 'feature/test', + null, + null, + null, + { localGitExecOptions: { admissionTier: 'background' } } + ) + expect(sendMock.mock.calls.map(([, event]) => event.reason)).toEqual( + expect.arrayContaining(['swr']) ) }) }) diff --git a/src/main/github/pr-refresh-coordinator.ts b/src/main/github/pr-refresh-coordinator.ts index 22846cbe17c..d2976079b2a 100644 --- a/src/main/github/pr-refresh-coordinator.ts +++ b/src/main/github/pr-refresh-coordinator.ts @@ -112,7 +112,10 @@ export function _getPRRefreshAliasCountForTests(key: string): number { return queue.aliasCount(key) } -export async function refreshPRNow(candidate: GitHubPRRefreshCandidate): Promise { +export async function refreshPRNow( + candidate: GitHubPRRefreshCandidate, + reason: GitHubPRRefreshReason = 'manual' +): Promise { const alias = aliasFromCandidate(candidate) const key = refreshKey(candidate) const existing = queue.get(key) @@ -128,7 +131,7 @@ export async function refreshPRNow(candidate: GitHubPRRefreshCandidate): Promise message: `Cannot refresh PR for this worktree: ${skippedReason}`, fetchedAt: Date.now() } - events.broadcast({ aliases: [alias], reason: 'manual', status: 'skipped', skippedReason }) + events.broadcast({ aliases: [alias], reason, status: 'skipped', skippedReason }) return outcome } @@ -139,14 +142,14 @@ export async function refreshPRNow(candidate: GitHubPRRefreshCandidate): Promise key, candidate, aliases: aliasMap, - reason: 'manual', + reason, priority: 40, dueAt: gateUntil, queuedAt: queue.nextOrder() }) events.broadcast({ aliases, - reason: 'manual', + reason, status: 'paused', pausedUntil: gateUntil, skippedReason: 'rate-limit' @@ -165,17 +168,14 @@ export async function refreshPRNow(candidate: GitHubPRRefreshCandidate): Promise queue.delete(key) const requestSequence = events.nextSequence() const requestStartedAt = Date.now() - events.broadcast( - { aliases, reason: 'manual', status: 'in-flight', requestStartedAt }, - requestSequence - ) + events.broadcast({ aliases, reason, status: 'in-flight', requestStartedAt }, requestSequence) const outcome = await getPRForBranchOutcome( candidate.repoPath, candidate.branch, candidate.linkedPRNumber ?? null, candidate.connectionId ?? null, candidate.linkedPRNumber == null ? (candidate.fallbackPRNumber ?? null) : null, - ...hostedReviewOptionArgs(candidate) + ...hostedReviewOptionArgs(candidate, reason) ) let plannedRetryAt: number | undefined let broadcastOutcome = outcome @@ -186,12 +186,14 @@ export async function refreshPRNow(candidate: GitHubPRRefreshCandidate): Promise events.observe(candidate, outcome) retry.noteManualGate(key, broadcastOutcome) events.broadcast( - { aliases, reason: 'manual', outcome: broadcastOutcome, requestStartedAt }, + { aliases, reason, outcome: broadcastOutcome, requestStartedAt }, requestSequence ) drainer.scheduleVisibleFollowUp(key, candidate, outcome, 40, aliases, undefined, { plannedRetryAt, - pendingMergeabilityDelayMs: MANUAL_MERGEABILITY_PENDING_REFRESH_MS + ...(reason === 'manual' + ? { pendingMergeabilityDelayMs: MANUAL_MERGEABILITY_PENDING_REFRESH_MS } + : {}) }) return broadcastOutcome } diff --git a/src/main/github/pr-refresh-queue-drainer.ts b/src/main/github/pr-refresh-queue-drainer.ts index d1e37492e32..387c4931868 100644 --- a/src/main/github/pr-refresh-queue-drainer.ts +++ b/src/main/github/pr-refresh-queue-drainer.ts @@ -193,7 +193,7 @@ export class PRRefreshQueueDrainer { next.candidate.linkedPRNumber ?? null, next.candidate.connectionId ?? null, next.candidate.linkedPRNumber == null ? (next.candidate.fallbackPRNumber ?? null) : null, - ...hostedReviewOptionArgs(next.candidate) + ...hostedReviewOptionArgs(next.candidate, next.reason) ) let plannedRetryAt: number | undefined let broadcastOutcome = outcome diff --git a/src/main/gitlab/gitlab-known-host-probe.ts b/src/main/gitlab/gitlab-known-host-probe.ts index 577baf9ad67..237c2ffeb90 100644 --- a/src/main/gitlab/gitlab-known-host-probe.ts +++ b/src/main/gitlab/gitlab-known-host-probe.ts @@ -3,9 +3,11 @@ import { NEGATIVE_ENTRY_TTL_MS } from '../git/remote-ref-probe-cache' import { glabExecFileAsync } from '../git/runner' import { getSshGitProviderGeneration } from '../providers/ssh-git-dispatch' import { DEFAULT_GITLAB_HOSTS, normalizeGitLabHost } from './project-ref-parser' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' export type LocalGitExecOptions = { wslDistro?: string + admissionTier?: GitAdmissionTier } const GLAB_KNOWN_HOSTS_TIMEOUT_MS = 10_000 @@ -150,7 +152,8 @@ async function probeGlabKnownHosts( timeout: GLAB_KNOWN_HOSTS_TIMEOUT_MS, ...(!connectionId && localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } - : {}) + : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) }) const hosts = parseGlabAuthStatusHosts(`${stdout}\n${stderr}`) const remembered = knownHostsCacheByExecutionContext.get(key) ?? [] diff --git a/src/main/gitlab/gitlab-project-ref-resolution.ts b/src/main/gitlab/gitlab-project-ref-resolution.ts index 96186f1ccf2..b64e8c3f44c 100644 --- a/src/main/gitlab/gitlab-project-ref-resolution.ts +++ b/src/main/gitlab/gitlab-project-ref-resolution.ts @@ -1,4 +1,5 @@ import { glabExecFileAsync } from '../git/runner' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' import { isTransientGitProbeError, readRemoteUrl } from '../git/remote-url-probe' import { NEGATIVE_ENTRY_TTL_MS } from '../git/remote-ref-probe-cache' import { getSshGitProviderGeneration } from '../providers/ssh-git-dispatch' @@ -123,7 +124,8 @@ async function resolveProjectRefForRemote( { repoPath, connectionId, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) }, remoteName ) @@ -246,12 +248,13 @@ export function glabRepoExecOptions( repoPath: string, connectionId?: string | null, localGitOptions: LocalGitExecOptions = {} -): { cwd?: string; wslDistro?: string } { +): { cwd?: string; wslDistro?: string; admissionTier?: GitAdmissionTier } { return connectionId ? {} : { cwd: repoPath, - ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}) + ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier ? { admissionTier: localGitOptions.admissionTier } : {}) } } diff --git a/src/main/gitlab/gl-utils.test.ts b/src/main/gitlab/gl-utils.test.ts index 6387455483b..22e0a15f21f 100644 --- a/src/main/gitlab/gl-utils.test.ts +++ b/src/main/gitlab/gl-utils.test.ts @@ -663,6 +663,21 @@ describe('getGlabKnownHosts', () => { expect(glabExecFileAsyncMock).toHaveBeenCalledWith(['auth', 'status'], { timeout: 10_000 }) }) + it('preserves WSL and background admission on the cold auth-status probe', async () => { + glabExecFileAsyncMock.mockResolvedValueOnce({ stdout: '', stderr: '' }) + + await getGlabKnownHosts(undefined, { + wslDistro: 'Ubuntu', + admissionTier: 'background' + }) + + expect(glabExecFileAsyncMock).toHaveBeenCalledWith(['auth', 'status'], { + timeout: 10_000, + wslDistro: 'Ubuntu', + admissionTier: 'background' + }) + }) + it('falls back to default when glab auth status fails', async () => { glabExecFileAsyncMock.mockRejectedValueOnce(new Error('glab not authenticated')) diff --git a/src/main/ipc/created-worktree-reconciliation.test.ts b/src/main/ipc/created-worktree-reconciliation.test.ts index a135e24c642..22912394d84 100644 --- a/src/main/ipc/created-worktree-reconciliation.test.ts +++ b/src/main/ipc/created-worktree-reconciliation.test.ts @@ -1,5 +1,20 @@ -import { describe, expect, it } from 'vitest' -import { findCreatedWorktree } from './created-worktree-reconciliation' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { describeCreatedWorktree, listWorktreesSharedStrict } from '../git/worktree' +import { findCreatedWorktree, resolveCreatedWorktree } from './created-worktree-reconciliation' + +vi.mock('../git/worktree', () => ({ + listWorktreesSharedStrict: vi.fn(), + describeCreatedWorktree: vi.fn() +})) + +const CREATED = { + path: '/workspaces/feature', + head: 'abc123', + branch: 'refs/heads/feature', + isBare: false, + isMainWorktree: false +} +const MAIN = { ...CREATED, path: '/repo', branch: 'refs/heads/main', isMainWorktree: true } describe('findCreatedWorktree', () => { it('prefers the direct path match', () => { @@ -81,3 +96,105 @@ describe('findCreatedWorktree', () => { } ) }) + +describe('resolveCreatedWorktree', () => { + beforeEach(() => { + vi.mocked(listWorktreesSharedStrict).mockReset() + vi.mocked(describeCreatedWorktree).mockReset().mockResolvedValue(undefined) + }) + + it('reports the whole listing when it contains the created row', async () => { + vi.mocked(listWorktreesSharedStrict).mockResolvedValue([MAIN, CREATED]) + + await expect( + resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature') + ).resolves.toEqual({ created: CREATED, worktrees: [MAIN, CREATED], listingComplete: true }) + expect(describeCreatedWorktree).not.toHaveBeenCalled() + }) + + it('completes the create from the direct read when the listing fails', async () => { + vi.mocked(listWorktreesSharedStrict).mockRejectedValue(new Error('git timed out.')) + vi.mocked(describeCreatedWorktree).mockResolvedValue(CREATED) + + await expect( + resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature') + ).resolves.toEqual({ created: CREATED, worktrees: [], listingComplete: false }) + }) + + it('completes the create from the direct read when the listing omits the row', async () => { + vi.mocked(listWorktreesSharedStrict).mockResolvedValue([MAIN]) + vi.mocked(describeCreatedWorktree).mockResolvedValue(CREATED) + + await expect( + resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature') + ).resolves.toMatchObject({ created: CREATED, listingComplete: false }) + }) + + it("surfaces the listing's own failure rather than an opaque message", async () => { + const failure = new Error('fatal: not a git repository') + vi.mocked(listWorktreesSharedStrict).mockRejectedValue(failure) + + await expect(resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature')).rejects.toBe( + failure + ) + }) + + it('keeps the listing failure when the direct read itself throws', async () => { + const failure = new Error('fatal: not a git repository') + vi.mocked(listWorktreesSharedStrict).mockRejectedValue(failure) + vi.mocked(describeCreatedWorktree).mockRejectedValue(new Error('rev-parse exploded')) + + await expect(resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature')).rejects.toBe( + failure + ) + }) + + it('names the path and branch when the listing succeeded without the row', async () => { + vi.mocked(listWorktreesSharedStrict).mockResolvedValue([MAIN]) + + await expect(resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature')).rejects.toThrow( + 'Worktree created but not found in listing: /workspaces/feature (branch feature)' + ) + }) + + it("adds the direct read's failure when the listing merely omitted the row", async () => { + vi.mocked(listWorktreesSharedStrict).mockResolvedValue([MAIN]) + vi.mocked(describeCreatedWorktree).mockRejectedValue(new Error('rev-parse exploded')) + + await expect(resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature')).rejects.toThrow( + 'Worktree created but not found in listing: /workspaces/feature (branch feature): rev-parse exploded' + ) + }) + + it('charges the recovery what the listing left of the budget, not a fresh one', async () => { + vi.mocked(listWorktreesSharedStrict).mockImplementation(async () => { + await new Promise((resolve) => setTimeout(resolve, 60)) + throw new Error('git worktree list timed out.') + }) + vi.mocked(describeCreatedWorktree).mockResolvedValue(CREATED) + + await resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature') + + const options = vi.mocked(describeCreatedWorktree).mock.lastCall?.[3] + expect(options?.timeout).toBeGreaterThanOrEqual(5_000) + expect(options?.timeout).toBeLessThan(30_000) + }) + + it("keeps the caller's own deadline instead of the shared budget", async () => { + vi.mocked(listWorktreesSharedStrict).mockRejectedValue(new Error('git worktree list failed.')) + vi.mocked(describeCreatedWorktree).mockResolvedValue(CREATED) + + await resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature', { timeout: 1_234 }) + + expect(vi.mocked(describeCreatedWorktree).mock.lastCall?.[3]).toMatchObject({ timeout: 1_234 }) + }) + + it('forwards exec options only when the caller supplied them', async () => { + vi.mocked(listWorktreesSharedStrict).mockResolvedValue([CREATED]) + await resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature') + expect(listWorktreesSharedStrict).toHaveBeenLastCalledWith('/repo') + + await resolveCreatedWorktree('/repo', '/workspaces/feature', 'feature', { wslDistro: 'Ubuntu' }) + expect(listWorktreesSharedStrict).toHaveBeenLastCalledWith('/repo', { wslDistro: 'Ubuntu' }) + }) +}) diff --git a/src/main/ipc/created-worktree-reconciliation.ts b/src/main/ipc/created-worktree-reconciliation.ts index 5642fdeb4c7..0f9b5cdbdb1 100644 --- a/src/main/ipc/created-worktree-reconciliation.ts +++ b/src/main/ipc/created-worktree-reconciliation.ts @@ -1,3 +1,8 @@ +import { describeCreatedWorktree, listWorktreesSharedStrict } from '../git/worktree' +// Not via the worktree barrel: suites mock that module wholesale and would blank the constant. +import { WORKTREE_LIST_TIMEOUT_MS } from '../git/worktree-operation-options' +import type { GitWorktreeExecOptions } from '../git/worktree' +import type { GitWorktreeInfo } from '../../shared/worktree/types' import { areWorktreePathsEqual } from './worktree-path-comparison' export function findCreatedWorktree( @@ -15,3 +20,81 @@ export function findCreatedWorktree return worktrees.find((worktree) => worktree.branch === `refs/heads/${branchName}`) } + +export type CreatedWorktreeResolution = { + created: GitWorktreeInfo + /** Rows `git worktree list` returned; empty when only the direct read found the worktree. */ + worktrees: readonly GitWorktreeInfo[] + /** Whether `worktrees` is the repo's whole listing, and so usable as its authorized-root set. */ + listingComplete: boolean +} + +/** `created but not found in listing` is load-bearing for `classifyWorkspaceCreateError`. */ +export function createdWorktreeNotFoundError(worktreePath: string, branchName: string): Error { + return new Error( + `Worktree created but not found in listing: ${worktreePath} (branch ${branchName})` + ) +} + +/** + * Find the row for a worktree `git worktree add` just created, preferring the repo listing and + * falling back to asking Git about the worktree itself. + * + * Why the fallback: the listing was the only witness the old code had, so any Git-level listing + * failure failed a create whose worktree and branch were already on disk, orphaning both (#16520). + */ +/** A listing that burned the whole budget still leaves the direct read a chance to answer. */ +const MIN_CREATED_WORKTREE_RECOVERY_MS = 5_000 + +export async function resolveCreatedWorktree( + repoPath: string, + worktreePath: string, + branchName: string, + options?: GitWorktreeExecOptions +): Promise { + const startedAt = Date.now() + let listingError: unknown + try { + const worktrees = options + ? await listWorktreesSharedStrict(repoPath, options) + : await listWorktreesSharedStrict(repoPath) + const created = findCreatedWorktree(worktrees, worktreePath, branchName) + if (created) { + return { created, worktrees, listingComplete: true } + } + } catch (err) { + listingError = err + } + + let described: GitWorktreeInfo | undefined + let describeError: unknown + try { + // One budget for verifying the create, not one per attempt: a hung Git already spent the + // listing's deadline, and charging the recovery a fresh one doubles the wait before the error. + const remainingMs = Math.max( + WORKTREE_LIST_TIMEOUT_MS - (Date.now() - startedAt), + MIN_CREATED_WORKTREE_RECOVERY_MS + ) + described = await describeCreatedWorktree(repoPath, worktreePath, branchName, { + ...options, + timeout: options?.timeout ?? remainingMs + }) + } catch (err) { + // Why keep, not rethrow: the recovery must not replace the listing's own, more informative failure. + describeError = err + } + if (described) { + return { created: described, worktrees: [], listingComplete: false } + } + if (listingError) { + throw listingError + } + const notFound = createdWorktreeNotFoundError(worktreePath, branchName) + if (describeError) { + // The listing simply omitted the row, so the direct read holds the only actionable failure. + throw new Error( + `${notFound.message}: ${describeError instanceof Error ? describeError.message : String(describeError)}` + ) + } + throw notFound +} diff --git a/src/main/ipc/created-worktree-root-prune.test.ts b/src/main/ipc/created-worktree-root-prune.test.ts new file mode 100644 index 00000000000..9114e34a07c --- /dev/null +++ b/src/main/ipc/created-worktree-root-prune.test.ts @@ -0,0 +1,123 @@ +import type * as NodeFsPromises from 'node:fs/promises' +import { resolve } from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type * as RepoWorktrees from '../repo-worktrees' +import { listRepoWorktrees } from '../repo-worktrees' +import type { Store } from '../persistence' +import type { Repo } from '../../shared/repo-types' +import { + __resetCreatedWorktreeRootsForTests, + invalidateAuthorizedRootsCache, + rebuildAuthorizedRootsCache, + registerCreatedWorktreeRoot, + resolveRegisteredWorktreePath +} from './registered-worktree-roots-cache' + +const { statMock } = vi.hoisted(() => ({ statMock: vi.fn() })) + +vi.mock('node:fs/promises', async () => { + const actual = await vi.importActual('node:fs/promises') + return { ...actual, stat: statMock } +}) + +vi.mock('../repo-worktrees', async () => { + const actual = await vi.importActual('../repo-worktrees') + return { ...actual, listRepoWorktrees: vi.fn() } +}) + +const repo: Repo = { + id: 'repo-1', + path: '/repos/app', + displayName: 'app', + badgeColor: '#000000', + addedAt: 1, + kind: 'git' +} + +const RECOVERED = resolve('/linked/recovered') + +function makeStore(): Store { + return { + getRepos: () => [repo], + getProjectGroups: () => [], + getFolderWorkspaces: () => [], + getSettings: () => ({}) + } as unknown as Store +} + +function statError(code: string): NodeJS.ErrnoException { + const error = new Error(code) as NodeJS.ErrnoException + error.code = code + return error +} + +/** A recovered root outlives a rebuild unless the rebuild proves it is listed again or gone (#16520). */ +describe('recovered worktree root pruning', () => { + beforeEach(() => { + invalidateAuthorizedRootsCache() + __resetCreatedWorktreeRootsForTests() + vi.mocked(listRepoWorktrees).mockReset() + // The #16520 outage itself: `listWorktrees` softens every Git failure to `[]`, so the rebuild + // reports success with the recovered row missing and the probe is the only remaining evidence. + vi.mocked(listRepoWorktrees).mockResolvedValue([]) + statMock.mockReset() + statMock.mockResolvedValue({}) + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('retires a recovered root the probe proves is gone', async () => { + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, RECOVERED) + statMock.mockRejectedValue(statError('ENOENT')) + + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath(RECOVERED, store)).rejects.toThrow('Access denied') + }) + + it('keeps a recovered root when the probe fails for any reason but ENOENT', async () => { + // A transient EACCES/EIO is not evidence of removal, and revoking on it would deny a worktree + // the user is working in. + for (const code of ['EACCES', 'EIO', 'EPERM']) { + __resetCreatedWorktreeRootsForTests() + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, RECOVERED) + statMock.mockRejectedValue(statError(code)) + + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath(RECOVERED, store)).resolves.toBe(RECOVERED) + } + }) + + it('finishes the rebuild and keeps the root when the probe never settles', async () => { + // A dead mount pins the syscall; the rebuild gates filesystem auth, so it must not wait on it. + vi.useFakeTimers() + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, RECOVERED) + statMock.mockReturnValue(new Promise(() => {})) + + const rebuild = rebuildAuthorizedRootsCache(store) + await vi.advanceTimersByTimeAsync(5_000) + await rebuild + vi.useRealTimers() + + await expect(resolveRegisteredWorktreePath(RECOVERED, store)).resolves.toBe(RECOVERED) + }) + + it('refuses a recovered root at capacity instead of evicting an authorized one', async () => { + const store = makeStore() + const first = resolve('/linked/recovered-0') + for (let i = 0; i < 64; i += 1) { + registerCreatedWorktreeRoot(store, repo.id, resolve(`/linked/recovered-${i}`)) + } + const overflow = resolve('/linked/recovered-overflow') + registerCreatedWorktreeRoot(store, repo.id, overflow) + + await expect(resolveRegisteredWorktreePath(first, store)).resolves.toBe(first) + await expect(resolveRegisteredWorktreePath(overflow, store)).rejects.toThrow('Access denied') + }) +}) diff --git a/src/main/ipc/filesystem-auth.test.ts b/src/main/ipc/filesystem-auth.test.ts index 32e2e054927..41c2c44a634 100644 --- a/src/main/ipc/filesystem-auth.test.ts +++ b/src/main/ipc/filesystem-auth.test.ts @@ -18,8 +18,10 @@ import { } from './filesystem-auth' import { isDescendantOrEqual, validateGitRelativeFilePath } from './filesystem-path-containment' import { + __resetCreatedWorktreeRootsForTests, invalidateAuthorizedRootsCache, rebuildAuthorizedRootsCache, + registerCreatedWorktreeRoot, resolveRegisteredWorktreePath } from './registered-worktree-roots-cache' @@ -95,6 +97,7 @@ function makeStore( describe('filesystem auth worktree roots', () => { beforeEach(() => { invalidateAuthorizedRootsCache() + __resetCreatedWorktreeRootsForTests() vi.mocked(listRepoWorktrees).mockReset() }) @@ -121,6 +124,79 @@ describe('filesystem auth worktree roots', () => { expect(listRepoWorktrees).toHaveBeenCalledTimes(1) }) + it("keeps a repo's roots when its listing fails mid-rebuild", async () => { + // Why: the rebuild runs while Git is still broken, and dropping the roots would revoke + // a worktree a create just recovered without a listing (#16520). + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, '/linked/recovered') + vi.mocked(listRepoWorktrees).mockRejectedValue(new Error('git worktree list failed.')) + + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath('/linked/recovered', store)).resolves.toBe( + resolve('/linked/recovered') + ) + }) + + it('keeps a recovered root when a healthy rebuild still cannot list it', async () => { + // Why: the rebuild recomputes from the very listing that omitted the row, so replacing the cache + // would re-deny the worktree the create just recovered (#16520). + const scratch = await mkdtemp(join(await realpath(tmpdir()), 'orca-recovered-')) + const recovered = join(scratch, 'feature') + await mkdir(recovered) + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, recovered) + vi.mocked(listRepoWorktrees).mockResolvedValue([]) + + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath(recovered, store)).resolves.toBe(resolve(recovered)) + await rm(scratch, { recursive: true, force: true }) + }) + + it('survives a rebuild that was already in flight when the create recovered', async () => { + const scratch = await mkdtemp(join(await realpath(tmpdir()), 'orca-recovered-race-')) + const recovered = join(scratch, 'feature') + await mkdir(recovered) + const store = makeStore() + // Register mid-listing: the rebuild's own result was computed before this worktree existed. + vi.mocked(listRepoWorktrees).mockImplementation(async () => { + registerCreatedWorktreeRoot(store, repo.id, recovered) + return [] + }) + + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath(recovered, store)).resolves.toBe(resolve(recovered)) + await rm(scratch, { recursive: true, force: true }) + }) + + it('retires a recovered root once the listing can see it again', async () => { + const store = makeStore() + registerCreatedWorktreeRoot(store, repo.id, '/linked/feature') + vi.mocked(listRepoWorktrees).mockResolvedValue([ + { + path: '/linked/feature', + head: '', + branch: 'refs/heads/feature', + isBare: false, + isMainWorktree: false + } + ]) + + await rebuildAuthorizedRootsCache(store) + // Still authorized, but now from the listing itself; a later listing that drops it is authoritative. + await expect(resolveRegisteredWorktreePath('/linked/feature', store)).resolves.toBe( + resolve('/linked/feature') + ) + vi.mocked(listRepoWorktrees).mockResolvedValue([]) + await rebuildAuthorizedRootsCache(store) + + await expect(resolveRegisteredWorktreePath('/linked/feature', store)).rejects.toThrow( + 'Access denied' + ) + }) + it('bounds concurrent repo probes while rebuilding authorized roots', async () => { const repos = Array.from({ length: 20 }, (_, index) => ({ ...repo, diff --git a/src/main/ipc/filesystem-branch-compare-diff.test.ts b/src/main/ipc/filesystem-branch-compare-diff.test.ts index e7aff1b0e5e..bb0669ec697 100644 --- a/src/main/ipc/filesystem-branch-compare-diff.test.ts +++ b/src/main/ipc/filesystem-branch-compare-diff.test.ts @@ -90,10 +90,13 @@ describe('registerFilesystemHandlers', () => { await handlers.get('git:branchCompare')!(null, { worktreePath: WORKTREE_FEATURE_PATH, - baseRef: 'origin/main' + baseRef: 'origin/main', + admissionTier: 'background' }) - expect(getBranchCompareMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, 'origin/main', {}) + expect(getBranchCompareMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, 'origin/main', { + admissionTier: 'background' + }) }) it('allows git operations on worktrees outside repo/workspace roots', async () => { @@ -242,7 +245,7 @@ describe('registerFilesystemHandlers', () => { filePath: path.join('src', 'file.ts'), oldPath: path.join('src', 'old-file.ts') }, - {} + { admissionTier: 'interactive' } ) }) diff --git a/src/main/ipc/filesystem-commit-message-generation.test.ts b/src/main/ipc/filesystem-commit-message-generation.test.ts index 591ea3565f9..8719c8d0f71 100644 --- a/src/main/ipc/filesystem-commit-message-generation.test.ts +++ b/src/main/ipc/filesystem-commit-message-generation.test.ts @@ -96,7 +96,9 @@ describe('registerFilesystemHandlers', () => { }) ).resolves.toEqual({ success: true, message: 'Update README' }) - expect(getStagedCommitContextMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, {}) + expect(getStagedCommitContextMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'interactive' + }) expect(generateCommitMessageFromContextMock).toHaveBeenCalledWith(context, params, { kind: 'local', cwd: WORKTREE_FEATURE_PATH @@ -253,6 +255,7 @@ describe('registerFilesystemHandlers', () => { }) expect(getStagedCommitContextMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'interactive', wslDistro: 'Ubuntu' }) expect(prepareForCodexLaunch).toHaveBeenCalledWith({ diff --git a/src/main/ipc/filesystem-git-commit-dispatch.test.ts b/src/main/ipc/filesystem-git-commit-dispatch.test.ts index 0f683936bd7..66b728b49a2 100644 --- a/src/main/ipc/filesystem-git-commit-dispatch.test.ts +++ b/src/main/ipc/filesystem-git-commit-dispatch.test.ts @@ -80,7 +80,9 @@ describe('registerFilesystemHandlers', () => { }) ).resolves.toEqual({ success: true }) - expect(commitChangesMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, 'feat: ship commit', {}) + expect(commitChangesMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, 'feat: ship commit', { + admissionTier: 'interactive' + }) }) it('returns local commit hook failure payload from git:commit', async () => { diff --git a/src/main/ipc/filesystem-git-status-staging.test.ts b/src/main/ipc/filesystem-git-status-staging.test.ts index 4f3a62ce679..5cc1b4e9540 100644 --- a/src/main/ipc/filesystem-git-status-staging.test.ts +++ b/src/main/ipc/filesystem-git-status-staging.test.ts @@ -94,11 +94,9 @@ describe('registerFilesystemHandlers', () => { // Why: validateGitRelativeFilePath uses path.relative() which produces // platform-specific separators (backslashes on Windows). - expect(stageFileMock).toHaveBeenCalledWith( - WORKTREE_FEATURE_PATH, - path.join('src', 'file.ts'), - {} - ) + expect(stageFileMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, path.join('src', 'file.ts'), { + admissionTier: 'interactive' + }) }) it('uses worktree roots seeded by worktrees:list without rebuilding the cache', async () => { @@ -111,7 +109,10 @@ describe('registerFilesystemHandlers', () => { expect(listWorktreesMock).not.toHaveBeenCalled() expect(realpathMock).not.toHaveBeenCalledWith(WORKTREE_FEATURE_PATH) - expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { includeIgnored: false }) + expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', + includeIgnored: false + }) }) it('passes configured shared links through the local status path', async () => { @@ -135,6 +136,7 @@ describe('registerFilesystemHandlers', () => { await handlers.get('git:status')!(null, { worktreePath: WORKTREE_FEATURE_PATH }) expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', includeIgnored: false, sharedLinkPaths: ['node_modules'] }) @@ -149,7 +151,10 @@ describe('registerFilesystemHandlers', () => { expect(listWorktreesMock).not.toHaveBeenCalled() expect(realpathMock).not.toHaveBeenCalledWith(REPO_PATH) - expect(getStatusMock).toHaveBeenCalledWith(REPO_PATH, { includeIgnored: false }) + expect(getStatusMock).toHaveBeenCalledWith(REPO_PATH, { + admissionTier: 'status', + includeIgnored: false + }) }) it('forwards includeIgnored through local and SSH git status IPC', async () => { @@ -172,8 +177,14 @@ describe('registerFilesystemHandlers', () => { includeIgnored: true }) - expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { includeIgnored: true }) - expect(sshProvider.getStatus).toHaveBeenCalledWith('/remote/repo', { includeIgnored: true }) + expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', + includeIgnored: true + }) + expect(sshProvider.getStatus).toHaveBeenCalledWith('/remote/repo', { + admissionTier: 'status', + includeIgnored: true + }) }) it('returns capped-state metadata unchanged across local and SSH status IPC', async () => { @@ -221,10 +232,12 @@ describe('registerFilesystemHandlers', () => { }) expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', includeIgnored: false, bypassEffectiveUpstreamNegativeCache: true }) expect(sshProvider.getStatus).toHaveBeenCalledWith('/remote/repo', { + admissionTier: 'status', includeIgnored: false, bypassEffectiveUpstreamNegativeCache: true }) @@ -250,15 +263,48 @@ describe('registerFilesystemHandlers', () => { }) expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', includeIgnored: false, reuseLineStats: true }) expect(sshProvider.getStatus).toHaveBeenCalledWith('/remote/repo', { + admissionTier: 'status', includeIgnored: false, reuseLineStats: true }) }) + it('forwards a false line-stats request through local and SSH git status IPC', async () => { + registerWorktreeRootsForRepo(store as never, 'repo-1', [REPO_PATH, WORKTREE_FEATURE_PATH]) + getStatusMock.mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) + const sshProvider = { + getStatus: vi.fn().mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) + } + getSshGitProviderMock.mockReturnValue(sshProvider) + registerFilesystemHandlers(store as never) + + await handlers.get('git:status')!(null, { + worktreePath: WORKTREE_FEATURE_PATH, + includeLineStats: false + }) + await handlers.get('git:status')!(null, { + worktreePath: '/remote/repo', + connectionId: 'ssh-1', + includeLineStats: false + }) + + expect(getStatusMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'status', + includeIgnored: false, + includeLineStats: false + }) + expect(sshProvider.getStatus).toHaveBeenCalledWith('/remote/repo', { + admissionTier: 'status', + includeIgnored: false, + includeLineStats: false + }) + }) + it('aborts tokenized local status without crossing renderer boundaries', async () => { registerWorktreeRootsForRepo(store as never, 'repo-1', [REPO_PATH, WORKTREE_FEATURE_PATH]) const statusSignals: AbortSignal[] = [] @@ -346,7 +392,9 @@ describe('registerFilesystemHandlers', () => { connectionId: 'ssh-1' }) - expect(abortMergeMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, {}) + expect(abortMergeMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'interactive' + }) expect(sshProvider.abortMerge).toHaveBeenCalledWith('/remote/repo') }) @@ -366,7 +414,9 @@ describe('registerFilesystemHandlers', () => { connectionId: 'ssh-1' }) - expect(abortRebaseMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, {}) + expect(abortRebaseMock).toHaveBeenCalledWith(WORKTREE_FEATURE_PATH, { + admissionTier: 'interactive' + }) expect(sshProvider.abortRebase).toHaveBeenCalledWith('/remote/repo') }) @@ -410,7 +460,7 @@ describe('registerFilesystemHandlers', () => { expect(bulkStageFilesMock).toHaveBeenCalledWith( WORKTREE_FEATURE_PATH, [path.join('src', 'file.ts'), path.join('nested', 'child.ts')], - {} + { admissionTier: 'interactive' } ) }) @@ -427,7 +477,7 @@ describe('registerFilesystemHandlers', () => { expect(bulkDiscardChangesMock).toHaveBeenCalledWith( WORKTREE_FEATURE_PATH, [path.join('src', 'file.ts'), path.join('nested', 'child.ts')], - {} + { admissionTier: 'interactive' } ) }) diff --git a/src/main/ipc/filesystem-list-files-git-directory-expansion.test.ts b/src/main/ipc/filesystem-list-files-git-directory-expansion.test.ts index 5d7507a5615..8d3601d5baa 100644 --- a/src/main/ipc/filesystem-list-files-git-directory-expansion.test.ts +++ b/src/main/ipc/filesystem-list-files-git-directory-expansion.test.ts @@ -60,7 +60,7 @@ describe('main Quick Open git directory expansion', () => { .mockResolvedValueOnce(primary) .mockResolvedValueOnce(ignored) - const promise = listFilesWithGit(root, [], {}) + const promise = listFilesWithGit(root, [], { wslDistro: 'Ubuntu' }) await vi.waitFor(() => expect(gitSpawnMock).toHaveBeenCalledTimes(1)) await vi.waitFor(() => expect(revParse.listenerCount('close')).toBeGreaterThan(0)) revParse.emit('close', 0, null) @@ -78,6 +78,12 @@ describe('main Quick Open git directory expansion', () => { 'scratch/notes.txt', 'src/index.ts' ]) + expect(gitSpawnMock.mock.calls[1][1]).toEqual( + expect.objectContaining({ admissionTier: 'interactive', wslDistro: 'Ubuntu' }) + ) + expect(gitSpawnMock.mock.calls[2][1]).toEqual( + expect.objectContaining({ admissionTier: 'interactive', wslDistro: 'Ubuntu' }) + ) expect(gitSpawnMock.mock.calls[2][0]).toContain('--directory') }) diff --git a/src/main/ipc/filesystem-list-files-git-fallback.ts b/src/main/ipc/filesystem-list-files-git-fallback.ts index bebab27808d..28cee2a4d50 100644 --- a/src/main/ipc/filesystem-list-files-git-fallback.ts +++ b/src/main/ipc/filesystem-list-files-git-fallback.ts @@ -132,6 +132,7 @@ export async function listFilesWithGit( // rootPath and use the output directly — no prefix stripping needed. const child = await gitSpawnAfterWindowsEnvironmentReady(['ls-files', ...args], { cwd: rootPath, + admissionTier: 'interactive', ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), signal: scanController.signal, stdio: ['ignore', 'pipe', 'pipe'] diff --git a/src/main/ipc/filesystem-list-files.test.ts b/src/main/ipc/filesystem-list-files.test.ts index 4ad492ec10a..b1b06bd2d16 100644 --- a/src/main/ipc/filesystem-list-files.test.ts +++ b/src/main/ipc/filesystem-list-files.test.ts @@ -37,6 +37,7 @@ import { EventEmitter } from 'node:events' import type { Store } from '../persistence' import type { ChildProcess } from 'node:child_process' import { FileListingCancelledError } from '../../shared/file-listing-cancellation' +import { _gitAdmissionSnapshotForTests } from '../git/command-runner/git-subprocess-admission' const SHA1 = '0123456789abcdef0123456789abcdef01234567' @@ -603,6 +604,7 @@ describe('filesystem-list-files', () => { await expect(promise).resolves.toEqual(['src/kept.ts']) expect(primary.kill).toHaveBeenCalled() + primary.emit('close', null, 'SIGTERM') }) it('git fallback applies hidden dir blocklist', async () => { @@ -695,6 +697,15 @@ describe('filesystem-list-files', () => { expect(gitP2.kill).toHaveBeenCalled() expect((gitP1.stdout as unknown as EventEmitter).listenerCount('data')).toBe(0) expect((gitP1.stderr as unknown as EventEmitter).listenerCount('data')).toBe(0) + // Admission retains live children after the listing listeners detach. + const admittedBeforeClose = _gitAdmissionSnapshotForTests().budgets.general?.baseUsed + expect(gitP1.listenerCount('error')).toBe(1) + expect(gitP1.listenerCount('close')).toBe(1) + gitP1.emit('close', null, 'SIGKILL') + gitP2.emit('close', null, 'SIGKILL') + + expect(admittedBeforeClose).toBe(2) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) expect(gitP1.listenerCount('error')).toBe(0) expect(gitP1.listenerCount('close')).toBe(0) } finally { @@ -748,6 +759,10 @@ describe('filesystem-list-files', () => { ) expect(gitP2.kill).toHaveBeenCalled() expect(warnSpy).toHaveBeenCalled() + const admittedBeforeClose = _gitAdmissionSnapshotForTests().budgets.general?.baseUsed + gitP2.emit('close', null, 'SIGKILL') + expect(admittedBeforeClose).toBe(1) + expect(_gitAdmissionSnapshotForTests().budgets.general?.baseUsed).toBe(0) } finally { vi.useRealTimers() warnSpy.mockRestore() diff --git a/src/main/ipc/filesystem-search-git.test.ts b/src/main/ipc/filesystem-search-git.test.ts index ae73b0aa2e2..7de098199f6 100644 --- a/src/main/ipc/filesystem-search-git.test.ts +++ b/src/main/ipc/filesystem-search-git.test.ts @@ -1,15 +1,11 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' -const { spawnMock } = vi.hoisted(() => ({ - spawnMock: vi.fn() +const { gitSpawnMock } = vi.hoisted(() => ({ + gitSpawnMock: vi.fn() })) -vi.mock('child_process', () => ({ - spawn: spawnMock, - // runner.ts imports these from child_process; stubs prevent - // "missing export" errors when the mock is resolved transitively. - execFile: vi.fn(), - execFileSync: vi.fn() +vi.mock('../git/runner', () => ({ + gitSpawnAfterWindowsEnvironmentReady: gitSpawnMock })) import { searchWithGitGrep } from './filesystem-search-git' @@ -36,7 +32,7 @@ describe('filesystem-search-git', () => { it('parses git grep output and finds matches', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'hello', rootPath: '/mock/root' }, 100) @@ -74,7 +70,7 @@ describe('filesystem-search-git', () => { it('finds multiple matches per line', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'ab', rootPath: '/mock/root' }, 100) @@ -97,7 +93,7 @@ describe('filesystem-search-git', () => { it('respects maxResults and sets truncated', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'x', rootPath: '/mock/root' }, 2) @@ -118,26 +114,30 @@ describe('filesystem-search-git', () => { it('passes correct flags for case-insensitive fixed-string search', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep( '/mock/root', { query: 'test', rootPath: '/mock/root', caseSensitive: false, useRegex: false }, - 100 + 100, + { wslDistro: 'Ubuntu' } ) setTimeout(() => proc.emit('close'), 10) await promise - const gitArgs = spawnMock.mock.calls[0][1] as string[] + const gitArgs = gitSpawnMock.mock.calls[0][0] as string[] expect(gitArgs).toContain('-i') expect(gitArgs).toContain('--fixed-strings') expect(gitArgs).not.toContain('--extended-regexp') + expect(gitSpawnMock.mock.calls[0][1]).toEqual( + expect.objectContaining({ admissionTier: 'interactive', wslDistro: 'Ubuntu' }) + ) }) it('passes correct flags for regex whole-word search', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep( '/mock/root', @@ -154,7 +154,7 @@ describe('filesystem-search-git', () => { setTimeout(() => proc.emit('close'), 10) await promise - const gitArgs = spawnMock.mock.calls[0][1] as string[] + const gitArgs = gitSpawnMock.mock.calls[0][0] as string[] expect(gitArgs).toContain('-w') expect(gitArgs).toContain('--extended-regexp') expect(gitArgs).not.toContain('-i') @@ -163,7 +163,7 @@ describe('filesystem-search-git', () => { it('returns empty result when git grep spawn fails', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'test', rootPath: '/mock/root' }, 100) @@ -180,7 +180,7 @@ describe('filesystem-search-git', () => { try { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'ok', rootPath: '/mock/root' }, 100) @@ -207,7 +207,7 @@ describe('filesystem-search-git', () => { it('skips lines without null separator', async () => { const proc = createMockProcess() - spawnMock.mockReturnValue(proc) + gitSpawnMock.mockReturnValue(proc) const promise = searchWithGitGrep('/mock/root', { query: 'ok', rootPath: '/mock/root' }, 100) diff --git a/src/main/ipc/filesystem-search-git.ts b/src/main/ipc/filesystem-search-git.ts index 0bff6336f66..da54799cad1 100644 --- a/src/main/ipc/filesystem-search-git.ts +++ b/src/main/ipc/filesystem-search-git.ts @@ -32,6 +32,7 @@ export async function searchWithGitGrep( const gitArgs = buildGitGrepArgs(args.query, args) const child = await gitSpawnAfterWindowsEnvironmentReady(gitArgs, { cwd: rootPath, + admissionTier: 'interactive', ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), stdio: ['ignore', 'pipe', 'pipe'] }) diff --git a/src/main/ipc/filesystem.ts b/src/main/ipc/filesystem.ts index 0ad3825a7fc..8f59aa00be7 100644 --- a/src/main/ipc/filesystem.ts +++ b/src/main/ipc/filesystem.ts @@ -28,6 +28,7 @@ import type { Repo } from '../../shared/repo-types' import type { TuiAgent } from '../../shared/tui-agent' import type { GitPushTarget } from '../../shared/worktree/types' import type { GitHistoryOptions, GitHistoryResult } from '../../shared/git-history' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' import type { SshMutationExpectation } from '../../shared/ssh-types' import { sortDirEntries } from '../../shared/file-name-sort' import { assertSshMutationExpectation } from '../ssh/ssh-connection-generation' @@ -1177,7 +1178,9 @@ export function registerFilesystemHandlers( args: { worktreePath: string connectionId?: string + admissionTier?: GitAdmissionTier includeIgnored?: boolean + includeLineStats?: boolean bypassEffectiveUpstreamNegativeCache?: boolean reuseLineStats?: boolean branchLineTotalMergeBase?: string @@ -1187,6 +1190,8 @@ export function registerFilesystemHandlers( const controller = gitStatusCancellations.begin(event, args.requestToken) const options = { includeIgnored: args.includeIgnored ?? false, + admissionTier: args.admissionTier ?? ('status' as const), + ...(args.includeLineStats === false ? { includeLineStats: false } : {}), ...(args.reuseLineStats === true ? { reuseLineStats: true } : {}), ...(args.branchLineTotalMergeBase === undefined ? {} @@ -1370,7 +1375,7 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await abortMerge(worktreePath, gitOptions) + await abortMerge(worktreePath, { ...gitOptions, admissionTier: 'interactive' }) } ) @@ -1390,7 +1395,7 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await abortRebase(worktreePath, gitOptions) + await abortRebase(worktreePath, { ...gitOptions, admissionTier: 'interactive' }) } ) @@ -1425,7 +1430,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - return getDiff(worktreePath, filePath, args.staged, args.compareAgainstHead, gitOptions) + return getDiff(worktreePath, filePath, args.staged, args.compareAgainstHead, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -1452,7 +1460,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - return commitChanges(worktreePath, args.message, gitOptions) + return commitChanges(worktreePath, args.message, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -1532,7 +1543,10 @@ export function registerFilesystemHandlers( ) let context try { - context = await getStagedCommitContext(worktreePath, gitOptions) + context = await getStagedCommitContext(worktreePath, { + ...gitOptions, + admissionTier: 'interactive' + }) } catch (error) { console.error('[filesystem] Failed to read staged commit context:', error) return { @@ -1822,14 +1836,23 @@ export function registerFilesystemHandlers( 'git:branchCompare', async ( _event, - args: { worktreePath: string; baseRef: string; connectionId?: string } + args: { + worktreePath: string + baseRef: string + connectionId?: string + admissionTier?: GitAdmissionTier + } ): Promise => { if (args.connectionId) { const provider = getSshGitProvider(args.connectionId) if (!provider) { throw new Error(SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE) } - return provider.getBranchCompare(args.worktreePath, args.baseRef) + return args.admissionTier + ? provider.getBranchCompare(args.worktreePath, args.baseRef, { + admissionTier: args.admissionTier + }) + : provider.getBranchCompare(args.worktreePath, args.baseRef) } const worktreePath = await resolveRegisteredWorktreePath(args.worktreePath, store) const gitOptions = getLocalGitOptionsForRegisteredWorktree( @@ -1837,7 +1860,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - return getBranchCompare(worktreePath, args.baseRef, gitOptions) + return getBranchCompare(worktreePath, args.baseRef, { + ...gitOptions, + ...(args.admissionTier ? { admissionTier: args.admissionTier } : {}) + }) } ) @@ -1914,9 +1940,15 @@ export function registerFilesystemHandlers( worktreePath ) if (args.pushTarget) { - await validateGitPushTarget(worktreePath, args.pushTarget, gitOptions) + await validateGitPushTarget(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } - await gitFetch(worktreePath, args.pushTarget, gitOptions) + await gitFetch(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -1946,7 +1978,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - return gitSyncForkDefaultBranch(worktreePath, expectedUpstream, gitOptions) + return gitSyncForkDefaultBranch(worktreePath, expectedUpstream, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -1983,11 +2018,15 @@ export function registerFilesystemHandlers( worktreePath ) if (args.pushTarget) { - await validateGitPushTarget(worktreePath, args.pushTarget, gitOptions) + await validateGitPushTarget(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } await gitPush(worktreePath, publish, args.pushTarget, { forceWithLease: args.forceWithLease === true, - ...gitOptions + ...gitOptions, + admissionTier: 'interactive' }) } ) @@ -2015,9 +2054,15 @@ export function registerFilesystemHandlers( worktreePath ) if (args.pushTarget) { - await validateGitPushTarget(worktreePath, args.pushTarget, gitOptions) + await validateGitPushTarget(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } - await gitPull(worktreePath, args.pushTarget, gitOptions) + await gitPull(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2044,9 +2089,15 @@ export function registerFilesystemHandlers( worktreePath ) if (args.pushTarget) { - await validateGitPushTarget(worktreePath, args.pushTarget, gitOptions) + await validateGitPushTarget(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } - await gitFastForward(worktreePath, args.pushTarget, gitOptions) + await gitFastForward(worktreePath, args.pushTarget, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2069,7 +2120,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await gitPullRebaseFromBase(worktreePath, args.baseRef, gitOptions) + await gitPullRebaseFromBase(worktreePath, args.baseRef, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2129,7 +2183,7 @@ export function registerFilesystemHandlers( filePath, oldPath }, - gitOptions + { ...gitOptions, admissionTier: 'interactive' } ) } ) @@ -2179,7 +2233,7 @@ export function registerFilesystemHandlers( filePath, oldPath }, - gitOptions + { ...gitOptions, admissionTier: 'interactive' } ) } ) @@ -2204,7 +2258,7 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await stageFile(worktreePath, filePath, gitOptions) + await stageFile(worktreePath, filePath, { ...gitOptions, admissionTier: 'interactive' }) } ) @@ -2228,7 +2282,7 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await unstageFile(worktreePath, filePath, gitOptions) + await unstageFile(worktreePath, filePath, { ...gitOptions, admissionTier: 'interactive' }) } ) @@ -2252,7 +2306,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await discardChanges(worktreePath, filePath, gitOptions) + await discardChanges(worktreePath, filePath, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2276,7 +2333,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await bulkDiscardChanges(worktreePath, filePaths, gitOptions) + await bulkDiscardChanges(worktreePath, filePaths, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2300,7 +2360,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await bulkStageFiles(worktreePath, filePaths, gitOptions) + await bulkStageFiles(worktreePath, filePaths, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) @@ -2324,7 +2387,10 @@ export function registerFilesystemHandlers( args.worktreePath, worktreePath ) - await bulkUnstageFiles(worktreePath, filePaths, gitOptions) + await bulkUnstageFiles(worktreePath, filePaths, { + ...gitOptions, + admissionTier: 'interactive' + }) } ) diff --git a/src/main/ipc/github-pr-refresh-handlers.ts b/src/main/ipc/github-pr-refresh-handlers.ts index ab4dc74ec7d..11b76fa6545 100644 --- a/src/main/ipc/github-pr-refresh-handlers.ts +++ b/src/main/ipc/github-pr-refresh-handlers.ts @@ -106,10 +106,14 @@ export function registerGitHubPRRefreshHandlers(store: Store, stats: StatsCollec ipcMain.handle( 'gh:refreshPRNow', - async (_event, args: { candidate: GitHubPRRefreshCandidate }) => { + async ( + _event, + args: { candidate: GitHubPRRefreshCandidate; reason?: GitHubPRRefreshReason } + ) => { const repo = assertRegisteredGitHubRepo(args.candidate, store) const outcome = await refreshPRNow( - applyRegisteredRepoToPRRefreshCandidate(store, repo, args.candidate) + applyRegisteredRepoToPRRefreshCandidate(store, repo, args.candidate), + args.reason ) recordPRIfNeeded(repo, outcome) return outcome diff --git a/src/main/ipc/hosted-review.test.ts b/src/main/ipc/hosted-review.test.ts index c22e9bbfe26..7cad33211d6 100644 --- a/src/main/ipc/hosted-review.test.ts +++ b/src/main/ipc/hosted-review.test.ts @@ -171,7 +171,7 @@ describe('registerHostedReviewHandlers', () => { title: 'Feature PR' }), null, - { localGitExecOptions: { wslDistro: 'Ubuntu' } } + { localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } } ) }) @@ -212,7 +212,10 @@ describe('registerHostedReviewHandlers', () => { resolvedWorktreePath, expect.anything(), null, - { sharedLinkPaths: ['node_modules'] } + { + localGitExecOptions: { admissionTier: 'interactive' }, + sharedLinkPaths: ['node_modules'] + } ) }) @@ -236,7 +239,9 @@ describe('registerHostedReviewHandlers', () => { title: 'Feature PR' }) - expect(createHostedReviewMock).toHaveBeenCalledWith(worktreePath, expect.anything(), 'ssh-1') + expect(createHostedReviewMock).toHaveBeenCalledWith(worktreePath, expect.anything(), 'ssh-1', { + localGitExecOptions: { admissionTier: 'interactive' } + }) }) it('routes local WSL project review status through main-process runtime options', async () => { @@ -289,7 +294,7 @@ describe('registerHostedReviewHandlers', () => { connectionId: undefined, branch: 'feature/wsl', linkedGitHubPR: 42, - localGitExecOptions: { wslDistro: 'Ubuntu' } + localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'background' } }) ) // Card-list polling is the O(N) tier and must not claim the fast one. @@ -314,6 +319,25 @@ describe('registerHostedReviewHandlers', () => { ) }) + it('uses interactive git admission for an explicit card refresh', async () => { + getHostedReviewForBranchMock.mockResolvedValueOnce(null) + registerHostedReviewHandlers(store as never, stats as never) + + await handlers['hostedReview:forBranch'](null, { + repoPath, + repoId: repo.id, + branch: 'feature/refresh', + admissionTier: 'interactive' + }) + + expect(getHostedReviewForBranchMock).toHaveBeenCalledWith( + expect.objectContaining({ + branch: 'feature/refresh', + localGitExecOptions: { admissionTier: 'interactive' } + }) + ) + }) + it('uses the explicit owner when duplicate repos share an id and path', async () => { const localRepo = { ...repo, connectionId: undefined } store.getRepos.mockReturnValue([localRepo, repo]) @@ -411,7 +435,8 @@ describe('registerHostedReviewHandlers', () => { body: null, draft: false }, - 'ssh-1' + 'ssh-1', + { localGitExecOptions: { admissionTier: 'interactive' } } ) expect(resolveRegisteredWorktreePathMock).not.toHaveBeenCalled() expect(stats.record).toHaveBeenCalledWith( @@ -447,7 +472,7 @@ describe('registerHostedReviewHandlers', () => { worktreePath, expect.objectContaining({ base: 'stack/parent', head: 'stack/child' }), 'ssh-1', - {} + { localGitExecOptions: { admissionTier: 'interactive' } } ) expect(createHostedReviewMock).not.toHaveBeenCalled() }) diff --git a/src/main/ipc/hosted-review.ts b/src/main/ipc/hosted-review.ts index 8bd9b7cce91..c431459f4f7 100644 --- a/src/main/ipc/hosted-review.ts +++ b/src/main/ipc/hosted-review.ts @@ -103,7 +103,10 @@ function normalizeRemoteHostedReviewPath(remotePath: string): string { export function registerHostedReviewHandlers(store: Store, stats: StatsCollector): void { ipcMain.handle('hostedReview:forBranch', async (_event, args: HostedReviewForBranchArgs) => { const repo = assertRegisteredRepoForBranch(args, store) - const localGitOptions = getLocalProjectWorktreeGitOptions(store, repo) + const localGitOptions = { + ...getLocalProjectWorktreeGitOptions(store, repo), + admissionTier: args.admissionTier ?? ('background' as const) + } const review = await getHostedReviewForBranch({ repoPath: repo.path, connectionId: repo.connectionId, @@ -116,7 +119,7 @@ export function registerHostedReviewHandlers(store: Store, stats: StatsCollector linkedGiteaPR: args.linkedGiteaPR ?? null, currentHeadOid: args.currentHeadOid ?? null, ...(args.active === true ? { active: true } : {}), - ...(Object.keys(localGitOptions).length > 0 ? { localGitExecOptions: localGitOptions } : {}) + localGitExecOptions: localGitOptions }) if (review?.provider === 'github' && !stats.hasCountedPR(review.url)) { stats.record({ @@ -139,7 +142,7 @@ export function registerHostedReviewHandlers(store: Store, stats: StatsCollector ...args, repoPath: worktreePath, connectionId: repo.connectionId ?? null, - ...(Object.keys(localGitOptions).length > 0 ? { localGitExecOptions: localGitOptions } : {}) + localGitExecOptions: { ...localGitOptions, admissionTier: 'interactive' as const } }) } ) @@ -147,7 +150,10 @@ export function registerHostedReviewHandlers(store: Store, stats: StatsCollector ipcMain.handle('hostedReview:create', async (_event, args: CreateHostedReviewArgs) => { const repo = assertRegisteredRepo(args.repoPath, store, args.repoId) const worktreePath = await resolveHostedReviewWorktreePath(repo, store, args.worktreePath) - const localGitOptions = getLocalProjectWorktreeGitOptions(store, repo) + const localGitOptions = { + ...getLocalProjectWorktreeGitOptions(store, repo), + admissionTier: 'interactive' as const + } // Why: the dirty preflight must not count Orca's own shared symlinks as user work (issue #10451). // Remote creation never materializes them, and `repo.path` is a path on the // remote host — reading it locally would resolve an unrelated `orca.yaml`. @@ -190,7 +196,10 @@ export function registerHostedReviewHandlers(store: Store, stats: StatsCollector async (_event, args: CreateStackedHostedReviewArgs) => { const repo = assertRegisteredRepo(args.repoPath, store, args.repoId) const worktreePath = await resolveHostedReviewWorktreePath(repo, store, args.worktreePath) - const localGitOptions = getLocalProjectWorktreeGitOptions(store, repo) + const localGitOptions = { + ...getLocalProjectWorktreeGitOptions(store, repo), + admissionTier: 'interactive' as const + } const sharedLinkPaths = repo.connectionId ? [] : getWorktreeSharedLinkPaths(repo) const executionOptions = { ...(Object.keys(localGitOptions).length > 0 diff --git a/src/main/ipc/registered-worktree-roots-cache.ts b/src/main/ipc/registered-worktree-roots-cache.ts index 92ae4fc334f..9e1d20733df 100644 --- a/src/main/ipc/registered-worktree-roots-cache.ts +++ b/src/main/ipc/registered-worktree-roots-cache.ts @@ -1,4 +1,7 @@ +import { stat } from 'node:fs/promises' import { resolve } from 'node:path' +import { withTimeout } from '../../shared/promise-timeout-fallback' +import { getErrorCode } from '../git/worktree-operation-options' import type { Store } from '../persistence' import { isRepoRoot, listRepoWorktrees } from '../repo-worktrees' import { getLocalRepos } from './filesystem-allowed-roots' @@ -6,6 +9,18 @@ import { isDescendantOrEqual, normalizeExistingPath } from './filesystem-path-co const registeredWorktreeRoots = new Set() const registeredWorktreeRootsByRepo = new Map>() +/** + * Roots Git confirmed by direct read while `git worktree list` could not see them. + * + * Why a layer of its own: everything in `registeredWorktreeRootsByRepo` is derived from the listing, + * so a rebuild recomputes it from the very listing that failed and would re-deny a worktree the + * create just recovered. This layer survives rebuilds and is pruned only on evidence (#16520). + */ +const createdWorktreeRootsByRepo = new Map>() +/** A recovered create is rare (Git's listing must be broken); cap the layer so it can never grow unbounded. */ +const CREATED_WORKTREE_ROOTS_MAX = 64 +/** The prune runs inside filesystem-auth resolution, so a hung mount must not stall it. */ +const CREATED_WORKTREE_ROOT_PROBE_TIMEOUT_MS = 1_000 const registeredWorktreeRootRepoIds = new Set() const registeredWorktreeRootsRevisionByRepo = new Map() let registeredWorktreeRootsRevisionSequence = 0 @@ -20,6 +35,9 @@ export function invalidateAuthorizedRootsCache(): void { registeredWorktreeRoots.clear() registeredWorktreeRootsByRepo.clear() registeredWorktreeRootRepoIds.clear() + // The recovered layer is deliberately not cleared: repo mutations are frequent, and dropping it here + // would re-deny a recovered worktree every time an unrelated repo is added or removed. + refreshRegisteredWorktreeRoots() registeredWorktreeRootsBaseRevision = ++registeredWorktreeRootsRevisionSequence registeredWorktreeRootsRevisionByRepo.clear() } @@ -42,10 +60,12 @@ export async function rebuildAuthorizedRootsCache(store: Store): Promise { } catch (error) { // Why: one inaccessible repo (EACCES/EIO) must not break the whole rebuild and disable File Explorer/Quick Open for the rest; skip it. console.warn(`[filesystem-auth] skipping repo ${repo.path} during cache rebuild:`, error) + return { repoId: repo.id, roots, listingFailed: true } } - return { repoId: repo.id, roots } + return { repoId: repo.id, roots, listingFailed: false } } ) + await pruneCreatedWorktreeRoots(perProjectResults, new Set(repos.map((repo) => repo.id))) registeredWorktreeRoots.clear() registeredWorktreeRootsByRepo.clear() @@ -59,11 +79,73 @@ export async function rebuildAuthorizedRootsCache(store: Store): Promise { registeredWorktreeRootsByRepo.set(repoId, normalizedRoots) registeredWorktreeRootRepoIds.add(repoId) } + for (const roots of createdWorktreeRootsByRepo.values()) { + for (const root of roots) { + registeredWorktreeRoots.add(root) + } + } registeredWorktreeRootsDirty = false registeredWorktreeRootsBaseRevision = ++registeredWorktreeRootsRevisionSequence registeredWorktreeRootsRevisionByRepo.clear() } +/** + * Retire recovered roots on evidence: the listing can see the worktree again, or it is gone from disk. + * + * Nothing is retired for want of evidence. A repo whose listing threw is left untouched, and so is a + * root whose probe hangs or errors for any reason but ENOENT — a dead mount fails the listing and the + * probe alike, and pruning on that would revoke the worktree in the very outage this layer exists for. + */ +async function pruneCreatedWorktreeRoots( + results: readonly { repoId: string; roots: string[]; listingFailed: boolean }[], + localRepoIds: Set +): Promise { + const listedByRepo = new Map( + results.filter((result) => !result.listingFailed).map((r) => [r.repoId, new Set(r.roots)]) + ) + const probes: Promise[] = [] + for (const [repoId, roots] of createdWorktreeRootsByRepo) { + if (!localRepoIds.has(repoId)) { + createdWorktreeRootsByRepo.delete(repoId) + continue + } + const listed = listedByRepo.get(repoId) + if (!listed) { + continue + } + for (const root of roots) { + if (listed.has(root)) { + roots.delete(root) + continue + } + // Probe in parallel: a repo may hold up to CREATED_WORKTREE_ROOTS_MAX roots, and serial + // timeouts would multiply into a rebuild stall of their own. + probes.push( + isRootGoneFromDisk(root).then((gone) => { + if (gone) { + roots.delete(root) + } + }) + ) + } + } + await Promise.all(probes) + for (const [repoId, roots] of createdWorktreeRootsByRepo) { + if (roots.size === 0) { + createdWorktreeRootsByRepo.delete(repoId) + } + } +} + +/** Only a definitive ENOENT counts as removal; the timeout unblocks the rebuild but cannot cancel the syscall. */ +async function isRootGoneFromDisk(targetPath: string): Promise { + const probe = stat(targetPath).then( + () => false, + (error: unknown) => getErrorCode(error) === 'ENOENT' + ) + return withTimeout(probe, CREATED_WORKTREE_ROOT_PROBE_TIMEOUT_MS, false) +} + async function mapWithConcurrency( items: readonly T[], maxConcurrent: number, @@ -114,6 +196,45 @@ export function registerWorktreeRootsForRepo( registeredWorktreeRootsDirty = !allLocalRepoRootsRegistered(localRepoIds) } +/** + * Authorize one worktree root that Git confirmed by direct read but could not list. + * + * Why not `registerWorktreeRootsForRepo`: that replaces the repo's set, and a create recovered without + * a listing has no full set to put there. The root goes in the recovered layer instead, so the next + * rebuild cannot drop it while Git's listing is still broken (#16520). + */ +export function registerCreatedWorktreeRoot( + store: Store, + repoId: string, + worktreeRoot: string +): void { + const localRepoIds = new Set(getLocalRepos(store).map((repo) => repo.id)) + if (!localRepoIds.has(repoId)) { + return + } + const roots = createdWorktreeRootsByRepo.get(repoId) ?? new Set() + const root = resolve(worktreeRoot) + if (!roots.has(root) && roots.size >= CREATED_WORKTREE_ROOTS_MAX) { + // Refuse rather than evict: dropping an already-authorized root denies a worktree the user is + // using, while declining this one only leaves the new create as unauthorized as it is today. + console.warn( + `[filesystem-auth] recovered-root layer full for repo ${repoId}; not authorizing ${root}` + ) + return + } + roots.add(root) + createdWorktreeRootsByRepo.set(repoId, roots) + registeredWorktreeRootsRevisionByRepo.set(repoId, ++registeredWorktreeRootsRevisionSequence) + refreshRegisteredWorktreeRoots() + registeredWorktreeRootsDirty = true +} + +/** The recovered layer outlives cache invalidation by design, so suites need an explicit reset. */ +export function __resetCreatedWorktreeRootsForTests(): void { + createdWorktreeRootsByRepo.clear() + refreshRegisteredWorktreeRoots() +} + export function getRegisteredWorktreeRootsRevision(repoId: string): number { return registeredWorktreeRootsRevisionByRepo.get(repoId) ?? registeredWorktreeRootsBaseRevision } @@ -168,9 +289,11 @@ export async function resolveRegisteredWorktreePath( function refreshRegisteredWorktreeRoots(): void { registeredWorktreeRoots.clear() - for (const roots of registeredWorktreeRootsByRepo.values()) { - for (const root of roots) { - registeredWorktreeRoots.add(root) + for (const byRepo of [registeredWorktreeRootsByRepo, createdWorktreeRootsByRepo]) { + for (const roots of byRepo.values()) { + for (const root of roots) { + registeredWorktreeRoots.add(root) + } } } } diff --git a/src/main/ipc/repos-local-clone-lifecycle.test.ts b/src/main/ipc/repos-local-clone-lifecycle.test.ts index b6f851590ba..395bfec8001 100644 --- a/src/main/ipc/repos-local-clone-lifecycle.test.ts +++ b/src/main/ipc/repos-local-clone-lifecycle.test.ts @@ -249,6 +249,7 @@ describe('repos:add + repos:clone', () => { expect(gitSpawnMock).toHaveBeenCalledWith( ['clone', '--progress', '--', 'https://example.com/orca.git', join(destination, 'orca')], expect.objectContaining({ + admissionTier: 'interactive', env: expect.objectContaining({ GIT_TERMINAL_PROMPT: '0', GCM_INTERACTIVE: 'never' diff --git a/src/main/ipc/repos/repo-clone-lifecycle.ts b/src/main/ipc/repos/repo-clone-lifecycle.ts index 19ce962057b..920c231aa7b 100644 --- a/src/main/ipc/repos/repo-clone-lifecycle.ts +++ b/src/main/ipc/repos/repo-clone-lifecycle.ts @@ -145,6 +145,7 @@ export function registerRepoCloneHandlers(mainWindow: BrowserWindow, store: Stor ['clone', '--progress', '--', args.url, clonePath], { cwd: args.destination, + admissionTier: 'interactive', // Why: without this, an auth-needing clone pops Git Credential Manager's OAuth window on Windows, unclosable in a restricted env (issue #7652). env: nonInteractiveGitEnv(), signal: pendingController.signal, diff --git a/src/main/ipc/workspace-cleanup-git-evidence.ts b/src/main/ipc/workspace-cleanup-git-evidence.ts index a54829c7c25..401c296b1f9 100644 --- a/src/main/ipc/workspace-cleanup-git-evidence.ts +++ b/src/main/ipc/workspace-cleanup-git-evidence.ts @@ -45,8 +45,9 @@ export async function readWorkspaceCleanupGitEvidence( status = await withWorkspaceCleanupTimeout( (signal) => repo.connectionId - ? provider!.getStatus(worktree.path, { signal }) + ? provider!.getStatus(worktree.path, { includeLineStats: false, signal }) : getStatus(worktree.path, { + includeLineStats: false, signal, ...(sharedLinkPaths.length > 0 ? { sharedLinkPaths } : {}) }), diff --git a/src/main/ipc/workspace-cleanup.test.ts b/src/main/ipc/workspace-cleanup.test.ts index 1bc9d8740b3..9b616acc3c4 100644 --- a/src/main/ipc/workspace-cleanup.test.ts +++ b/src/main/ipc/workspace-cleanup.test.ts @@ -197,6 +197,7 @@ describe('workspace cleanup scan', () => { const result = await scanWorkspaceCleanup(makeStore()) expect(getStatusMock).toHaveBeenCalledWith('/repo-feature', { + includeLineStats: false, signal: expect.any(AbortSignal), sharedLinkPaths: ['node_modules'] }) @@ -456,6 +457,7 @@ describe('workspace cleanup scan', () => { signal: expect.any(AbortSignal) }) expect(provider.getStatus).toHaveBeenCalledWith('/remote/repo-feature', { + includeLineStats: false, signal: expect.any(AbortSignal) }) expect(result.errors).toEqual([]) diff --git a/src/main/ipc/worktree-remote.ts b/src/main/ipc/worktree-remote.ts index 66234738128..edda8ebbbce 100644 --- a/src/main/ipc/worktree-remote.ts +++ b/src/main/ipc/worktree-remote.ts @@ -90,7 +90,7 @@ import { shouldSetDisplayName, mergeWorktree } from './worktree-logic' -import { findCreatedWorktree } from './created-worktree-reconciliation' +import { resolveCreatedWorktree } from './created-worktree-reconciliation' import type { BranchPrefixSettings } from '../../shared/branch-prefix' import { getRepoIdFromWorktreeId } from '../../shared/worktree/id' import { parseWorkspaceKey, worktreeWorkspaceKey } from '../../shared/workspace-scope' @@ -108,7 +108,10 @@ import { prepareWorktreePushTargetWithExec } from './worktree-push-target-setup' import { isENOENT } from './filesystem-path-containment' -import { registerWorktreeRootsForRepo } from './registered-worktree-roots-cache' +import { + registerCreatedWorktreeRoot, + registerWorktreeRootsForRepo +} from './registered-worktree-roots-cache' import { createWorktreeCopiedPaths, createWorktreeLinkedPaths, @@ -2512,16 +2515,18 @@ export async function createLocalWorktree( } // Re-list to get the freshly created worktree info - const gitWorktrees = await timing.time('list_created_worktree', async () => - hasLocalWorktreeGitOptions - ? listWorktrees(repo.path, localWorktreeGitOptions) - : listWorktrees(repo.path) + const { + created, + worktrees: gitWorktrees, + listingComplete + } = await timing.time('list_created_worktree', async () => + resolveCreatedWorktree( + repo.path, + worktreePath, + branchName, + hasLocalWorktreeGitOptions ? localWorktreeGitOptions : undefined + ) ) - // Why: Git may canonicalize a symlinked create path; its exact branch identifies the listed row. - const created = findCreatedWorktree(gitWorktrees, worktreePath, branchName) - if (!created) { - throw new Error('Worktree created but not found in listing') - } const worktreeId = `${repo.id}::${created.path}` const now = Date.now() @@ -2596,10 +2601,18 @@ export async function createLocalWorktree( now ) // Why: reuse the roots creation already paid for via `git worktree list` so later IPC doesn't lazily rescan and trip macOS privacy prompts. - registerWorktreeRootsForRepo(store, repo.id, [ - repo.path, - ...gitWorktrees.map((worktree) => worktree.path) - ]) + // Why gated: registration replaces the repo's root set, so registering a create recovered without + // a listing would revoke filesystem access to every worktree that listing would have named. + if (listingComplete) { + registerWorktreeRootsForRepo(store, repo.id, [ + repo.path, + ...gitWorktrees.map((worktree) => worktree.path) + ]) + } else { + // Recovered without a listing: authorize just the new root, or the create the user just made + // is rejected by filesystem/git-status IPC until a full scan repopulates the cache. + registerCreatedWorktreeRoot(store, repo.id, created.path) + } // Why: link user-configured shared paths (e.g. `node_modules`, `.env`) before setup runs so setup scripts see them in place. const symlinkPaths = repo.symlinkPaths ?? [] diff --git a/src/main/ipc/worktrees-local-create-flow.test.ts b/src/main/ipc/worktrees-local-create-flow.test.ts index 4a580f82de0..d01efc489da 100644 --- a/src/main/ipc/worktrees-local-create-flow.test.ts +++ b/src/main/ipc/worktrees-local-create-flow.test.ts @@ -4,6 +4,7 @@ import type { CreateWorktreeResult } from '../../shared/worktree/create-types' import { resolveRegisteredWorktreePath } from './registered-worktree-roots-cache' import { listWorktreesMock, + describeCreatedWorktreeMock, addWorktreeMock, resolveLocalGitUsernameMock, getBaseRefDefaultMock, @@ -462,6 +463,49 @@ describe('registerWorktreeHandlers', () => { expect(listWorktreesMock).toHaveBeenCalledTimes(listWorktreesCallsAfterCreate) }) + it('completes a create the listing failed and keeps sibling worktrees authorized', async () => { + const sibling = { + path: '/workspace/existing-sibling', + head: 'sib123', + branch: 'refs/heads/existing-sibling', + isBare: false, + isMainWorktree: false + } + listWorktreesMock.mockResolvedValue([ + { + path: '/workspace/repo', + head: 'base', + branch: 'refs/heads/main', + isBare: false, + isMainWorktree: true + }, + sibling + ]) + await handlers['worktrees:create'](null, { repoId: 'repo-1', name: 'existing-sibling' }) + + // The create Git could no longer list, recovered by reading the worktree directly. + listWorktreesMock.mockRejectedValue(new Error('git worktree list timed out.')) + describeCreatedWorktreeMock.mockResolvedValue({ + path: '/workspace/improve-dashboard', + head: 'abc123', + branch: 'refs/heads/improve-dashboard', + isBare: false, + isMainWorktree: false + }) + + await expect( + handlers['worktrees:create'](null, { repoId: 'repo-1', name: 'improve-dashboard' }) + ).resolves.toMatchObject({ worktree: { path: '/workspace/improve-dashboard' } }) + // Why: registration replaces the repo's root set, so a one-row recovery must not revoke it. + await expect( + resolveRegisteredWorktreePath('/workspace/existing-sibling', store as never) + ).resolves.toBe(resolve('/workspace/existing-sibling')) + // Why: the recovered create is still a real worktree, so its own path must be usable at once. + await expect( + resolveRegisteredWorktreePath('/workspace/improve-dashboard', store as never) + ).resolves.toBe(resolve('/workspace/improve-dashboard')) + }) + it('uses branchNameOverride for the git branch while keeping the sanitized worktree path', async () => { store.getSettings.mockReturnValue({ branchPrefix: 'git-username', diff --git a/src/main/ipc/worktrees-test-harness.ts b/src/main/ipc/worktrees-test-harness.ts index 1888156a692..9552cd51770 100644 --- a/src/main/ipc/worktrees-test-harness.ts +++ b/src/main/ipc/worktrees-test-harness.ts @@ -1,5 +1,8 @@ import { __resetSshWorktreeCreateFetchCacheForTests } from './worktree-remote' -import { invalidateAuthorizedRootsCache } from './registered-worktree-roots-cache' +import { + __resetCreatedWorktreeRootsForTests, + invalidateAuthorizedRootsCache +} from './registered-worktree-roots-cache' import { registerWorktreeHandlers } from './worktrees' import { __resetDetectedWorktreeScanCacheForTests } from './worktrees/listing/detected-worktree-scan-cache' import { clearConfiguredWorktreeSharedDirectoriesCacheForTests } from '../git/worktree-shared-directories' @@ -16,6 +19,7 @@ import { handleMock, removeHandlerMock, listWorktreesMock, + describeCreatedWorktreeMock, assertWorktreeCleanForRemovalMock, addWorktreeMock, addSparseWorktreeMock, @@ -82,6 +86,7 @@ export function setupWorktreeHandlers(): WorktreeRuntimeStub { __resetDetectedWorktreeScanCacheForTests() resetSshProviderAuthorities() invalidateAuthorizedRootsCache() + __resetCreatedWorktreeRootsForTests() for (const m of [ handleMock, removeHandlerMock, @@ -157,7 +162,8 @@ export function setupWorktreeHandlers(): WorktreeRuntimeStub { pruneSpaceAnalysisSnapshotsMock, recordRemovalSnapshotPruneMock, findExistingWorktreeSymlinkPathsMock, - removeWorktreeLinkedPathsMock + removeWorktreeLinkedPathsMock, + describeCreatedWorktreeMock ]) { m.mockReset() } @@ -293,6 +299,8 @@ export function setupWorktreeHandlers(): WorktreeRuntimeStub { ) ensurePathWithinWorkspaceMock.mockImplementation((targetPath: string) => targetPath) listWorktreesMock.mockResolvedValue([]) + // Default: no direct-read recovery, so a listing that omits the row still fails the create. + describeCreatedWorktreeMock.mockResolvedValue(undefined) forceDeleteLocalBranchMock.mockResolvedValue(undefined) const runtimeStub = createWorktreeRuntimeStub() registerWorktreeHandlers(mainWindow as never, store as never, runtimeStub as never) diff --git a/src/main/ipc/worktrees-test-module-mocks.ts b/src/main/ipc/worktrees-test-module-mocks.ts index 50bdc6a21d7..f31f6ae1dd6 100644 --- a/src/main/ipc/worktrees-test-module-mocks.ts +++ b/src/main/ipc/worktrees-test-module-mocks.ts @@ -32,6 +32,7 @@ export const findExistingWorktreeSymlinkPathsMock: ModuleMock = vi.fn() export const handleMock: Mock<(channel: string, handler: HandlerMap[string]) => void> = vi.fn() export const removeHandlerMock: ModuleMock = vi.fn() export const listWorktreesMock: StringArgMock = vi.fn() +export const describeCreatedWorktreeMock: ModuleMock = vi.fn() export const parseWorktreeListMock: Mock<(output: string) => ParsedWorktreeRow[]> = vi.fn( (output: string) => output @@ -113,6 +114,8 @@ export const electronModuleMock = () => ({ export const gitWorktreeModuleMock = () => ({ listWorktrees: listWorktreesMock, listWorktreesStrict: listWorktreesMock, + listWorktreesSharedStrict: listWorktreesMock, + describeCreatedWorktree: describeCreatedWorktreeMock, parseWorktreeList: parseWorktreeListMock, assertWorktreeCleanForRemoval: assertWorktreeCleanForRemovalMock, addWorktree: addWorktreeMock, diff --git a/src/main/ipc/worktrees-windows.test.ts b/src/main/ipc/worktrees-windows.test.ts index 3826f5493a8..4d4115264a3 100644 --- a/src/main/ipc/worktrees-windows.test.ts +++ b/src/main/ipc/worktrees-windows.test.ts @@ -73,6 +73,8 @@ vi.mock('electron', () => ({ vi.mock('../git/worktree', () => ({ listWorktrees: listWorktreesMock, listWorktreesStrict: listWorktreesMock, + listWorktreesSharedStrict: listWorktreesMock, + describeCreatedWorktree: vi.fn().mockResolvedValue(undefined), assertWorktreeCleanForRemoval: assertWorktreeCleanForRemovalMock, addWorktree: addWorktreeMock, removeWorktree: removeWorktreeMock diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-reverse.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-reverse.ts index 0030760b957..f59f7735245 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-reverse.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-reverse.ts @@ -130,7 +130,7 @@ export async function handoffStructuredSessionToNative( throw error } context.releaseOwner(sessionId) - deps.transport?.revealNativeSession?.({ + await deps.transport?.revealNativeSession?.({ workspaceId: record.location.workspaceId, sessionId, agent: record.provider, diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts index 27769c8d5b4..7155826702d 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-handoff-types.ts @@ -49,7 +49,7 @@ export type StructuredAgentSessionHandoffTransport = { sessionId: string agent?: 'claude' | 'codex' adoptedTerminal?: true - }): void + }): Promise | void waitForTuiExit(owner: StructuredTuiOwner): Promise<{ transcriptPath?: string }> waitForTuiIdleOrExit( owner: StructuredTuiOwner, diff --git a/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts b/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts index 47276ea1ba0..c2eecc4d783 100644 --- a/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts +++ b/src/main/native-chat/agent-session-wire/structured-agent-session-host.ts @@ -184,6 +184,14 @@ export class StructuredAgentSessionHost { return listStructuredAgentSessionTabs(this.sessions) } + getPersistedVisibleSessionTabIndex(): { present: boolean; sessionIds: string[] } { + return this.deps.store.getVisibleSessionTabIndex() + } + + setSessionTabVisibility(sessionId: string, visible: boolean): Promise { + return this.deps.store.setSessionTabVisibility(sessionId, visible) + } + reconcileRestartLeases = async (): Promise => { const refusal = await this.reconcileLeases('startup') if (refusal) { diff --git a/src/main/observability/instrumentation.ts b/src/main/observability/instrumentation.ts index 369312476f2..bab57b74f64 100644 --- a/src/main/observability/instrumentation.ts +++ b/src/main/observability/instrumentation.ts @@ -21,7 +21,7 @@ // itself becomes a `noopSpan` that swallows all calls — call sites do not // need to branch on whether tracing is on. -import { withSpan, type ActiveSpan } from './tracer' +import { startSpan, withSpan, type ActiveSpan } from './tracer' const GIT_FAST_SUCCESS_THRESHOLD_MS = 250 const GIT_FAST_SUCCESS_WINDOW_MS = 60_000 @@ -173,17 +173,30 @@ export type GitSpanArgs = { /** Wrap a git execution in a `git.exec` span. Git accepts global options before * the subcommand; promoting the parsed command to its own attribute makes it * grep-friendly without copying the full args array into dashboards. */ -export async function withGitSpan(meta: GitSpanArgs, fn: () => Promise): Promise { +export async function withGitSpan( + meta: GitSpanArgs, + fn: (span: ActiveSpan) => Promise +): Promise { return withSpan( 'git.exec', async (span) => { addGitAttributes(span, meta) - return await fn() + return await fn(span) }, { attributes: { kind: 'git' }, shouldRecord: (record) => shouldRecordGitSpan(meta, record) } ) } +/** Start a git span whose lifetime follows a returned ChildProcess. */ +export function startGitSpan(meta: GitSpanArgs): ActiveSpan { + const span = startSpan('git.exec', { + attributes: { kind: 'git' }, + shouldRecord: (record) => shouldRecordGitSpan(meta, record) + }) + addGitAttributes(span, meta) + return span +} + export type WorktreeSpanArgs = { readonly stage: 'clone' | 'checkout' | 'install' | 'create' | 'remove' readonly path?: string diff --git a/src/main/providers/git-provider-contract.ts b/src/main/providers/git-provider-contract.ts index f70f3ddcc72..e6edb9f1c75 100644 --- a/src/main/providers/git-provider-contract.ts +++ b/src/main/providers/git-provider-contract.ts @@ -15,6 +15,7 @@ import type { GitPushTarget, GitWorktreeInfo } from '../../shared/worktree/types import type { GitHistoryOptions, GitHistoryResult } from '../../shared/git-history' import type { CommitMessageDraftContext } from '../../shared/commit-message-generation' import type { GitProviderStatusOptions } from './git-provider-status-options' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' export type { GitProviderStatusOptions } from './git-provider-status-options' @@ -46,7 +47,11 @@ export type IGitProvider = { abortRebase(worktreePath: string): Promise checkoutBranch(worktreePath: string, branch: string): Promise listLocalBranches(worktreePath: string): Promise<{ current: string | null; branches: string[] }> - getBranchCompare(worktreePath: string, baseRef: string): Promise + getBranchCompare( + worktreePath: string, + baseRef: string, + options?: { admissionTier?: GitAdmissionTier } + ): Promise getCommitCompare(worktreePath: string, commitId: string): Promise getUpstreamStatus(worktreePath: string, pushTarget?: GitPushTarget): Promise pushBranch( diff --git a/src/main/providers/git-provider-status-options.ts b/src/main/providers/git-provider-status-options.ts index a8924924f22..1a5d64e7f6a 100644 --- a/src/main/providers/git-provider-status-options.ts +++ b/src/main/providers/git-provider-status-options.ts @@ -1,6 +1,8 @@ // Kept separate so the central cross-provider contract stays within its enforced size limit. export type GitProviderStatusOptions = { + admissionTier?: 'interactive' | 'status' | 'background' includeIgnored?: boolean + includeLineStats?: boolean bypassEffectiveUpstreamNegativeCache?: boolean reuseLineStats?: boolean /** Merge-base OID to measure the branch line total against; omit to skip the work. */ diff --git a/src/main/providers/ssh-git-provider-status-lease.test.ts b/src/main/providers/ssh-git-provider-status-lease.test.ts index f3d041836c8..f7a8a09018b 100644 --- a/src/main/providers/ssh-git-provider-status-lease.test.ts +++ b/src/main/providers/ssh-git-provider-status-lease.test.ts @@ -146,7 +146,7 @@ describe('SshGitProvider status read leases', () => { }) it('isolates status reads by worktree and output-affecting options', async () => { - const pendingRequests = Array.from({ length: 5 }, () => + const pendingRequests = Array.from({ length: 8 }, () => deferredPromise<{ entries: never[]; conflictOperation: 'unknown' }>() ) mux.request.mockImplementation( @@ -157,22 +157,28 @@ describe('SshGitProvider status read leases', () => { provider.getStatus('/home/user/repo'), provider.getStatus('/home/user/other'), provider.getStatus('/home/user/repo', { includeIgnored: true }), + provider.getStatus('/home/user/repo', { includeLineStats: false }), provider.getStatus('/home/user/repo', { bypassEffectiveUpstreamNegativeCache: true }), - provider.getStatus('/home/user/repo', { reuseLineStats: true }) + provider.getStatus('/home/user/repo', { reuseLineStats: true }), + provider.getStatus('/home/user/repo', { admissionTier: 'background' }), + provider.getStatus('/home/user/repo', { admissionTier: 'interactive' }) ] - await waitForRequestCount(mux.request, 5) + await waitForRequestCount(mux.request, 8) expect(mux.request.mock.calls.map(([, payload]) => payload)).toEqual([ { worktreePath: '/home/user/repo' }, { worktreePath: '/home/user/other' }, { worktreePath: '/home/user/repo', includeIgnored: true }, + { worktreePath: '/home/user/repo', includeLineStats: false }, { worktreePath: '/home/user/repo', bypassEffectiveUpstreamNegativeCache: true }, - { worktreePath: '/home/user/repo', reuseLineStats: true } + { worktreePath: '/home/user/repo', reuseLineStats: true }, + { worktreePath: '/home/user/repo', admissionTier: 'background' }, + { worktreePath: '/home/user/repo', admissionTier: 'interactive' } ]) pendingRequests.forEach((pending) => pending.resolve({ entries: [], conflictOperation: 'unknown' }) diff --git a/src/main/providers/ssh-git-provider-status.test.ts b/src/main/providers/ssh-git-provider-status.test.ts index b2814624a6c..1eb727eacfb 100644 --- a/src/main/providers/ssh-git-provider-status.test.ts +++ b/src/main/providers/ssh-git-provider-status.test.ts @@ -57,6 +57,18 @@ describe('SshGitProvider', () => { ) }) + it('getStatus forwards a false line-stats request', async () => { + mux.request.mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) + + await provider.getStatus('/home/user/repo', { includeLineStats: false }) + + expect(mux.request).toHaveBeenCalledWith( + 'git.status', + { worktreePath: '/home/user/repo', includeLineStats: false }, + { signal: expect.any(AbortSignal) } + ) + }) + it('getStatus forwards upstream-negative-cache bypass only when requested', async () => { const statusResult = { entries: [], conflictOperation: 'unknown' } mux.request.mockResolvedValue(statusResult) @@ -193,10 +205,13 @@ describe('SshGitProvider', () => { const compareResult = { summary: { ahead: 2, behind: 0 }, entries: [] } mux.request.mockResolvedValue(compareResult) - const result = await provider.getBranchCompare('/home/user/repo', 'main') + const result = await provider.getBranchCompare('/home/user/repo', 'main', { + admissionTier: 'background' + }) expect(mux.request).toHaveBeenCalledWith('git.branchCompare', { worktreePath: '/home/user/repo', - baseRef: 'main' + baseRef: 'main', + admissionTier: 'background' }) expect(result).toEqual(compareResult) }) diff --git a/src/main/providers/ssh-git-read-provider.ts b/src/main/providers/ssh-git-read-provider.ts index 54720d8d9fb..5cbcbc17b5a 100644 --- a/src/main/providers/ssh-git-read-provider.ts +++ b/src/main/providers/ssh-git-read-provider.ts @@ -57,7 +57,9 @@ export class SshGitReadProvider { this.gitDiffReadDedupe.clear() const request = { worktreePath, + ...(options?.admissionTier ? { admissionTier: options.admissionTier } : {}), ...(options?.includeIgnored ? { includeIgnored: true } : {}), + ...(options?.includeLineStats === false ? { includeLineStats: false } : {}), ...(options?.bypassEffectiveUpstreamNegativeCache ? { bypassEffectiveUpstreamNegativeCache: true } : {}), @@ -68,7 +70,9 @@ export class SshGitReadProvider { } const key = stableInFlightKey([ worktreePath, + options?.admissionTier ?? 'status', options?.includeIgnored === true, + options?.includeLineStats !== false, options?.bypassEffectiveUpstreamNegativeCache === true, options?.reuseLineStats === true, options?.branchLineTotalMergeBase ?? '' diff --git a/src/main/providers/ssh-git-working-tree-provider.ts b/src/main/providers/ssh-git-working-tree-provider.ts index 6942b91ca1b..85e2bbb2938 100644 --- a/src/main/providers/ssh-git-working-tree-provider.ts +++ b/src/main/providers/ssh-git-working-tree-provider.ts @@ -4,6 +4,7 @@ import type { } from '../../shared/git-diff-compare-types' import type { GitHistoryOptions, GitHistoryResult } from '../../shared/git-history' import type { GitConflictOperation } from '../../shared/git-status-types' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' import { SshGitNoninteractiveProvider } from './ssh-git-noninteractive-provider' export class SshGitWorkingTreeProvider extends SshGitNoninteractiveProvider { @@ -106,10 +107,15 @@ export class SshGitWorkingTreeProvider extends SshGitNoninteractiveProvider { } } - async getBranchCompare(worktreePath: string, baseRef: string): Promise { + async getBranchCompare( + worktreePath: string, + baseRef: string, + options: { admissionTier?: GitAdmissionTier } = {} + ): Promise { return (await this.mux.request('git.branchCompare', { worktreePath, - baseRef + baseRef, + ...(options.admissionTier ? { admissionTier: options.admissionTier } : {}) })) as GitBranchCompareResult } diff --git a/src/main/providers/working-directory-validation.ts b/src/main/providers/working-directory-validation.ts index e43a488443c..688cc852446 100644 --- a/src/main/providers/working-directory-validation.ts +++ b/src/main/providers/working-directory-validation.ts @@ -29,7 +29,7 @@ const uncRouteLanes = new Map() * subdirectories of one share share a lane. Returns null for local-disk paths, * which never block long enough to be worth queueing. */ -function uncRouteKey(cwd: string): string | null { +export function uncRouteKey(cwd: string): string | null { if (!cwd.startsWith('\\\\')) { return null } diff --git a/src/main/runtime/agent-session-record-store-file.ts b/src/main/runtime/agent-session-record-store-file.ts index 8b8ef6cc4e4..7eb3cacdc7c 100644 --- a/src/main/runtime/agent-session-record-store-file.ts +++ b/src/main/runtime/agent-session-record-store-file.ts @@ -26,6 +26,8 @@ import { renameDurable, writeTempFileDurable } from '../durable-file-write' +import { parseVisibleSessionIds } from './agent-session-visible-tab-index' +import { serializeAgentSessionStoreState } from './agent-session-store-serialization' export const AGENT_SESSION_STORE_SCHEMA_VERSION = 2 as const @@ -41,6 +43,10 @@ export type AgentSessionStoreState = { retiredClaimKeys: RetiredAgentSessionClaimKey[] /** Rows this build cannot validate, kept with a durable refusal reason. */ unreadableRecords: Map + /** Structured sessions that currently have a visible chat tab. */ + visibleSessionIds: Set + /** True once this store has committed the visibility index field. */ + visibleSessionIdsIndexPresent: boolean } export type LoadedAgentSessionStore = { @@ -58,9 +64,7 @@ export function agentSessionStorePath(directory: string): string { return join(directory, AGENT_SESSION_STORE_FILE_NAME) } -function backupPath(filePath: string): string { - return `${filePath}.bak` -} +const backupPath = (filePath: string): string => `${filePath}.bak` function emptyState(hostId: string): AgentSessionStoreState { return { @@ -69,7 +73,9 @@ function emptyState(hostId: string): AgentSessionStoreState { records: new Map(), operations: new Map(), retiredClaimKeys: [], - unreadableRecords: new Map() + unreadableRecords: new Map(), + visibleSessionIds: new Set(), + visibleSessionIdsIndexPresent: false } } @@ -77,7 +83,7 @@ export function agentSessionStoreRevision(state: AgentSessionStoreState): string return createHash('sha256') .update(String(state.schemaVersion)) .update('\0') - .update(serializeState(state)) + .update(serializeAgentSessionStoreState(state)) .digest('hex') } @@ -101,6 +107,7 @@ function parseState( operations?: unknown retiredClaimKeys?: unknown unusableRecords?: unknown + visibleSessionIds?: unknown } if ( !Number.isSafeInteger(file.schemaVersion) || @@ -208,6 +215,16 @@ function parseState( state.retiredClaimKeys.push({ keyId: key.keyId, retiredAt: key.retiredAt as number }) } } + const visibleSessionIds = parseVisibleSessionIds( + file.visibleSessionIds, + schemaVersion, + AGENT_SESSION_STORE_SCHEMA_VERSION + ) + if (!visibleSessionIds.valid) { + return null + } + state.visibleSessionIdsIndexPresent = visibleSessionIds.present + visibleSessionIds.ids.forEach((sessionId) => state.visibleSessionIds.add(sessionId)) return { state, needsRewrite } } @@ -295,21 +312,6 @@ export async function loadAgentSessionStore( } } -function serializeState(state: AgentSessionStoreState): string { - const records: Record = Object.create(null) - for (const [sessionId, record] of state.records) { - records[sessionId] = record - } - return JSON.stringify({ - schemaVersion: AGENT_SESSION_STORE_SCHEMA_VERSION, - hostId: state.hostId, - records, - operations: Object.fromEntries(state.operations), - retiredClaimKeys: state.retiredClaimKeys, - unusableRecords: Object.fromEntries(state.unreadableRecords) - }) -} - /** * Commit the whole state. The live path is never absent: the new content is made durable in a temp * file first, a validated primary is COPIED to the backup, and only then does the rename publish it. @@ -329,7 +331,7 @@ export async function saveAgentSessionStore( await chmod(directory, 0o700) const tmpPath = durableWriteTempPath(filePath) try { - await writeTempFileDurable(tmpPath, serializeState(state), 0o600) + await writeTempFileDurable(tmpPath, serializeAgentSessionStoreState(state), 0o600) // Only a primary parsed under the transaction lock may replace the backup. During recovery the // primary is corrupt or absent, so the known-good backup must survive until publication. if (options.primaryStatus === 'validated') { diff --git a/src/main/runtime/agent-session-record-store.ts b/src/main/runtime/agent-session-record-store.ts index 85f77596010..6fc0e59f212 100644 --- a/src/main/runtime/agent-session-record-store.ts +++ b/src/main/runtime/agent-session-record-store.ts @@ -115,6 +115,29 @@ export class AgentSessionRecordStore { listRecords = (): AgentSessionRecord[] => [...this.state.records.values()] + listVisibleSessionIds = (): string[] => + [...this.state.visibleSessionIds].filter((sessionId) => this.state.records.has(sessionId)) + + getVisibleSessionTabIndex = (): { present: boolean; sessionIds: string[] } => ({ + present: this.state.visibleSessionIdsIndexPresent, + sessionIds: this.listVisibleSessionIds() + }) + + /** Persist the user-visible tab reference separately from the rollback-sensitive profile tabs. */ + setSessionTabVisibility(sessionId: string, visible: boolean): Promise { + return this.transact(() => { + if (visible) { + if (!this.state.records.has(sessionId)) { + throw new Error('agent_session_identity_required') + } + this.state.visibleSessionIds.add(sessionId) + } else { + this.state.visibleSessionIds.delete(sessionId) + } + this.state.visibleSessionIdsIndexPresent = true + }) + } + listByScope(location: AgentSessionExecutionLocation): AgentSessionRecord[] { const scope = agentSessionScopeKey(location) return this.listRecords().filter((record) => agentSessionScopeKey(record.location) === scope) diff --git a/src/main/runtime/agent-session-recovery-publish-fault.test.ts b/src/main/runtime/agent-session-recovery-publish-fault.test.ts index 37ad172bdfa..f3f2ba91d2a 100644 --- a/src/main/runtime/agent-session-recovery-publish-fault.test.ts +++ b/src/main/runtime/agent-session-recovery-publish-fault.test.ts @@ -47,7 +47,9 @@ function state(generation: number): AgentSessionStoreState { records: new Map(), operations: new Map(), retiredClaimKeys: [{ keyId: `generation-${generation}`, retiredAt: generation }], - unreadableRecords: new Map() + unreadableRecords: new Map(), + visibleSessionIds: new Set(), + visibleSessionIdsIndexPresent: false } } diff --git a/src/main/runtime/agent-session-store-serialization.ts b/src/main/runtime/agent-session-store-serialization.ts new file mode 100644 index 00000000000..cda3e44d7ff --- /dev/null +++ b/src/main/runtime/agent-session-store-serialization.ts @@ -0,0 +1,20 @@ +import type { AgentSessionStoreState } from './agent-session-record-store-file' + +export function serializeAgentSessionStoreState(state: AgentSessionStoreState): string { + const records: Record = Object.create(null) + for (const [sessionId, record] of state.records) { + records[sessionId] = record + } + const serialized: Record = { + schemaVersion: state.schemaVersion, + hostId: state.hostId, + records, + operations: Object.fromEntries(state.operations), + retiredClaimKeys: state.retiredClaimKeys, + unusableRecords: Object.fromEntries(state.unreadableRecords) + } + if (state.visibleSessionIdsIndexPresent) { + serialized.visibleSessionIds = [...state.visibleSessionIds] + } + return JSON.stringify(serialized) +} diff --git a/src/main/runtime/agent-session-store-transaction-queue.ts b/src/main/runtime/agent-session-store-transaction-queue.ts index 43266c0f113..060ec3bd633 100644 --- a/src/main/runtime/agent-session-store-transaction-queue.ts +++ b/src/main/runtime/agent-session-store-transaction-queue.ts @@ -37,12 +37,17 @@ function agentSessionStoreStateChanged( records: ReadonlyMap, operations: ReadonlyMap, retiredClaimKeys: AgentSessionStoreState['retiredClaimKeys'], - unreadableRecords: AgentSessionStoreState['unreadableRecords'] + unreadableRecords: AgentSessionStoreState['unreadableRecords'], + visibleSessionIds: AgentSessionStoreState['visibleSessionIds'], + visibleSessionIdsIndexPresent: AgentSessionStoreState['visibleSessionIdsIndexPresent'] ): boolean { return ( !mapEntriesMatch(state.records, records) || !mapEntriesMatch(state.operations, operations) || !mapEntriesMatch(state.unreadableRecords, unreadableRecords) || + state.visibleSessionIdsIndexPresent !== visibleSessionIdsIndexPresent || + state.visibleSessionIds.size !== visibleSessionIds.size || + [...state.visibleSessionIds].some((id) => !visibleSessionIds.has(id)) || state.retiredClaimKeys.length !== retiredClaimKeys.length || state.retiredClaimKeys.some((entry, index) => entry !== retiredClaimKeys[index]) ) @@ -94,6 +99,8 @@ export class AgentSessionStoreTransactionQueue { const operations = new Map(this.state.operations) const retiredClaimKeys = [...this.state.retiredClaimKeys] const unreadableRecords = new Map(this.state.unreadableRecords) + const visibleSessionIds = new Set(this.state.visibleSessionIds) + const visibleSessionIdsIndexPresent = this.state.visibleSessionIdsIndexPresent try { // The lost commit may have granted a higher fence than the backup records show. Rather // than refuse forever, raise every recovered fence clear of anything that commit could @@ -111,7 +118,9 @@ export class AgentSessionStoreTransactionQueue { records, operations, retiredClaimKeys, - unreadableRecords + unreadableRecords, + visibleSessionIds, + visibleSessionIdsIndexPresent ) ) { return result @@ -130,6 +139,8 @@ export class AgentSessionStoreTransactionQueue { this.state.operations = operations this.state.retiredClaimKeys = retiredClaimKeys this.state.unreadableRecords = unreadableRecords + this.state.visibleSessionIds = visibleSessionIds + this.state.visibleSessionIdsIndexPresent = visibleSessionIdsIndexPresent throw error } }) diff --git a/src/main/runtime/agent-session-visible-tab-index.ts b/src/main/runtime/agent-session-visible-tab-index.ts new file mode 100644 index 00000000000..e55ccce4ae6 --- /dev/null +++ b/src/main/runtime/agent-session-visible-tab-index.ts @@ -0,0 +1,21 @@ +export function parseVisibleSessionIds( + raw: unknown, + schemaVersion: number, + currentSchemaVersion: number +): { ids: string[]; present: boolean; valid: boolean } { + if (raw === undefined) { + return { ids: [], present: false, valid: true } + } + if (!Array.isArray(raw)) { + return { ids: [], present: false, valid: schemaVersion !== currentSchemaVersion } + } + const ids: string[] = [] + for (const value of raw) { + if (typeof value === 'string' && value.length > 0) { + ids.push(value) + } else if (schemaVersion === currentSchemaVersion) { + return { ids: [], present: true, valid: false } + } + } + return { ids, present: true, valid: true } +} diff --git a/src/main/runtime/orca-runtime-git-diff-budget.test.ts b/src/main/runtime/orca-runtime-git-diff-budget.test.ts index 2e30f7f931e..b2e894d4bc6 100644 --- a/src/main/runtime/orca-runtime-git-diff-budget.test.ts +++ b/src/main/runtime/orca-runtime-git-diff-budget.test.ts @@ -44,7 +44,10 @@ function oversizedResult(): GitDiffResult { } } -function commands(connectionId?: string): RuntimeGitCommands { +function commands( + connectionId?: string, + localGitOptions?: { wslDistro: string } +): RuntimeGitCommands { const worktree = { id: 'wt-1', repoId: 'repo-1', @@ -54,7 +57,8 @@ function commands(connectionId?: string): RuntimeGitCommands { return new RuntimeGitCommands({ resolveRuntimeGitTarget: async () => ({ worktree, - ...(connectionId ? { connectionId } : {}) + ...(connectionId ? { connectionId } : {}), + ...(localGitOptions ? { localGitOptions } : {}) }), getRuntimeSettings: () => ({}) as GlobalSettings }) @@ -195,4 +199,23 @@ describe('runtime git diff transport budget', () => { } ) }) + + it('prioritizes local file diff reads without losing WSL routing', async () => { + const runtime = commands(undefined, { wslDistro: 'Ubuntu' }) + + await runtime.getRuntimeGitBranchDiff('id:wt-1', BRANCH_COMPARE, 'assets/logo.png') + await runtime.getRuntimeGitCommitDiff('id:wt-1', COMMIT_ARGS) + + const options = { admissionTier: 'interactive', wslDistro: 'Ubuntu' } + expect(mocks.getBranchDiff).toHaveBeenLastCalledWith( + '/remote/repo', + expect.objectContaining({ filePath: 'assets/logo.png' }), + options + ) + expect(mocks.getCommitDiff).toHaveBeenLastCalledWith( + '/remote/repo', + expect.objectContaining({ filePath: 'assets/logo.png' }), + options + ) + }) }) diff --git a/src/main/runtime/orca-runtime-git.test.ts b/src/main/runtime/orca-runtime-git.test.ts index 26b993704f2..70fe676f98c 100644 --- a/src/main/runtime/orca-runtime-git.test.ts +++ b/src/main/runtime/orca-runtime-git.test.ts @@ -9,9 +9,8 @@ import type * as PullRequestContextModule from '../text-generation/pull-request- import { RuntimeGitCommands, type ResolvedRuntimeGitWorktree } from './orca-runtime-git' const mocks = vi.hoisted(() => ({ - abortMerge: vi.fn(), - abortRebase: vi.fn(), checkoutBranch: vi.fn(), + discardChanges: vi.fn(), listLocalBranches: vi.fn(), getStagedCommitContext: vi.fn(), getPullRequestDraftContext: vi.fn(), @@ -26,8 +25,7 @@ const mocks = vi.hoisted(() => ({ vi.mock('../git/status', async () => ({ ...(await vi.importActual('../git/status')), - abortMerge: mocks.abortMerge, - abortRebase: mocks.abortRebase, + discardChanges: mocks.discardChanges, getStagedCommitContext: mocks.getStagedCommitContext, getStatus: mocks.getStatus })) @@ -97,8 +95,6 @@ function makeCommands(worktreePath: string): RuntimeGitCommands { describe('RuntimeGitCommands', () => { beforeEach(() => { - mocks.abortMerge.mockReset() - mocks.abortRebase.mockReset() mocks.getStagedCommitContext.mockReset() mocks.getPullRequestDraftContext.mockReset() mocks.generateCommitMessageFromContext.mockReset() @@ -111,6 +107,7 @@ describe('RuntimeGitCommands', () => { mocks.getSshGitProvider.mockReset() mocks.getStatus.mockReset() mocks.checkoutBranch.mockReset() + mocks.discardChanges.mockReset() mocks.listLocalBranches.mockReset() }) @@ -120,17 +117,6 @@ describe('RuntimeGitCommands', () => { } }) - it('aborts a local merge through the resolved worktree', async () => { - const worktreePath = mkdtempSync(join(tmpdir(), 'orca-runtime-git-')) - tempDirs.push(worktreePath) - const commands = makeCommands(worktreePath) - mocks.abortMerge.mockResolvedValue(undefined) - - await expect(commands.abortRuntimeGitMerge('id:wt-1')).resolves.toEqual({ ok: true }) - - expect(mocks.abortMerge).toHaveBeenCalledWith(worktreePath, {}) - }) - // Why: a directory-only ignore rule (`node_modules/`) never matches the shared // symlink, so Git reports it untracked forever. Runtime/CLI status has to tell // getStatus which untracked entries are Orca's own (issue #10451); nothing else @@ -148,6 +134,7 @@ describe('RuntimeGitCommands', () => { await commands.getRuntimeGitStatus('id:wt-1') expect(mocks.getStatus).toHaveBeenCalledWith('/workspace/feature', { + admissionTier: 'status', sharedLinkPaths: ['node_modules'] }) }) @@ -170,55 +157,16 @@ describe('RuntimeGitCommands', () => { expect(mocks.getStatus).not.toHaveBeenCalled() }) - it('aborts a remote merge through the SSH git provider', async () => { - const provider = { abortMerge: vi.fn().mockResolvedValue(undefined) } - mocks.getSshGitProvider.mockReturnValue(provider) - const commands = new RuntimeGitCommands({ - resolveRuntimeGitTarget: async () => ({ - worktree: makeWorktree('/remote/repo'), - connectionId: 'conn-1' - }), - getRuntimeSettings: () => ({}) as GlobalSettings - }) - - await expect(commands.abortRuntimeGitMerge('id:wt-1')).resolves.toEqual({ ok: true }) - - expect(provider.abortMerge).toHaveBeenCalledWith('/remote/repo') - expect(mocks.abortMerge).not.toHaveBeenCalled() - }) - - it('aborts a local rebase through the resolved worktree', async () => { - const worktreePath = mkdtempSync(join(tmpdir(), 'orca-runtime-git-')) - tempDirs.push(worktreePath) - const commands = makeCommands(worktreePath) - mocks.abortRebase.mockResolvedValue(undefined) - - await expect(commands.abortRuntimeGitRebase('id:wt-1')).resolves.toEqual({ ok: true }) - - expect(mocks.abortRebase).toHaveBeenCalledWith(worktreePath, {}) - }) - - it('aborts a remote rebase through the SSH git provider', async () => { - const provider = { abortRebase: vi.fn().mockResolvedValue(undefined) } - mocks.getSshGitProvider.mockReturnValue(provider) - const commands = new RuntimeGitCommands({ - resolveRuntimeGitTarget: async () => ({ - worktree: makeWorktree('/remote/repo'), - connectionId: 'conn-1' - }), - getRuntimeSettings: () => ({}) as GlobalSettings - }) - - await expect(commands.abortRuntimeGitRebase('id:wt-1')).resolves.toEqual({ ok: true }) - - expect(provider.abortRebase).toHaveBeenCalledWith('/remote/repo') - expect(mocks.abortRebase).not.toHaveBeenCalled() - }) - it('checks out a local branch through the resolved worktree', async () => { const worktreePath = mkdtempSync(join(tmpdir(), 'orca-runtime-git-')) tempDirs.push(worktreePath) - const commands = makeCommands(worktreePath) + const commands = new RuntimeGitCommands({ + resolveRuntimeGitTarget: async () => ({ + worktree: makeWorktree(worktreePath), + localGitOptions: { wslDistro: 'Ubuntu' } + }), + getRuntimeSettings: () => ({}) as GlobalSettings + }) mocks.checkoutBranch.mockResolvedValue(undefined) await expect(commands.checkoutRuntimeGitBranch('id:wt-1', 'feature/x')).resolves.toEqual({ @@ -226,7 +174,10 @@ describe('RuntimeGitCommands', () => { branch: 'feature/x' }) - expect(mocks.checkoutBranch).toHaveBeenCalledWith(worktreePath, 'feature/x', {}) + expect(mocks.checkoutBranch).toHaveBeenCalledWith(worktreePath, 'feature/x', { + admissionTier: 'interactive', + wslDistro: 'Ubuntu' + }) }) it('checks out a remote branch through the SSH git provider', async () => { @@ -263,6 +214,40 @@ describe('RuntimeGitCommands', () => { expect(mocks.listLocalBranches).toHaveBeenCalledWith(worktreePath, {}) }) + it('prioritizes a local single-file discard without losing WSL routing', async () => { + const commands = new RuntimeGitCommands({ + resolveRuntimeGitTarget: async () => ({ + worktree: makeWorktree('/workspace/repo'), + localGitOptions: { wslDistro: 'Ubuntu' } + }), + getRuntimeSettings: () => ({}) as GlobalSettings + }) + + await commands.discardRuntimeGitPath('id:wt-1', 'src/app.ts') + + expect(mocks.discardChanges).toHaveBeenCalledWith('/workspace/repo', 'src/app.ts', { + admissionTier: 'interactive', + wslDistro: 'Ubuntu' + }) + }) + + it('keeps a remote single-file discard owned by the SSH provider', async () => { + const provider = { discardChanges: vi.fn() } + mocks.getSshGitProvider.mockReturnValue(provider) + const commands = new RuntimeGitCommands({ + resolveRuntimeGitTarget: async () => ({ + worktree: makeWorktree('/remote/repo'), + connectionId: 'conn-1' + }), + getRuntimeSettings: () => ({}) as GlobalSettings + }) + + await commands.discardRuntimeGitPath('id:wt-1', 'src/app.ts') + + expect(provider.discardChanges).toHaveBeenCalledWith('/remote/repo', 'src/app.ts') + expect(mocks.discardChanges).not.toHaveBeenCalled() + }) + it('lists remote local branches through the SSH git provider', async () => { const provider = { listLocalBranches: vi.fn().mockResolvedValue({ current: 'main', branches: ['main'] }) @@ -386,6 +371,7 @@ describe('RuntimeGitCommands', () => { }) expect(mocks.getStagedCommitContext).toHaveBeenCalledWith(worktreePath, { + admissionTier: 'interactive', wslDistro: 'Ubuntu' }) expect(prepareForCodexLaunch).toHaveBeenCalledWith({ diff --git a/src/main/runtime/orca-runtime-structured-session-restore.test.ts b/src/main/runtime/orca-runtime-structured-session-restore.test.ts index 39275ebedc1..52db9673705 100644 --- a/src/main/runtime/orca-runtime-structured-session-restore.test.ts +++ b/src/main/runtime/orca-runtime-structured-session-restore.test.ts @@ -107,6 +107,101 @@ describe('structured session cold restoration', () => { ) }) + it('prefers the durable visible-session index after a legacy profile drops agent tabs', async () => { + const runtime = new OrcaRuntimeService() + const restoreReadableSessions = vi.fn(async () => undefined) + const internal = runtime as unknown as { + store: { getWorkspaceSession: () => unknown } + hasPersistedStructuredAgentSessionStore(): boolean + getKnownWorkspaceSessionWorktreeIds(): Set + hydrateHeadlessMobileSessionTabsFromWorkspaceSession(): Set + refreshMobileSessionPtyRecords(): Promise | null> + ensureStructuredAgentSessionHost(): Promise + } + internal.store = { + getWorkspaceSession: () => ({ + activeRepoId: null, + activeWorktreeId: 'workspace-1', + activeTabId: null, + tabsByWorktree: {}, + terminalLayoutsByTabId: {}, + unifiedTabs: { 'workspace-1': [] } + }) + } + internal.hasPersistedStructuredAgentSessionStore = () => true + internal.getKnownWorkspaceSessionWorktreeIds = () => new Set() + internal.hydrateHeadlessMobileSessionTabsFromWorkspaceSession = () => new Set() + internal.refreshMobileSessionPtyRecords = async () => new Set() + internal.ensureStructuredAgentSessionHost = async () => undefined + setStructuredAgentSessionHost({ + reconcileRestartLeases: async () => undefined, + getPersistedVisibleSessionTabIndex: () => ({ + present: true, + sessionIds: ['session-survives-rollback'] + }), + restoreReadableSessions, + listSessionTabs: () => [] + } as never) + + await runtime.restoreStructuredAgentSessionTabs() + + expect(restoreReadableSessions).toHaveBeenCalledWith(['session-survives-rollback']) + }) + + it('treats an empty durable visible-session index as authoritative', async () => { + const runtime = new OrcaRuntimeService() + const restoreReadableSessions = vi.fn(async () => undefined) + const internal = runtime as unknown as { + store: { getWorkspaceSession: () => unknown } + hasPersistedStructuredAgentSessionStore(): boolean + getKnownWorkspaceSessionWorktreeIds(): Set + hydrateHeadlessMobileSessionTabsFromWorkspaceSession(): Set + refreshMobileSessionPtyRecords(): Promise | null> + ensureStructuredAgentSessionHost(): Promise + } + internal.store = { + getWorkspaceSession: () => ({ + activeRepoId: null, + activeWorktreeId: 'workspace-1', + activeTabId: 'agent-session:closed-session', + tabsByWorktree: {}, + terminalLayoutsByTabId: {}, + activeTabIdByWorktree: { 'workspace-1': 'agent-session:closed-session' }, + unifiedTabs: { + 'workspace-1': [ + { + id: 'agent-session:closed-session', + entityId: 'closed-session', + groupId: 'group-1', + worktreeId: 'workspace-1', + contentType: 'agent-session', + label: 'Codex Chat', + customLabel: null, + color: null, + sortOrder: 0, + createdAt: 1 + } + ] + } + }) + } + internal.hasPersistedStructuredAgentSessionStore = () => true + internal.getKnownWorkspaceSessionWorktreeIds = () => new Set() + internal.hydrateHeadlessMobileSessionTabsFromWorkspaceSession = () => new Set() + internal.refreshMobileSessionPtyRecords = async () => new Set() + internal.ensureStructuredAgentSessionHost = async () => undefined + setStructuredAgentSessionHost({ + reconcileRestartLeases: async () => undefined, + getPersistedVisibleSessionTabIndex: () => ({ present: true, sessionIds: [] }), + restoreReadableSessions, + listSessionTabs: () => [] + } as never) + + await runtime.restoreStructuredAgentSessionTabs() + + expect(restoreReadableSessions).toHaveBeenCalledWith([]) + }) + it('normalizes a restored tab id and removes it when closed', async () => { const runtime = new OrcaRuntimeService() const closeSessionTab = vi.fn(async () => undefined) @@ -225,7 +320,7 @@ describe('structured session cold restoration', () => { throw new Error('session_tab_not_found') }) } as never) - runtime.publishStructuredAgentSessionTab({ + await runtime.publishStructuredAgentSessionTab({ workspaceId: 'workspace-1', sessionId: 'session-1', agent: 'codex', diff --git a/src/main/runtime/orca-runtime.test.ts b/src/main/runtime/orca-runtime.test.ts index 96c6c4e1886..bdcab959b01 100644 --- a/src/main/runtime/orca-runtime.test.ts +++ b/src/main/runtime/orca-runtime.test.ts @@ -41,6 +41,7 @@ import { addWorktree, assertWorktreeCleanForRemoval, listWorktrees, + listWorktreesSharedStrict, listWorktreesStrict, removeWorktree } from '../git/worktree' @@ -441,6 +442,8 @@ const { vi.mock('../git/worktree', () => ({ listWorktrees: vi.fn().mockResolvedValue(MOCK_GIT_WORKTREES), listWorktreesStrict: vi.fn().mockResolvedValue(MOCK_GIT_WORKTREES), + listWorktreesSharedStrict: vi.fn().mockResolvedValue(MOCK_GIT_WORKTREES), + describeCreatedWorktree: vi.fn().mockResolvedValue(undefined), assertWorktreeCleanForRemoval: vi.fn().mockResolvedValue(undefined), addSparseWorktree: addSparseWorktreeMock, addWorktree: addWorktreeMock, @@ -736,6 +739,11 @@ function resetRuntimeTestMocks(): void { forgetRemoteWatcherRemovalSnapshotMock.mockReset() vi.mocked(listWorktrees).mockResolvedValue(MOCK_GIT_WORKTREES) vi.mocked(listWorktreesStrict).mockResolvedValue(MOCK_GIT_WORKTREES) + // Why delegate: production reads both from one repo state, so a test that stubs the listing must + // see the same rows through the create path's strict read. + vi.mocked(listWorktreesSharedStrict).mockImplementation((repoPath, options) => + options ? listWorktrees(repoPath, options) : listWorktrees(repoPath) + ) scanLocalRepoWorktreesForResolutionMock .mockReset() .mockImplementation(async (repoPath: string, options: { wslDistro?: string }) => { @@ -7839,6 +7847,24 @@ describe('OrcaRuntimeService', () => { const checkDetailsSignal = new AbortController().signal await runtime.getRepoPRForBranch('id:repo-1', 'feature/wsl', 42, 43) + await runtime.getRepoPRForBranch( + 'id:repo-1', + 'feature/wsl-manual', + 42, + 43, + undefined, + undefined, + 'manual' + ) + await runtime.getRepoPRForBranch( + 'id:repo-1', + 'feature/wsl-active', + 42, + 43, + undefined, + undefined, + 'active' + ) await runtime.getRepoWorkItem('id:repo-1', 42, 'pr') await runtime.getRepoWorkItemByOwnerRepo('id:repo-1', prRepo, 42, 'pr') await runtime.getRepoWorkItemDetails('id:repo-1', 42, 'pr') @@ -7910,6 +7936,22 @@ describe('OrcaRuntimeService', () => { localGitExecOptions: localGitOptions } ) + expect(getPRForBranchOutcomeMock).toHaveBeenCalledWith( + TEST_REPO_PATH, + 'feature/wsl-manual', + 42, + null, + null, + { localGitExecOptions: { ...localGitOptions, admissionTier: 'interactive' } } + ) + expect(getPRForBranchOutcomeMock).toHaveBeenCalledWith( + TEST_REPO_PATH, + 'feature/wsl-active', + 42, + null, + null, + { localGitExecOptions: { ...localGitOptions, admissionTier: 'background' } } + ) expect(getGitHubWorkItemMock).toHaveBeenCalledWith( TEST_REPO_PATH, 42, @@ -8188,7 +8230,8 @@ describe('OrcaRuntimeService', () => { head: 'feature/ssh', title: 'Feature SSH' }), - 'ssh-1' + 'ssh-1', + { localGitExecOptions: { admissionTier: 'interactive' } } ) expect(createStackedHostedReviewMock).toHaveBeenCalledWith( '/remote/repo', @@ -8198,7 +8241,7 @@ describe('OrcaRuntimeService', () => { head: 'feature/ssh' }), 'ssh-1', - {} + { localGitExecOptions: { admissionTier: 'interactive' } } ) }) @@ -8277,7 +8320,7 @@ describe('OrcaRuntimeService', () => { repoPath: TEST_REPO_PATH, connectionId: null, branch: 'feature/wsl', - localGitExecOptions: { wslDistro: 'Ubuntu' } + localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } }) ) expect(getHostedReviewForBranchMock).toHaveBeenCalledWith( @@ -8286,7 +8329,7 @@ describe('OrcaRuntimeService', () => { connectionId: null, branch: 'feature/wsl', linkedGitHubPR: 76, - localGitExecOptions: { wslDistro: 'Ubuntu' } + localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'background' } }) ) expect(createHostedReviewMock).toHaveBeenCalledWith( @@ -8297,7 +8340,7 @@ describe('OrcaRuntimeService', () => { title: 'Feature WSL' }), null, - { localGitExecOptions: { wslDistro: 'Ubuntu' } } + { localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } } ) expect(createStackedHostedReviewMock).toHaveBeenCalledWith( TEST_REPO_PATH, @@ -8307,7 +8350,7 @@ describe('OrcaRuntimeService', () => { head: 'feature/wsl' }), null, - { localGitExecOptions: { wslDistro: 'Ubuntu' } } + { localGitExecOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } } ) }) @@ -9345,6 +9388,10 @@ describe('OrcaRuntimeService', () => { try { const repo = await runtime.cloneRepo('https://example.com/repo-badge-color.git', '/tmp') + expect(spawnSpy).toHaveBeenCalledWith( + expect.arrayContaining(['clone']), + expect.objectContaining({ admissionTier: 'interactive' }) + ) expect(repo.badgeColor).toBe(DEFAULT_REPO_BADGE_COLOR) expect(added).toEqual([ expect.objectContaining({ diff --git a/src/main/runtime/orca-runtime.ts b/src/main/runtime/orca-runtime.ts index 92ebd0ff74d..9432cd95472 100644 --- a/src/main/runtime/orca-runtime.ts +++ b/src/main/runtime/orca-runtime.ts @@ -167,6 +167,7 @@ import { gitSpawnAfterWindowsEnvironmentReady, nonInteractiveGitEnv } from '../git/runner' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' import { runWithGitReadCacheInvalidation } from '../git/status' import { wakeFolderRepoGitUpgradeWatch } from '../ipc/folder-repo-git-upgrade-wake' import { @@ -338,7 +339,11 @@ import type { GitHubPRReviewCommentInput, GitHubReactionContent } from '../../shared/github/comment-types' -import type { PRRefreshOutcome } from '../../shared/github/pull-request-refresh-types' +import type { + GitHubPRRefreshReason, + PRRefreshOutcome +} from '../../shared/github/pull-request-refresh-types' +import { admissionTierForRefreshReason } from '../github/pr-refresh-candidate-policy' import type { GitHubOwnerRepo, GitHubPRFile } from '../../shared/github/pull-request-types' import type { ListWorkItemsResult } from '../../shared/github/work-item-types' import type { @@ -1243,7 +1248,7 @@ import { shouldSetDisplayName, areWorktreePathsEqual } from '../ipc/worktree-logic' -import { findCreatedWorktree } from '../ipc/created-worktree-reconciliation' +import { resolveCreatedWorktree } from '../ipc/created-worktree-reconciliation' import { worktreePathComparisonKey } from '../ipc/worktree-path-comparison' import { assertWorktreeDoesNotContainRegisteredWorktree, @@ -10165,7 +10170,7 @@ export class OrcaRuntimeService { } } } - this.closeStructuredAgentSessionTab(worktreeId, snapshot, tab) + await this.closeStructuredAgentSessionTab(worktreeId, snapshot, tab) } else { if (!this.notifier?.closeSessionTab) { throw new Error('runtime_unavailable') @@ -10271,11 +10276,15 @@ export class OrcaRuntimeService { return true } - private closeStructuredAgentSessionTab( + private async closeStructuredAgentSessionTab( worktreeId: string, snapshot: RuntimeMobileSessionTabsSnapshot, tab: RuntimeMobileSessionAgentTab - ): void { + ): Promise { + const host = getStructuredAgentSessionHost() + if (typeof host?.setSessionTabVisibility === 'function') { + await host.setSessionTabVisibility(tab.sessionId, false) + } const nextTabs = snapshot.tabs.filter((candidate) => candidate.id !== tab.id) const active = nextTabs.find((candidate) => candidate.isActive) ?? nextTabs[0] ?? null const nextSnapshot: RuntimeMobileSessionTabsSnapshot = { @@ -11789,11 +11798,11 @@ export class OrcaRuntimeService { stopRecoveredOwner: (record) => this.stopStructuredSessionProcess(record), tuiStatus: (owner) => this.structuredTuiStatus(owner), closeTuiOwner: (owner) => this.closeStructuredTuiOwner(owner), - revealNativeSession: ({ workspaceId, sessionId, agent = 'codex', adoptedTerminal }) => { + revealNativeSession: async ({ workspaceId, sessionId, agent = 'codex', adoptedTerminal }) => { if (adoptedTerminal || agent !== 'codex') { return } - this.publishStructuredAgentSessionTab({ + await this.publishStructuredAgentSessionTab({ workspaceId, sessionId, agent, @@ -12352,10 +12361,15 @@ export class OrcaRuntimeService { private async restoreStructuredAgentSessionTabsOnce(): Promise { await this.prepareStructuredAgentSessionStartupRestoration() const host = getStructuredAgentSessionHost() + const persistedVisibleIndex = + typeof host?.getPersistedVisibleSessionTabIndex === 'function' + ? host.getPersistedVisibleSessionTabIndex() + : { present: false, sessionIds: [] } + const profileIds = collectSavedStructuredAgentSessionIds( + this.store?.getWorkspaceSession?.(LOCAL_EXECUTION_HOST_ID) ?? null + ) await host?.restoreReadableSessions( - collectSavedStructuredAgentSessionIds( - this.store?.getWorkspaceSession?.(LOCAL_EXECUTION_HOST_ID) ?? null - ) + persistedVisibleIndex.present ? persistedVisibleIndex.sessionIds : profileIds ) for (const worktreeId of this.getKnownWorkspaceSessionWorktreeIds()) { this.hydrateHeadlessMobileSessionTabsFromWorkspaceSession(worktreeId, { @@ -12372,7 +12386,7 @@ export class OrcaRuntimeService { while (sessionId.startsWith('agent-session:')) { sessionId = sessionId.slice('agent-session:'.length) } - this.publishStructuredAgentSessionTab({ + await this.publishStructuredAgentSessionTab({ ...session, agent: 'codex', sessionId, @@ -12382,13 +12396,17 @@ export class OrcaRuntimeService { } } - publishStructuredAgentSessionTab(input: { + async publishStructuredAgentSessionTab(input: { workspaceId: string sessionId: string agent: 'codex' activate: boolean notify?: boolean - }): void { + }): Promise { + const host = getStructuredAgentSessionHost() + if (typeof host?.setSessionTabVisibility === 'function') { + await host.setSessionTabVisibility(input.sessionId, true) + } const existing = this.mobileSessionTabsByWorktree.get(input.workspaceId) const id = `agent-session:${input.sessionId}` if (existing?.tabs.some((tab) => tab.id === id)) { @@ -23634,6 +23652,7 @@ export class OrcaRuntimeService { ['clone', '--progress', '--', trimmedUrl, clonePath], { cwd: trimmedDestination, + admissionTier: 'interactive', // Why: without the non-interactive guard, a clone that needs GitHub // auth makes Git Credential Manager pop its "Connect to GitHub" OAuth // window on Windows; in a network-restricted env the browser/device @@ -24030,9 +24049,20 @@ export class OrcaRuntimeService { } private getHostedReviewExecutionOptions( - repo: Repo - ): { localGitExecOptions: { wslDistro?: string } } | undefined { - const localGitOptions = this.getLocalGitExecutionOptionArgs(repo)[0] ?? {} + repo: Repo, + admissionTier?: GitAdmissionTier + ): + | { + localGitExecOptions: { + wslDistro?: string + admissionTier?: GitAdmissionTier + } + } + | undefined { + const localGitOptions = { + ...this.getLocalGitExecutionOptionArgs(repo)[0], + ...(admissionTier && { admissionTier }) + } return Object.keys(localGitOptions).length > 0 ? { localGitExecOptions: localGitOptions } : undefined @@ -24257,10 +24287,15 @@ export class OrcaRuntimeService { linkedPRNumber?: number | null, fallbackPRNumber?: number | null, acceptMergedFallbackPR?: boolean, - currentHeadOid?: string | null + currentHeadOid?: string | null, + reason?: GitHubPRRefreshReason ): Promise { const repo = await this.resolveRepoSelector(repoSelector) - const options: GitHubPRBranchLookupOptions = this.getHostedReviewExecutionOptions(repo) ?? {} + const options: GitHubPRBranchLookupOptions = + this.getHostedReviewExecutionOptions( + repo, + reason ? admissionTierForRefreshReason(reason) : undefined + ) ?? {} const lookupOptions = { ...options } if (acceptMergedFallbackPR === true) { lookupOptions.acceptMergedFallbackPR = true @@ -24287,6 +24322,7 @@ export class OrcaRuntimeService { async getHostedReviewForBranch(args: { repoSelector: string branch: string + admissionTier?: GitAdmissionTier currentHeadOid?: string | null active?: boolean linkedGitHubPR?: number | null @@ -24297,7 +24333,10 @@ export class OrcaRuntimeService { linkedGiteaPR?: number | null }): Promise { const repo = await this.resolveRepoSelector(args.repoSelector) - const executionOptions = this.getHostedReviewExecutionOptions(repo) + const executionOptions = this.getHostedReviewExecutionOptions( + repo, + args.admissionTier ?? 'background' + ) const review = await getHostedReviewForBranchFromRepo({ repoPath: repo.path, connectionId: repo.connectionId ?? null, @@ -24330,7 +24369,7 @@ export class OrcaRuntimeService { } ): Promise { const { repo, repoPath } = await this.resolveHostedReviewTarget(args) - const executionOptions = this.getHostedReviewExecutionOptions(repo) + const executionOptions = this.getHostedReviewExecutionOptions(repo, 'interactive') return getHostedReviewCreationEligibilityFromRepo({ repoPath, connectionId: repo.connectionId ?? null, @@ -24354,7 +24393,7 @@ export class OrcaRuntimeService { args: CreateHostedReviewInput & { repoSelector: string; worktreeSelector?: string } ): Promise { const { repo, repoPath } = await this.resolveHostedReviewTarget(args) - const executionOptions = this.getHostedReviewExecutionOptions(repo) + const executionOptions = this.getHostedReviewExecutionOptions(repo, 'interactive') const input = { provider: args.provider, base: args.base, @@ -24401,7 +24440,7 @@ export class OrcaRuntimeService { args: CreateStackedHostedReviewInput & { repoSelector: string; worktreeSelector?: string } ): Promise { const { repo, repoPath } = await this.resolveHostedReviewTarget(args) - const executionOptions = this.getHostedReviewExecutionOptions(repo) + const executionOptions = this.getHostedReviewExecutionOptions(repo, 'interactive') const result = await createStackedHostedReviewFromRepo( repoPath, { @@ -27300,14 +27339,12 @@ export class OrcaRuntimeService { ) } - const gitWorktrees = hasLocalWorktreeGitOptions - ? await listWorktrees(repo.path, localWorktreeGitOptions) - : await listWorktrees(repo.path) - // Why: Git may canonicalize a symlinked create path; its exact branch identifies the listed row. - const created = findCreatedWorktree(gitWorktrees, worktreePath, branchName) - if (!created) { - throw new Error('Worktree created but not found in listing') - } + const { created } = await resolveCreatedWorktree( + repo.path, + worktreePath, + branchName, + hasLocalWorktreeGitOptions ? localWorktreeGitOptions : undefined + ) const worktreeId = `${repo.id}::${created.path}` const now = Date.now() @@ -33885,6 +33922,8 @@ export class OrcaRuntimeService { } } } else if (selector.startsWith('path:')) { + // Why exact-spelling-only (#16628): a Linux path names a directory in *some* WSL distro, and + // only the CLI sits in one and can prove which. Guessing here would delete a stranger's. candidates = worktrees.filter((worktree) => runtimePathsEqual(worktree.path, selector.slice(5)) ) diff --git a/src/main/runtime/rpc/methods/git-admission-tier-schema.ts b/src/main/runtime/rpc/methods/git-admission-tier-schema.ts new file mode 100644 index 00000000000..926aba5b6f9 --- /dev/null +++ b/src/main/runtime/rpc/methods/git-admission-tier-schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod' +import type { GitAdmissionTier } from '../../../git/command-runner/git-exec-options' + +export const OptionalGitAdmissionTier = z + .unknown() + .optional() + .transform((value): GitAdmissionTier | undefined => { + return value === 'interactive' || value === 'status' || value === 'background' + ? value + : undefined + }) diff --git a/src/main/runtime/rpc/methods/git-params.ts b/src/main/runtime/rpc/methods/git-params.ts index 00ec4bb6913..f69b01cd053 100644 --- a/src/main/runtime/rpc/methods/git-params.ts +++ b/src/main/runtime/rpc/methods/git-params.ts @@ -1,4 +1,5 @@ import { z } from 'zod' +import { OptionalGitAdmissionTier } from './git-admission-tier-schema' export const WorktreeSelector = z.object({ worktree: z @@ -8,7 +9,9 @@ export const WorktreeSelector = z.object({ }) export const GitStatusParams = WorktreeSelector.extend({ + admissionTier: OptionalGitAdmissionTier, includeIgnored: z.boolean().optional(), + includeLineStats: z.boolean().optional(), bypassEffectiveUpstreamNegativeCache: z.boolean().optional(), reuseLineStats: z.boolean().optional(), // Shape is re-validated host-side before it reaches a git argv. @@ -48,6 +51,7 @@ export const GitDiff = GitFilePath.extend({ }) export const GitBranchCompare = WorktreeSelector.extend({ + admissionTier: OptionalGitAdmissionTier, baseRef: z .unknown() .transform((v) => (typeof v === 'string' ? v : '')) diff --git a/src/main/runtime/rpc/methods/git.test.ts b/src/main/runtime/rpc/methods/git.test.ts index 92221d4bb33..34ec308bfb4 100644 --- a/src/main/runtime/rpc/methods/git.test.ts +++ b/src/main/runtime/rpc/methods/git.test.ts @@ -25,7 +25,9 @@ describe('git RPC methods', () => { const response = await dispatcher.dispatch(makeRequest('git.status', { worktree: 'id:wt-1' })) - expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1') + expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { + admissionTier: 'status' + }) expect(response).toMatchObject({ ok: true, result: { entries: [], branch: 'main', didHitLimit: true, statusLength: 1_001 } @@ -48,6 +50,7 @@ describe('git RPC methods', () => { ) expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { + admissionTier: 'status', includeIgnored: true }) expect(response).toMatchObject({ @@ -56,6 +59,23 @@ describe('git RPC methods', () => { }) }) + it('forwards a false line-stats request through the parsed RPC options', async () => { + const runtime = { + getRuntimeId: () => 'test-runtime', + getRuntimeGitStatus: vi.fn().mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) + } as unknown as OrcaRuntimeService + const dispatcher = new RpcDispatcher({ runtime, methods: GIT_METHODS }) + + await dispatcher.dispatch( + makeRequest('git.status', { worktree: 'id:wt-1', includeLineStats: false }) + ) + + expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { + admissionTier: 'status', + includeLineStats: false + }) + }) + it('forwards upstream-negative-cache bypass for status requests', async () => { const runtime = { getRuntimeId: () => 'test-runtime', @@ -74,6 +94,7 @@ describe('git RPC methods', () => { ) expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { + admissionTier: 'status', bypassEffectiveUpstreamNegativeCache: true }) expect(response).toMatchObject({ @@ -99,6 +120,7 @@ describe('git RPC methods', () => { ) expect(runtime.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { + admissionTier: 'status', reuseLineStats: true, signal: controller.signal }) @@ -679,6 +701,44 @@ describe('git RPC methods', () => { expect(runtime.getRuntimeGitBranchCompare).not.toHaveBeenCalled() }) + it('forwards valid branch-compare admission and defaults future tiers', async () => { + const runtime = { + getRuntimeId: () => 'test-runtime', + getRuntimeGitBranchCompare: vi.fn().mockResolvedValue({ summary: {}, entries: [] }) + } as unknown as OrcaRuntimeService + const dispatcher = new RpcDispatcher({ runtime, methods: GIT_METHODS }) + + const accepted = await dispatcher.dispatch( + makeRequest('git.branchCompare', { + worktree: 'id:wt-1', + baseRef: 'origin/main', + admissionTier: 'background' + }) + ) + const future = await dispatcher.dispatch( + makeRequest('git.branchCompare', { + worktree: 'id:wt-1', + baseRef: 'origin/main', + admissionTier: 'urgent' + }) + ) + + expect(accepted.ok).toBe(true) + expect(runtime.getRuntimeGitBranchCompare).toHaveBeenNthCalledWith( + 1, + 'id:wt-1', + 'origin/main', + 'background' + ) + expect(future.ok).toBe(true) + expect(runtime.getRuntimeGitBranchCompare).toHaveBeenNthCalledWith( + 2, + 'id:wt-1', + 'origin/main', + undefined + ) + }) + it('rejects git history limits above the runtime cap', async () => { const runtime = { getRuntimeId: () => 'test-runtime', diff --git a/src/main/runtime/rpc/methods/git.ts b/src/main/runtime/rpc/methods/git.ts index e89113f9b60..ddfbe7bf273 100644 --- a/src/main/runtime/rpc/methods/git.ts +++ b/src/main/runtime/rpc/methods/git.ts @@ -28,15 +28,20 @@ export const GIT_METHODS: RpcMethod[] = [ handler: async (params, { runtime, signal }) => { const options = params.includeIgnored === undefined && + params.includeLineStats === undefined && params.bypassEffectiveUpstreamNegativeCache === undefined && params.reuseLineStats === undefined && params.branchLineTotalMergeBase === undefined && + params.admissionTier === undefined && signal === undefined ? undefined : { ...(params.includeIgnored === undefined ? {} : { includeIgnored: params.includeIgnored }), + ...(params.includeLineStats === undefined + ? {} + : { includeLineStats: params.includeLineStats }), ...(params.bypassEffectiveUpstreamNegativeCache === true ? { bypassEffectiveUpstreamNegativeCache: true } : {}), @@ -44,10 +49,11 @@ export const GIT_METHODS: RpcMethod[] = [ ...(params.branchLineTotalMergeBase === undefined ? {} : { branchLineTotalMergeBase: params.branchLineTotalMergeBase }), + admissionTier: params.admissionTier ?? 'status', ...(signal ? { signal } : {}) } return options === undefined - ? runtime.getRuntimeGitStatus(params.worktree) + ? runtime.getRuntimeGitStatus(params.worktree, { admissionTier: 'status' }) : runtime.getRuntimeGitStatus(params.worktree, options) } }), @@ -103,7 +109,7 @@ export const GIT_METHODS: RpcMethod[] = [ name: 'git.branchCompare', params: GitBranchCompare, handler: async (params, { runtime }) => - runtime.getRuntimeGitBranchCompare(params.worktree, params.baseRef) + runtime.getRuntimeGitBranchCompare(params.worktree, params.baseRef, params.admissionTier) }), defineMethod({ name: 'git.commitCompare', diff --git a/src/main/runtime/rpc/methods/github-pr-refresh-reason.test.ts b/src/main/runtime/rpc/methods/github-pr-refresh-reason.test.ts new file mode 100644 index 00000000000..967bafa516e --- /dev/null +++ b/src/main/runtime/rpc/methods/github-pr-refresh-reason.test.ts @@ -0,0 +1,69 @@ +// Split from github.test.ts to keep it under its line cap. +import { describe, expect, it, vi } from 'vitest' +import { RpcDispatcher } from '../dispatcher' +import type { RpcRequest } from '../core' +import type { OrcaRuntimeService } from '../../orca-runtime' +import { GITHUB_METHODS } from './github' + +function makeRequest(method: string, params?: unknown): RpcRequest { + return { id: 'req-1', authToken: 'tok', method, params } +} + +describe('github.prForBranch refresh reason', () => { + it('forwards an optional PR refresh reason without requiring it from older clients', async () => { + const runtime = { + getRuntimeId: () => 'test-runtime', + getRepoPRForBranch: vi.fn().mockResolvedValue({ kind: 'no-pr', fetchedAt: 1 }) + } as unknown as OrcaRuntimeService + const dispatcher = new RpcDispatcher({ runtime, methods: GITHUB_METHODS }) + + await dispatcher.dispatch( + makeRequest('github.prForBranch', { + repo: 'repo-1', + branch: 'feature/admission', + reason: 'manual' + }) + ) + await dispatcher.dispatch( + makeRequest('github.prForBranch', { repo: 'repo-1', branch: 'feature/legacy' }) + ) + await dispatcher.dispatch( + makeRequest('github.prForBranch', { + repo: 'repo-1', + branch: 'feature/future', + reason: 'next-generation-refresh' + }) + ) + + expect(runtime.getRepoPRForBranch).toHaveBeenNthCalledWith( + 1, + 'repo-1', + 'feature/admission', + undefined, + undefined, + undefined, + undefined, + 'manual' + ) + expect(runtime.getRepoPRForBranch).toHaveBeenNthCalledWith( + 2, + 'repo-1', + 'feature/legacy', + undefined, + undefined, + undefined, + undefined, + undefined + ) + expect(runtime.getRepoPRForBranch).toHaveBeenNthCalledWith( + 3, + 'repo-1', + 'feature/future', + undefined, + undefined, + undefined, + undefined, + undefined + ) + }) +}) diff --git a/src/main/runtime/rpc/methods/github-pull-request-methods.ts b/src/main/runtime/rpc/methods/github-pull-request-methods.ts index 30aea3f2c6c..958e08c439a 100644 --- a/src/main/runtime/rpc/methods/github-pull-request-methods.ts +++ b/src/main/runtime/rpc/methods/github-pull-request-methods.ts @@ -2,9 +2,24 @@ import { z } from 'zod' import { defineMethod, type RpcMethod } from '../core' import { OptionalString, requiredString } from '../schemas' import { RepoSelector, SlugRepo } from './github-repo-target-schemas' +import type { GitHubPRRefreshReason } from '../../../../shared/github/pull-request-refresh-types' + +const OptionalPRRefreshReason = z + .unknown() + .optional() + .transform((value): GitHubPRRefreshReason | undefined => { + return value === 'visible' || + value === 'active' || + value === 'post-push' || + value === 'manual' || + value === 'swr' + ? value + : undefined + }) const PrForBranch = RepoSelector.extend({ branch: requiredString('Missing branch'), + reason: OptionalPRRefreshReason, linkedPRNumber: z.number().int().positive().nullable().optional(), fallbackPRNumber: z.number().int().positive().nullable().optional(), acceptMergedFallbackPR: z.boolean().optional(), @@ -75,7 +90,8 @@ export const GITHUB_PULL_REQUEST_METHODS: RpcMethod[] = [ params.linkedPRNumber, params.fallbackPRNumber, params.acceptMergedFallbackPR, - params.currentHeadOid + params.currentHeadOid, + params.reason ) }), defineMethod({ diff --git a/src/main/runtime/rpc/methods/hosted-review.test.ts b/src/main/runtime/rpc/methods/hosted-review.test.ts index e9a70f0d978..9d649fd819a 100644 --- a/src/main/runtime/rpc/methods/hosted-review.test.ts +++ b/src/main/runtime/rpc/methods/hosted-review.test.ts @@ -71,6 +71,26 @@ describe('hosted review RPC methods', () => { ) }) + it('carries interactive card refresh admission through to the runtime', async () => { + const runtime = { + getRuntimeId: () => 'test-runtime', + getHostedReviewForBranch: vi.fn().mockResolvedValue(null) + } as unknown as OrcaRuntimeService + const dispatcher = new RpcDispatcher({ runtime, methods: HOSTED_REVIEW_METHODS }) + + await dispatcher.dispatch( + makeRequest('hostedReview.forBranch', { + repo: '/repo', + branch: 'feature/refresh', + admissionTier: 'interactive' + }) + ) + + expect(runtime.getHostedReviewForBranch).toHaveBeenCalledWith( + expect.objectContaining({ admissionTier: 'interactive' }) + ) + }) + it('dispatches creation eligibility requests to the runtime', async () => { const runtime = { getRuntimeId: () => 'test-runtime', diff --git a/src/main/runtime/rpc/methods/hosted-review.ts b/src/main/runtime/rpc/methods/hosted-review.ts index 414a60c445f..f30aed7db49 100644 --- a/src/main/runtime/rpc/methods/hosted-review.ts +++ b/src/main/runtime/rpc/methods/hosted-review.ts @@ -1,10 +1,12 @@ import { z } from 'zod' import { defineMethod, type RpcMethod } from '../core' import { requiredString } from '../schemas' +import { OptionalGitAdmissionTier } from './git-admission-tier-schema' const HostedReviewForBranch = z.object({ repo: requiredString('Missing repo selector'), branch: requiredString('Missing branch'), + admissionTier: OptionalGitAdmissionTier, currentHeadOid: z.string().nullable().optional(), // Only the caller's selected worktree; the host caps how many earn the fast tier. active: z.boolean().optional(), @@ -129,6 +131,7 @@ export const HOSTED_REVIEW_METHODS: RpcMethod[] = [ return runtime.getHostedReviewForBranch({ repoSelector: params.repo, branch: params.branch, + ...(params.admissionTier ? { admissionTier: params.admissionTier } : {}), currentHeadOid: params.currentHeadOid ?? null, ...(params.active === true ? { active: true } : {}), linkedGitHubPR: params.linkedGitHubPR ?? null, diff --git a/src/main/runtime/rpc/methods/structured-agent-session.test.ts b/src/main/runtime/rpc/methods/structured-agent-session.test.ts index 4da598ff876..c698cc7229c 100644 --- a/src/main/runtime/rpc/methods/structured-agent-session.test.ts +++ b/src/main/runtime/rpc/methods/structured-agent-session.test.ts @@ -95,6 +95,8 @@ function hostStub(): StructuredAgentSessionHost { })), send: vi.fn(async () => ({ ok: true, replayed: false })), cancel: vi.fn(async () => ({ ok: true, replayed: false })), + close: vi.fn(async () => undefined), + setSessionTabVisibility: vi.fn(async () => undefined), respondToPrompt: vi.fn(async () => ({ ok: true, replayed: false })), setOption: vi.fn(async () => ({ ok: true, replayed: false })), handoffStatus: vi.fn(async () => ({ owner: 'native' })), @@ -178,6 +180,14 @@ afterEach(() => { }) describe('capability gating', () => { + it('clears durable tab visibility when closing through the agent-session RPC', async () => { + const response = await call('agentSession.close', { sessionId: SESSION }, STRUCTURED_CLIENT) + + expect(response).toMatchObject({ ok: true, result: { ok: true } }) + expect(hostCalls.close).toHaveBeenCalledWith(SESSION) + expect(hostCalls.setSessionTabVisibility).toHaveBeenCalledWith(SESSION, false) + }) + it('advertises the capability without bumping the protocol version', () => { expect(RUNTIME_CAPABILITIES).toContain(STRUCTURED_AGENT_SESSION_RUNTIME_CAPABILITY) expect(RUNTIME_CAPABILITIES).toContain(STRUCTURED_AGENT_SESSION_HOLD_RUNTIME_CAPABILITY) diff --git a/src/main/runtime/rpc/methods/structured-agent-session.ts b/src/main/runtime/rpc/methods/structured-agent-session.ts index 0f007006109..8ea85aa0e87 100644 --- a/src/main/runtime/rpc/methods/structured-agent-session.ts +++ b/src/main/runtime/rpc/methods/structured-agent-session.ts @@ -91,7 +91,7 @@ export const STRUCTURED_AGENT_SESSION_METHODS: RpcAnyMethod[] = [ envelope: { ...params.envelope, payloadFingerprint: hostFingerprint } }) if (result.ok && resolved.agent === 'codex') { - ctx.runtime.publishStructuredAgentSessionTab({ + await ctx.runtime.publishStructuredAgentSessionTab({ workspaceId: resolved.location.workspaceId, sessionId: result.value.sessionId, agent: 'codex', @@ -128,7 +128,12 @@ export const STRUCTURED_AGENT_SESSION_METHODS: RpcAnyMethod[] = [ name: 'agentSession.close', params: OptionsParams, handler: async (params, ctx) => { - await requireHost(ctx).close(params.sessionId) + const host = requireHost(ctx) + await host.close(params.sessionId) + // Terminal-disposal closes use this RPC without the session-tabs retirement RPC. + if (typeof host.setSessionTabVisibility === 'function') { + await host.setSessionTabVisibility(params.sessionId, false) + } return { ok: true as const } } }), diff --git a/src/main/runtime/runtime-git-branch-compare-admission.test.ts b/src/main/runtime/runtime-git-branch-compare-admission.test.ts new file mode 100644 index 00000000000..f2b77c209de --- /dev/null +++ b/src/main/runtime/runtime-git-branch-compare-admission.test.ts @@ -0,0 +1,83 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { RuntimeGitCommandHost, RuntimeGitTarget } from './runtime-git-command-target' + +const mocks = vi.hoisted(() => ({ + getBranchCompare: vi.fn(), + getSshGitProvider: vi.fn() +})) + +vi.mock('../git/status', () => ({ + getBranchCompare: mocks.getBranchCompare, + getBranchDiff: vi.fn(), + getCommitCompare: vi.fn(), + getCommitDiff: vi.fn(), + getDiff: vi.fn() +})) +vi.mock('../git/repo', () => ({ getRemoteCommitUrl: vi.fn(), getRemoteFileUrl: vi.fn() })) +vi.mock('../git/runner', () => ({ awaitWindowsHostGitEnvironmentReady: vi.fn() })) +vi.mock('../providers/ssh-git-dispatch', () => ({ + getSshGitProvider: mocks.getSshGitProvider, + SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE: 'provider unavailable' +})) + +import { RuntimeGitDiffCommands } from './runtime-git-diff-commands' + +function makeCommands(overrides: Partial = {}): RuntimeGitDiffCommands { + const target = { + worktree: { + id: 'wt-1', + repoId: 'repo-1', + path: 'C:\\repo', + git: { + path: 'C:\\repo', + branch: 'feature', + isBare: false, + isMainWorktree: false, + head: 'a'.repeat(40) + } + }, + localGitOptions: { wslDistro: 'Ubuntu' }, + ...overrides + } as RuntimeGitTarget + const host = { + resolveRuntimeGitTarget: async () => target, + getRuntimeSettings: () => ({}) + } as unknown as RuntimeGitCommandHost + return new RuntimeGitDiffCommands(host) +} + +describe('RuntimeGitDiffCommands branch-compare admission', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.getBranchCompare.mockResolvedValue({ summary: {}, entries: [] }) + }) + + it('preserves a background tier with WSL routing and defaults legacy callers to interactive', async () => { + const commands = makeCommands() + + await commands.getRuntimeGitBranchCompare('id:wt-1', 'origin/main', 'background') + await commands.getRuntimeGitBranchCompare('id:wt-1', 'origin/main') + + expect(mocks.getBranchCompare).toHaveBeenNthCalledWith(1, 'C:\\repo', 'origin/main', { + wslDistro: 'Ubuntu', + admissionTier: 'background' + }) + expect(mocks.getBranchCompare).toHaveBeenNthCalledWith(2, 'C:\\repo', 'origin/main', { + wslDistro: 'Ubuntu', + admissionTier: 'interactive' + }) + }) + + it('forwards background admission to the SSH execution host', async () => { + const getBranchCompare = vi.fn().mockResolvedValue({ summary: {}, entries: [] }) + mocks.getSshGitProvider.mockReturnValue({ getBranchCompare }) + const commands = makeCommands({ connectionId: 'conn-1' }) + + await commands.getRuntimeGitBranchCompare('id:wt-1', 'origin/main', 'background') + + expect(getBranchCompare).toHaveBeenCalledWith('C:\\repo', 'origin/main', { + admissionTier: 'background' + }) + expect(mocks.getBranchCompare).not.toHaveBeenCalled() + }) +}) diff --git a/src/main/runtime/runtime-git-diff-commands.ts b/src/main/runtime/runtime-git-diff-commands.ts index 52e436fc67f..a6d94775ae5 100644 --- a/src/main/runtime/runtime-git-diff-commands.ts +++ b/src/main/runtime/runtime-git-diff-commands.ts @@ -13,6 +13,7 @@ import { getDiff } from '../git/status' import { awaitWindowsHostGitEnvironmentReady } from '../git/runner' +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' import { getSshGitProvider, SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE @@ -48,20 +49,18 @@ export class RuntimeGitDiffCommands { ) } return assertGitDiffWithinTransportBudget( - await getDiff( - target.worktree.path, - relativePath, - staged, - compareAgainstHead, - localGitOptionsForTarget(target) - ), + await getDiff(target.worktree.path, relativePath, staged, compareAgainstHead, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }), maxContentBytes ) } async getRuntimeGitBranchCompare( worktreeSelector: string, - baseRef: string + baseRef: string, + admissionTier: GitAdmissionTier = 'interactive' ): Promise { const target = await this.host.resolveRuntimeGitTarget(worktreeSelector) const provider = target.connectionId ? getSshGitProvider(target.connectionId) : null @@ -69,9 +68,12 @@ export class RuntimeGitDiffCommands { if (!provider) { throw new Error(SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE) } - return provider.getBranchCompare(target.worktree.path, baseRef) + return provider.getBranchCompare(target.worktree.path, baseRef, { admissionTier }) } - return getBranchCompare(target.worktree.path, baseRef, localGitOptionsForTarget(target)) + return getBranchCompare(target.worktree.path, baseRef, { + ...localGitOptionsForTarget(target), + admissionTier + }) } async getRuntimeGitCommitCompare( @@ -86,7 +88,10 @@ export class RuntimeGitDiffCommands { } return provider.getCommitCompare(target.worktree.path, commitId) } - return getCommitCompare(target.worktree.path, commitId, localGitOptionsForTarget(target)) + return getCommitCompare(target.worktree.path, commitId, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) } async getRuntimeGitBranchDiff( @@ -130,7 +135,10 @@ export class RuntimeGitDiffCommands { filePath: relativePath, oldPath: oldRelativePath }, - localGitOptionsForTarget(target) + { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + } ), maxContentBytes ) @@ -168,7 +176,10 @@ export class RuntimeGitDiffCommands { filePath: relativePath, oldPath: oldRelativePath }, - localGitOptionsForTarget(target) + { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + } ), maxContentBytes ) diff --git a/src/main/runtime/runtime-git-generation-admission.test.ts b/src/main/runtime/runtime-git-generation-admission.test.ts new file mode 100644 index 00000000000..2569ae47749 --- /dev/null +++ b/src/main/runtime/runtime-git-generation-admission.test.ts @@ -0,0 +1,159 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { GlobalSettings } from '../../shared/global-settings-types' +import type { RuntimeGitCommandHost, RuntimeGitTarget } from './runtime-git-command-target' + +const mocks = vi.hoisted(() => ({ + getStagedCommitContext: vi.fn(), + gitExecFileAsync: vi.fn(), + getPullRequestDraftContext: vi.fn(), + loadPullRequestLinkedIssue: vi.fn(), + getSshGitProvider: vi.fn(), + prepareLocalCommitMessageAgentEnv: vi.fn(), + generateCommitMessageFromContext: vi.fn(), + generatePullRequestFieldsFromContext: vi.fn(), + resolveHostedReviewBodyForGeneration: vi.fn() +})) + +vi.mock('../git/status', () => ({ getStagedCommitContext: mocks.getStagedCommitContext })) +vi.mock('../git/runner', () => ({ gitExecFileAsync: mocks.gitExecFileAsync })) +vi.mock('../text-generation/pull-request-context', () => ({ + getPullRequestDraftContext: mocks.getPullRequestDraftContext +})) +vi.mock('../source-control/pull-request-linked-issue', () => ({ + loadPullRequestLinkedIssue: mocks.loadPullRequestLinkedIssue +})) +vi.mock('../providers/ssh-git-dispatch', () => ({ + getSshGitProvider: mocks.getSshGitProvider, + SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE: 'provider unavailable' +})) +vi.mock('../text-generation/commit-message-agent-environment', () => ({ + prepareLocalCommitMessageAgentEnv: mocks.prepareLocalCommitMessageAgentEnv +})) +vi.mock('../text-generation/commit-message-text-generation', () => ({ + generateCommitMessageFromContext: mocks.generateCommitMessageFromContext, + generatePullRequestFieldsFromContext: mocks.generatePullRequestFieldsFromContext +})) +vi.mock('../source-control/pull-request-template', () => ({ + resolveHostedReviewBodyForGeneration: mocks.resolveHostedReviewBodyForGeneration +})) + +import { RuntimeGitGenerationCommands } from './runtime-git-generation-commands' + +const params = { agentId: 'codex' as const, model: 'gpt-5.5' } +const settingsOverride = { sourceControlAiResolvedParams: params } +const pullRequestContext = { + base: 'main', + branch: 'feature/admission', + commitSummary: 'abc123 feat: test', + changeSummary: 'M README.md', + patch: '+hello', + currentTitle: '', + currentBody: '', + currentDraft: false +} + +function makeTarget(path: string, overrides: Partial = {}): RuntimeGitTarget { + return { + worktree: { + id: 'wt-1', + repoId: 'repo-1', + path, + git: { path, branch: 'main', isBare: false, isMainWorktree: false, head: 'a'.repeat(40) } + } as RuntimeGitTarget['worktree'], + ...overrides + } +} + +function makeCommands(target: RuntimeGitTarget): RuntimeGitGenerationCommands { + const host: RuntimeGitCommandHost = { + resolveRuntimeGitTarget: async () => target, + getRuntimeSettings: () => ({}) as GlobalSettings + } + return new RuntimeGitGenerationCommands(host) +} + +describe('RuntimeGitGenerationCommands admission', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.gitExecFileAsync.mockResolvedValue({ stdout: '', stderr: '' }) + mocks.loadPullRequestLinkedIssue.mockResolvedValue(null) + mocks.resolveHostedReviewBodyForGeneration.mockImplementation(async ({ body }) => body) + mocks.prepareLocalCommitMessageAgentEnv.mockResolvedValue({ ok: true, env: {} }) + mocks.generateCommitMessageFromContext.mockResolvedValue({ success: true, message: 'feat' }) + mocks.generatePullRequestFieldsFromContext.mockResolvedValue({ success: true, fields: {} }) + }) + + it('marks local staged commit context as interactive without dropping WSL routing', async () => { + mocks.getStagedCommitContext.mockResolvedValue({ + branch: 'main', + stagedSummary: 'M README.md', + stagedPatch: '+hello' + }) + const commands = makeCommands( + makeTarget('C:\\repo', { localGitOptions: { wslDistro: 'Ubuntu' } }) + ) + + await commands.generateRuntimeCommitMessage('id:wt-1', settingsOverride) + + expect(mocks.getStagedCommitContext).toHaveBeenCalledWith('C:\\repo', { + wslDistro: 'Ubuntu', + admissionTier: 'interactive' + }) + }) + + it('marks local pull-request context and linked-issue reads as interactive', async () => { + mocks.getPullRequestDraftContext.mockImplementation(async (execute) => { + await execute(['fetch', 'origin', 'main'], { timeout: 123 }) + return pullRequestContext + }) + const commands = makeCommands( + makeTarget('C:\\repo', { localGitOptions: { wslDistro: 'Ubuntu' } }) + ) + + await commands.generateRuntimePullRequestFields( + 'id:wt-1', + { base: 'main', title: '', body: '', draft: false }, + settingsOverride + ) + + expect(mocks.gitExecFileAsync).toHaveBeenCalledWith(['fetch', 'origin', 'main'], { + cwd: 'C:\\repo', + wslDistro: 'Ubuntu', + timeout: 123, + admissionTier: 'interactive' + }) + expect(mocks.loadPullRequestLinkedIssue).toHaveBeenCalledWith( + expect.objectContaining({ + connectionId: undefined, + localGitOptions: { wslDistro: 'Ubuntu', admissionTier: 'interactive' } + }) + ) + }) + + it('keeps SSH pull-request context reads on the remote provider', async () => { + const exec = vi.fn().mockResolvedValue({ stdout: '', stderr: '' }) + mocks.getSshGitProvider.mockReturnValue({ exec, executeCommitMessagePlan: vi.fn() }) + mocks.getPullRequestDraftContext.mockImplementation(async (execute) => { + await execute(['log', '--oneline']) + return pullRequestContext + }) + const commands = makeCommands( + makeTarget('/remote/repo', { + connectionId: 'conn-1', + localGitOptions: { wslDistro: 'Ubuntu' } + }) + ) + + await commands.generateRuntimePullRequestFields( + 'id:wt-1', + { base: 'main', title: '', body: '', draft: false }, + settingsOverride + ) + + expect(exec).toHaveBeenCalledWith(['log', '--oneline'], '/remote/repo') + expect(mocks.gitExecFileAsync).not.toHaveBeenCalled() + expect(mocks.loadPullRequestLinkedIssue).toHaveBeenCalledWith( + expect.objectContaining({ connectionId: 'conn-1', localGitOptions: {} }) + ) + }) +}) diff --git a/src/main/runtime/runtime-git-generation-commands.ts b/src/main/runtime/runtime-git-generation-commands.ts index 0bbabc39e28..868b97acd89 100644 --- a/src/main/runtime/runtime-git-generation-commands.ts +++ b/src/main/runtime/runtime-git-generation-commands.ts @@ -89,7 +89,10 @@ export class RuntimeGitGenerationCommands { let context: CommitMessageDraftContext | null try { - context = await getStagedCommitContext(target.worktree.path, localGitOptionsForTarget(target)) + context = await getStagedCommitContext(target.worktree.path, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) } catch (error) { console.error('[runtime-git] Failed to read staged commit context:', error) return { success: false, error: 'Failed to read staged changes.' } @@ -166,7 +169,12 @@ export class RuntimeGitGenerationCommands { provider: input.provider, repoPath: target.worktree.path, connectionId: target.connectionId, - localGitOptions: localGitOptionsForTarget(target) + localGitOptions: target.connectionId + ? {} + : { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + } }) let context: Awaited> try { @@ -189,7 +197,8 @@ export class RuntimeGitGenerationCommands { gitExecFileAsync(argv, { cwd: target.worktree.path, ...localGitOptionsForTarget(target), - ...options + ...options, + admissionTier: 'interactive' }), { base: input.base, diff --git a/src/main/runtime/runtime-git-staging-commands.ts b/src/main/runtime/runtime-git-staging-commands.ts index 3ffb7590de6..a856be7bf7b 100644 --- a/src/main/runtime/runtime-git-staging-commands.ts +++ b/src/main/runtime/runtime-git-staging-commands.ts @@ -30,7 +30,10 @@ export class RuntimeGitStagingCommands { await provider.stageFile(target.worktree.path, relativePath) return { ok: true } } - await stageFile(target.worktree.path, relativePath, localGitOptionsForTarget(target)) + await stageFile(target.worktree.path, relativePath, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -45,7 +48,10 @@ export class RuntimeGitStagingCommands { await provider.unstageFile(target.worktree.path, relativePath) return { ok: true } } - await unstageFile(target.worktree.path, relativePath, localGitOptionsForTarget(target)) + await unstageFile(target.worktree.path, relativePath, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -63,7 +69,10 @@ export class RuntimeGitStagingCommands { await provider.bulkStageFiles(target.worktree.path, relativePaths) return { ok: true } } - await bulkStageFiles(target.worktree.path, relativePaths, localGitOptionsForTarget(target)) + await bulkStageFiles(target.worktree.path, relativePaths, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -81,7 +90,10 @@ export class RuntimeGitStagingCommands { await provider.bulkUnstageFiles(target.worktree.path, relativePaths) return { ok: true } } - await bulkUnstageFiles(target.worktree.path, relativePaths, localGitOptionsForTarget(target)) + await bulkUnstageFiles(target.worktree.path, relativePaths, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -99,7 +111,10 @@ export class RuntimeGitStagingCommands { await provider.bulkDiscardChanges(target.worktree.path, relativePaths) return { ok: true } } - await bulkDiscardChanges(target.worktree.path, relativePaths, localGitOptionsForTarget(target)) + await bulkDiscardChanges(target.worktree.path, relativePaths, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -114,7 +129,10 @@ export class RuntimeGitStagingCommands { await provider.discardChanges(target.worktree.path, relativePath) return { ok: true } } - await discardChanges(target.worktree.path, relativePath, localGitOptionsForTarget(target)) + await discardChanges(target.worktree.path, relativePath, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } } diff --git a/src/main/runtime/runtime-git-status-admission.test.ts b/src/main/runtime/runtime-git-status-admission.test.ts new file mode 100644 index 00000000000..1a0c5a0a47f --- /dev/null +++ b/src/main/runtime/runtime-git-status-admission.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it, vi } from 'vitest' +import type { GitAdmissionEvent } from '../git/command-runner/git-admission-state' +import { GitAdmissionScheduler } from '../git/command-runner/git-subprocess-admission' +import type * as GitStatusModule from '../git/status' +import type { OrcaRuntimeService } from './orca-runtime' +import { RpcDispatcher } from './rpc/dispatcher' +import { GIT_METHODS } from './rpc/methods/git' +import { RuntimeGitStatusCommands } from './runtime-git-status-commands' + +const getStatusMock = vi.hoisted(() => vi.fn()) + +vi.mock('../git/status', async () => ({ + ...(await vi.importActual('../git/status')), + getStatus: getStatusMock +})) + +describe('runtime git status admission', () => { + it('admits RPC reads at the caller tier and defaults future tiers to status', async () => { + const events: GitAdmissionEvent[] = [] + const scheduler = new GitAdmissionScheduler({ + onAdmissionEvent: (event) => events.push(event) + }) + getStatusMock.mockImplementation(async (worktreePath, options) => { + const grant = await scheduler.acquire({ + args: ['status'], + cwd: worktreePath, + tier: options.admissionTier + }) + grant.release() + return { entries: [], conflictOperation: 'none' } + }) + const commands = new RuntimeGitStatusCommands({ + resolveRuntimeGitTarget: async () => ({ worktree: { path: '/workspace/feature' } }) + } as never) + const runtime = { + getRuntimeId: () => 'test-runtime', + getRuntimeGitStatus: commands.getRuntimeGitStatus.bind(commands) + } as unknown as OrcaRuntimeService + const dispatcher = new RpcDispatcher({ runtime, methods: GIT_METHODS }) + + for (const admissionTier of ['background', 'interactive', 'future-tier']) { + const response = await dispatcher.dispatch({ + id: `request-${admissionTier}`, + authToken: 'token', + method: 'git.status', + params: { worktree: 'id:wt-1', admissionTier } + }) + expect(response.ok).toBe(true) + } + + expect(events.filter((event) => event.phase === 'grant').map((event) => event.tier)).toEqual([ + 'background', + 'interactive', + 'status' + ]) + }) +}) diff --git a/src/main/runtime/runtime-git-status-commands.ts b/src/main/runtime/runtime-git-status-commands.ts index a11a5a8efb2..e76342aca1a 100644 --- a/src/main/runtime/runtime-git-status-commands.ts +++ b/src/main/runtime/runtime-git-status-commands.ts @@ -38,7 +38,10 @@ export class RuntimeGitStatusCommands { ? provider.getStatus(target.worktree.path, options) : provider.getStatus(target.worktree.path) } - const gitOptions = localGitOptionsForTarget(target) + const gitOptions = { + ...localGitOptionsForTarget(target), + admissionTier: options?.admissionTier ?? ('status' as const) + } // Why: shared symlinks do not match Git's directory-only ignore rules. const sharedLinkPaths = target.repo ? getWorktreeSharedLinkPaths(target.repo) : [] const sharedOptions = sharedLinkPaths.length > 0 ? { sharedLinkPaths } : {} @@ -62,6 +65,7 @@ export class RuntimeGitStatusCommands { } return getGitSubmoduleStatus(target.worktree.path, submodulePath, { ...localGitOptionsForTarget(target), + admissionTier: 'interactive', ...(area === 'staged' ? { staged: true } : {}) }) } @@ -78,7 +82,10 @@ export class RuntimeGitStatusCommands { } return provider.checkIgnoredPaths(target.worktree.path, relativePaths) } - return checkIgnoredPaths(target.worktree.path, relativePaths, localGitOptionsForTarget(target)) + return checkIgnoredPaths(target.worktree.path, relativePaths, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) } async getRuntimeGitHistory( @@ -95,7 +102,8 @@ export class RuntimeGitStatusCommands { } return getGitHistory(target.worktree.path, { ...options, - ...localGitOptionsForTarget(target) + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' }) } @@ -124,7 +132,10 @@ export class RuntimeGitStatusCommands { await provider.checkoutBranch(target.worktree.path, branch) return { ok: true, branch } } - await checkoutBranch(target.worktree.path, branch, localGitOptionsForTarget(target)) + await checkoutBranch(target.worktree.path, branch, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true, branch } } diff --git a/src/main/runtime/runtime-git-sync-commands.test.ts b/src/main/runtime/runtime-git-sync-commands.test.ts new file mode 100644 index 00000000000..f662c909cb6 --- /dev/null +++ b/src/main/runtime/runtime-git-sync-commands.test.ts @@ -0,0 +1,138 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { GlobalSettings } from '../../shared/global-settings-types' +import type { GitPushTarget } from '../../shared/worktree/types' +import type * as GitRemoteModule from '../git/remote' +import type * as GitStatusModule from '../git/status' +import type * as GitForkSyncModule from '../git/fork-sync' +import type { ResolvedRuntimeGitWorktree } from './runtime-git-command-target' +import { RuntimeGitSyncCommands } from './runtime-git-sync-commands' + +const mocks = vi.hoisted(() => ({ + abortMerge: vi.fn(), + abortRebase: vi.fn(), + commitChanges: vi.fn(), + getSshGitProvider: vi.fn(), + gitSyncForkDefaultBranch: vi.fn(), + gitFastForward: vi.fn(), + gitFetch: vi.fn(), + gitPull: vi.fn() +})) + +vi.mock('../git/fork-sync', async () => ({ + ...(await vi.importActual('../git/fork-sync')), + gitSyncForkDefaultBranch: mocks.gitSyncForkDefaultBranch +})) + +vi.mock('../git/status', async () => ({ + ...(await vi.importActual('../git/status')), + abortMerge: mocks.abortMerge, + abortRebase: mocks.abortRebase, + commitChanges: mocks.commitChanges +})) + +vi.mock('../git/remote', async () => ({ + ...(await vi.importActual('../git/remote')), + gitFastForward: mocks.gitFastForward, + gitFetch: mocks.gitFetch, + gitPull: mocks.gitPull +})) + +vi.mock('../providers/ssh-git-dispatch', () => ({ + getSshGitProvider: mocks.getSshGitProvider +})) + +const worktree = { + id: 'wt-1', + path: '/workspace/repo' +} as ResolvedRuntimeGitWorktree +const pushTarget = { + remoteName: 'origin', + branchName: 'main' +} satisfies GitPushTarget +const expectedUpstream = { owner: 'stablyai', repo: 'orca' } + +describe('RuntimeGitSyncCommands admission', () => { + beforeEach(() => { + vi.resetAllMocks() + }) + + it('prioritizes local runtime git actions and preserves host routing', async () => { + const commands = new RuntimeGitSyncCommands({ + resolveRuntimeGitTarget: async () => ({ + worktree, + localGitOptions: { wslDistro: 'Ubuntu' } + }), + getRuntimeSettings: () => ({}) as GlobalSettings + }) + mocks.commitChanges.mockResolvedValue({ success: true }) + mocks.gitSyncForkDefaultBranch.mockResolvedValue({ status: 'up-to-date' }) + + await commands.abortRuntimeGitMerge('id:wt-1') + await commands.abortRuntimeGitRebase('id:wt-1') + await commands.fetchRuntimeGit('id:wt-1', pushTarget) + await commands.syncRuntimeGitForkDefaultBranch('id:wt-1', expectedUpstream) + await commands.pullRuntimeGit('id:wt-1', pushTarget) + await commands.fastForwardRuntimeGit('id:wt-1', pushTarget) + await commands.commitRuntimeGit('id:wt-1', 'feat: prioritize user action') + + const options = { admissionTier: 'interactive', wslDistro: 'Ubuntu' } + expect(mocks.abortMerge).toHaveBeenCalledWith(worktree.path, options) + expect(mocks.abortRebase).toHaveBeenCalledWith(worktree.path, options) + expect(mocks.gitFetch).toHaveBeenCalledWith(worktree.path, pushTarget, options) + expect(mocks.gitSyncForkDefaultBranch).toHaveBeenCalledWith( + worktree.path, + expectedUpstream, + options + ) + expect(mocks.gitPull).toHaveBeenCalledWith(worktree.path, pushTarget, options) + expect(mocks.gitFastForward).toHaveBeenCalledWith(worktree.path, pushTarget, options) + expect(mocks.commitChanges).toHaveBeenCalledWith( + worktree.path, + 'feat: prioritize user action', + options + ) + }) + + it('keeps remote runtime git actions owned by the SSH provider', async () => { + const provider = { + abortMerge: vi.fn(), + abortRebase: vi.fn(), + commit: vi.fn().mockResolvedValue({ success: true }), + fastForwardBranch: vi.fn(), + fetchRemote: vi.fn(), + syncForkDefaultBranch: vi.fn().mockResolvedValue({ status: 'up-to-date' }), + pullBranch: vi.fn() + } + mocks.getSshGitProvider.mockReturnValue(provider) + const commands = new RuntimeGitSyncCommands({ + resolveRuntimeGitTarget: async () => ({ + worktree, + connectionId: 'conn-1' + }), + getRuntimeSettings: () => ({}) as GlobalSettings + }) + + await commands.abortRuntimeGitMerge('id:wt-1') + await commands.abortRuntimeGitRebase('id:wt-1') + await commands.fetchRuntimeGit('id:wt-1', pushTarget) + await commands.syncRuntimeGitForkDefaultBranch('id:wt-1', expectedUpstream) + await commands.pullRuntimeGit('id:wt-1', pushTarget) + await commands.fastForwardRuntimeGit('id:wt-1', pushTarget) + await commands.commitRuntimeGit('id:wt-1', 'feat: keep execution remote') + + expect(provider.abortMerge).toHaveBeenCalledWith(worktree.path) + expect(provider.abortRebase).toHaveBeenCalledWith(worktree.path) + expect(provider.fetchRemote).toHaveBeenCalledWith(worktree.path, pushTarget) + expect(provider.syncForkDefaultBranch).toHaveBeenCalledWith(worktree.path, expectedUpstream) + expect(provider.pullBranch).toHaveBeenCalledWith(worktree.path, pushTarget) + expect(provider.fastForwardBranch).toHaveBeenCalledWith(worktree.path, pushTarget) + expect(provider.commit).toHaveBeenCalledWith(worktree.path, 'feat: keep execution remote') + expect(mocks.abortMerge).not.toHaveBeenCalled() + expect(mocks.abortRebase).not.toHaveBeenCalled() + expect(mocks.gitFetch).not.toHaveBeenCalled() + expect(mocks.gitSyncForkDefaultBranch).not.toHaveBeenCalled() + expect(mocks.gitPull).not.toHaveBeenCalled() + expect(mocks.gitFastForward).not.toHaveBeenCalled() + expect(mocks.commitChanges).not.toHaveBeenCalled() + }) +}) diff --git a/src/main/runtime/runtime-git-sync-commands.ts b/src/main/runtime/runtime-git-sync-commands.ts index fe18012bbab..7cc892bac75 100644 --- a/src/main/runtime/runtime-git-sync-commands.ts +++ b/src/main/runtime/runtime-git-sync-commands.ts @@ -24,7 +24,10 @@ export class RuntimeGitSyncCommands { await provider.abortMerge(target.worktree.path) return { ok: true } } - await abortMerge(target.worktree.path, localGitOptionsForTarget(target)) + await abortMerge(target.worktree.path, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -38,7 +41,10 @@ export class RuntimeGitSyncCommands { await provider.abortRebase(target.worktree.path) return { ok: true } } - await abortRebase(target.worktree.path, localGitOptionsForTarget(target)) + await abortRebase(target.worktree.path, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -70,7 +76,10 @@ export class RuntimeGitSyncCommands { await provider.fetchRemote(target.worktree.path, pushTarget) return { ok: true } } - await gitFetch(target.worktree.path, pushTarget, localGitOptionsForTarget(target)) + await gitFetch(target.worktree.path, pushTarget, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -86,11 +95,10 @@ export class RuntimeGitSyncCommands { } return provider.syncForkDefaultBranch(target.worktree.path, expectedUpstream) } - return gitSyncForkDefaultBranch( - target.worktree.path, - expectedUpstream, - localGitOptionsForTarget(target) - ) + return gitSyncForkDefaultBranch(target.worktree.path, expectedUpstream, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) } async pullRuntimeGit( @@ -106,7 +114,10 @@ export class RuntimeGitSyncCommands { await provider.pullBranch(target.worktree.path, pushTarget) return { ok: true } } - await gitPull(target.worktree.path, pushTarget, localGitOptionsForTarget(target)) + await gitPull(target.worktree.path, pushTarget, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -123,7 +134,10 @@ export class RuntimeGitSyncCommands { await provider.fastForwardBranch(target.worktree.path, pushTarget) return { ok: true } } - await gitFastForward(target.worktree.path, pushTarget, localGitOptionsForTarget(target)) + await gitFastForward(target.worktree.path, pushTarget, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -137,7 +151,10 @@ export class RuntimeGitSyncCommands { await provider.rebaseFromBase(target.worktree.path, baseRef) return { ok: true } } - await gitPullRebaseFromBase(target.worktree.path, baseRef, localGitOptionsForTarget(target)) + await gitPullRebaseFromBase(target.worktree.path, baseRef, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) return { ok: true } } @@ -160,7 +177,8 @@ export class RuntimeGitSyncCommands { } await gitPush(target.worktree.path, publish === true, pushTarget, { forceWithLease: forceWithLease === true, - ...localGitOptionsForTarget(target) + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' }) return { ok: true } } @@ -180,6 +198,9 @@ export class RuntimeGitSyncCommands { } return provider.commit(target.worktree.path, message) } - return commitChanges(target.worktree.path, message, localGitOptionsForTarget(target)) + return commitChanges(target.worktree.path, message, { + ...localGitOptionsForTarget(target), + admissionTier: 'interactive' + }) } } diff --git a/src/main/runtime/runtime-rpc-mobile-method-allowlist.test.ts b/src/main/runtime/runtime-rpc-mobile-method-allowlist.test.ts index 9c590994c41..88f4aefb186 100644 --- a/src/main/runtime/runtime-rpc-mobile-method-allowlist.test.ts +++ b/src/main/runtime/runtime-rpc-mobile-method-allowlist.test.ts @@ -628,7 +628,7 @@ describe('OrcaRuntimeRpcServer', () => { expectedCodexResetScope ) expect(mocks.readTerminal).toHaveBeenCalledWith('term-1', { cursor: undefined }) - expect(mocks.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1') + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledWith('id:wt-1', { admissionTier: 'status' }) expect(mocks.pushRuntimeGit).toHaveBeenCalledWith('id:wt-1', true, undefined, undefined) expect(mocks.getRuntimeGitUpstreamStatus).toHaveBeenCalledWith('id:wt-1') expect(mocks.bulkStageRuntimeGitPaths).toHaveBeenCalledWith('id:wt-1', ['a.ts', 'b.ts']) diff --git a/src/main/runtime/runtime-rpc/runtime-rpc-mobile-method-allowlist.ts b/src/main/runtime/runtime-rpc/runtime-rpc-mobile-method-allowlist.ts index 461ec02ba69..cfeb6e8c3e6 100644 --- a/src/main/runtime/runtime-rpc/runtime-rpc-mobile-method-allowlist.ts +++ b/src/main/runtime/runtime-rpc/runtime-rpc-mobile-method-allowlist.ts @@ -43,9 +43,12 @@ export const MOBILE_RPC_METHOD_ALLOWLIST = new Set([ 'files.readDir', 'files.readPreview', 'files.readTerminalArtifact', + 'files.readTerminalArtifactChunk', 'files.readTerminalArtifactPreview', 'files.resolveTerminalPath', 'files.searchPaths', + 'files.watch', + 'files.writeIfUnchanged', 'files.writeTerminalArtifact', 'folderWorkspace.list', 'git.abortMerge', @@ -123,6 +126,7 @@ export const MOBILE_RPC_METHOD_ALLOWLIST = new Set([ 'github.workItemDetails', 'gitlab.createIssue', 'gitlab.addIssueComment', + 'gitlab.addMRInlineComment', 'gitlab.addMRComment', 'gitlab.listWorkItems', // Mobile Smart picker: resolve a pasted GitLab URL to an exact issue/MR (MR listing reuses gitlab.listWorkItems). @@ -143,6 +147,7 @@ export const MOBILE_RPC_METHOD_ALLOWLIST = new Set([ 'hostedReview.createStacked', 'hostedReview.forBranch', 'hostedReview.getCreationEligibility', + 'hostedReview.submit', 'linear.getCustomView', 'linear.getIssue', 'linear.getProject', @@ -171,6 +176,9 @@ export const MOBILE_RPC_METHOD_ALLOWLIST = new Set([ 'linear.updateIssue', 'markdown.readTab', 'markdown.saveTab', + 'mobileWeb.package.asset', + 'mobileWeb.package.asset.gzip', + 'mobileWeb.package.manifest', 'notifications.getMissedSince', 'notifications.subscribe', 'notifications.unsubscribe', diff --git a/src/main/runtime/structured-agent-session-rollback-compatibility.test.ts b/src/main/runtime/structured-agent-session-rollback-compatibility.test.ts new file mode 100644 index 00000000000..293ec194aae --- /dev/null +++ b/src/main/runtime/structured-agent-session-rollback-compatibility.test.ts @@ -0,0 +1,145 @@ +import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { agentSessionRecordFixture } from '../../shared/agent-session-record.test-fixture' +import { safeParseWorkspaceSession } from '../../shared/workspace-session-schema' +import { journalDirectoryFor } from '../native-chat/agent-session-journal/journal-paths' +import { AgentSessionRecordStore } from './agent-session-record-store' +import { AGENT_SESSION_STORE_FILE_NAME } from './agent-session-record-store-file' +import { collectSavedStructuredAgentSessionIds } from './saved-structured-agent-session-restoration' + +const WORKSPACE = 'workspace-1' +const SESSION = 'session-alpha-1' + +function structuredTab() { + return { + id: `agent-session:${SESSION}`, + entityId: SESSION, + groupId: 'group-1', + worktreeId: WORKSPACE, + contentType: 'agent-session' as const, + label: 'Codex Chat', + customLabel: null, + color: null, + sortOrder: 0, + createdAt: 1 + } +} + +function profileWithStructuredTab(): Record { + return { + activeRepoId: null, + activeWorktreeId: WORKSPACE, + activeTabId: structuredTab().id, + tabsByWorktree: {}, + terminalLayoutsByTabId: {}, + activeTabIdByWorktree: { [WORKSPACE]: structuredTab().id }, + unifiedTabs: { [WORKSPACE]: [structuredTab()] } + } +} + +/** The pinned base rejects the new discriminator and salvages the remaining profile. */ +function pinnedBaseRoundTrip(raw: Record): Record { + const unifiedTabs = raw.unifiedTabs as Record | undefined + return { + ...raw, + ...(unifiedTabs + ? { + unifiedTabs: Object.fromEntries( + Object.entries(unifiedTabs).map(([worktreeId, tabs]) => [ + worktreeId, + tabs.filter((tab) => { + const contentType = (tab as { contentType?: unknown }).contentType + return ( + contentType === 'terminal' || + contentType === 'editor' || + contentType === 'diff' || + contentType === 'conflict-review' || + contentType === 'check-details' || + contentType === 'browser' || + contentType === 'simulator' + ) + }) + ]) + ) + } + : {}) + } +} + +let root: string + +afterEach(async () => { + await rm(root, { recursive: true, force: true }) +}) + +describe('structured session rollback compatibility', () => { + it('keeps the visible session reference through target → base → target', async () => { + root = await mkdtemp(join(tmpdir(), 'orca-structured-rollback-')) + const storeDir = join(root, 'agent-store') + await mkdir(storeDir, { recursive: true }) + const record = agentSessionRecordFixture({ + ...agentSessionRecordFixture().lease, + sessionId: SESSION, + runtimeKind: 'native' + }) + await writeFile( + join(storeDir, AGENT_SESSION_STORE_FILE_NAME), + JSON.stringify({ + schemaVersion: 2, + hostId: 'local', + records: { [SESSION]: record }, + operations: {}, + retiredClaimKeys: [], + unusableRecords: {} + }) + ) + const journalDir = journalDirectoryFor(root, { workspaceId: WORKSPACE, sessionId: SESSION }) + await mkdir(journalDir, { recursive: true }) + await writeFile(join(journalDir, 'journal.log'), 'durable-journal-fixture\n') + + const target = await AgentSessionRecordStore.open({ directory: storeDir, hostId: 'local' }) + expect(target.getVisibleSessionTabIndex()).toEqual({ present: false, sessionIds: [] }) + await target.setSessionTabVisibility(SESSION, true) + expect(target.getVisibleSessionTabIndex()).toEqual({ present: true, sessionIds: [SESSION] }) + + const targetProfile = profileWithStructuredTab() + const targetParsed = safeParseWorkspaceSession(targetProfile) + expect(targetParsed?.success).toBe(true) + expect( + collectSavedStructuredAgentSessionIds(targetParsed?.success ? targetParsed.data : null) + ).toEqual([SESSION]) + + const baseProfile = pinnedBaseRoundTrip(targetProfile) + const baseParsed = safeParseWorkspaceSession(baseProfile) + expect(baseParsed?.success).toBe(true) + expect( + collectSavedStructuredAgentSessionIds(baseParsed?.success ? baseParsed.data : null) + ).toEqual([]) + + await writeFile(join(root, 'profile.json'), JSON.stringify(baseProfile)) + const targetReloadedProfile = safeParseWorkspaceSession(JSON.parse(JSON.stringify(baseProfile))) + expect(targetReloadedProfile?.success).toBe(true) + expect( + collectSavedStructuredAgentSessionIds( + targetReloadedProfile?.success ? targetReloadedProfile.data : null + ) + ).toEqual([]) + const reloaded = await AgentSessionRecordStore.open({ directory: storeDir, hostId: 'local' }) + expect(reloaded.listVisibleSessionIds()).toEqual([SESSION]) + expect(reloaded.getRecord(SESSION)?.providerHandleChain).toHaveLength(1) + await expect(readFile(join(journalDir, 'journal.log'), 'utf8')).resolves.toBe( + 'durable-journal-fixture\n' + ) + expect( + JSON.parse(await readFile(join(storeDir, AGENT_SESSION_STORE_FILE_NAME), 'utf8')) + ).toMatchObject({ visibleSessionIds: [SESSION] }) + + await reloaded.setSessionTabVisibility(SESSION, false) + const afterClose = await AgentSessionRecordStore.open({ directory: storeDir, hostId: 'local' }) + expect(afterClose.getVisibleSessionTabIndex()).toEqual({ present: true, sessionIds: [] }) + expect(afterClose.listVisibleSessionIds()).toEqual([]) + expect(afterClose.getRecord(SESSION)?.providerHandleChain).toHaveLength(1) + }) +}) diff --git a/src/main/runtime/worktree-path-selector-wsl-posix.test.ts b/src/main/runtime/worktree-path-selector-wsl-posix.test.ts new file mode 100644 index 00000000000..2346afa500b --- /dev/null +++ b/src/main/runtime/worktree-path-selector-wsl-posix.test.ts @@ -0,0 +1,226 @@ +/** + * A WSL shell prints `/home/neil/qa-repo`; the runtime stored the same directory as the UNC path + * Windows sees (#16628). The CLI translates, proving the caller's distro from its own UNC cwd — + * this resolver also feeds `worktree rm`, so a tail-only match would delete another distro's copy. + */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const electronMocks = vi.hoisted(() => { + const ipcMain = { + on: vi.fn(() => ipcMain), + removeListener: vi.fn(() => ipcMain), + emit: vi.fn(() => true) + } + return { + BrowserWindow: { fromId: vi.fn((): unknown => null) }, + webContents: { fromId: vi.fn((): unknown => null) }, + ipcMain, + app: { getPath: vi.fn(() => '/tmp'), isPackaged: false } + } +}) +vi.mock('electron', () => electronMocks) + +const getSshGitProviderMock = vi.hoisted(() => vi.fn()) +vi.mock('../providers/ssh-git-dispatch', () => ({ + getSshGitProvider: getSshGitProviderMock, + getSshGitProviderGeneration: vi.fn(() => 0), + SSH_GIT_PROVIDER_UNAVAILABLE_MESSAGE: 'unavailable', + requireSshGitProvider: (connectionId: string) => getSshGitProviderMock(connectionId) +})) + +const listWorktreesStrictMock = vi.hoisted(() => vi.fn()) +vi.mock('../git/worktree', async (importOriginal) => ({ + ...(await importOriginal>()), + listWorktreesStrict: listWorktreesStrictMock +})) + +import { isWslUncPathForCallerLinuxPath } from '../../shared/cross-platform-path' +import { parseWslUncPath } from '../../shared/wsl-paths' +import { OrcaRuntimeService } from './orca-runtime' + +const UBUNTU = 'Ubuntu-24.04' +const DEBIAN = 'Debian' +const LINUX_REPO_PATH = '/home/neil/repo' +const LINUX_WORKTREE_PATH = '/home/neil/qa-repo' + +/** The cwd the WSL launcher hands the CLI: the caller's directory, already in UNC form. */ +function uncPath(distro: string, linuxPath: string): string { + return `\\\\wsl.localhost\\${distro}${linuxPath.replace(/\//g, '\\')}` +} + +type Registration = { distro: string; repoPath: string; worktreePath: string } + +function registration(distro: string, spelling: (linuxPath: string) => string): Registration { + return { + distro, + repoPath: spelling(LINUX_REPO_PATH), + worktreePath: spelling(LINUX_WORKTREE_PATH) + } +} + +/** One repo per distro, so an unwanted cross-distro match shows up as the wrong resolved path. */ +function makeStore(registrations: readonly Registration[]) { + const repos = registrations.map((entry) => ({ + id: `repo-${entry.distro.toLowerCase()}`, + path: entry.repoPath, + displayName: entry.distro, + badgeColor: 'blue', + addedAt: 1 + })) + const store = { + getRepo: (id: string) => repos.find((repo) => repo.id === id), + getRepos: () => repos, + getAllWorktreeMeta: vi.fn(() => ({})), + getWorktreeMeta: () => undefined, + setWorktreeMeta: vi.fn(), + removeWorktreeMeta: () => {}, + getAllWorktreeLineage: () => ({}), + getAllWorkspaceLineage: () => ({}), + removeWorktreeLineage: vi.fn(), + removeWorkspaceLineage: vi.fn(), + getGitHubCache: () => undefined as never, + getSettings: () => ({ + workspaceDir: '/tmp/workspaces', + nestWorkspaces: false, + refreshLocalBaseRefOnWorktreeCreate: false, + branchPrefix: 'none', + branchPrefixCustom: '' + }), + getProjects: () => [] + } + return store +} + +/** `git worktree list` for each registered repo: the main checkout plus one workspace. */ +function scanReports(registrations: readonly Registration[]): void { + listWorktreesStrictMock.mockImplementation(async (repoPath: string) => { + const entry = registrations.find((candidate) => candidate.repoPath === repoPath) + if (!entry) { + return [] + } + return [ + { path: entry.repoPath, head: 'abc', branch: 'main', isBare: false, isMainWorktree: true }, + { + path: entry.worktreePath, + head: 'def', + branch: 'qa', + isBare: false, + isMainWorktree: false + } + ] + }) +} + +function makeRuntime(registrations: readonly Registration[]): OrcaRuntimeService { + scanReports(registrations) + return new OrcaRuntimeService(makeStore(registrations) as never) +} + +/** + * What `resolveCallerDistroPathSelector` sends: the caller's distro comes from its own UNC cwd, + * and the stored spelling of the one worktree that distro can mean replaces the typed path. + * Mirrored rather than imported — `src/cli` is outside this file's tsconfig project. + */ +async function selectorTheCliWouldSend( + runtime: OrcaRuntimeService, + callerCwd: string, + typedPath: string +): Promise { + const callerDistro = parseWslUncPath(callerCwd)?.distro + if (!callerDistro) { + return `path:${typedPath}` + } + const listed = await runtime.listManagedWorktrees() + const match = listed.worktrees.find((worktree) => + isWslUncPathForCallerLinuxPath(worktree.path, typedPath, callerDistro) + ) + return match ? `path:${match.path}` : `path:${typedPath}` +} + +beforeEach(() => { + getSshGitProviderMock.mockReset() + listWorktreesStrictMock.mockReset() +}) + +describe('a WSL caller typing the Linux path of a UNC-stored worktree (#16628)', () => { + it('resolves the Linux path a WSL shell prints to the UNC-stored worktree', async () => { + const registrations = [registration(UBUNTU, (linuxPath) => uncPath(UBUNTU, linuxPath))] + const runtime = makeRuntime(registrations) + + // The live bug: the spelling the runtime stored resolves, the one the user types does not. + await expect( + runtime.showManagedWorktree(`path:${uncPath(UBUNTU, LINUX_WORKTREE_PATH)}`) + ).resolves.toMatchObject({ path: uncPath(UBUNTU, LINUX_WORKTREE_PATH) }) + await expect(runtime.showManagedWorktree(`path:${LINUX_WORKTREE_PATH}`)).rejects.toThrow( + 'selector_not_found' + ) + + const selector = await selectorTheCliWouldSend( + runtime, + uncPath(UBUNTU, '/home/neil'), + LINUX_WORKTREE_PATH + ) + + await expect(runtime.showManagedWorktree(selector)).resolves.toMatchObject({ + path: uncPath(UBUNTU, LINUX_WORKTREE_PATH) + }) + }) + + it('resolves a forward-slash UNC registration from the same Linux path', async () => { + // Windows records the same share both ways; the caller's spelling never changes. + const forwardSlash = (linuxPath: string) => `//wsl.localhost/${UBUNTU}${linuxPath}` + const runtime = makeRuntime([registration(UBUNTU, forwardSlash)]) + + const selector = await selectorTheCliWouldSend( + runtime, + uncPath(UBUNTU, '/home/neil'), + LINUX_WORKTREE_PATH + ) + + await expect(runtime.showManagedWorktree(selector)).resolves.toMatchObject({ + path: forwardSlash(LINUX_WORKTREE_PATH) + }) + }) + + it('refuses a Linux path another distro spells, instead of resolving that distro', async () => { + const runtime = makeRuntime([registration(UBUNTU, (linuxPath) => uncPath(UBUNTU, linuxPath))]) + const selector = await selectorTheCliWouldSend( + runtime, + uncPath(DEBIAN, '/home/neil'), + LINUX_WORKTREE_PATH + ) + + // Untranslated, so the runtime refuses rather than deleting Ubuntu's copy on a Debian `rm`. + expect(selector).toBe(`path:${LINUX_WORKTREE_PATH}`) + await expect(runtime.showManagedWorktree(selector)).rejects.toThrow('selector_not_found') + }) + + it('picks the caller-distro worktree when two distros spell the same Linux path', async () => { + const runtime = makeRuntime([ + registration(UBUNTU, (linuxPath) => uncPath(UBUNTU, linuxPath)), + registration(DEBIAN, (linuxPath) => uncPath(DEBIAN, linuxPath)) + ]) + + const selector = await selectorTheCliWouldSend( + runtime, + uncPath(DEBIAN, '/home/neil'), + LINUX_WORKTREE_PATH + ) + + await expect(runtime.showManagedWorktree(selector)).resolves.toMatchObject({ + path: uncPath(DEBIAN, LINUX_WORKTREE_PATH) + }) + }) + + it('leaves a Linux-native CLI, whose runtime stores POSIX paths, untouched', async () => { + const posix = (linuxPath: string) => linuxPath + const runtime = makeRuntime([registration(UBUNTU, posix)]) + + const selector = await selectorTheCliWouldSend(runtime, '/home/neil', LINUX_WORKTREE_PATH) + + expect(selector).toBe(`path:${LINUX_WORKTREE_PATH}`) + await expect(runtime.showManagedWorktree(selector)).resolves.toMatchObject({ + path: LINUX_WORKTREE_PATH + }) + }) +}) diff --git a/src/main/source-control/hosted-review-git-options.ts b/src/main/source-control/hosted-review-git-options.ts index eb8dc63f33c..060c116bcb2 100644 --- a/src/main/source-control/hosted-review-git-options.ts +++ b/src/main/source-control/hosted-review-git-options.ts @@ -1,5 +1,8 @@ +import type { GitAdmissionTier } from '../git/command-runner/git-exec-options' + export type HostedReviewLocalGitOptions = { wslDistro?: string + admissionTier?: GitAdmissionTier } export type HostedReviewExecutionOptions = { @@ -14,7 +17,11 @@ export function getHostedReviewLocalGitOptions( options: HostedReviewExecutionOptions = {} ): HostedReviewLocalGitOptions { const wslDistro = options.localGitExecOptions?.wslDistro - return wslDistro ? { wslDistro } : {} + const admissionTier = options.localGitExecOptions?.admissionTier + return { + ...(wslDistro ? { wslDistro } : {}), + ...(admissionTier ? { admissionTier } : {}) + } } export function hasHostedReviewLocalGitOptions( diff --git a/src/main/source-control/pull-request-linked-issue.ts b/src/main/source-control/pull-request-linked-issue.ts index 94ea1432473..90c61930d91 100644 --- a/src/main/source-control/pull-request-linked-issue.ts +++ b/src/main/source-control/pull-request-linked-issue.ts @@ -2,6 +2,7 @@ import type { HostedReviewProvider } from '../../shared/hosted-review' import type { PullRequestLinkedIssue } from '../../shared/pull-request-generation' import { isLinkedIssueNumber } from '../../shared/source-control-ai-action-variables' import type { WorkspaceLinkedItem } from '../../shared/worktree/types' +import type { GitRuntimeOptions } from '../git/git-runtime-options' import { getIssue as getGitHubIssue } from '../github/issues' import { getIssue as getGitLabIssue } from '../gitlab/issues' @@ -11,7 +12,7 @@ export type PullRequestLinkedIssueMeta = { linkedWorkItem?: WorkspaceLinkedItem | null } -type LocalGitOptions = { wslDistro?: string } +type LocalGitOptions = Pick function inferIssueProvider( meta: PullRequestLinkedIssueMeta, diff --git a/src/main/source-control/repo-default-branch.ts b/src/main/source-control/repo-default-branch.ts index b5c4f77d2c8..d24cde4ea13 100644 --- a/src/main/source-control/repo-default-branch.ts +++ b/src/main/source-control/repo-default-branch.ts @@ -90,6 +90,9 @@ export async function getRepoDefaultBranchName( : gitExecFileAsync(argv, { cwd: repoPath, ...(localGitOptions.wslDistro ? { wslDistro: localGitOptions.wslDistro } : {}), + ...(localGitOptions.admissionTier + ? { admissionTier: localGitOptions.admissionTier } + : {}), timeout: timeoutMs }) }) diff --git a/src/preload/api/git-inspection-api.ts b/src/preload/api/git-inspection-api.ts index b71234d2d0c..d4e13a20e55 100644 --- a/src/preload/api/git-inspection-api.ts +++ b/src/preload/api/git-inspection-api.ts @@ -20,7 +20,9 @@ export type GitInspectionApi = { status: (args: { worktreePath: string connectionId?: string + admissionTier?: 'interactive' | 'status' | 'background' includeIgnored?: boolean + includeLineStats?: boolean bypassEffectiveUpstreamNegativeCache?: boolean reuseLineStats?: boolean /** Merge-base OID to measure the branch line total against; omit to skip the work. */ @@ -66,6 +68,7 @@ export type GitInspectionApi = { worktreePath: string baseRef: string connectionId?: string + admissionTier?: 'interactive' | 'status' | 'background' }) => Promise commitCompare: (args: { worktreePath: string diff --git a/src/preload/api/github-pull-request-api.ts b/src/preload/api/github-pull-request-api.ts index 5e044286b95..68de9ac2d31 100644 --- a/src/preload/api/github-pull-request-api.ts +++ b/src/preload/api/github-pull-request-api.ts @@ -44,7 +44,10 @@ export type GithubPullRequestApi = { acceptMergedFallbackPR?: boolean currentHeadOid?: string | null }) => Promise - refreshPRNow: (args: { candidate: GitHubPRRefreshCandidate }) => Promise + refreshPRNow: (args: { + candidate: GitHubPRRefreshCandidate + reason?: GitHubPRRefreshReason + }) => Promise enqueuePRRefresh: (args: { candidate: GitHubPRRefreshCandidate reason: GitHubPRRefreshReason diff --git a/src/preload/index.ts b/src/preload/index.ts index 7c422ade23f..abd21173c70 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1466,8 +1466,10 @@ const api = { currentHeadOid?: string | null }): Promise => ipcRenderer.invoke('gh:prForBranch', args), - refreshPRNow: (args: { candidate: GitHubPRRefreshCandidate }): Promise => - ipcRenderer.invoke('gh:refreshPRNow', args), + refreshPRNow: (args: { + candidate: GitHubPRRefreshCandidate + reason?: GitHubPRRefreshReason + }): Promise => ipcRenderer.invoke('gh:refreshPRNow', args), enqueuePRRefresh: (args: { candidate: GitHubPRRefreshCandidate @@ -3612,7 +3614,9 @@ const api = { status: (args: { worktreePath: string connectionId?: string + admissionTier?: 'interactive' | 'status' | 'background' includeIgnored?: boolean + includeLineStats?: boolean bypassEffectiveUpstreamNegativeCache?: boolean reuseLineStats?: boolean branchLineTotalMergeBase?: string @@ -3663,6 +3667,7 @@ const api = { worktreePath: string baseRef: string connectionId?: string + admissionTier?: 'interactive' | 'status' | 'background' }): Promise => ipcRenderer.invoke('git:branchCompare', args), commitCompare: (args: { worktreePath: string diff --git a/src/relay/git-handler-status-ops.test.ts b/src/relay/git-handler-status-ops.test.ts index 2207a982dc7..b8e379ed262 100644 --- a/src/relay/git-handler-status-ops.test.ts +++ b/src/relay/git-handler-status-ops.test.ts @@ -209,6 +209,37 @@ describe('getStatusOp', () => { expect(git.mock.calls.filter(([args]) => args.includes('diff'))).toHaveLength(2) }) + it('omits line stats without overwriting the reusable line-stats cache', async () => { + const statusOutput = `${buildBranchStatusOutput('head-skip', '(detached)')}\n1 .M N... 100644 100644 100644 aaaa aaaa src/a.ts` + const git = vi.fn(async (args) => { + if (args.includes('status')) { + return { stdout: statusOutput, stderr: '' } + } + if (args.includes('diff')) { + return { stdout: '3\t2\tsrc/a.ts\n', stderr: '' } + } + throw new Error(`Unexpected git command: ${args.join(' ')}`) + }) + + const withStats = await getStatusOp(git, streamGitFromCapture(git), { + worktreePath: tmpDir + }) + const withoutStats = await getStatusOp(git, streamGitFromCapture(git), { + worktreePath: tmpDir, + includeLineStats: false + }) + const reused = await getStatusOp(git, streamGitFromCapture(git), { + worktreePath: tmpDir, + reuseLineStats: true + }) + + expect(withoutStats.entries).toEqual( + withStats.entries.map(({ added: _added, removed: _removed, ...entry }) => entry) + ) + expect(reused.entries).toEqual(withStats.entries) + expect(git.mock.calls.filter(([args]) => args.includes('diff'))).toHaveLength(1) + }) + it('forwards the request abort signal to status and numstat subprocesses', async () => { const controller = new AbortController() const git = vi.fn(async (args) => { diff --git a/src/relay/git-handler-status-ops.ts b/src/relay/git-handler-status-ops.ts index f87311c2cb3..6ae1baee2af 100644 --- a/src/relay/git-handler-status-ops.ts +++ b/src/relay/git-handler-status-ops.ts @@ -83,7 +83,8 @@ export async function getStatusOp( }> { const worktreePath = params.worktreePath as string const lineStatsCacheKey = `relay\0${worktreePath}` - const lineStatsWriteToken = beginGitStatusLineStatsCacheWrite(lineStatsCacheKey) + const lineStatsWriteToken = + params.includeLineStats === false ? null : beginGitStatusLineStatsCacheWrite(lineStatsCacheKey) const includeIgnored = params.includeIgnored === true // Why: untrusted RPC input spliced into a git argv — only an OID shape may pass. const branchLineTotalMergeBase = readGitBranchLineTotalMergeBaseParam( @@ -197,7 +198,7 @@ export async function getStatusOp( } // Why: skip numstat after the limit to avoid reintroducing its cost. - if (!didHitLimit) { + if (!didHitLimit && lineStatsWriteToken !== null) { const branchLineTotalInput = buildBranchLineTotalInput( git, worktreePath, @@ -218,7 +219,7 @@ export async function getStatusOp( recompute: () => attachLineStats(git, worktreePath, entries, options.signal), ...(branchLineTotalInput ? { branchLineTotal: branchLineTotalInput } : {}) })) - } else { + } else if (lineStatsWriteToken !== null) { clearGitStatusLineStatsCacheKey(lineStatsCacheKey, lineStatsWriteToken) } diff --git a/src/relay/pty-handler-attach-replay.test.ts b/src/relay/pty-handler-attach-replay.test.ts index 7de5242f2ae..6af9faec047 100644 --- a/src/relay/pty-handler-attach-replay.test.ts +++ b/src/relay/pty-handler-attach-replay.test.ts @@ -32,15 +32,18 @@ vi.mock('../main/shell-prompt-readiness-probe', () => ({ createShellPromptReadinessProbe: mockCreateShellPromptReadinessProbe })) -import { PtyHandler, attachIdentityMismatches } from './pty-handler' -import type { RelayDispatcher } from './dispatcher' +import { attachIdentityMismatches, type PtyHandler } from './pty-handler' import { beginPtyHandlerTest, createPtyRequestHelpers, + createTestPtyHandler, + testPtyId, endPtyHandlerTest } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -83,19 +86,19 @@ describe('PtyHandler', () => { const aliveSpy = vi.spyOn(ptyShellUtils, 'isProcessAlive').mockReturnValue(false) try { await expect( - dispatcher.callRequest('pty.attach', { id: 'pty-1', suppressReplayNotification: true }) - ).rejects.toThrow('PTY "pty-1" not found') + dispatcher.callRequest('pty.attach', { id: PTY_1, suppressReplayNotification: true }) + ).rejects.toThrow(`PTY "${PTY_1}" not found`) } finally { aliveSpy.mockRestore() } // The stale entry is reaped: cache-eviction observers fire and the map slot // is freed so a later attach also cleanly reports not-found. - expect(exits).toEqual([{ id: 'pty-1', paneKey: 'tab-dead:0' }]) + expect(exits).toEqual([{ id: PTY_1, paneKey: 'tab-dead:0' }]) expect(handler.activePtyCount).toBe(0) await expect( - dispatcher.callRequest('pty.attach', { id: 'pty-1', suppressReplayNotification: true }) - ).rejects.toThrow('PTY "pty-1" not found') + dispatcher.callRequest('pty.attach', { id: PTY_1, suppressReplayNotification: true }) + ).rejects.toThrow(`PTY "${PTY_1}" not found`) }) it('settles concurrent immediate shutdown when attach proves the shell exited', async () => { @@ -110,12 +113,12 @@ describe('PtyHandler', () => { let shutdown: Promise | undefined const aliveSpy = vi.spyOn(ptyShellUtils, 'isProcessAlive').mockImplementation(() => { - shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) return false }) try { - await expect(dispatcher.callRequest('pty.attach', { id: 'pty-1' })).rejects.toThrow( - 'PTY "pty-1" not found' + await expect(dispatcher.callRequest('pty.attach', { id: PTY_1 })).rejects.toThrow( + `PTY "${PTY_1}" not found` ) await expect(shutdown).resolves.toBeUndefined() } finally { @@ -144,7 +147,7 @@ describe('PtyHandler', () => { const aliveSpy = vi.spyOn(ptyShellUtils, 'isProcessAlive').mockReturnValue(true) try { const result = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(result).toEqual({ incarnationId: spawn.incarnationId, replay: 'prompt$ ' }) @@ -168,7 +171,7 @@ describe('PtyHandler', () => { dataCallback!('buffered output') const result = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) @@ -197,7 +200,7 @@ describe('PtyHandler', () => { } as never) const result = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) @@ -264,11 +267,11 @@ describe('PtyHandler', () => { dataCallback!('buffered output') dispatcher.notify.mockClear() - const result = await attachPty({ id: 'pty-1' }) + const result = await attachPty({ id: PTY_1 }) expect(result).toEqual({ incarnationId: spawn.incarnationId }) expect(dispatcher.notify).toHaveBeenCalledWith('pty.replay', { - id: 'pty-1', + id: PTY_1, data: 'buffered output' }) vi.advanceTimersByTime(8) @@ -306,15 +309,15 @@ describe('PtyHandler', () => { await expect( attachPty({ - id: 'pty-1', + id: PTY_1, expectedPaneKey: 'tab-b:leaf-b', expectedTabId: 'tab-b' }) - ).rejects.toThrow('PTY "pty-1" not found') + ).rejects.toThrow(`PTY "${PTY_1}" not found`) await expect( attachPty({ - id: 'pty-1', + id: PTY_1, expectedPaneKey: 'tab-a:leaf-a', expectedTabId: 'tab-a' }) @@ -336,7 +339,7 @@ describe('PtyHandler', () => { exitCallback!({ exitCode: 0 }) expect(dispatcher.notify).toHaveBeenCalledWith('pty.exit', { - id: 'pty-1', + id: PTY_1, code: 0, incarnationId: spawn.incarnationId }) @@ -356,7 +359,7 @@ describe('PtyHandler', () => { tryNotifyPtyExit, legacyRetentionBelowLowWater: true }) - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) let exitCallback: ((info: { exitCode: number }) => void) | undefined mockPtySpawn.mockReturnValue({ ...mockPtyInstance, @@ -372,7 +375,7 @@ describe('PtyHandler', () => { capacityListener?.() expect(tryNotifyPtyExit).toHaveBeenLastCalledWith({ - id: 'pty-1', + id: PTY_1, code: 0, incarnationId: spawn.incarnationId }) @@ -397,11 +400,11 @@ describe('PtyHandler', () => { exitCallback!({ exitCode: 0 }) expect(dispatcher.notify).toHaveBeenNthCalledWith(1, 'pty.data', { - id: 'pty-1', + id: PTY_1, data: 'final output' }) expect(dispatcher.notify).toHaveBeenNthCalledWith(2, 'pty.exit', { - id: 'pty-1', + id: PTY_1, code: 0, incarnationId: spawn.incarnationId }) @@ -427,7 +430,7 @@ describe('PtyHandler', () => { dataCallback!('initial output') const r1 = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(r1).toEqual({ incarnationId: spawn.incarnationId, replay: 'initial output' }) @@ -435,7 +438,7 @@ describe('PtyHandler', () => { dataCallback!(' more') const r2 = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(r2).toEqual({ incarnationId: spawn.incarnationId, replay: 'initial output more' }) @@ -457,7 +460,7 @@ describe('PtyHandler', () => { dataCallback!('Mon Apr 28\r\n') const firstAttach = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(firstAttach.incarnationId).toBe(spawn.incarnationId) @@ -465,7 +468,7 @@ describe('PtyHandler', () => { dataCallback!('Tue Apr 29\r\n') const secondAttach = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(secondAttach.incarnationId).toBe(spawn.incarnationId) @@ -473,7 +476,7 @@ describe('PtyHandler', () => { dataCallback!('Wed Apr 30\r\n') const result = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(result).toEqual({ diff --git a/src/relay/pty-handler-dispose-lifecycle.test.ts b/src/relay/pty-handler-dispose-lifecycle.test.ts index a67327c12b4..0553f92a4e5 100644 --- a/src/relay/pty-handler-dispose-lifecycle.test.ts +++ b/src/relay/pty-handler-dispose-lifecycle.test.ts @@ -32,9 +32,12 @@ vi.mock('../main/shell-prompt-readiness-probe', () => ({ })) import { IMMEDIATE_PTY_EXIT_TIMEOUT_MS, type PtyHandler } from './pty-handler' -import { beginPtyHandlerTest, endPtyHandlerTest } from './pty-handler-test-harness' +import { beginPtyHandlerTest, endPtyHandlerTest, testPtyId } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) +const PTY_2 = testPtyId(2) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -71,7 +74,7 @@ describe('PtyHandler', () => { expect(onExitCb).toBeDefined() onExitCb!({ exitCode: 0 }) - expect(exits).toEqual([{ id: 'pty-1', paneKey: 'tab-2:1' }]) + expect(exits).toEqual([{ id: PTY_1, paneKey: 'tab-2:1' }]) }) it('keeps immediate shutdown pending until onExit and invokes the exit listener once', async () => { @@ -92,7 +95,7 @@ describe('PtyHandler', () => { env: { ORCA_PANE_KEY: 'tab-shutdown:0' } }) let settled = false - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) void shutdown.then(() => { settled = true }) @@ -105,7 +108,7 @@ describe('PtyHandler', () => { await shutdown expect(mockKill).toHaveBeenCalledWith('SIGKILL') - expect(exits).toEqual([{ id: 'pty-1', paneKey: 'tab-shutdown:0' }]) + expect(exits).toEqual([{ id: PTY_1, paneKey: 'tab-shutdown:0' }]) expect(handler.activePtyCount).toBe(0) }) @@ -170,14 +173,14 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) const rejected = expect(shutdown).rejects.toThrow('Timed out waiting for PTY process exit') await vi.advanceTimersByTimeAsync(IMMEDIATE_PTY_EXIT_TIMEOUT_MS) await rejected expect(mockKill).toHaveBeenCalledTimes(1) expect(handler.activePtyCount).toBe(1) - const retry = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const retry = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) expect(mockKill).toHaveBeenCalledTimes(1) onExitCb!({ exitCode: 137 }) await retry @@ -275,7 +278,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) vi.advanceTimersByTime(5000) expect(mockKill.mock.calls).toEqual([['SIGTERM'], ['SIGKILL']]) expect(vi.getTimerCount()).toBe(1) @@ -325,8 +328,8 @@ describe('PtyHandler', () => { } await dispose expect(exits).toEqual([ - { id: 'pty-1', paneKey: 'tab-dispose:0' }, - { id: 'pty-2', paneKey: 'tab-dispose:1' } + { id: PTY_1, paneKey: 'tab-dispose:0' }, + { id: PTY_2, paneKey: 'tab-dispose:1' } ]) expect(handler.activePtyCount).toBe(0) }) diff --git a/src/relay/pty-handler-output-drain-differential.test.ts b/src/relay/pty-handler-output-drain-differential.test.ts index 22ba265cd10..cbaee4bcb75 100644 --- a/src/relay/pty-handler-output-drain-differential.test.ts +++ b/src/relay/pty-handler-output-drain-differential.test.ts @@ -159,16 +159,20 @@ describe('relay PTY output drain — differential vs the pre-optimization snapsh async function spawnPtys(count: number): Promise { const ids: string[] = [] for (let i = 0; i < count; i++) { + let dataCallback!: (data: string) => void + let exitCallback!: (event: { exitCode: number }) => void mockPtySpawn.mockReturnValueOnce({ ...mockPtyInstance, onData: vi.fn((cb: (data: string) => void) => { - dataCallbacks.set(`pty-${i + 1}`, cb) + dataCallback = cb }), onExit: vi.fn((cb: (event: { exitCode: number }) => void) => { - exitCallbacks.set(`pty-${i + 1}`, cb) + exitCallback = cb }) }) const spawned = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + dataCallbacks.set(spawned.id, dataCallback) + exitCallbacks.set(spawned.id, exitCallback) ids.push(spawned.id) } return ids diff --git a/src/relay/pty-handler-output-streaming.test.ts b/src/relay/pty-handler-output-streaming.test.ts index 75bf570687d..acfa5d07456 100644 --- a/src/relay/pty-handler-output-streaming.test.ts +++ b/src/relay/pty-handler-output-streaming.test.ts @@ -35,9 +35,16 @@ vi.mock('../main/shell-prompt-readiness-probe', () => ({ import { PtyHandler } from './pty-handler' import { RelayDispatcher } from './dispatcher' import { encodeJsonRpcFrame } from './protocol' -import { beginPtyHandlerTest, endPtyHandlerTest } from './pty-handler-test-harness' +import { + beginPtyHandlerTest, + createTestPtyHandler, + endPtyHandlerTest, + testPtyId +} from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -84,7 +91,7 @@ describe('PtyHandler', () => { writableHighWaterMark: () => 4 * 1024 * 1024 } ) - const boundedHandler = new PtyHandler(boundedDispatcher) + const boundedHandler = new PtyHandler(boundedDispatcher, undefined, 'bounded-test-mint-epoch') try { boundedDispatcher.feed( encodeJsonRpcFrame({ jsonrpc: '2.0', id: 1, method: 'pty.spawn', params: {} }, 1, 0) @@ -125,7 +132,7 @@ describe('PtyHandler', () => { dataCallback!('hello world') expect(dispatcher.notify).not.toHaveBeenCalledWith('pty.data', expect.anything()) vi.advanceTimersByTime(8) - expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: 'pty-1', data: 'hello world' }) + expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: PTY_1, data: 'hello world' }) }) it('consumes capable startup queries before relay replay and fanout', async () => { @@ -153,16 +160,16 @@ describe('PtyHandler', () => { expect(term.write).toHaveBeenCalledWith('\x1b]10;rgb:2e2e/3434/3434\x1b\\') expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '', rawLength: query.length, seq: query.length, transformed: true }) - expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: 'pty-1', data: 'prompt' }) + expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: PTY_1, data: 'prompt' }) await expect( dispatcher.callRequest('pty.attach', { - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) ).resolves.toEqual({ replay: 'prompt', incarnationId: expect.any(String) }) @@ -184,7 +191,7 @@ describe('PtyHandler', () => { tryNotifyPtyExit: vi.fn(() => true), legacyRetentionBelowLowWater: true }) - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) let dataCallback: ((data: string) => void) | undefined mockPtySpawn.mockReturnValue({ ...mockPtyInstance, @@ -210,13 +217,13 @@ describe('PtyHandler', () => { expect(tryNotifyPtyData).toHaveBeenCalledTimes(3) expect(admitted).toEqual([ { - id: 'pty-1', + id: PTY_1, data: '', rawLength: query.length, seq: query.length, transformed: true }, - { id: 'pty-1', data: 'fresh' } + { id: PTY_1, data: 'fresh' } ]) }) @@ -250,7 +257,7 @@ describe('PtyHandler', () => { Math.min(maxChars, data.length, limit ?? data.length) ) }) - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) dataCallback = undefined mockPtySpawn.mockReturnValue({ ...mockPtyInstance, @@ -278,7 +285,7 @@ describe('PtyHandler', () => { expect(admitted.map((frame) => frame.data).join('')).toBe('a'.repeat(20_000) + 'b'.repeat(10)) expect((admitted[0].data as string).length).toBe(5_000) // Why: remainder frames must not leak transformed/rawLength/seq keys. - expect(admitted[1]).toStrictEqual({ id: 'pty-1', data: expect.any(String) }) + expect(admitted[1]).toStrictEqual({ id: PTY_1, data: expect.any(String) }) }) it('keeps a tail appended after a failed flush under constant capacity', async () => { @@ -331,8 +338,8 @@ describe('PtyHandler', () => { await vi.runAllTimersAsync() expect(admitted).toEqual([ - { id: 'pty-1', data: '', rawLength: 7, seq: 7, transformed: true }, - { id: 'pty-1', data: '', rawLength: 7, seq: 14, transformed: true } + { id: PTY_1, data: '', rawLength: 7, seq: 7, transformed: true }, + { id: PTY_1, data: '', rawLength: 7, seq: 14, transformed: true } ]) }) }) @@ -363,7 +370,7 @@ describe('PtyHandler', () => { vi.advanceTimersByTime(8) expect(term.write).not.toHaveBeenCalled() - expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: 'pty-1', data: query }) + expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: PTY_1, data: query }) } finally { if (originalPlatform) { Object.defineProperty(process, 'platform', originalPlatform) @@ -391,7 +398,7 @@ describe('PtyHandler', () => { expect(term.write).not.toHaveBeenCalled() expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '', rawLength: '\x1b]10;?\x07'.length, seq: '\x1b]10;?\x07'.length, @@ -422,7 +429,7 @@ describe('PtyHandler', () => { dataCallback!(query) vi.advanceTimersByTime(8) - expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: 'pty-1', data: query }) + expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { id: PTY_1, data: query }) } finally { if (originalPlatform) { Object.defineProperty(process, 'platform', originalPlatform) @@ -451,10 +458,10 @@ describe('PtyHandler', () => { dataCallback!('\x1b]11;?\x07') vi.advanceTimersByTime(8) - dispatcher.callNotification('pty.data', { id: 'pty-1', data: reply }) + dispatcher.callNotification('pty.data', { id: PTY_1, data: reply }) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b]11;?\x07' }) expect(term.write).toHaveBeenCalledWith(reply) @@ -482,7 +489,7 @@ describe('PtyHandler', () => { expect(dispatcher.notify).not.toHaveBeenCalledWith('pty.data', expect.anything()) vi.advanceTimersByTime(8) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: 'hello world' }) }) @@ -498,13 +505,13 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - dispatcher.callNotification('pty.data', { id: 'pty-1', data: 'a' }) + dispatcher.callNotification('pty.data', { id: PTY_1, data: 'a' }) dispatcher.notify.mockClear() dataCallback!('\x1b[20;2Hredraw') expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b[20;2Hredraw' }) vi.advanceTimersByTime(8) @@ -528,14 +535,14 @@ describe('PtyHandler', () => { vi.advanceTimersByTime(8) expect(dispatcher.notify).toHaveBeenCalledTimes(1) expect(dispatcher.notify).toHaveBeenNthCalledWith(1, 'pty.data', { - id: 'pty-1', + id: PTY_1, data: firstChunk }) vi.advanceTimersByTime(1) expect(dispatcher.notify).toHaveBeenCalledTimes(2) expect(dispatcher.notify).toHaveBeenNthCalledWith(2, 'pty.data', { - id: 'pty-1', + id: PTY_1, data: 'tail' }) }) @@ -550,7 +557,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - dispatcher.callNotification('pty.data', { id: 'pty-1', data: 'ls\n' }) + dispatcher.callNotification('pty.data', { id: PTY_1, data: 'ls\n' }) expect(mockWrite).toHaveBeenCalledWith('ls\n') }) @@ -564,7 +571,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - dispatcher.callNotification('pty.resize', { id: 'pty-1', cols: 120, rows: 40 }) + dispatcher.callNotification('pty.resize', { id: PTY_1, cols: 120, rows: 40 }) expect(mockResize).toHaveBeenCalledWith(120, 40) }) diff --git a/src/relay/pty-handler-revive.test.ts b/src/relay/pty-handler-revive.test.ts index 9350067da3b..c43a9af576a 100644 --- a/src/relay/pty-handler-revive.test.ts +++ b/src/relay/pty-handler-revive.test.ts @@ -35,15 +35,18 @@ vi.mock('../main/shell-prompt-readiness-probe', () => ({ createShellPromptReadinessProbe: mockCreateShellPromptReadinessProbe })) -import { MAX_RELAY_PTY_SESSIONS, PtyHandler } from './pty-handler' -import type { RelayDispatcher } from './dispatcher' +import { MAX_RELAY_PTY_SESSIONS, type PtyHandler } from './pty-handler' import { beginPtyHandlerTest, createMockDispatcher, + createTestPtyHandler, + testPtyId, endPtyHandlerTest } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -72,12 +75,12 @@ describe('PtyHandler', () => { ORCA_WORKTREE_ID: 'wt-5' } }) - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) handler.addEnvAugmenter(() => ({ ORCA_AGENT_HOOK_PORT: '12345', ORCA_AGENT_HOOK_TOKEN: 'abc-uuid' @@ -200,13 +203,13 @@ describe('PtyHandler', () => { await dispatcher.callRequest('pty.spawn', { command: 'claude' }) - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string expect(JSON.parse(state)[0]?.gitCredentialPromptGuarded).toBe(true) handler.dispose() mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) try { await dispatcher.callRequest('pty.revive', { state }) @@ -270,7 +273,7 @@ describe('PtyHandler', () => { expect(initialEnv.name).toBe('xterm-256color') expect(initialEnv.env.TERM).toBe('xterm-256color') - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string const [serialized] = JSON.parse(state) as { explicitTerm?: string envToDelete?: string[] @@ -281,7 +284,7 @@ describe('PtyHandler', () => { await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) handler.addEnvAugmenter(() => ({ ORCA_STALE_TEST_ENV: '/tmp/revived-stale' })) @@ -347,14 +350,14 @@ describe('PtyHandler', () => { env: { TERM: 'screen-256color' }, envToDelete: ['ORCA_STALE_TEST_ENV'] }) - let state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + let state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) try { await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) handler.addEnvAugmenter(() => ({ ORCA_STALE_TEST_ENV: '/tmp/first-revive' })) @@ -367,7 +370,7 @@ describe('PtyHandler', () => { expect(firstRevivedEnv.name).toBe('screen-256color') expect(firstRevivedEnv.env.TERM).toBe('screen-256color') expect(firstRevivedEnv.env.ORCA_STALE_TEST_ENV).toBeUndefined() - state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string expect(JSON.parse(state)).toMatchObject([ { explicitTerm: 'screen-256color', @@ -378,7 +381,7 @@ describe('PtyHandler', () => { await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) handler.addEnvAugmenter(() => ({ ORCA_STALE_TEST_ENV: '/tmp/second-revive' })) @@ -447,12 +450,12 @@ describe('PtyHandler', () => { process.env.ORCA_TAB_ID = oldTabId } } - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) delete process.env.ORCA_PANE_KEY delete process.env.ORCA_TAB_ID @@ -478,11 +481,11 @@ describe('PtyHandler', () => { await expect( dispatcher.callRequest('pty.attach', { - id: 'pty-1', + id: PTY_1, expectedPaneKey: 'tab-other:leaf', expectedTabId: 'tab-other' }) - ).rejects.toThrow('PTY "pty-1" not found') + ).rejects.toThrow(`PTY "${PTY_1}" not found`) }) describe('a Windows relay reviving a WSL pane', () => { @@ -517,13 +520,13 @@ describe('PtyHandler', () => { worktreeId, historyIsolationEnabled: true }) - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() rmSync(historyFile, { force: true }) dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) try { @@ -559,7 +562,7 @@ describe('PtyHandler', () => { it('keeps the override across a second serialize/revive round trip', async () => { await reviveWslPane() - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string expect(JSON.parse(state)[0]).toMatchObject({ shellOverride: 'wsl.exe', diff --git a/src/relay/pty-handler-shutdown-signals.test.ts b/src/relay/pty-handler-shutdown-signals.test.ts index 22c10bbda2b..951ce7209e0 100644 --- a/src/relay/pty-handler-shutdown-signals.test.ts +++ b/src/relay/pty-handler-shutdown-signals.test.ts @@ -35,10 +35,13 @@ import type { PtyHandler } from './pty-handler' import { beginPtyHandlerTest, createPtyRequestHelpers, - endPtyHandlerTest + endPtyHandlerTest, + testPtyId } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -96,7 +99,7 @@ describe('PtyHandler', () => { it('accepts SIGWINCH for restored TUI repaint', async () => { await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.sendSignal', { id: 'pty-1', signal: 'SIGWINCH' }) + await dispatcher.callRequest('pty.sendSignal', { id: PTY_1, signal: 'SIGWINCH' }) const term = mockPtySpawn.mock.results[0].value expect(term.kill).toHaveBeenCalledWith('SIGWINCH') @@ -112,7 +115,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) expect(mockKill).toHaveBeenCalledWith('SIGTERM') }) @@ -153,7 +156,7 @@ describe('PtyHandler', () => { await withWindowsPlatform(async () => { const mockKill = mockKillablePty() await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) expectBareKills(mockKill, 1) }) }) @@ -171,7 +174,7 @@ describe('PtyHandler', () => { }) }) await dispatcher.callRequest('pty.spawn', {}) - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) onExitCb!({ exitCode: 137 }) await shutdown expectBareKills(mockKill, 1) @@ -193,9 +196,9 @@ describe('PtyHandler', () => { }) }) await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) const immediate = dispatcher.callRequest('pty.shutdown', { - id: 'pty-1', + id: PTY_1, immediate: true }) @@ -227,7 +230,7 @@ describe('PtyHandler', () => { await withWindowsPlatform(async () => { const mockKill = mockKillablePty() await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) expectBareKills(mockKill, 1) vi.advanceTimersByTime(5000) expectBareKills(mockKill, 1) @@ -270,12 +273,12 @@ describe('PtyHandler', () => { await dispatcher.callRequest('pty.spawn', {}) dataCallback!('last words') - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) onExitCb!({ exitCode: 137 }) await shutdown expect(dispatcher.notify).toHaveBeenNthCalledWith(1, 'pty.data', { - id: 'pty-1', + id: PTY_1, data: 'last words' }) expect(mockKill).toHaveBeenCalledWith('SIGKILL') @@ -296,7 +299,7 @@ describe('PtyHandler', () => { handler.setExitListener((evt) => exits.push(evt)) const spawn = await spawnPty({ env: { ORCA_PANE_KEY: 'tab-fallback:0' } }) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) vi.advanceTimersByTime(5000) expect(handler.activePtyCount).toBe(1) @@ -307,11 +310,11 @@ describe('PtyHandler', () => { expect(mockKill).toHaveBeenCalledWith('SIGTERM') expect(mockKill).toHaveBeenCalledWith('SIGKILL') expect(dispatcher.notify).toHaveBeenCalledWith('pty.exit', { - id: 'pty-1', + id: PTY_1, code: 137, incarnationId: spawn.incarnationId }) - expect(exits).toEqual([{ id: 'pty-1', paneKey: 'tab-fallback:0' }]) + expect(exits).toEqual([{ id: PTY_1, paneKey: 'tab-fallback:0' }]) expect(handler.activePtyCount).toBe(0) }) @@ -333,7 +336,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - await dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: false }) + await dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: false }) vi.advanceTimersByTime(5000) expect(mockKill.mock.calls).toEqual([['SIGTERM'], ['SIGKILL']]) @@ -362,7 +365,7 @@ describe('PtyHandler', () => { }) await dispatcher.callRequest('pty.spawn', {}) - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) onExitCb!({ exitCode: 137 }) await shutdown expect(mockKill).toHaveBeenCalledWith('SIGKILL') diff --git a/src/relay/pty-handler-source-publication.test.ts b/src/relay/pty-handler-source-publication.test.ts index f8082b20af5..71e8c12b48f 100644 --- a/src/relay/pty-handler-source-publication.test.ts +++ b/src/relay/pty-handler-source-publication.test.ts @@ -7,11 +7,14 @@ import { } from './dispatcher' import { encodeJsonRpcFrame, MessageType } from './protocol' import { PtyHandler } from './pty-handler' +import { TEST_PTY_ID_MINT_EPOCH, testPtyId } from './pty-handler-test-harness' import { RelayPtySourcePublication } from './relay-pty-source-publication' import { SshPtyConsumerSessionAdapter } from './ssh-pty-consumer-session-adapter' const { mockPtySpawn } = vi.hoisted(() => ({ mockPtySpawn: vi.fn() })) +const PTY_1 = testPtyId(1) + vi.mock('node-pty', () => ({ spawn: mockPtySpawn })) const endpointIdentity: RelayClientSessionIdentity = { @@ -127,7 +130,7 @@ describe('PtyHandler negotiated source publication', () => { }, endpointIdentity ) - handler = new PtyHandler(dispatcher) + handler = new PtyHandler(dispatcher, undefined, TEST_PTY_ID_MINT_EPOCH) adapter = new SshPtyConsumerSessionAdapter(dispatcher, 'build-a', undefined, (id) => publication.onCreditAvailable(id) ) @@ -659,14 +662,14 @@ describe('PtyHandler negotiated source publication', () => { 4 ) ).toMatchObject({ - id: 'pty-1', + id: PTY_1, incarnationId: expect.any(String), sourceActivation: expect.objectContaining({ deliveryToken: expect.any(String) }) }) expect( replacementWrites.map(notification).find((frame) => frame?.method === 'pty.data')?.params ).toMatchObject({ - id: 'pty-1', + id: PTY_1, data: 'prompt', sourceLengthSu: 6, sourceEndSu: 6 @@ -688,7 +691,7 @@ describe('PtyHandler negotiated source publication', () => { await vi.advanceTimersByTimeAsync(8) expect(projectSpy).toHaveBeenCalledTimes(1) - handler.handleSourcePublicationCapacity('pty-1') + handler.handleSourcePublicationCapacity(PTY_1) await vi.advanceTimersByTimeAsync(8) // Retried projection carries the byte-identical span params. @@ -783,7 +786,7 @@ describe('PtyHandler negotiated source publication', () => { describe('a second attach for the same client', () => { async function attach(id: number, params: Record) { writes = [] - dispatcher.feed(requestFrame(id, 'pty.attach', { id: 'pty-1', ...params })) + dispatcher.feed(requestFrame(id, 'pty.attach', { id: PTY_1, ...params })) await vi.advanceTimersByTimeAsync(0) return writes.map((buffer) => responseResult(buffer, id)).find(Boolean) } diff --git a/src/relay/pty-handler-spawn-admission.test.ts b/src/relay/pty-handler-spawn-admission.test.ts index aae35a2e166..2df29b95420 100644 --- a/src/relay/pty-handler-spawn-admission.test.ts +++ b/src/relay/pty-handler-spawn-admission.test.ts @@ -38,6 +38,8 @@ import { beginPtyHandlerTest, createMockDispatcher, createPtyRequestHelpers, + createTestPtyHandler, + testPtyId, endPtyHandlerTest } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' @@ -93,7 +95,7 @@ describe('PtyHandler', () => { it('spawns a PTY and returns an id', async () => { const result = await spawnPty({ cols: 80, rows: 24 }) - expect(result).toEqual({ id: 'pty-1', incarnationId: expect.any(String) }) + expect(result).toEqual({ id: testPtyId(1), incarnationId: expect.any(String) }) expect(mockPtySpawn).toHaveBeenCalled() expect(handler.activePtyCount).toBe(1) }) @@ -112,7 +114,7 @@ describe('PtyHandler', () => { agentSessionCreateOperationId: operationId }) - expect(replayed).toEqual({ id: 'pty-1', incarnationId: expect.any(String) }) + expect(replayed).toEqual({ id: testPtyId(1), incarnationId: expect.any(String) }) expect(mockPtySpawn).toHaveBeenCalledOnce() expect(mockPtyInstance.kill).not.toHaveBeenCalled() expect(handler.activePtyCount).toBe(1) @@ -166,7 +168,7 @@ describe('PtyHandler', () => { loadPty.mockResolvedValue({ spawn: mockPtySpawn }) await expect(dispatcher.callRequest('pty.spawn', request)).resolves.toMatchObject({ - id: expect.stringMatching(/^pty-/) + id: testPtyId(2) }) expect(mockPtySpawn).toHaveBeenCalledOnce() }) @@ -207,11 +209,11 @@ describe('PtyHandler', () => { })) as Record expect(first).toMatchObject({ - id: 'pty-1', + id: testPtyId(1), agentSessionEnsure: { disposition: 'created' } }) expect(second).toMatchObject({ - id: 'pty-1', + id: testPtyId(1), agentSessionEnsure: { disposition: 'adopted' } }) expect(second.agentSessionEnsure).toMatchObject({ @@ -283,7 +285,9 @@ describe('PtyHandler', () => { const descriptor = Object.getOwnPropertyDescriptor(Array.prototype, 'toReversed') Reflect.deleteProperty(Array.prototype, 'toReversed') try { - await expect(dispatcher.callRequest('pty.spawn', {})).resolves.toMatchObject({ id: 'pty-1' }) + await expect(dispatcher.callRequest('pty.spawn', {})).resolves.toMatchObject({ + id: testPtyId(1) + }) expect(handler.activePtyCount).toBe(1) } finally { if (descriptor) { @@ -295,8 +299,80 @@ describe('PtyHandler', () => { it('increments PTY ids on each spawn', async () => { const r1 = await dispatcher.callRequest('pty.spawn', {}) const r2 = await dispatcher.callRequest('pty.spawn', {}) - expect((r1 as { id: string }).id).toBe('pty-1') - expect((r2 as { id: string }).id).toBe('pty-2') + expect((r1 as { id: string }).id).toBe(testPtyId(1)) + expect((r2 as { id: string }).id).toBe(testPtyId(2)) + }) + + it('does not remint a PTY id across handler lifetimes', async () => { + const first = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + await handler.dispose({ waitForPhysicalExit: false }) + dispatcher = createMockDispatcher() + handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + + const second = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + + expect(first.id).toMatch(/^pty2:[^:]+:1$/) + expect(second.id).toMatch(/^pty2:[^:]+:1$/) + expect(second.id).not.toBe(first.id) + }) + + it('escapes the mint epoch so it cannot forge the id separators', async () => { + await handler.dispose({ waitForPhysicalExit: false }) + dispatcher = createMockDispatcher() + // Why: the epoch is constructor-supplied. Encoding is what keeps a minted id + // exactly three fields, so it can never be read as another epoch/sequence and + // can never smuggle the `@@` that app-side SSH id routing splits on. + handler = new PtyHandler(dispatcher as unknown as RelayDispatcher, undefined, 'a:b@@c:9') + + const spawned = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + + const [prefix, epoch, sequence, ...extra] = spawned.id.split(':') + expect(extra).toEqual([]) + expect(prefix).toBe('pty2') + expect(decodeURIComponent(epoch)).toBe('a:b@@c:9') + expect(sequence).toBe('1') + expect(spawned.id).not.toContain('@@') + }) + + it('revives a legacy id and advances the legacy sequence', async () => { + const state = JSON.stringify([ + { id: 'pty-7', pid: process.pid, cols: 80, rows: 24, cwd: process.cwd() } + ]) + const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) + try { + await dispatcher.callRequest('pty.revive', { state }) + } finally { + killSpy.mockRestore() + } + + const serialized = (await dispatcher.callRequest('pty.serialize', { + ids: ['pty-7'] + })) as string + const spawned = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + + expect(JSON.parse(serialized)).toMatchObject([{ id: 'pty-7' }]) + expect(spawned.id).toBe(testPtyId(8)) + }) + + it('does not advance its sequence from a revived foreign mint epoch', async () => { + const foreignId = 'pty2:previous-mint-epoch:40' + const state = JSON.stringify([ + { id: foreignId, pid: process.pid, cols: 80, rows: 24, cwd: process.cwd() } + ]) + const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) + try { + await dispatcher.callRequest('pty.revive', { state }) + } finally { + killSpy.mockRestore() + } + + const serialized = (await dispatcher.callRequest('pty.serialize', { + ids: [foreignId] + })) as string + const spawned = (await dispatcher.callRequest('pty.spawn', {})) as { id: string } + + expect(JSON.parse(serialized)).toMatchObject([{ id: foreignId }]) + expect(spawned.id).toBe(testPtyId(1)) }) it('admits default-cwd spawns through the worktree removal coordinator', async () => { @@ -370,9 +446,9 @@ describe('PtyHandler', () => { const aliveSpy = vi.spyOn(ptyShellUtils, 'isProcessAlive').mockReturnValue(false) try { - await expect(attachPty({ id: 'pty-1', suppressReplayNotification: true })).rejects.toThrow( - 'PTY "pty-1" not found' - ) + await expect( + attachPty({ id: testPtyId(1), suppressReplayNotification: true }) + ).rejects.toThrow(`PTY "${testPtyId(1)}" not found`) } finally { aliveSpy.mockRestore() } @@ -477,10 +553,12 @@ describe('PtyHandler', () => { it('fires for a revived PTY whose creation was admitted before the pool was empty', async () => { await spawnPty({ cols: 80, rows: 24, cwd: '/tmp' }) - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { + ids: [testPtyId(1)] + })) as string await handler.dispose({ waitForPhysicalExit: false }) dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) mockPtySpawn.mockReturnValue({ ...mockPtyInstance, onData: vi.fn(), onExit: vi.fn() }) const poolActive = vi.fn() handler.onPtyPoolActive(poolActive) diff --git a/src/relay/pty-handler-spawn-environment.test.ts b/src/relay/pty-handler-spawn-environment.test.ts index 39c5a207a48..8879686821e 100644 --- a/src/relay/pty-handler-spawn-environment.test.ts +++ b/src/relay/pty-handler-spawn-environment.test.ts @@ -41,15 +41,19 @@ vi.mock('../main/shell-prompt-readiness-probe', () => ({ createShellPromptReadinessProbe: mockCreateShellPromptReadinessProbe })) -import { PtyHandler } from './pty-handler' -import type { RelayDispatcher } from './dispatcher' +import type { PtyHandler } from './pty-handler' import { beginPtyHandlerTest, createMockDispatcher, + createTestPtyHandler, + testPtyId, endPtyHandlerTest } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) +const PTY_2 = testPtyId(2) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -184,12 +188,12 @@ describe('PtyHandler', () => { expect(spawnedEnv.env.ORCA_ATTRIBUTION_SHIM_DIR).toBeUndefined() const state = (await dispatcher.callRequest('pty.serialize', { - ids: ['pty-1'] + ids: [PTY_1] })) as string await handler.dispose({ waitForPhysicalExit: false }) mockPtySpawn.mockClear() dispatcher = createMockDispatcher() - handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + handler = createTestPtyHandler(dispatcher) const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true) try { await dispatcher.callRequest('pty.revive', { state }) @@ -498,7 +502,7 @@ describe('PtyHandler', () => { expect(userEnv.GIT_CONFIG_COUNT).toBe('1') expect(userEnv.GIT_CONFIG_KEY_0).toBe('core.quotePath') expect(userEnv.GIT_CONFIG_KEY_1).toBeUndefined() - const state = (await dispatcher.callRequest('pty.serialize', { ids: ['pty-1'] })) as string + const state = (await dispatcher.callRequest('pty.serialize', { ids: [PTY_1] })) as string expect(JSON.parse(state)[0]?.gitCredentialPromptGuarded).toBe(false) } finally { Object.defineProperty(process, 'platform', { @@ -557,14 +561,14 @@ describe('PtyHandler', () => { const firstEnv = mockPtySpawn.mock.calls[0][2] as { env: Record } const secondEnv = mockPtySpawn.mock.calls[1][2] as { env: Record } expect(seenContexts[0]).toMatchObject({ - id: 'pty-1', + id: PTY_1, paneKey: 'tab-context:0', launchAgent: 'pi', env: { ORCA_PANE_KEY: 'tab-context:0' } }) - expect(seenContexts[1]).toMatchObject({ id: 'pty-2', paneKey: undefined }) + expect(seenContexts[1]).toMatchObject({ id: PTY_2, paneKey: undefined }) expect(firstEnv.env.OVERLAY_ID).toBe('tab-context:0') - expect(secondEnv.env.OVERLAY_ID).toBe('pty-2') + expect(secondEnv.env.OVERLAY_ID).toBe(PTY_2) }) it('passes process and renderer env to env augmenters before augmenter overrides are applied', async () => { diff --git a/src/relay/pty-handler-startup-command-delivery.test.ts b/src/relay/pty-handler-startup-command-delivery.test.ts index 8e522e68f59..817ca756385 100644 --- a/src/relay/pty-handler-startup-command-delivery.test.ts +++ b/src/relay/pty-handler-startup-command-delivery.test.ts @@ -40,10 +40,13 @@ import type { PtyHandler } from './pty-handler' import { beginPtyHandlerTest, createPtyRequestHelpers, - endPtyHandlerTest + endPtyHandlerTest, + testPtyId } from './pty-handler-test-harness' import type { MockDispatcher } from './pty-handler-test-harness' +const PTY_1 = testPtyId(1) + describe('PtyHandler', () => { let dispatcher: MockDispatcher let handler: PtyHandler @@ -293,7 +296,7 @@ describe('PtyHandler', () => { expect(handler.retainedStartupCommandCount).toBe(0) vi.advanceTimersByTime(8) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: 'user@remote $ ' }) } @@ -340,7 +343,7 @@ describe('PtyHandler', () => { mockCreateShellPromptReadinessProbe.mock.results[0]?.value.notifyOutput ).toHaveBeenCalledWith('\x1b[?2004hremote $ ') expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b[?2004hremote $ ' }) promptOptions.onPromptReady() @@ -384,7 +387,7 @@ describe('PtyHandler', () => { dataCallback?.(`\x1b]777;orca-shell-start:${process.pid}\x07\x1b[?2004hremote $ `) await vi.advanceTimersByTimeAsync(8) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b[?2004hremote $ ' }) @@ -396,7 +399,7 @@ describe('PtyHandler', () => { expect(term.write).not.toHaveBeenCalled() expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b]777;orca-shell-ready\x07' }) expect(handler.retainedStartupCommandCount).toBe(0) @@ -439,7 +442,7 @@ describe('PtyHandler', () => { await vi.advanceTimersByTimeAsync(8) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b]777;orca-shell-ready\x07remote $ ' }) expect(handler.retainedStartupCommandCount).toBe(0) @@ -484,7 +487,7 @@ describe('PtyHandler', () => { expect(probe.notifyOutput).not.toHaveBeenCalled() expect(probe.dispose).toHaveBeenCalledOnce() expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b]777;orca-shell-ready\x07remote $ ' }) expect(handler.retainedStartupCommandCount).toBe(0) @@ -563,12 +566,12 @@ describe('PtyHandler', () => { expect(term.write).toHaveBeenCalledWith('echo fallback\n') vi.advanceTimersByTime(8) expect(dispatcher.notify).toHaveBeenCalledWith('pty.data', { - id: 'pty-1', + id: PTY_1, data: '\x1b]777;orca-shell-ready' }) const result = await attachPty({ - id: 'pty-1', + id: PTY_1, suppressReplayNotification: true }) expect(result).toEqual({ @@ -609,8 +612,8 @@ describe('PtyHandler', () => { const aliveSpy = vi.spyOn(ptyShellUtils, 'isProcessAlive').mockReturnValue(false) try { - await expect(dispatcher.callRequest('pty.attach', { id: 'pty-1' })).rejects.toThrow( - 'PTY "pty-1" not found' + await expect(dispatcher.callRequest('pty.attach', { id: PTY_1 })).rejects.toThrow( + `PTY "${PTY_1}" not found` ) } finally { aliveSpy.mockRestore() @@ -658,7 +661,7 @@ describe('PtyHandler', () => { }) expect(handler.retainedStartupCommandCount).toBe(1) - const shutdown = dispatcher.callRequest('pty.shutdown', { id: 'pty-1', immediate: true }) + const shutdown = dispatcher.callRequest('pty.shutdown', { id: PTY_1, immediate: true }) onExitCb!({ exitCode: 137 }) await shutdown vi.advanceTimersByTime(50) diff --git a/src/relay/pty-handler-test-harness.ts b/src/relay/pty-handler-test-harness.ts index 04dc828e507..e3d99213ea5 100644 --- a/src/relay/pty-handler-test-harness.ts +++ b/src/relay/pty-handler-test-harness.ts @@ -4,6 +4,18 @@ import * as ptyShellUtils from './pty-shell-utils' import { PtyHandler } from './pty-handler' import type { RelayDispatcher } from './dispatcher' +export const TEST_PTY_ID_MINT_EPOCH = 'test-mint-epoch' + +// Why encoded: production escapes the epoch at the mint site. A test epoch with a +// reserved character would otherwise diverge silently across ~40 assertions. +export function testPtyId(sequence: number): string { + return `pty2:${encodeURIComponent(TEST_PTY_ID_MINT_EPOCH)}:${sequence}` +} + +export function createTestPtyHandler(dispatcher: MockDispatcher): PtyHandler { + return new PtyHandler(dispatcher as unknown as RelayDispatcher, undefined, TEST_PTY_ID_MINT_EPOCH) +} + export type TestRequestContext = { isStale: () => boolean signal?: AbortSignal @@ -108,7 +120,7 @@ export function beginPtyHandlerTest(mocks: PtyHandlerTestMocks): { mockPtySpawn.mockReturnValue({ ...mockPtyInstance }) const dispatcher = createMockDispatcher() - const handler = new PtyHandler(dispatcher as unknown as RelayDispatcher) + const handler = createTestPtyHandler(dispatcher) return { dispatcher, handler, originalPlatform } } diff --git a/src/relay/pty-handler.ts b/src/relay/pty-handler.ts index 6251fa60290..35293fe2871 100644 --- a/src/relay/pty-handler.ts +++ b/src/relay/pty-handler.ts @@ -409,7 +409,7 @@ type PtyIdentity = { paneKey?: string; tabId?: string } /** * True when a reattach's expected pane identity contradicts the target PTY's own. - * Rejects cross-relay-generation id collisions (a reset relay reuses `pty-N`). + * Rejects legacy cross-relay-generation id collisions (a reset relay reused `pty-N`). * Only compares fields present on both sides; absent identity stays permissive. */ export function attachIdentityMismatches(expected: PtyIdentity, managed: PtyIdentity): boolean { @@ -435,6 +435,7 @@ export type RelayPtyWorktreeRemovalCoordinator = { export class PtyHandler { private ptys = new Map() + private readonly ptyIdMintEpoch: string private nextId = 1 private dispatcher: RelayDispatcher private graceTimeMs: number @@ -471,9 +472,14 @@ export class PtyHandler { Promise >() - constructor(dispatcher: RelayDispatcher, graceTimeMs = DEFAULT_GRACE_TIME_MS) { + constructor( + dispatcher: RelayDispatcher, + graceTimeMs = DEFAULT_GRACE_TIME_MS, + ptyIdMintEpoch: string = randomUUID() + ) { this.dispatcher = dispatcher this.graceTimeMs = graceTimeMs + this.ptyIdMintEpoch = ptyIdMintEpoch this.registerHandlers() this.removeLegacyCapacityListener = this.dispatcher.onLegacyPtyCapacity?.(() => this.handleLegacyCapacity()) ?? null @@ -1617,7 +1623,7 @@ export class PtyHandler { const shell = resolvedShellOverride || requestedEnvShell || resolveDefaultShell() let id: string do { - id = `pty-${this.nextId++}` + id = `pty2:${encodeURIComponent(this.ptyIdMintEpoch)}:${this.nextId++}` } while (this.ptys.has(id) || this.pendingReviveIds.has(id)) // Why: augmenter values override renderer env so remote paths and hook coords win over local userData. @@ -1819,7 +1825,7 @@ export class PtyHandler { throw new Error(`PTY "${id}" not found`) } - // Why: generation resets can reuse PTY IDs; reject conflicting identities. + // Why: legacy `pty-N` ids repeated across relay generations; reject conflicting identities. const mismatch = attachIdentityMismatches( { paneKey: typeof params.expectedPaneKey === 'string' ? params.expectedPaneKey : undefined, diff --git a/src/relay/subprocess.test.ts b/src/relay/subprocess.test.ts index 18d837bb4ef..0c7eea10765 100644 --- a/src/relay/subprocess.test.ts +++ b/src/relay/subprocess.test.ts @@ -204,7 +204,8 @@ describe('Subprocess: Relay entry point', () => { const repairedId = relay.send('pty.spawn', { cols: 80, rows: 24 }) const repaired = await relay.waitForResponse(repairedId) expect(repaired.error).toBeUndefined() - expect(repaired.result).toMatchObject({ id: 'pty-1' }) + // Why: a spawn that never loaded node-pty must not burn a mint sequence, so the repair is still :1. + expect(repaired.result).toMatchObject({ id: expect.stringMatching(/^pty2:[^:]+:1$/) }) }, 10_000) it('reloads node-pty after a late native binding failure without restarting', async () => { @@ -228,7 +229,8 @@ describe('Subprocess: Relay entry point', () => { const repairedId = relay.send('pty.spawn', { cols: 80, rows: 24 }) const repaired = await relay.waitForResponse(repairedId) expect(repaired.error).toBeUndefined() - expect(repaired.result).toMatchObject({ id: 'pty-2' }) + // Why: the late failure happens after the id is minted, so the repair lands on the next sequence. + expect(repaired.result).toMatchObject({ id: expect.stringMatching(/^pty2:[^:]+:2$/) }) }, 10_000) it('responds to fs.stat over stdin/stdout', async () => { diff --git a/src/renderer/src/components/browser-pane/assemble-chrome/BrowserPane.remote-link-routing.test.ts b/src/renderer/src/components/browser-pane/assemble-chrome/BrowserPane.remote-link-routing.test.ts index 511b1eb064c..856ac24c725 100644 --- a/src/renderer/src/components/browser-pane/assemble-chrome/BrowserPane.remote-link-routing.test.ts +++ b/src/renderer/src/components/browser-pane/assemble-chrome/BrowserPane.remote-link-routing.test.ts @@ -15,5 +15,6 @@ describe('remote browser link routing', () => { expect(openRequest).toContain('workspaceId: worktreeId') expect(openRequest).toContain('expectedRuntimeEnvironmentId: runtimeEnvironmentId') + expect(openRequest).toContain("placementPreference: 'server'") }) }) diff --git a/src/renderer/src/components/browser-pane/stream-remote/remote-browser-page-pane.tsx b/src/renderer/src/components/browser-pane/stream-remote/remote-browser-page-pane.tsx index 443264c1f1b..91995117b16 100644 --- a/src/renderer/src/components/browser-pane/stream-remote/remote-browser-page-pane.tsx +++ b/src/renderer/src/components/browser-pane/stream-remote/remote-browser-page-pane.tsx @@ -359,7 +359,8 @@ export function RemoteBrowserPagePane({ workspaceId: worktreeId, url: linkUrl, intent: { kind: 'url' }, - expectedRuntimeEnvironmentId: runtimeEnvironmentId + expectedRuntimeEnvironmentId: runtimeEnvironmentId, + placementPreference: 'server' }).catch((error) => { setPaneNotice({ kind: 'direct', diff --git a/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.clipboard-routes.test.tsx b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.clipboard-routes.test.tsx new file mode 100644 index 00000000000..f95815b2552 --- /dev/null +++ b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.clipboard-routes.test.tsx @@ -0,0 +1,528 @@ +// @vitest-environment happy-dom + +import '@testing-library/jest-dom/vitest' +import { act, cleanup, render, waitFor } from '@testing-library/react' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + TERMINAL_PASTE_CHUNK_MAX_BYTES, + TERMINAL_PASTE_DIRECT_MAX_BYTES +} from '@/components/terminal-pane/terminal-paste-limits' +import { + BRACKETED_PASTE_END, + BRACKETED_PASTE_START +} from '@/components/terminal-pane/terminal-bracketed-paste' +import { dispatchAppMenuPasteEvent } from '@/lib/app-menu-paste' +import { dispatchAppMenuSelectionAction } from '@/lib/app-menu-selection-actions' + +const terminalHarness = vi.hoisted(() => ({ + instances: [] as { + write: ReturnType + writeCallbacks: (() => void)[] + onDataListener: ((data: string) => void) | null + dispose: ReturnType + resize: ReturnType + reset: ReturnType + paste: ReturnType + input: ReturnType + scrollToTop: ReturnType + scrollToBottom: ReturnType + selectAll: ReturnType + modes: { bracketedPasteMode: boolean } + selectionText: string + customKeyHandler: ((event: KeyboardEvent) => boolean) | null + }[], + userInputListener: null as (() => void) | null, + userInputDispose: vi.fn() +})) + +const platformState = vi.hoisted(() => ({ value: 'linux' })) +const storeState = vi.hoisted(() => ({ + settings: null as { terminalRightClickToPaste?: boolean } | null, + keybindings: {} as Record +})) + +const imeHarness = vi.hoisted(() => ({ + forwarders: [] as { + claimKeyEvent: ReturnType + dispose: ReturnType + sendInput: (data: string) => void + getKittyKeyboardFlags: () => number + }[], + trackers: [] as { dispose: ReturnType }[], + claimResult: false +})) + +vi.mock('@xterm/xterm', () => ({ + Terminal: class { + cols = 80 + rows = 24 + buffer = { active: { cursorY: 0 } } + writeCallbacks: (() => void)[] = [] + onDataListener: ((data: string) => void) | null = null + customKeyHandler: ((event: KeyboardEvent) => boolean) | null = null + selectionText = '' + write = vi.fn((_data: string, callback?: () => void) => { + if (callback) { + this.writeCallbacks.push(callback) + } + }) + open = vi.fn() + focus = vi.fn() + dispose = vi.fn() + resize = vi.fn() + reset = vi.fn() + modes = { bracketedPasteMode: false } + paste = vi.fn((data: string) => { + terminalHarness.userInputListener?.() + this.onDataListener?.(data) + }) + input = vi.fn((data: string) => { + terminalHarness.userInputListener?.() + this.onDataListener?.(data) + }) + element = document.createElement('div') + unicode = { activeVersion: '6', versions: ['6', '11'], register: vi.fn() } + loadAddon = vi.fn() + attachCustomWheelEventHandler = vi.fn() + scrollToTop = vi.fn() + scrollToBottom = vi.fn() + selectAll = vi.fn() + getSelection = vi.fn(() => this.selectionText) + attachCustomKeyEventHandler = vi.fn((handler: (event: KeyboardEvent) => boolean) => { + this.customKeyHandler = handler + }) + onData = vi.fn((listener: (data: string) => void) => { + this.onDataListener = listener + return { dispose: vi.fn() } + }) + + constructor() { + terminalHarness.instances.push(this) + } + } +})) +vi.mock(import('@/lib/pane-manager/pane-terminal-options'), async (importOriginal) => ({ + ...(await importOriginal()), + buildDefaultTerminalOptions: () => ({}) +})) +vi.mock('@/components/terminal-pane/terminal-user-input-signal', () => ({ + subscribeToTerminalUserInput: (_terminal: unknown, listener: () => void) => { + terminalHarness.userInputListener = listener + return { dispose: terminalHarness.userInputDispose } + } +})) +vi.mock('@/components/terminal-pane/use-system-prefers-dark', () => ({ + useSystemPrefersDark: () => false +})) +vi.mock('@/lib/shortcut-platform', () => ({ + getShortcutPlatform: () => platformState.value +})) +vi.mock('@/components/terminal-pane/terminal-ime-native-text-forwarder', () => ({ + installTerminalImeNativeTextForwarder: (args: { + sendInput: (data: string) => void + getKittyKeyboardFlags?: () => number + }) => { + const forwarder = { + claimKeyEvent: vi.fn(() => imeHarness.claimResult), + dispose: vi.fn(), + sendInput: args.sendInput, + // Why captured: the bridge's whole job is handing the live mirror to the + // forwarder, so the test reads what a real commit would read. + getKittyKeyboardFlags: args.getKittyKeyboardFlags ?? ((): number => 0) + } + imeHarness.forwarders.push(forwarder) + return forwarder + } +})) +vi.mock('@/components/terminal-pane/terminal-ime-composition-tracker', () => ({ + installTerminalImeCompositionTracker: () => { + const tracker = { isActive: () => false, dispose: vi.fn() } + imeHarness.trackers.push(tracker) + return tracker + } +})) +vi.mock('@/store', () => { + const useAppStore = (selector: (s: typeof storeState) => unknown): unknown => selector(storeState) + useAppStore.getState = (): typeof storeState => storeState + return { useAppStore } +}) + +import { AgentTerminalPreview } from './AgentTerminalPreview' + +describe('AgentTerminalPreview clipboard routes', () => { + const input = vi.fn(async (_ptyId: string, _data: string) => true) + const fit = vi.fn(async (_ptyId: string, cols: number, rows: number) => ({ cols, rows })) + const ack = vi.fn(async () => {}) + const unsubscribe = vi.fn(async () => {}) + const connect = vi.fn() + const readClipboardText = vi.fn(async () => 'clip-text') + const writeClipboardText = vi.fn(async () => {}) + const writeTerminalClipboardText = vi.fn(async () => {}) + const performNativeSelectionAction = vi.fn() + + /** Focuses a stand-in for xterm's helper textarea inside the preview container. */ + const focusInsidePreview = (container: HTMLElement, tagName = 'input'): HTMLElement => { + const host = container.querySelector('.origin-bottom-left')! + const focusTarget = document.createElement(tagName) + host.appendChild(focusTarget) + focusTarget.focus() + return focusTarget + } + + beforeEach(() => { + terminalHarness.instances.length = 0 + terminalHarness.userInputListener = null + platformState.value = 'linux' + storeState.keybindings = {} + imeHarness.forwarders.length = 0 + imeHarness.trackers.length = 0 + imeHarness.claimResult = false + storeState.settings = null + connect.mockResolvedValue({ + snapshot: { data: '', cols: 80, rows: 24, seq: 1 }, + replay: [] + }) + readClipboardText.mockResolvedValue('clip-text') + Object.assign(window, { + api: { + terminalPreview: { + connect, + input, + fit, + ack, + unsubscribe, + onData: () => vi.fn() + }, + ui: { + readClipboardText, + writeClipboardText, + writeTerminalClipboardText, + performNativeSelectionAction + } + } + }) + }) + + afterEach(() => { + cleanup() + vi.clearAllMocks() + }) + + it('claims the app-menu paste event and pastes while the preview owns focus', async () => { + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + + let claimed = false + act(() => { + claimed = dispatchAppMenuPasteEvent() + }) + + // The claim is what keeps App-level paste out of xterm's hidden textarea. + expect(claimed).toBe(true) + await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) + expect(input).toHaveBeenCalledWith('pty-1', 'clip-text') + }) + + it('encodes a leading newline for a remote Windows Codex preview without submitting', async () => { + readClipboardText.mockResolvedValueOnce('\nsecond line') + const view = render( + + ) + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + + act(() => { + dispatchAppMenuPasteEvent() + }) + + await waitFor(() => + expect(input).toHaveBeenCalledWith('remote:windows-box@@pty-1', '\x1b\rsecond line') + ) + expect(terminal.input).toHaveBeenCalledWith('\x1b\rsecond line') + expect(terminal.paste).not.toHaveBeenCalled() + }) + + it('claims app-menu selection actions while the preview owns focus', async () => { + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + terminal.selectionText = 'selected text' + const focusTarget = focusInsidePreview(view.container, 'textarea') + focusTarget.className = 'xterm-helper-textarea' + + let selectAllClaimed = false + let copyClaimed = false + act(() => { + selectAllClaimed = dispatchAppMenuSelectionAction('select-all') + }) + act(() => { + copyClaimed = dispatchAppMenuSelectionAction('copy') + }) + + expect(selectAllClaimed).toBe(true) + expect(copyClaimed).toBe(true) + expect(terminal.selectAll).toHaveBeenCalledOnce() + await waitFor(() => expect(writeTerminalClipboardText).toHaveBeenCalledWith('selected text')) + }) + + it('leaves app-menu selection actions unclaimed for text controls inside the preview', async () => { + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + + let claimed = true + act(() => { + claimed = dispatchAppMenuSelectionAction('select-all') + }) + + // Unclaimed so the App-level handler performs the native selection action. + expect(claimed).toBe(false) + expect(terminal.selectAll).not.toHaveBeenCalled() + }) + + it('leaves a copy action with no terminal selection unclaimed', async () => { + render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + + let claimed = true + act(() => { + claimed = dispatchAppMenuSelectionAction('copy') + }) + + expect(claimed).toBe(false) + expect(writeTerminalClipboardText).not.toHaveBeenCalled() + }) + + it('leaves the app-menu paste event unclaimed when focus is outside the preview', async () => { + render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + + let claimed = true + await act(async () => { + claimed = dispatchAppMenuPasteEvent() + }) + + expect(claimed).toBe(false) + expect(readClipboardText).not.toHaveBeenCalled() + expect(terminalHarness.instances[0]!.paste).not.toHaveBeenCalled() + }) + + it('stops claiming app-menu clipboard events once unmounted', async () => { + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + focusInsidePreview(view.container) + view.unmount() + + expect(dispatchAppMenuPasteEvent()).toBe(false) + expect(dispatchAppMenuSelectionAction('select-all')).toBe(false) + }) + + it('pastes on plain Ctrl+V on Windows, where no Edit-menu accelerator ever fires', async () => { + platformState.value = 'win32' + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + await waitFor(() => expect(terminal.customKeyHandler).not.toBeNull()) + focusInsidePreview(view.container) + + const plain = new KeyboardEvent('keydown', { + key: 'v', + code: 'KeyV', + ctrlKey: true, + cancelable: true + }) + expect(terminal.customKeyHandler!(plain)).toBe(false) + expect(plain.defaultPrevented).toBe(true) + await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) + + // The repeat is swallowed without a second clipboard read, and so is the keyup. + expect( + terminal.customKeyHandler!( + new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', ctrlKey: true, repeat: true }) + ) + ).toBe(false) + expect(terminal.customKeyHandler!(new KeyboardEvent('keyup', { key: 'v', code: 'KeyV' }))).toBe( + false + ) + expect(readClipboardText).toHaveBeenCalledTimes(1) + }) + + it('handles the shifted paste chord on Linux', async () => { + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + await waitFor(() => expect(terminal.customKeyHandler).not.toBeNull()) + focusInsidePreview(view.container) + + const shifted = new KeyboardEvent('keydown', { + key: 'V', + code: 'KeyV', + ctrlKey: true, + shiftKey: true, + cancelable: true + }) + expect(terminal.customKeyHandler!(shifted)).toBe(false) + expect(shifted.defaultPrevented).toBe(true) + await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) + expect(readClipboardText).toHaveBeenCalledTimes(1) + }) + + it('leaves plain Cmd+V to the macOS Edit-menu accelerator', async () => { + platformState.value = 'darwin' + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + await waitFor(() => expect(terminal.customKeyHandler).not.toBeNull()) + focusInsidePreview(view.container) + + // Why deferred: macOS keeps a real Cmd+V accelerator, so handling it here + // AND letting the menu fire would paste twice. + const plain = terminal.customKeyHandler!( + new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', metaKey: true }) + ) + expect(plain).toBe(true) + expect(readClipboardText).not.toHaveBeenCalled() + }) + + it('pastes on terminal-style right-click when the setting is on', async () => { + storeState.settings = { terminalRightClickToPaste: true } + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + const host = view.container.querySelector('.origin-bottom-left')! + + const menuEvent = new MouseEvent('contextmenu', { bubbles: true, cancelable: true }) + act(() => { + host.dispatchEvent(menuEvent) + }) + + expect(menuEvent.defaultPrevented).toBe(true) + await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) + }) + + it('copies the selection on terminal-style right-click instead of pasting', async () => { + storeState.settings = { terminalRightClickToPaste: true } + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + terminal.selectionText = 'selected text' + focusInsidePreview(view.container) + const host = view.container.querySelector('.origin-bottom-left')! + + act(() => { + host.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true })) + }) + + await waitFor(() => expect(writeTerminalClipboardText).toHaveBeenCalledWith('selected text')) + expect(readClipboardText).not.toHaveBeenCalled() + }) + + it('leaves right-click to the native menu when the setting is off', async () => { + storeState.settings = { terminalRightClickToPaste: false } + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + focusInsidePreview(view.container) + const host = view.container.querySelector('.origin-bottom-left')! + + const menuEvent = new MouseEvent('contextmenu', { bubbles: true, cancelable: true }) + act(() => { + host.dispatchEvent(menuEvent) + }) + + expect(menuEvent.defaultPrevented).toBe(false) + expect(readClipboardText).not.toHaveBeenCalled() + }) + + it('cancels an async paste when the preview loses focus', async () => { + let resolveClipboard!: (text: string) => void + readClipboardText.mockReturnValueOnce( + new Promise((resolve) => { + resolveClipboard = resolve + }) + ) + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + const outsideInput = document.createElement('input') + view.container.appendChild(outsideInput) + + act(() => { + dispatchAppMenuPasteEvent() + }) + outsideInput.focus() + await act(async () => resolveClipboard('stale text')) + + expect(terminal.paste).not.toHaveBeenCalled() + expect(input).not.toHaveBeenCalled() + }) + + it('streams large pastes as bounded IPC payloads instead of one renderer-blocking write', async () => { + const encoder = new TextEncoder() + const multibytePrefix = '😀'.repeat(TERMINAL_PASTE_DIRECT_MAX_BYTES / 4 + 1) + const largePaste = `${multibytePrefix}\r\nnext\n` + const expectedPaste = `${multibytePrefix}\rnext\r` + readClipboardText.mockResolvedValueOnce(largePaste) + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + focusInsidePreview(view.container) + + act(() => { + dispatchAppMenuPasteEvent() + }) + const expectedChunks = Math.ceil( + encoder.encode(expectedPaste).byteLength / TERMINAL_PASTE_CHUNK_MAX_BYTES + ) + await waitFor(() => expect(input).toHaveBeenCalledTimes(expectedChunks)) + + const payloads = input.mock.calls.map(([, data]) => data as string) + expect(terminal.paste).not.toHaveBeenCalled() + expect(payloads.join('')).toBe(expectedPaste) + expect( + payloads.every( + (payload) => encoder.encode(payload).byteLength <= TERMINAL_PASTE_CHUNK_MAX_BYTES + ) + ).toBe(true) + }) + + it('closes a bracketed large paste when focus changes between chunks', async () => { + readClipboardText.mockResolvedValueOnce('x'.repeat(TERMINAL_PASTE_DIRECT_MAX_BYTES + 1)) + const view = render() + await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) + const terminal = terminalHarness.instances[0]! + terminal.modes.bracketedPasteMode = true + focusInsidePreview(view.container) + const outsideInput = document.createElement('input') + view.container.appendChild(outsideInput) + input.mockImplementationOnce(async () => { + outsideInput.focus() + return true + }) + + act(() => { + dispatchAppMenuPasteEvent() + }) + await waitFor(() => expect(input).toHaveBeenCalledTimes(2)) + + expect(input.mock.calls.map(([, data]) => data)).toEqual([ + BRACKETED_PASTE_START, + BRACKETED_PASTE_END + ]) + }) +}) diff --git a/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.test.tsx b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.test.tsx index a51149cfb13..4c91a22a3b8 100644 --- a/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.test.tsx +++ b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.test.tsx @@ -3,14 +3,6 @@ import '@testing-library/jest-dom/vitest' import { act, cleanup, render, waitFor } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { - TERMINAL_PASTE_CHUNK_MAX_BYTES, - TERMINAL_PASTE_DIRECT_MAX_BYTES -} from '@/components/terminal-pane/terminal-paste-limits' -import { - BRACKETED_PASTE_END, - BRACKETED_PASTE_START -} from '@/components/terminal-pane/terminal-bracketed-paste' const terminalHarness = vi.hoisted(() => ({ instances: [] as { @@ -157,8 +149,6 @@ describe('AgentTerminalPreview', () => { const writeClipboardText = vi.fn(async () => {}) const writeTerminalClipboardText = vi.fn(async () => {}) let emitData: ((payload: unknown) => void) | null - let emitAppMenuPaste: (() => void) | null - let emitAppMenuSelectionAction: ((action: 'copy' | 'select-all') => void) | null beforeEach(() => { terminalHarness.instances.length = 0 @@ -169,8 +159,6 @@ describe('AgentTerminalPreview', () => { imeHarness.trackers.length = 0 imeHarness.claimResult = false emitData = null - emitAppMenuPaste = null - emitAppMenuSelectionAction = null connect.mockResolvedValue({ snapshot: { data: '', cols: 80, rows: 24, seq: 1 }, replay: [] @@ -193,14 +181,6 @@ describe('AgentTerminalPreview', () => { readClipboardText, writeClipboardText, writeTerminalClipboardText, - onAppMenuPaste: (listener: () => void) => { - emitAppMenuPaste = listener - return vi.fn() - }, - onAppMenuSelectionAction: (listener: (action: 'copy' | 'select-all') => void) => { - emitAppMenuSelectionAction = listener - return vi.fn() - }, performNativeSelectionAction: vi.fn() } } @@ -404,98 +384,6 @@ describe('AgentTerminalPreview', () => { expect(terminal.selectAll).toHaveBeenCalledOnce() }) - it('pastes clipboard text on the app-menu paste signal while the preview owns focus', async () => { - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - expect(emitAppMenuPaste).not.toBeNull() - - const host = view.container.querySelector('.origin-bottom-left')! - const focusTarget = document.createElement('input') - host.appendChild(focusTarget) - focusTarget.focus() - - act(() => emitAppMenuPaste!()) - await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) - expect(input).toHaveBeenCalledWith('pty-1', 'clip-text') - }) - - it('encodes a leading newline for a remote Windows Codex preview without submitting', async () => { - readClipboardText.mockResolvedValueOnce('\nsecond line') - const view = render( - - ) - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - const host = view.container.querySelector('.origin-bottom-left')! - const focusTarget = document.createElement('input') - host.appendChild(focusTarget) - focusTarget.focus() - - act(() => emitAppMenuPaste!()) - - await waitFor(() => - expect(input).toHaveBeenCalledWith('remote:windows-box@@pty-1', '\x1b\rsecond line') - ) - expect(terminal.input).toHaveBeenCalledWith('\x1b\rsecond line') - expect(terminal.paste).not.toHaveBeenCalled() - }) - - it('handles app-menu selection actions while the preview owns focus', async () => { - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - terminal.selectionText = 'selected text' - - const host = view.container.querySelector('.origin-bottom-left')! - const focusTarget = document.createElement('textarea') - focusTarget.className = 'xterm-helper-textarea' - host.appendChild(focusTarget) - focusTarget.focus() - - act(() => emitAppMenuSelectionAction?.('select-all')) - act(() => emitAppMenuSelectionAction?.('copy')) - - expect(terminal.selectAll).toHaveBeenCalledOnce() - await waitFor(() => expect(writeTerminalClipboardText).toHaveBeenCalledWith('selected text')) - }) - - it('keeps app-menu selection actions native for text controls inside the preview', async () => { - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - - const host = view.container.querySelector('.origin-bottom-left')! - const focusTarget = document.createElement('input') - host.appendChild(focusTarget) - focusTarget.focus() - - act(() => emitAppMenuSelectionAction?.('select-all')) - - expect(terminal.selectAll).not.toHaveBeenCalled() - expect(window.api.ui.performNativeSelectionAction).toHaveBeenCalledWith('select-all') - }) - - it('ignores the app-menu paste signal when focus is outside the preview', async () => { - render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - expect(emitAppMenuPaste).not.toBeNull() - - await act(async () => emitAppMenuPaste!()) - expect(readClipboardText).not.toHaveBeenCalled() - expect(terminalHarness.instances[0]!.paste).not.toHaveBeenCalled() - }) - it('sends the word-kill byte on Ctrl+Backspace and blocks xterm handling', async () => { render() await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) @@ -665,132 +553,6 @@ describe('AgentTerminalPreview', () => { expect(terminal.input).not.toHaveBeenCalled() }) - it('leaves plain Ctrl+V to the Edit-menu accelerator but handles the shifted paste chord', async () => { - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - await waitFor(() => expect(terminal.customKeyHandler).not.toBeNull()) - const host = view.container.querySelector('.origin-bottom-left')! - const terminalInput = document.createElement('input') - host.appendChild(terminalInput) - terminalInput.focus() - - const plain = terminal.customKeyHandler!( - new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', ctrlKey: true }) - ) - expect(plain).toBe(true) - expect(readClipboardText).not.toHaveBeenCalled() - - const shiftedEvent = new KeyboardEvent('keydown', { - key: 'V', - code: 'KeyV', - ctrlKey: true, - shiftKey: true, - cancelable: true - }) - const shifted = terminal.customKeyHandler!(shiftedEvent) - const repeated = terminal.customKeyHandler!( - new KeyboardEvent('keydown', { - key: 'V', - code: 'KeyV', - ctrlKey: true, - shiftKey: true, - repeat: true - }) - ) - expect(shifted).toBe(false) - expect(repeated).toBe(false) - expect(shiftedEvent.defaultPrevented).toBe(true) - await waitFor(() => expect(terminal.paste).toHaveBeenCalledWith('clip-text')) - expect(readClipboardText).toHaveBeenCalledTimes(1) - expect( - terminal.customKeyHandler!( - new KeyboardEvent('keyup', { key: 'V', code: 'KeyV', ctrlKey: true, shiftKey: true }) - ) - ).toBe(false) - }) - - it('cancels an async paste when the preview loses focus', async () => { - let resolveClipboard!: (text: string) => void - readClipboardText.mockReturnValueOnce( - new Promise((resolve) => { - resolveClipboard = resolve - }) - ) - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - const host = view.container.querySelector('.origin-bottom-left')! - const terminalInput = document.createElement('input') - const outsideInput = document.createElement('input') - host.appendChild(terminalInput) - view.container.appendChild(outsideInput) - terminalInput.focus() - - act(() => emitAppMenuPaste!()) - outsideInput.focus() - await act(async () => resolveClipboard('stale text')) - - expect(terminal.paste).not.toHaveBeenCalled() - expect(input).not.toHaveBeenCalled() - }) - - it('streams large pastes as bounded IPC payloads instead of one renderer-blocking write', async () => { - const encoder = new TextEncoder() - const multibytePrefix = '😀'.repeat(TERMINAL_PASTE_DIRECT_MAX_BYTES / 4 + 1) - const largePaste = `${multibytePrefix}\r\nnext\n` - const expectedPaste = `${multibytePrefix}\rnext\r` - readClipboardText.mockResolvedValueOnce(largePaste) - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - const host = view.container.querySelector('.origin-bottom-left')! - const terminalInput = document.createElement('input') - host.appendChild(terminalInput) - terminalInput.focus() - - act(() => emitAppMenuPaste!()) - const expectedChunks = Math.ceil( - encoder.encode(expectedPaste).byteLength / TERMINAL_PASTE_CHUNK_MAX_BYTES - ) - await waitFor(() => expect(input).toHaveBeenCalledTimes(expectedChunks)) - - const payloads = input.mock.calls.map(([, data]) => data as string) - expect(terminal.paste).not.toHaveBeenCalled() - expect(payloads.join('')).toBe(expectedPaste) - expect( - payloads.every( - (payload) => encoder.encode(payload).byteLength <= TERMINAL_PASTE_CHUNK_MAX_BYTES - ) - ).toBe(true) - }) - - it('closes a bracketed large paste when focus changes between chunks', async () => { - readClipboardText.mockResolvedValueOnce('x'.repeat(TERMINAL_PASTE_DIRECT_MAX_BYTES + 1)) - const view = render() - await waitFor(() => expect(terminalHarness.instances).toHaveLength(1)) - const terminal = terminalHarness.instances[0]! - terminal.modes.bracketedPasteMode = true - const host = view.container.querySelector('.origin-bottom-left')! - const terminalInput = document.createElement('input') - const outsideInput = document.createElement('input') - host.appendChild(terminalInput) - view.container.appendChild(outsideInput) - terminalInput.focus() - input.mockImplementationOnce(async () => { - outsideInput.focus() - return true - }) - - act(() => emitAppMenuPaste!()) - await waitFor(() => expect(input).toHaveBeenCalledTimes(2)) - - expect(input.mock.calls.map(([, data]) => data)).toEqual([ - BRACKETED_PASTE_START, - BRACKETED_PASTE_END - ]) - }) - it('keeps the existing terminal visible while a resync snapshot is captured', async () => { let resolveRefresh!: (value: { snapshot: { data: string; cols: number; rows: number; seq: number } diff --git a/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.tsx b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.tsx index 226bd2adc5d..f2a702782e9 100644 --- a/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.tsx +++ b/src/renderer/src/components/dashboard-popout/AgentTerminalPreview.tsx @@ -23,7 +23,10 @@ import { cn } from '@/lib/utils' import { useAppStore } from '@/store' import { installPreviewTerminalKeyHandler } from './preview-terminal-key-handler' import { createPreviewGridClaim } from './preview-grid-claim' +import { createPreviewBoxFit } from './preview-terminal-box-fit' import { installPreviewTerminalAppMenuClipboard } from './preview-terminal-app-menu-clipboard' +import { installPreviewTerminalRightClickPaste } from './preview-terminal-right-click-paste' +import { isWindowsUserAgent } from '@/components/terminal-pane/pane-helpers' import type { TerminalPreviewDataPayload } from '../../../../shared/terminal-preview' const PREVIEW_SCROLLBACK_ROWS = 24 @@ -43,11 +46,9 @@ function clamp(value: number, min: number, max: number): number { * process's per-PTY headless emulator. On open it claims the PTY grid for the * dialog's own box (see createPreviewGridClaim), so the terminal renders * properly sized rather than scaled. The terminal itself is always created at - * the PTY's REAL cols/rows — serialized ANSI replayed into different - * dimensions rewraps into garbage — and when someone else owns the grid (a - * phone, a host reclaim) the oversized frame is scaled down to fit and - * anchored so the cursor stays visible. Keystrokes pass through to the PTY; - * DOM renderer so it never grabs a WebGL context. + * the PTY's REAL cols/rows, and when someone else owns the grid (a phone, a + * host reclaim) createPreviewBoxFit scales the oversized frame down. Keystrokes + * pass through to the PTY; DOM renderer so it never grabs a WebGL context. */ export function AgentTerminalPreview({ ptyId, @@ -115,36 +116,8 @@ export function AgentTerminalPreview({ let retryTimer: ReturnType | null = null const pendingLivePayloads: Extract[] = [] - const fitToBox = (): void => { - const screen = container.querySelector('.xterm-screen') - const box = container.parentElement - if (!screen || !box || !terminal) { - return - } - const scale = Math.min(1, box.clientWidth / Math.max(1, screen.offsetWidth)) - container.style.transform = scale < 1 ? `scale(${scale})` : '' - // Anchor whichever end keeps the CURSOR row in view when the terminal is - // taller than the box: a fresh shell prompts at the TOP of its screen - // (blind bottom-anchoring clipped it away), while a busy TUI keeps its - // action at the bottom. - const cellHeight = screen.offsetHeight / Math.max(1, terminal.rows) - const cursorBottom = (terminal.buffer.active.cursorY + 1) * cellHeight * scale - const anchorTop = cursorBottom <= box.clientHeight - box.style.alignItems = anchorTop ? 'flex-start' : 'flex-end' - container.style.transformOrigin = anchorTop ? 'top left' : 'bottom left' - } - // Re-fit after every parsed write (cursor may move ends); rAF coalesces. - let fitScheduled = false - const scheduleFit = (): void => { - if (fitScheduled) { - return - } - fitScheduled = true - requestAnimationFrame(() => { - fitScheduled = false - fitToBox() - }) - } + const boxFit = createPreviewBoxFit({ container, getTerminal: () => terminal }) + const scheduleFit = boxFit.schedule const gridClaim = createPreviewGridClaim({ ptyId, @@ -384,7 +357,15 @@ export function AgentTerminalPreview({ const disposeAppMenuClipboard = installPreviewTerminalAppMenuClipboard({ container, getTerminal: () => terminal, - pasteClipboardText + pasteClipboardText: (activeElement, source) => void pasteClipboardText(activeElement, source) + }) + const disposeRightClickPaste = installPreviewTerminalRightClickPaste({ + container, + getTerminal: () => terminal, + // Same default as the pane: Windows users expect terminal-style right-click. + isRightClickToPasteEnabled: () => + settingsRef.current?.terminalRightClickToPaste ?? isWindowsUserAgent(), + pasteClipboardText: (activeElement, source) => void pasteClipboardText(activeElement, source) }) offData = window.api.terminalPreview.onData((payload) => { @@ -408,6 +389,7 @@ export function AgentTerminalPreview({ gridClaim.dispose() boxResizeObserver?.disconnect() disposeAppMenuClipboard() + disposeRightClickPaste() offData?.() userInputDisposable?.dispose() disposeImeNativeTextBridge() @@ -438,7 +420,7 @@ export function AgentTerminalPreview({ // Why: a size FIXED by the viewport (not shrink-to-fit) + overflow-hidden // keeps the dialog stable no matter how wide/tall the pane's serialized // buffer is. The terminal keeps the pane's true dimensions and is scaled/ - // clipped to fit; fitToBox anchors whichever end keeps the cursor in view. + // clipped to fit; createPreviewBoxFit anchors the end that shows the cursor.
({ AgentKanbanBoard: () => null })) +vi.mock('./useDashboardSnapshot', () => ({ useDashboardSnapshot: () => null })) + +import { DashboardPopoutRoot } from './DashboardPopoutRoot' + +describe('DashboardPopoutRoot', () => { + const performNativePaste = vi.fn() + const performNativeSelectionAction = vi.fn() + let emitAppMenuPaste: (() => void) | null = null + let emitAppMenuSelectionAction: ((action: 'copy' | 'select-all') => void) | null = null + + beforeEach(() => { + vi.clearAllMocks() + emitAppMenuPaste = null + emitAppMenuSelectionAction = null + Object.assign(window, { + api: { + ui: { + readClipboardText: vi.fn(async () => ''), + performNativePaste, + performNativeSelectionAction, + onAppMenuPaste: (listener: () => void) => { + emitAppMenuPaste = listener + return vi.fn() + }, + onEditableContextPaste: () => vi.fn(), + onAppMenuSelectionAction: (listener: (action: 'copy' | 'select-all') => void) => { + emitAppMenuSelectionAction = listener + return vi.fn() + } + } + } + }) + }) + + afterEach(() => { + cleanup() + }) + + // Why: this window has no App shell, so without the hooks the terminal + // preview's ownership listeners would never see a menu command at all. + it('translates app-menu clipboard IPC into renderer ownership events', async () => { + const onPaste = vi.fn() + const onSelectionAction = vi.fn() + window.addEventListener(APP_MENU_PASTE_EVENT, onPaste) + window.addEventListener(APP_MENU_SELECTION_ACTION_EVENT, onSelectionAction) + render() + expect(emitAppMenuPaste).not.toBeNull() + expect(emitAppMenuSelectionAction).not.toBeNull() + + await act(async () => emitAppMenuPaste!()) + act(() => emitAppMenuSelectionAction!('select-all')) + window.removeEventListener(APP_MENU_PASTE_EVENT, onPaste) + window.removeEventListener(APP_MENU_SELECTION_ACTION_EVENT, onSelectionAction) + + expect(onPaste).toHaveBeenCalledOnce() + expect(onSelectionAction).toHaveBeenCalledOnce() + // Unclaimed here (no preview mounted), so both still reach the native path. + expect(performNativePaste).toHaveBeenCalledOnce() + expect(performNativeSelectionAction).toHaveBeenCalledWith('select-all') + }) +}) diff --git a/src/renderer/src/components/dashboard-popout/DashboardPopoutRoot.tsx b/src/renderer/src/components/dashboard-popout/DashboardPopoutRoot.tsx index 4f8f2bb9b3d..2fd4e39e4d1 100644 --- a/src/renderer/src/components/dashboard-popout/DashboardPopoutRoot.tsx +++ b/src/renderer/src/components/dashboard-popout/DashboardPopoutRoot.tsx @@ -1,3 +1,5 @@ +import { useAppMenuPaste } from '@/hooks/useAppMenuPaste' +import { useAppMenuSelectionActions } from '@/hooks/useAppMenuSelectionActions' import { AgentKanbanBoard } from './AgentKanbanBoard' import { useDashboardSnapshot } from './useDashboardSnapshot' @@ -6,6 +8,10 @@ import { useDashboardSnapshot } from './useDashboardSnapshot' * from the main window and renders the agent board. */ export function DashboardPopoutRoot(): React.JSX.Element { + // Why: this window has no App shell, so nothing else would translate the + // Edit-menu IPC into the ownership events the terminal preview claims. + useAppMenuPaste() + useAppMenuSelectionActions() const snapshot = useDashboardSnapshot() return } diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-app-menu-clipboard.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-app-menu-clipboard.ts index 5f0fecf7164..27d35109982 100644 --- a/src/renderer/src/components/dashboard-popout/preview-terminal-app-menu-clipboard.ts +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-app-menu-clipboard.ts @@ -1,8 +1,26 @@ import type { Terminal } from '@xterm/xterm' import { isEditableTarget } from '@/lib/editable-target' +import { APP_MENU_PASTE_EVENT } from '@/lib/app-menu-paste' +import { + APP_MENU_SELECTION_ACTION_EVENT, + type AppMenuSelectionAction +} from '@/lib/app-menu-selection-actions' +import { copyTerminalSelection } from '@/components/terminal-pane/terminal-selection-copy' +import type { PreviewTerminalPasteSource } from './preview-terminal-paste' -type PreviewTerminalSelection = Pick +type PreviewTerminalSelection = Pick +/** + * Routes Edit-menu and context-menu clipboard commands to the preview terminal. + * + * Listens to the renderer-wide ownership events, exactly like a real pane, and + * NOT to the raw ui:appMenuPaste / ui:appMenuSelectionAction IPC. The + * preventDefault() claim is load-bearing: without it the App-level handler + * falls back to the focused text control, which for a focused terminal is + * xterm's hidden .xterm-helper-textarea — the clipboard text lands there and + * never reaches the PTY. Leaving an event unclaimed is equally deliberate: the + * App handler then performs the native action for text controls. + */ export function installPreviewTerminalAppMenuClipboard({ container, getTerminal, @@ -10,34 +28,45 @@ export function installPreviewTerminalAppMenuClipboard({ }: { container: HTMLElement getTerminal: () => PreviewTerminalSelection | null - pasteClipboardText: (activeElementAtDispatch: Element | null, source: 'app-menu') => Promise + pasteClipboardText: ( + activeElementAtDispatch: Element | null, + source: PreviewTerminalPasteSource + ) => void }): () => void { - const offPaste = window.api.ui.onAppMenuPaste(() => { + const onAppMenuPaste = (event: Event): void => { const active = document.activeElement - if (active && container.contains(active)) { - void pasteClipboardText(active, 'app-menu') + if (!active || !container.contains(active)) { + return } - }) - const offSelection = window.api.ui.onAppMenuSelectionAction((action) => { + event.preventDefault() + event.stopPropagation() + pasteClipboardText(active, 'app-menu') + } + const onAppMenuSelectionAction = (event: Event): void => { const active = document.activeElement const terminal = getTerminal() if (!active || !container.contains(active) || isEditableTarget(active) || !terminal) { - window.api.ui.performNativeSelectionAction(action) return } + const action = (event as CustomEvent).detail if (action === 'select-all') { + event.preventDefault() terminal.selectAll() return } - const selection = terminal.getSelection() - if (selection) { - void window.api.ui.writeTerminalClipboardText(selection).catch(() => undefined) - } else { - window.api.ui.performNativeSelectionAction(action) + if (!terminal.getSelection()) { + return } - }) + event.preventDefault() + void copyTerminalSelection({ + terminal, + writeClipboardText: window.api.ui.writeTerminalClipboardText + }).catch(() => undefined) + } + window.addEventListener(APP_MENU_PASTE_EVENT, onAppMenuPaste) + window.addEventListener(APP_MENU_SELECTION_ACTION_EVENT, onAppMenuSelectionAction) return () => { - offPaste() - offSelection() + window.removeEventListener(APP_MENU_PASTE_EVENT, onAppMenuPaste) + window.removeEventListener(APP_MENU_SELECTION_ACTION_EVENT, onAppMenuSelectionAction) } } diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-box-fit.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-box-fit.ts new file mode 100644 index 00000000000..ccf1f9f0da5 --- /dev/null +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-box-fit.ts @@ -0,0 +1,47 @@ +import type { Terminal } from '@xterm/xterm' + +type PreviewBoxFitTerminal = Pick + +/** + * Scales the preview terminal down to the dialog box it lives in. The terminal + * keeps the PTY's real cols/rows (replaying serialized ANSI into different + * dimensions rewraps into garbage), so an oversized frame is transform-scaled + * and anchored at whichever end keeps the CURSOR row visible: a fresh shell + * prompts at the TOP of its screen (blind bottom-anchoring clipped it away), + * while a busy TUI keeps its action at the bottom. + */ +export function createPreviewBoxFit(args: { + container: HTMLElement + getTerminal: () => PreviewBoxFitTerminal | null +}): { fit: () => void; schedule: () => void } { + const fit = (): void => { + const terminal = args.getTerminal() + const screen = args.container.querySelector('.xterm-screen') + const box = args.container.parentElement + if (!screen || !box || !terminal) { + return + } + const scale = Math.min(1, box.clientWidth / Math.max(1, screen.offsetWidth)) + args.container.style.transform = scale < 1 ? `scale(${scale})` : '' + const cellHeight = screen.offsetHeight / Math.max(1, terminal.rows) + const cursorBottom = (terminal.buffer.active.cursorY + 1) * cellHeight * scale + const anchorTop = cursorBottom <= box.clientHeight + box.style.alignItems = anchorTop ? 'flex-start' : 'flex-end' + args.container.style.transformOrigin = anchorTop ? 'top left' : 'bottom left' + } + + // Re-fit after every parsed write (cursor may move ends); rAF coalesces. + let scheduled = false + const schedule = (): void => { + if (scheduled) { + return + } + scheduled = true + requestAnimationFrame(() => { + scheduled = false + fit() + }) + } + + return { fit, schedule } +} diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-key-handler.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-key-handler.ts index 14aac0c2034..29a6b80688d 100644 --- a/src/renderer/src/components/dashboard-popout/preview-terminal-key-handler.ts +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-key-handler.ts @@ -17,9 +17,9 @@ import { /** * Installs the preview terminal's ONE custom key handler (xterm allows a single * attachCustomKeyEventHandler) covering copy/paste chords, the IME native-text - * bypass, and the full pane shortcut policy. Plain Mod+V is left to the - * Edit-menu accelerator, which reaches this window as ui:appMenuPaste — matching - * it here too would paste twice. + * bypass, and the full pane shortcut policy. On macOS plain Cmd+V is left to + * the Edit-menu accelerator, which reaches this window as an app-menu paste — + * matching it here too would paste twice. * * Returns a disposer for the Option-key location listeners the policy needs to * tell left Option from right. @@ -128,8 +128,13 @@ export function installPreviewTerminalKeyHandler(args: { } return consumeEvent(event) } + // Why darwin-only: only macOS has a real Edit-menu Cmd+V accelerator to + // defer to. Windows/Linux draw their own titlebar with the menu hidden, so + // a deferred Ctrl+V would never come back — handle it here, like the pane. const isMenuPasteChord = - (platform === 'darwin' ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey) && + platform === 'darwin' && + event.metaKey && + !event.ctrlKey && !event.altKey && !event.shiftKey && event.key.toLowerCase() === 'v' diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-paste.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-paste.ts index fc69fe8d10a..7bebeacd3e4 100644 --- a/src/renderer/src/components/dashboard-popout/preview-terminal-paste.ts +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-paste.ts @@ -9,6 +9,8 @@ import { TERMINAL_PASTE_MAX_BYTES } from '@/components/terminal-pane/terminal-pa import { pasteTerminalText } from '@/components/terminal-pane/terminal-bracketed-paste' import type { DashboardCardTerminalInput } from '../../../../shared/dashboard-snapshot' +export type PreviewTerminalPasteSource = 'keyboard' | 'app-menu' | 'right-click' + /** * Clipboard paste for the preview terminal, on the pane's coordinator: large * pastes stream as bounded IPC payloads, and the plan re-checks that the same @@ -20,7 +22,7 @@ export function createPreviewClipboardPaster(deps: { getTerminal: () => Terminal | null getTerminalInput: () => DashboardCardTerminalInput | null isDisposed: () => boolean -}): (activeElementAtDispatch: Element | null, source: 'keyboard' | 'app-menu') => Promise { +}): (activeElementAtDispatch: Element | null, source: PreviewTerminalPasteSource) => Promise { return async (activeElementAtDispatch, source) => { let text: string try { diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.test.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.test.ts new file mode 100644 index 00000000000..a972bf00740 --- /dev/null +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.test.ts @@ -0,0 +1,96 @@ +// @vitest-environment happy-dom + +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { installPreviewTerminalRightClickPaste } from './preview-terminal-right-click-paste' + +describe('installPreviewTerminalRightClickPaste', () => { + const writeTerminalClipboardText = vi.fn(async () => {}) + const pasteClipboardText = vi.fn() + let container: HTMLElement + let selection: string + let clearSelection: ReturnType void>> + let rightClickToPaste: boolean + + const install = (): (() => void) => + installPreviewTerminalRightClickPaste({ + container, + getTerminal: () => ({ getSelection: () => selection, clearSelection }), + isRightClickToPasteEnabled: () => rightClickToPaste, + pasteClipboardText + }) + + const rightClick = (init: MouseEventInit = {}): MouseEvent => { + const event = new MouseEvent('contextmenu', { bubbles: true, cancelable: true, ...init }) + container.dispatchEvent(event) + return event + } + + beforeEach(() => { + vi.clearAllMocks() + document.body.innerHTML = '' + container = document.createElement('div') + document.body.appendChild(container) + selection = '' + clearSelection = vi.fn<() => void>() + rightClickToPaste = true + Object.assign(window, { api: { ui: { writeTerminalClipboardText } } }) + }) + + it('pastes when nothing is selected', () => { + install() + const event = rightClick() + expect(event.defaultPrevented).toBe(true) + expect(pasteClipboardText).toHaveBeenCalledWith(document.activeElement, 'right-click') + expect(writeTerminalClipboardText).not.toHaveBeenCalled() + }) + + it('copies and clears the selection instead of pasting', async () => { + selection = 'selected text' + install() + const event = rightClick() + expect(event.defaultPrevented).toBe(true) + expect(writeTerminalClipboardText).toHaveBeenCalledWith('selected text') + await vi.waitFor(() => expect(clearSelection).toHaveBeenCalledOnce()) + expect(pasteClipboardText).not.toHaveBeenCalled() + }) + + it('keeps the selection when the clipboard write fails', async () => { + selection = 'selected text' + writeTerminalClipboardText.mockRejectedValueOnce(new Error('denied')) + install() + rightClick() + await Promise.resolve() + expect(clearSelection).not.toHaveBeenCalled() + }) + + it('falls through to the native menu on Ctrl+right-click', () => { + install() + const event = rightClick({ ctrlKey: true }) + expect(event.defaultPrevented).toBe(false) + expect(pasteClipboardText).not.toHaveBeenCalled() + }) + + it('falls through to the native menu when the setting is off', () => { + rightClickToPaste = false + install() + const event = rightClick() + expect(event.defaultPrevented).toBe(false) + expect(pasteClipboardText).not.toHaveBeenCalled() + }) + + it('falls through before the terminal exists and stops listening once disposed', () => { + const dispose = installPreviewTerminalRightClickPaste({ + container, + getTerminal: () => null, + isRightClickToPasteEnabled: () => true, + pasteClipboardText + }) + expect(rightClick().defaultPrevented).toBe(false) + dispose() + + const disposeSecond = install() + disposeSecond() + expect(rightClick().defaultPrevented).toBe(false) + expect(pasteClipboardText).not.toHaveBeenCalled() + }) +}) diff --git a/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.ts b/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.ts new file mode 100644 index 00000000000..9baa3999751 --- /dev/null +++ b/src/renderer/src/components/dashboard-popout/preview-terminal-right-click-paste.ts @@ -0,0 +1,45 @@ +import type { Terminal } from '@xterm/xterm' +import { copyTerminalSelection } from '@/components/terminal-pane/terminal-selection-copy' +import type { PreviewTerminalPasteSource } from './preview-terminal-paste' + +type PreviewRightClickTerminal = Pick + +/** + * Terminal-style right-click for the preview terminal, mirroring the pane's + * useTerminalContextMenuTrigger: a selection copies and clears, no selection + * pastes, and Ctrl+right-click keeps the native menu reachable. + */ +export function installPreviewTerminalRightClickPaste({ + container, + getTerminal, + isRightClickToPasteEnabled, + pasteClipboardText +}: { + container: HTMLElement + getTerminal: () => PreviewRightClickTerminal | null + isRightClickToPasteEnabled: () => boolean + pasteClipboardText: ( + activeElementAtDispatch: Element | null, + source: PreviewTerminalPasteSource + ) => void +}): () => void { + const onContextMenu = (event: MouseEvent): void => { + const terminal = getTerminal() + if (!terminal || !isRightClickToPasteEnabled() || event.ctrlKey) { + return + } + event.preventDefault() + event.stopPropagation() + if (terminal.getSelection()) { + void copyTerminalSelection({ + terminal, + writeClipboardText: window.api.ui.writeTerminalClipboardText, + clearSelectionOnSuccess: true + }).catch(() => undefined) + return + } + pasteClipboardText(document.activeElement, 'right-click') + } + container.addEventListener('contextmenu', onContextMenu) + return () => container.removeEventListener('contextmenu', onContextMenu) +} diff --git a/src/renderer/src/components/native-chat/NativeChatStructuredSession.test.tsx b/src/renderer/src/components/native-chat/NativeChatStructuredSession.test.tsx index 2a5542ab9f4..e0e8b74fe63 100644 --- a/src/renderer/src/components/native-chat/NativeChatStructuredSession.test.tsx +++ b/src/renderer/src/components/native-chat/NativeChatStructuredSession.test.tsx @@ -1,6 +1,7 @@ // @vitest-environment happy-dom import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' +import type React from 'react' import { afterEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ @@ -11,7 +12,8 @@ const mocks = vi.hoisted(() => ({ allowFileUriLinks?: boolean onLinkClick?: (...args: unknown[]) => void }, - composerProps: null as null | { structuredTransport?: Record } + composerProps: null as null | { structuredTransport?: Record }, + submissions: [] as unknown[] })) vi.mock('@/runtime/structured-agent-session-client', () => ({ @@ -21,12 +23,15 @@ vi.mock('@/runtime/structured-agent-session-client', () => ({ vi.mock('./use-structured-agent-session', async () => { const { useStructuredAgentSessionOutbox } = await import('./use-structured-agent-session-outbox') return { - useStructuredAgentSession: (props: { sessionId: string; target: { kind: 'local' } }) => { + useStructuredAgentSession: (props: { + sessionId: string + target: { kind: 'local' } | { kind: 'environment'; environmentId: string } + }) => { const outbox = useStructuredAgentSessionOutbox({ sessionId: props.sessionId, target: props.target, fence: 1, - submissions: [] + submissions: mocks.submissions as never }) return { messages: @@ -123,6 +128,7 @@ describe('NativeChatStructuredSession', () => { mocks.mode = 'static' mocks.messageListProps = null mocks.composerProps = null + mocks.submissions = [] }) it('wires local structured file links through the native chat opener', () => { @@ -201,4 +207,314 @@ describe('NativeChatStructuredSession', () => { await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2)) await waitFor(() => expect(screen.queryByText('Message delivery is unconfirmed.')).toBeNull()) }) + + it('resends a transport-unconfirmed head so later messages are not wedged', async () => { + mocks.mode = 'outbox' + mocks.submissions = [] + mocks.call.mockRejectedValueOnce(new Error('socket closed')).mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'accepted' } } + }) + + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + await waitFor(() => expect(screen.getByText('Message delivery is unconfirmed.')).toBeTruthy()) + + expect(send?.('second', [])).toBe(true) + // The head is probed automatically, clears, and the queue drains. + await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(3), { timeout: 10000 }) + await waitFor(() => expect(screen.queryByText('Message delivery is unconfirmed.')).toBeNull()) + }, 20000) + + it('probes without retryUnknown so the host cannot redispatch', async () => { + mocks.mode = 'outbox' + mocks.submissions = [] + mocks.call.mockRejectedValueOnce(new Error('socket closed')).mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'accepted' } } + }) + + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2), { timeout: 10000 }) + + const first = mocks.call.mock.calls[0]?.[2] as Record + const probe = mocks.call.mock.calls[1]?.[2] as Record + expect(probe.retryUnknown).toBeUndefined() + // Same operation id: both dedupe layers key off it. + expect((probe.envelope as { clientOperationId: string }).clientOperationId).toBe( + (first.envelope as { clientOperationId: string }).clientOperationId + ) + }, 20000) + + it('parks a host-confirmed unknown instead of probing it', async () => { + mocks.mode = 'outbox' + mocks.call.mockRejectedValueOnce(new Error('socket closed')).mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'accepted' } } + }) + + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + + const sent = mocks.call.mock.calls[0]?.[2] as { envelope: { clientOperationId: string } } + // The host now reports it as an unresolved unknown: redispatch is the user's call. + mocks.submissions = [ + { + clientMessageId: sent.envelope.clientOperationId, + fence: 1, + payloadFingerprint: 'fp', + dispatchState: 'unknown', + providerItemId: null, + reason: null, + submittedAt: 1, + resolvedAt: null + } + ] + // Queue a second message purely to re-render so the effect observes the + // new submissions; it must stay wedged behind the parked head. + await act(async () => { + send?.('second', []) + }) + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3000)) + }) + expect(mocks.call).toHaveBeenCalledOnce() + }, 20000) + + it('still probes while streaming batches rebuild the submissions array', async () => { + mocks.mode = 'outbox' + mocks.submissions = [] + mocks.call.mockRejectedValueOnce(new Error('socket closed')).mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'accepted' } } + }) + + const makeView = (): React.ReactElement => ( + + ) + const { rerender } = render(makeView()) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + + // Each batch mints a fresh submissions array for an unrelated message. An + // array-identity dependency restarts the backoff on every one of these, so a + // stream that outlasts the delay would never let the probe fire. + for (let index = 0; index < 12; index += 1) { + mocks.submissions = [ + { + clientMessageId: `other-${index}`, + fence: 1, + payloadFingerprint: 'fp', + dispatchState: 'accepted', + providerItemId: null, + reason: null, + submittedAt: index, + resolvedAt: index + } + ] + await act(async () => { + rerender(makeView()) + await new Promise((resolve) => setTimeout(resolve, 250)) + }) + } + + // Asserted with no trailing grace period: the probe must have fired *during* + // the stream, not after it went quiet. + expect(mocks.call).toHaveBeenCalledTimes(2) + }, 20000) + + it('restarts probe delay when the runtime target changes', async () => { + mocks.mode = 'outbox' + mocks.call.mockRejectedValueOnce(new Error('socket closed')).mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'accepted' } } + }) + + const makeView = ( + target: { kind: 'local' } | { kind: 'environment'; environmentId: string } + ) => ( + + ) + const { rerender } = render(makeView({ kind: 'local' })) + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + await waitFor(() => expect(screen.getByText('Message delivery is unconfirmed.')).toBeTruthy()) + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 300)) + }) + rerender(makeView({ kind: 'environment', environmentId: 'env-1' })) + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 600)) + }) + expect(mocks.call).toHaveBeenCalledOnce() + await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2), { timeout: 1500 }) + }, 10000) + + it('never auto-probes an entry the user already force-retried', async () => { + mocks.mode = 'outbox' + mocks.submissions = [] + // Both the original send and the user's explicit Retry fail at the transport. + mocks.call.mockRejectedValue(new Error('socket closed')) + + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + await waitFor(() => expect(screen.getByText('Message delivery is unconfirmed.')).toBeTruthy()) + + // User force-retries: this request legitimately carries retryUnknown. + fireEvent.click(screen.getByRole('button', { name: /Retry/ })) + await waitFor(() => expect(mocks.call).toHaveBeenCalledTimes(2)) + const forcedRequest = mocks.call.mock.calls[1]?.[2] as Record | undefined + expect(forcedRequest?.retryUnknown).toBe(true) + + // That retry also failed at the transport. The probe must NOT pick it up, or it + // would re-send retryUnknown automatically and redispatch to the agent. + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3000)) + }) + expect(mocks.call).toHaveBeenCalledTimes(2) + }, 20000) + + it('does not hot-loop when the host answers pending', async () => { + mocks.mode = 'outbox' + mocks.call.mockResolvedValue({ + ok: true, + value: { submission: { clientMessageId: 'client-1', dispatchState: 'pending' } } + }) + + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + await waitFor(() => expect(mocks.call).toHaveBeenCalledOnce()) + + // A pending row parks the entry under the backoff instead of re-dispatching + // immediately. Without that, this window is an unbounded back-to-back RPC flood. + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 2500)) + }) + expect(mocks.call.mock.calls.length).toBeLessThanOrEqual(3) + }, 20000) + + it('keeps probing past the old five-attempt budget', async () => { + mocks.mode = 'outbox' + mocks.call.mockRejectedValue(new Error('socket closed')) + vi.useFakeTimers({ shouldAdvanceTime: true }) + try { + render( + + ) + + const send = mocks.composerProps?.structuredTransport?.send as + | ((text: string, attachments: readonly { id: string; path: string }[]) => boolean) + | undefined + expect(send?.('first', [])).toBe(true) + + // Backoff is 1+2+4+8+16 = 31s for five probes, which was the old hard budget. + // Step past it; a seventh call proves the probe re-arms instead of giving up. + for (let step = 0; step < 12; step += 1) { + await act(async () => { + await vi.advanceTimersByTimeAsync(8_000) + }) + } + expect(mocks.call.mock.calls.length).toBeGreaterThanOrEqual(7) + } finally { + vi.useRealTimers() + } + }, 30000) }) diff --git a/src/renderer/src/components/native-chat/structured-agent-session-outbox-storage.ts b/src/renderer/src/components/native-chat/structured-agent-session-outbox-storage.ts new file mode 100644 index 00000000000..eb735652f40 --- /dev/null +++ b/src/renderer/src/components/native-chat/structured-agent-session-outbox-storage.ts @@ -0,0 +1,43 @@ +import { + parseStructuredAgentSessionOutboxEntry, + type StructuredAgentSessionOutboxEntry +} from '../../../../shared/structured-agent-session-outbox' + +const OUTBOX_PREFIX = 'orca:desktopStructuredAgentSessionOutbox:v1:' + +function storageKey(sessionId: string): string { + return `${OUTBOX_PREFIX}${encodeURIComponent(sessionId)}` +} + +export function readOutbox(sessionId: string): StructuredAgentSessionOutboxEntry[] { + try { + const value = JSON.parse(localStorage.getItem(storageKey(sessionId)) ?? '[]') + return Array.isArray(value) + ? value + .map((entry) => parseStructuredAgentSessionOutboxEntry(entry, sessionId)) + .filter((entry): entry is StructuredAgentSessionOutboxEntry => entry !== null) + .map((entry) => + entry.state === 'dispatching' ? { ...entry, state: 'unconfirmed' as const } : entry + ) + .sort((left, right) => left.queuedAt - right.queuedAt) + : [] + } catch { + return [] + } +} + +export function writeOutbox( + sessionId: string, + entries: readonly StructuredAgentSessionOutboxEntry[] +): boolean { + try { + if (entries.length === 0) { + localStorage.removeItem(storageKey(sessionId)) + } else { + localStorage.setItem(storageKey(sessionId), JSON.stringify(entries)) + } + return true + } catch { + return false + } +} diff --git a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.ts b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.ts index 56ccefe3f76..79b1e2c95bb 100644 --- a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.ts +++ b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox.ts @@ -8,7 +8,6 @@ import { createStructuredAgentSessionOperationId } from '../../../../shared/stru import { classifyStructuredAgentSessionSendFailure, createStructuredAgentSessionOutboxEntry, - parseStructuredAgentSessionOutboxEntry, reconcileStructuredAgentSessionOutbox, requeueStructuredAgentSessionSendRefusal, structuredAgentSessionSendRequest, @@ -16,49 +15,18 @@ import { } from '../../../../shared/structured-agent-session-outbox' import type { RuntimeClientTarget } from '@/runtime/runtime-rpc-client' import { callStructuredAgentSession } from '@/runtime/structured-agent-session-client' - -const OUTBOX_PREFIX = 'orca:desktopStructuredAgentSessionOutbox:v1:' +import { readOutbox, writeOutbox } from './structured-agent-session-outbox-storage' export function structuredSessionOperationId(): string { return createStructuredAgentSessionOperationId(() => crypto.randomUUID()) } -function storageKey(sessionId: string): string { - return `${OUTBOX_PREFIX}${encodeURIComponent(sessionId)}` -} - -function readOutbox(sessionId: string): StructuredAgentSessionOutboxEntry[] { - try { - const value = JSON.parse(localStorage.getItem(storageKey(sessionId)) ?? '[]') - return Array.isArray(value) - ? value - .map((entry) => parseStructuredAgentSessionOutboxEntry(entry, sessionId)) - .filter((entry): entry is StructuredAgentSessionOutboxEntry => entry !== null) - .map((entry) => - entry.state === 'dispatching' ? { ...entry, state: 'unconfirmed' as const } : entry - ) - .sort((left, right) => left.queuedAt - right.queuedAt) - : [] - } catch { - return [] - } -} - -function writeOutbox( - sessionId: string, - entries: readonly StructuredAgentSessionOutboxEntry[] -): boolean { - try { - if (entries.length === 0) { - localStorage.removeItem(storageKey(sessionId)) - } else { - localStorage.setItem(storageKey(sessionId), JSON.stringify(entries)) - } - return true - } catch { - return false - } -} +const UNCONFIRMED_PROBE_BASE_DELAY_MS = 1_000 +/** No attempt ceiling: a transport outage outlives any fixed budget, and giving up + * restores the wedge this fixes. Growth caps the rate at one status query per 16s. + * A refusal that blocks the head still ends probing until a fence change or a manual + * Retry, because the entry leaves `unconfirmed` -- pre-existing, not closed here. */ +const UNCONFIRMED_PROBE_MAX_DELAY_MS = 16_000 function isDesktopDeliveryUnknown(error: unknown): boolean { const text = error instanceof Error ? `${error.name}:${error.message}` : String(error) @@ -72,6 +40,7 @@ export function useStructuredAgentSessionOutbox(args: { submissions: readonly AgentJournalSubmission[] }) { const { fence, sessionId, submissions, target } = args + const targetKey = target.kind === 'local' ? 'local' : `environment:${target.environmentId}` const [outbox, setOutbox] = useState(() => readOutbox(sessionId) ) @@ -80,6 +49,7 @@ export function useStructuredAgentSessionOutbox(args: { const dispatchingRef = useRef(false) const dispatchGenerationRef = useRef(0) const blockedIdRef = useRef(null) + const probeAttemptsRef = useRef({ id: null as string | null, attempts: 0 }) const [error, setError] = useState(null) const [errorSession, setErrorSession] = useState(sessionId) // Render-time reset (react.dev: adjusting state when a prop changes), so the @@ -97,7 +67,8 @@ export function useStructuredAgentSessionOutbox(args: { dispatchGenerationRef.current += 1 dispatchingRef.current = false blockedIdRef.current = null - }, [fence, sessionId, target]) + probeAttemptsRef.current = { id: null, attempts: 0 } + }, [fence, sessionId, targetKey]) useEffect(() => { const sessionChanged = outboxSessionRef.current !== sessionId @@ -196,7 +167,8 @@ export function useStructuredAgentSessionOutbox(args: { ? { ...entry, state: - submission.dispatchState === 'unknown' + submission.dispatchState === 'unknown' || + submission.dispatchState === 'pending' ? ('unconfirmed' as const) : ('queued' as const) } @@ -237,6 +209,47 @@ export function useStructuredAgentSessionOutbox(args: { }) }, [fence, outbox, sessionId, target]) + // A transport-side unknown may never have reached the host, and nothing else + // moves it out of `unconfirmed`, so one wedges the whole FIFO queue. Re-issuing + // the same envelope without `retryUnknown` is idempotent: the operation ledger + // replays a recorded outcome, or the host performs a genuine first delivery. + // A host-confirmed unknown stays parked — forcing past that redispatches, which + // is the user's call via Retry. + const head = outbox[0] + // Depend on primitives: `submissions` is rebuilt on every streaming batch, so an + // array-identity dep would reset the backoff forever while the agent is working. + // A non-null `retryAfterUnknownSubmittedAt` means the user already force-retried, + // so the request would carry `retryUnknown` and redispatch host-side. Only entries + // that have never been force-retried are safe to re-issue automatically. + const probeId = + head && + head.sessionId === sessionId && + head.state === 'unconfirmed' && + head.retryAfterUnknownSubmittedAt === null + ? head.clientMessageId + : null + const probeSettled = + probeId !== null && submissions.some((submission) => submission.clientMessageId === probeId) + useEffect(() => { + if (probeId === null || probeSettled || fence === null) { + return + } + const attempts = probeAttemptsRef.current.id === probeId ? probeAttemptsRef.current.attempts : 0 + const timer = setTimeout( + () => { + probeAttemptsRef.current = { id: probeId, attempts: attempts + 1 } + const next = outboxRef.current.map((entry) => + entry.clientMessageId === probeId ? { ...entry, state: 'queued' as const } : entry + ) + outboxRef.current = next + setOutbox(next) + writeOutbox(sessionId, next) + }, + Math.min(UNCONFIRMED_PROBE_BASE_DELAY_MS * 2 ** attempts, UNCONFIRMED_PROBE_MAX_DELAY_MS) + ) + return () => clearTimeout(timer) + }, [fence, probeId, probeSettled, sessionId, targetKey]) + const send = useCallback( (text: string, attachments: readonly { path: string; previewUri: string }[] = []): boolean => { if (!text.trim() && attachments.length === 0) { diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-conflict-refresh.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-conflict-refresh.tsx index c306998ad7e..13f804f2270 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-conflict-refresh.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-conflict-refresh.tsx @@ -58,7 +58,8 @@ export function useChecksPanelConflictRefresh(model: ChecksPanelConflictRefreshI repoId: repo.id, worktreeId: activeWorktreeId ?? undefined, linkedPRNumber: linkedPR, - fallbackPRNumber: fallbackGitHubPRNumber ?? pr.number + fallbackPRNumber: fallbackGitHubPRNumber ?? pr.number, + reason: 'active' }).finally(() => { // Why: fetchPRForBranch can rerun this effect; only the current key clears the spinner so stale requests don't race newer branches. if (conflictSummaryRefreshKeyRef.current === refreshKey) { diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-controller-state.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-controller-state.tsx index 2665473f605..3ba2dbf7e3e 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-controller-state.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-controller-state.tsx @@ -204,8 +204,6 @@ export function useChecksPanelControllerState() { const asyncResultKeyRef = useRef('') const refreshRequestKeyRef = useRef(null) const refreshContextKeyRef = useRef(null) - const gitStatusSnapshotInFlightContextRef = useRef(null) - const gitStatusSnapshotRerunContextRef = useRef(null) const gitStatusSnapshotRetryTimerRef = useRef | null>(null) const gitIdentityDisplay = activeWorktree ? getWorktreeGitIdentityDisplay(activeWorktree) : null const detachedHeadDisplay = gitIdentityDisplay?.kind === 'detached' ? gitIdentityDisplay : null @@ -374,8 +372,6 @@ export function useChecksPanelControllerState() { asyncResultKeyRef, refreshRequestKeyRef, refreshContextKeyRef, - gitStatusSnapshotInFlightContextRef, - gitStatusSnapshotRerunContextRef, gitStatusSnapshotRetryTimerRef, gitIdentityDisplay, detachedHeadDisplay, diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-foreground-effects.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-foreground-effects.tsx index 8ac18593476..c451dcf4152 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-foreground-effects.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-foreground-effects.tsx @@ -1,9 +1,6 @@ import { useEffect } from 'react' import { resolveChecksPanelPRRefreshRequest } from '../checks-panel-pr-refresh-request' -import { - shouldCoalesceChecksPanelGitStatusSnapshotRefresh, - shouldPollChecksPanelRuntimeSshStatus -} from '../checks-panel-git-status-snapshot' +import { shouldPollChecksPanelRuntimeSshStatus } from '../checks-panel-git-status-snapshot' import type { ChecksPanelControllerState } from './use-checks-panel-controller-state' import type { ChecksPanelContextState } from './use-checks-panel-context-state' import type { ChecksPanelReviewState } from './use-checks-panel-review-state' @@ -17,10 +14,7 @@ type ChecksPanelForegroundEffectsInput = Pick< | 'enqueueGitHubPRRefresh' | 'fetchHostedReviewForBranch' | 'foregroundedUnrenderedReviewKeyRef' - | 'gitStatusSnapshotInFlightContextRef' - | 'gitStatusSnapshotRerunContextRef' | 'isPanelVisible' - | 'panelContextKeyRef' | 'panelVisibleSinceRef' | 'repo' | 'repoConnectionId' @@ -55,8 +49,6 @@ export function useChecksPanelForegroundEffects(model: ChecksPanelForegroundEffe fetchHostedReviewForBranch, foregroundReviewEvidenceKey, foregroundedUnrenderedReviewKeyRef, - gitStatusSnapshotInFlightContextRef, - gitStatusSnapshotRerunContextRef, isFolder, isGitHubReviewContext, isPanelVisible, @@ -65,7 +57,6 @@ export function useChecksPanelForegroundEffects(model: ChecksPanelForegroundEffe linkedGiteaPR, linkedGitLabMR, linkedPR, - panelContextKeyRef, panelVisibleSinceRef, prCachedHasPR, prFetchedAt, @@ -150,27 +141,10 @@ export function useChecksPanelForegroundEffects(model: ChecksPanelForegroundEffe skippedInitialRun = true return } - const currentContextKey = panelContextKeyRef.current - if ( - shouldCoalesceChecksPanelGitStatusSnapshotRefresh( - gitStatusSnapshotInFlightContextRef.current, - currentContextKey - ) - ) { - gitStatusSnapshotRerunContextRef.current = currentContextKey - return - } setGitStatusRefreshNonce((value) => value + 1) }, + jitterOnVisible: true, intervalMs: RUNTIME_SSH_STATUS_REFRESH_MS }) - }, [ - isPanelVisible, - repoConnectionId, - runtimeEnvironmentId, - gitStatusSnapshotInFlightContextRef, - gitStatusSnapshotRerunContextRef, - setGitStatusRefreshNonce, - panelContextKeyRef - ]) + }, [isPanelVisible, repoConnectionId, runtimeEnvironmentId, setGitStatusRefreshNonce]) } diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.test.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.test.tsx new file mode 100644 index 00000000000..231f835619d --- /dev/null +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.test.tsx @@ -0,0 +1,246 @@ +// @vitest-environment happy-dom + +import { act } from 'react' +import type { Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ + getRuntimeGitStatus: vi.fn(), + getRuntimeGitUpstreamStatus: vi.fn() +})) + +vi.mock('@/runtime/runtime-git-client', () => mocks) + +import { useChecksPanelGitStatusEffects } from './use-checks-panel-git-status-effects' +import { deferred, flush, mountProbe, unmountProbes } from '../source-control-hook-test-harness' + +const retryTimerRef = { current: null as ReturnType | null } +const panelContextKeyRef = { current: 'context-A' } +const setGitStatusSnapshot = vi.fn() +const setGitStatusProbeErrorContextKey = vi.fn() +const setGitStatusRefreshNonce = vi.fn() +const updateWorktreeGitIdentity = vi.fn() + +function Probe({ + nonce, + contextKey = 'context-A', + isPanelVisible = true, + repoConnectionId = null, + sshConnectionStatus, + worktreeId = 'worktree-A', + worktreePath = '/repo' +}: { + nonce: number + contextKey?: string + isPanelVisible?: boolean + repoConnectionId?: string | null + sshConnectionStatus?: 'connected' | 'connecting' | 'disconnected' + worktreeId?: string + worktreePath?: string +}): null { + panelContextKeyRef.current = contextKey + useChecksPanelGitStatusEffects({ + activeConnectionId: repoConnectionId, + activeWorktreeId: worktreeId, + activeWorktreePath: worktreePath, + activeWorktreePushTarget: null, + branch: 'feature', + eligibilityHeadOidRef: { current: null }, + eligibilityRefreshNonce: 0, + getHostedReviewCreationEligibility: vi.fn(), + gitStatusInvalidation: 0, + gitStatusReadyForPanelContext: false, + gitStatusRefreshNonce: nonce, + gitStatusSnapshotRetryTimerRef: retryTimerRef, + hasUncommittedChanges: false, + hostedReviewCreationRequestKey: 'eligibility-A', + isFolder: false, + isPanelVisible, + linkedAzureDevOpsPR: null, + linkedBitbucketPR: null, + linkedGiteaPR: null, + linkedGitLabMR: null, + linkedPR: null, + fallbackGitHubPRNumber: null, + localExecutionScope: 'host', + ownerSettings: null, + panelContextKey: contextKey, + panelContextKeyRef, + remoteStatus: undefined, + remoteStatusInvalidation: 0, + repo: { id: 'repo-A', path: '/repo', connectionId: repoConnectionId, worktreeBaseRef: 'main' }, + repoConnectionId, + runtimeEnvironmentId: null, + setGitStatusProbeErrorContextKey, + setGitStatusRefreshNonce, + setGitStatusSnapshot, + setHostedReviewCreationSnapshot: vi.fn(), + sshConnectionStatus, + updateWorktreeGitIdentity + } as never) + return null +} + +beforeEach(() => { + vi.useFakeTimers() + vi.setSystemTime(0) + retryTimerRef.current = null + panelContextKeyRef.current = 'context-A' + mocks.getRuntimeGitStatus.mockReset() + mocks.getRuntimeGitUpstreamStatus.mockReset() + setGitStatusSnapshot.mockReset() + setGitStatusProbeErrorContextKey.mockReset() + setGitStatusRefreshNonce.mockReset() + updateWorktreeGitIdentity.mockReset() +}) + +afterEach(() => { + unmountProbes() + vi.useRealTimers() +}) + +describe('useChecksPanelGitStatusEffects poll runner', () => { + it('coalesces M nonce ticks into one trailing run after the slowTaskBackoff gap', async () => { + const first = deferred<{ + entries: never[] + head: string + branch: string + upstreamStatus: { hasUpstream: boolean; ahead: number; behind: number } + }>() + const status = { + entries: [], + head: 'head-A', + branch: 'feature', + upstreamStatus: { hasUpstream: true, ahead: 0, behind: 0 } + } + mocks.getRuntimeGitStatus.mockReturnValueOnce(first.promise).mockResolvedValue(status) + const root: Root = await mountProbe() + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + for (let tick = 1; tick <= 5; tick += 1) { + await act(async () => { + root.render() + }) + } + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + await act(async () => { + await vi.advanceTimersByTimeAsync(10_000) + first.resolve(status) + }) + await flush() + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + await act(async () => { + await vi.advanceTimersByTimeAsync(9_999) + }) + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + await act(async () => { + await vi.advanceTimersByTimeAsync(1) + }) + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(2) + }) + + it('does not carry a slow worktree backoff into the next panel context', async () => { + const first = deferred<{ + entries: never[] + head: string + branch: string + upstreamStatus: { hasUpstream: boolean; ahead: number; behind: number } + }>() + const status = { + entries: [], + head: 'head-A', + branch: 'feature', + upstreamStatus: { hasUpstream: true, ahead: 0, behind: 0 } + } + mocks.getRuntimeGitStatus.mockReturnValueOnce(first.promise).mockResolvedValue(status) + const root: Root = await mountProbe() + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + await act(async () => { + await vi.advanceTimersByTimeAsync(10_000) + first.resolve(status) + }) + await flush() + + await act(async () => { + root.render( + + ) + }) + await flush() + + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(2) + expect(mocks.getRuntimeGitStatus).toHaveBeenLastCalledWith( + expect.objectContaining({ worktreeId: 'worktree-B', worktreePath: '/repo-b' }), + { admissionTier: 'status' } + ) + }) + + it('does not carry a discarded hidden run backoff into the reopened panel', async () => { + const first = deferred<{ + entries: never[] + head: string + branch: string + upstreamStatus: { hasUpstream: boolean; ahead: number; behind: number } + }>() + const status = { + entries: [], + head: 'head-A', + branch: 'feature', + upstreamStatus: { hasUpstream: true, ahead: 0, behind: 0 } + } + mocks.getRuntimeGitStatus.mockReturnValueOnce(first.promise).mockResolvedValue(status) + const root: Root = await mountProbe() + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + await act(async () => { + await vi.advanceTimersByTimeAsync(10_000) + root.render() + }) + first.resolve(status) + await flush() + + await act(async () => { + root.render() + }) + await flush() + + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(2) + }) + + it('does not carry a discarded disconnected run backoff through SSH reconnect', async () => { + const first = deferred<{ + entries: never[] + head: string + branch: string + upstreamStatus: { hasUpstream: boolean; ahead: number; behind: number } + }>() + const status = { + entries: [], + head: 'head-A', + branch: 'feature', + upstreamStatus: { hasUpstream: true, ahead: 0, behind: 0 } + } + mocks.getRuntimeGitStatus.mockReturnValueOnce(first.promise).mockResolvedValue(status) + const root: Root = await mountProbe( + + ) + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(1) + + await act(async () => { + await vi.advanceTimersByTimeAsync(10_000) + root.render() + }) + first.resolve(status) + await flush() + + await act(async () => { + root.render() + }) + await flush() + + expect(mocks.getRuntimeGitStatus).toHaveBeenCalledTimes(2) + }) +}) diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.tsx index fa4eca45608..ba362915ddd 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-git-status-effects.tsx @@ -1,11 +1,11 @@ -import { useEffect } from 'react' +import { useEffect, useRef } from 'react' import { getRuntimeGitStatus, getRuntimeGitUpstreamStatus } from '@/runtime/runtime-git-client' import { buildChecksPanelEligibilityGitFingerprint, shouldClearChecksPanelGitStatusSnapshot, - shouldCoalesceChecksPanelGitStatusSnapshotRefresh, shouldCommitChecksPanelGitStatusSnapshot } from '../checks-panel-git-status-snapshot' +import { createCoalescedPollRunner, type CoalescedPollRunner } from '../coalesced-poll-runner' import type { ChecksPanelControllerState } from './use-checks-panel-controller-state' import type { ChecksPanelReviewState } from './use-checks-panel-review-state' import type { ChecksPanelContextState } from './use-checks-panel-context-state' @@ -21,8 +21,6 @@ type ChecksPanelGitStatusEffectsInput = Pick< | 'getHostedReviewCreationEligibility' | 'gitStatusInvalidation' | 'gitStatusRefreshNonce' - | 'gitStatusSnapshotInFlightContextRef' - | 'gitStatusSnapshotRerunContextRef' | 'gitStatusSnapshotRetryTimerRef' | 'isPanelVisible' | 'localExecutionScope' @@ -60,6 +58,12 @@ type ChecksPanelGitStatusEffectsInput = Pick< > const GIT_STATUS_FAILURE_RETRY_MS = 3000 +const CHECKS_PANEL_GIT_STATUS_MIN_INTERVAL_MS = 3000 +const CHECKS_PANEL_GIT_STATUS_SLOW_BACKOFF = { + idleMultiplier: 1, + changeSignalMultiplier: 1, + maxIntervalMs: 5 * 60_000 +} export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffectsInput) { const { @@ -74,8 +78,6 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect gitStatusInvalidation, gitStatusReadyForPanelContext, gitStatusRefreshNonce, - gitStatusSnapshotInFlightContextRef, - gitStatusSnapshotRerunContextRef, gitStatusSnapshotRetryTimerRef, hasUncommittedChanges, hostedReviewCreationRequestKey, @@ -103,6 +105,36 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect sshConnectionStatus, updateWorktreeGitIdentity } = model + const gitStatusRequestRef = useRef<(() => Promise) | null>(null) + const gitStatusPollRunnerRef = useRef(null) + const gitStatusPollingReady = Boolean( + repo && + !isFolder && + branch && + isPanelVisible && + activeWorktreeId && + activeWorktreePath && + (runtimeEnvironmentId || !repoConnectionId || sshConnectionStatus === 'connected') + ) + + useEffect(() => { + const runner = createCoalescedPollRunner( + () => gitStatusRequestRef.current?.() ?? Promise.resolve(), + { + minIntervalMs: CHECKS_PANEL_GIT_STATUS_MIN_INTERVAL_MS, + slowTaskBackoff: CHECKS_PANEL_GIT_STATUS_SLOW_BACKOFF + } + ) + gitStatusPollRunnerRef.current = runner + return () => { + gitStatusRequestRef.current = null + runner.dispose() + if (gitStatusPollRunnerRef.current === runner) { + gitStatusPollRunnerRef.current = null + } + } + }, [gitStatusPollingReady, panelContextKey]) + useEffect(() => { if ( !repo || @@ -117,24 +149,13 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect clearTimeout(gitStatusSnapshotRetryTimerRef.current) gitStatusSnapshotRetryTimerRef.current = null } + gitStatusRequestRef.current = null // Why: hiding the panel or losing SSH should stop new work, not erase same-context Create PR eligibility that can still be retried. return } let stale = false const requestContextKey = panelContextKey const connectionId = activeConnectionId ?? undefined - if ( - shouldCoalesceChecksPanelGitStatusSnapshotRefresh( - gitStatusSnapshotInFlightContextRef.current, - requestContextKey - ) - ) { - gitStatusSnapshotRerunContextRef.current = requestContextKey - return () => { - stale = true - } - } - gitStatusSnapshotInFlightContextRef.current = requestContextKey // Why: global status maps are keyed only by worktree; use their changes as invalidation signals, then fetch a local snapshot. if (gitStatusSnapshotRetryTimerRef.current) { clearTimeout(gitStatusSnapshotRetryTimerRef.current) @@ -149,32 +170,30 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect worktreePath: activeWorktreePath, connectionId } - void (async () => { - const status = await getRuntimeGitStatus(context) - if ( - !stale && - shouldCommitChecksPanelGitStatusSnapshot(panelContextKeyRef.current, requestContextKey) - ) { - // Why: the Checks tab can be the only visible git surface; commit branch identity before branch-scoped upstream refresh can fail. - updateWorktreeGitIdentity(activeWorktreeId, { - head: status.head, - branch: status.branch ?? (status.head ? null : undefined) - }) - } - let freshRemoteStatus = status.upstreamStatus - if (activeWorktreePushTarget) { - freshRemoteStatus = await getRuntimeGitUpstreamStatus(context, activeWorktreePushTarget) - } else if ( - !freshRemoteStatus || - (freshRemoteStatus.ahead > 0 && - freshRemoteStatus.behind > 0 && - freshRemoteStatus.behindCommitsArePatchEquivalent === undefined) - ) { - freshRemoteStatus = await getRuntimeGitUpstreamStatus(context) - } - return { status, remoteStatus: freshRemoteStatus } - })() - .then(({ status, remoteStatus }) => { + const runRequest = async (): Promise => { + try { + const status = await getRuntimeGitStatus(context, { admissionTier: 'status' }) + if ( + !stale && + shouldCommitChecksPanelGitStatusSnapshot(panelContextKeyRef.current, requestContextKey) + ) { + // Why: the Checks tab can be the only visible git surface; commit branch identity before branch-scoped upstream refresh can fail. + updateWorktreeGitIdentity(activeWorktreeId, { + head: status.head, + branch: status.branch ?? (status.head ? null : undefined) + }) + } + let freshRemoteStatus = status.upstreamStatus + if (activeWorktreePushTarget) { + freshRemoteStatus = await getRuntimeGitUpstreamStatus(context, activeWorktreePushTarget) + } else if ( + !freshRemoteStatus || + (freshRemoteStatus.ahead > 0 && + freshRemoteStatus.behind > 0 && + freshRemoteStatus.behindCommitsArePatchEquivalent === undefined) + ) { + freshRemoteStatus = await getRuntimeGitUpstreamStatus(context) + } if ( !stale && shouldCommitChecksPanelGitStatusSnapshot(panelContextKeyRef.current, requestContextKey) @@ -182,7 +201,7 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect setGitStatusSnapshot({ contextKey: requestContextKey, hasUncommittedChanges: status.entries.length > 0, - remoteStatus, + remoteStatus: freshRemoteStatus, gitIdentity: { head: status.head, branch: status.branch ?? (status.head ? null : undefined) @@ -191,8 +210,7 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect // A fresh probe succeeded, so this context is no longer in the "could not check branch status" state. setGitStatusProbeErrorContextKey((key) => (key === requestContextKey ? null : key)) } - }) - .catch((error) => { + } catch (error) { console.warn('[ChecksPanel] git status refresh before eligibility failed', error) if (!stale) { // Why: transient SSH/runtime flakes shouldn't hide an already-valid Create PR state for this branch; retry while visible. @@ -217,22 +235,15 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect } }, GIT_STATUS_FAILURE_RETRY_MS) } - }) - .finally(() => { - if (gitStatusSnapshotInFlightContextRef.current === requestContextKey) { - gitStatusSnapshotInFlightContextRef.current = null - } - if (gitStatusSnapshotRerunContextRef.current === requestContextKey) { - gitStatusSnapshotRerunContextRef.current = null - if ( - shouldCommitChecksPanelGitStatusSnapshot(panelContextKeyRef.current, requestContextKey) - ) { - setGitStatusRefreshNonce((value) => value + 1) - } - } - }) + } + } + gitStatusRequestRef.current = runRequest + gitStatusPollRunnerRef.current?.run() return () => { stale = true + if (gitStatusRequestRef.current === runRequest) { + gitStatusRequestRef.current = null + } if (gitStatusSnapshotRetryTimerRef.current) { clearTimeout(gitStatusSnapshotRetryTimerRef.current) gitStatusSnapshotRetryTimerRef.current = null @@ -259,9 +270,7 @@ export function useChecksPanelGitStatusEffects(model: ChecksPanelGitStatusEffect setGitStatusProbeErrorContextKey, setGitStatusSnapshot, gitStatusSnapshotRetryTimerRef, - gitStatusSnapshotRerunContextRef, setGitStatusRefreshNonce, - gitStatusSnapshotInFlightContextRef, panelContextKeyRef ]) diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.test.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.test.tsx index 959ea4468ec..94c07d7171d 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.test.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.test.tsx @@ -112,5 +112,13 @@ describe('useChecksPanelManualRefresh ordering', () => { 'comments-loading:false', 'refreshing:false' ]) + expect(input.fetchPRForBranch).toHaveBeenCalledWith('/workspace/repo', 'main', { + force: true, + repoId: 'repo-1', + worktreeId: undefined, + linkedPRNumber: null, + fallbackPRNumber: null, + reason: 'manual' + }) }) }) diff --git a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.tsx b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.tsx index 25ab151a19a..796140405ef 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.tsx +++ b/src/renderer/src/components/right-sidebar/checks-panel/use-checks-panel-manual-refresh.tsx @@ -117,7 +117,9 @@ export function useChecksPanelManualRefresh(model: ChecksPanelManualRefreshInput worktreePath: activeWorktreePath, connectionId: activeConnectionId ?? undefined } - const status = await getRuntimeGitStatus(statusContext) + const status = await getRuntimeGitStatus(statusContext, { + admissionTier: 'interactive' + }) const observedBranch = status.branch ?? (status.head ? null : undefined) updateWorktreeGitIdentity(activeWorktreeId, { head: status.head, @@ -172,6 +174,7 @@ export function useChecksPanelManualRefresh(model: ChecksPanelManualRefreshInput repoPath: repo.path, repoId: repo.id, branch, + admissionTier: 'interactive', linkedGitHubPR: linkedPR, fallbackGitHubPR: fallbackGitHubPRNumber, linkedGitLabMR, @@ -212,7 +215,8 @@ export function useChecksPanelManualRefresh(model: ChecksPanelManualRefreshInput repoId: repo.id, worktreeId: activeWorktreeId ?? undefined, linkedPRNumber: linkedPR, - fallbackPRNumber: fallbackGitHubPRNumber + fallbackPRNumber: fallbackGitHubPRNumber, + reason: 'manual' }) } finally { if (startedPRRefreshToken) { @@ -226,6 +230,7 @@ export function useChecksPanelManualRefresh(model: ChecksPanelManualRefreshInput repoPath: repo.path, repoId: repo.id, branch, + admissionTier: 'interactive', linkedGitHubPR: linkedPR, fallbackGitHubPR: refreshedPR?.number ?? fallbackGitHubPRNumber, linkedGitLabMR, diff --git a/src/renderer/src/components/right-sidebar/coalesced-poll-runner.test.ts b/src/renderer/src/components/right-sidebar/coalesced-poll-runner.test.ts index bff4e78bbdc..d5f7a5ed120 100644 --- a/src/renderer/src/components/right-sidebar/coalesced-poll-runner.test.ts +++ b/src/renderer/src/components/right-sidebar/coalesced-poll-runner.test.ts @@ -4,12 +4,15 @@ import { type CoalescedPollRunner, createCoalescedPollRunner } from './coalesced function deferred(): { promise: Promise resolve: () => void + reject: (error: Error) => void } { let resolve: () => void = () => {} - const promise = new Promise((r) => { + let reject: (error: Error) => void = () => {} + const promise = new Promise((r, j) => { resolve = r + reject = j }) - return { promise, resolve } + return { promise, resolve, reject } } async function flushMicrotasks(): Promise { @@ -167,6 +170,28 @@ describe('createCoalescedPollRunner', () => { vi.useRealTimers() }) + it('paces a GitCommandTimeoutError from its full timeout duration', async () => { + vi.useFakeTimers() + const { runner, task, calls } = makeSlowRunner() + + runner.run() + runner.run() + await vi.advanceTimersByTimeAsync(120_000) + const timeoutError = new Error('git timed out.') + timeoutError.name = 'GitCommandTimeoutError' + calls[0]?.reject(timeoutError) + await flushMicrotasks() + + await vi.advanceTimersByTimeAsync(299_999) + expect(task).toHaveBeenCalledTimes(1) + await vi.advanceTimersByTimeAsync(1) + expect(task).toHaveBeenCalledTimes(2) + + calls[1]?.resolve() + await flushMicrotasks() + vi.useRealTimers() + }) + it('keeps minIntervalMs as the gap for fast tasks', async () => { vi.useFakeTimers() const { runner, task, calls } = makeSlowRunner() diff --git a/src/renderer/src/components/right-sidebar/git-status-refresh-branch-line-total.test.ts b/src/renderer/src/components/right-sidebar/git-status-refresh-branch-line-total.test.ts index 4727ebd173b..2bb1f45d6ff 100644 --- a/src/renderer/src/components/right-sidebar/git-status-refresh-branch-line-total.test.ts +++ b/src/renderer/src/components/right-sidebar/git-status-refresh-branch-line-total.test.ts @@ -61,6 +61,7 @@ describe('branch line total request gate on git status refreshes', () => { // Why: no OID on the request is the whole performance contract — the host // runs no ranged diff, so a background worktree costs nothing. expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'status', worktreePath: '/repo', connectionId: 'ssh-1' }) @@ -78,6 +79,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'status', worktreePath: '/repo', connectionId: undefined }) @@ -94,6 +96,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'status', worktreePath: '/other-repo', connectionId: undefined }) @@ -113,6 +116,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'status', worktreePath: '/repo', connectionId: 'ssh-1', branchLineTotalMergeBase: MERGE_BASE @@ -131,6 +135,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'status', worktreePath: '/repo', connectionId: undefined, reuseLineStats: true, @@ -175,11 +180,13 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenNthCalledWith(1, { + admissionTier: 'status', worktreePath: '/repo', connectionId: undefined, branchLineTotalMergeBase: MERGE_BASE }) expect(gitStatus).toHaveBeenNthCalledWith(2, { + admissionTier: 'status', worktreePath: '/repo', connectionId: undefined, branchLineTotalMergeBase: 'rebased-merge-base' @@ -196,6 +203,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'interactive', worktreePath: '/repo', connectionId: undefined, bypassEffectiveUpstreamNegativeCache: true @@ -215,6 +223,7 @@ describe('branch line total request gate on git status refreshes', () => { }) expect(gitStatus).toHaveBeenCalledWith({ + admissionTier: 'interactive', worktreePath: '/repo', connectionId: undefined, bypassEffectiveUpstreamNegativeCache: true, diff --git a/src/renderer/src/components/right-sidebar/git-status-refresh-scheduler.test.ts b/src/renderer/src/components/right-sidebar/git-status-refresh-scheduler.test.ts index 1e00ac163b5..70ed74bad1e 100644 --- a/src/renderer/src/components/right-sidebar/git-status-refresh-scheduler.test.ts +++ b/src/renderer/src/components/right-sidebar/git-status-refresh-scheduler.test.ts @@ -29,7 +29,7 @@ function createScheduler( activityDebounceMs: 125, activityMinGapMs: 3000, slowTaskBackoff: { - idleMultiplier: 5, + idleMultiplier: 1, changeSignalMultiplier: 1, maxIntervalMs: 5 * 60_000 }, @@ -176,11 +176,11 @@ describe('createGitStatusRefreshScheduler', () => { await vi.advanceTimersByTimeAsync(1) expect(task).toHaveBeenCalledTimes(2) - // The second scan is also slow; the next safety waits max(60s, 5x) = 150s. + // The second scan is also slow; the next safety waits max(60s, 1x) = 60s. await vi.advanceTimersByTimeAsync(30_000) calls[1]?.resolve() await flushMicrotasks() - await vi.advanceTimersByTimeAsync(149_999) + await vi.advanceTimersByTimeAsync(59_999) expect(task).toHaveBeenCalledTimes(2) await vi.advanceTimersByTimeAsync(1) expect(task).toHaveBeenCalledTimes(3) diff --git a/src/renderer/src/components/right-sidebar/git-status-refresh.test.ts b/src/renderer/src/components/right-sidebar/git-status-refresh.test.ts index dd03ae54f87..bfe42b97513 100644 --- a/src/renderer/src/components/right-sidebar/git-status-refresh.test.ts +++ b/src/renderer/src/components/right-sidebar/git-status-refresh.test.ts @@ -63,7 +63,8 @@ describe('refreshGitStatusForWorktree', () => { expect(gitStatus).toHaveBeenCalledWith({ worktreePath: '/repo', - connectionId: 'ssh-1' + connectionId: 'ssh-1', + admissionTier: 'status' }) expect(deps.setGitStatus).toHaveBeenCalledWith('wt-1', status) expect(deps.updateWorktreeGitIdentity).toHaveBeenCalledWith('wt-1', { @@ -150,7 +151,8 @@ describe('refreshGitStatusForWorktree', () => { expect(gitStatus).toHaveBeenCalledWith({ worktreePath: '/repo', - connectionId: undefined + connectionId: undefined, + admissionTier: 'status' }) expect(deps.setGitStatus).toHaveBeenCalledWith('wt-3', status) }) @@ -178,11 +180,13 @@ describe('refreshGitStatusForWorktree', () => { expect(gitStatus).toHaveBeenNthCalledWith(1, { worktreePath: '/repo', - connectionId: undefined + connectionId: undefined, + admissionTier: 'status' }) expect(gitStatus).toHaveBeenNthCalledWith(2, { worktreePath: '/repo', connectionId: undefined, + admissionTier: 'interactive', bypassEffectiveUpstreamNegativeCache: true }) }) diff --git a/src/renderer/src/components/right-sidebar/git-status-refresh.ts b/src/renderer/src/components/right-sidebar/git-status-refresh.ts index ec654b2c175..ade0f1d7633 100644 --- a/src/renderer/src/components/right-sidebar/git-status-refresh.ts +++ b/src/renderer/src/components/right-sidebar/git-status-refresh.ts @@ -112,6 +112,7 @@ export async function refreshGitStatusForWorktree({ pushTarget?: GitPushTarget deps: GitStatusRefreshDeps request?: { + admissionTier?: 'interactive' | 'status' | 'background' reuseLineStats?: boolean signal?: AbortSignal shouldApply?: () => boolean @@ -131,6 +132,7 @@ export async function refreshGitStatusForWorktree({ connectionId }, { + admissionTier: request?.admissionTier ?? 'status', ...(request?.reuseLineStats === true ? { reuseLineStats: true } : {}), ...(request?.signal ? { signal: request.signal } : {}), ...(branchLineTotalMergeBase ? { branchLineTotalMergeBase } : {}) @@ -256,6 +258,7 @@ export async function refreshGitStatusForWorktreeStrict({ connectionId }, { + admissionTier: 'interactive', // Why: strict refreshes are user-triggered reconciliation and must not reuse // automatic polling's no-upstream backoff window. bypassEffectiveUpstreamNegativeCache: true, diff --git a/src/renderer/src/components/right-sidebar/source-control/review/use-hosted-review-created.ts b/src/renderer/src/components/right-sidebar/source-control/review/use-hosted-review-created.ts index 20edb394d81..017b18dff55 100644 --- a/src/renderer/src/components/right-sidebar/source-control/review/use-hosted-review-created.ts +++ b/src/renderer/src/components/right-sidebar/source-control/review/use-hosted-review-created.ts @@ -109,7 +109,8 @@ export function useSourceControlHostedReviewCreated({ force: true, repoId, worktreeId: worktreeId ?? undefined, - linkedPRNumber: result.number + linkedPRNumber: result.number, + reason: 'post-push' }) ]) } catch { diff --git a/src/renderer/src/components/right-sidebar/source-control/sync/use-branch-compare.ts b/src/renderer/src/components/right-sidebar/source-control/sync/use-branch-compare.ts index 74601a3c0d5..3979ddf8e35 100644 --- a/src/renderer/src/components/right-sidebar/source-control/sync/use-branch-compare.ts +++ b/src/renderer/src/components/right-sidebar/source-control/sync/use-branch-compare.ts @@ -11,9 +11,14 @@ import { type BranchCompareRemoteStatusSnapshot, type BranchCompareStatusHeadSnapshot } from './compare-summary' +import { slowTaskRequiredIdleMs } from '../../coalesced-poll-runner' -// Why: 30s poll — 5s churned git subprocesses in large repos; explicit commit/remote/manual/base-ref refreshes still run immediately. +// Why: 30s poll — slow runs idle for their own duration; explicit commit/remote/manual/base-ref refreshes still run immediately. export const BRANCH_REFRESH_INTERVAL_MS = 30_000 +const BRANCH_REFRESH_IDLE_MULTIPLIER = 1 +const BRANCH_REFRESH_MAX_INTERVAL_MS = 5 * 60_000 + +type BranchCompareRefreshKind = 'immediate' | 'interval' export function useSourceControlBranchCompare({ activeRepoSettings, @@ -43,99 +48,174 @@ export function useSourceControlBranchCompare({ const setGitBranchCompareResult = useAppStore((s) => s.setGitBranchCompareResult) const clearGitBranchCompare = useAppStore((s) => s.clearGitBranchCompare) const branchCompareInFlightRef = useRef(false) - const branchCompareRerunRef = useRef(false) + const branchCompareRerunRef = useRef(null) const branchCompareRunPromiseRef = useRef | null>(null) const refreshBranchCompareRef = useRef<() => Promise>(async () => {}) + const startBranchCompareRef = useRef<(kind: BranchCompareRefreshKind) => Promise>( + async () => {} + ) + const branchComparePollTimerRef = useRef | null>(null) + const branchComparePollEnabledRef = useRef(false) + const branchCompareLastRunEndedAtRef = useRef(-Infinity) + const branchCompareLastRunDurationRef = useRef(0) const branchCompareStatusHeadRef = useRef(null) const branchCompareRemoteStatusRef = useRef(null) - const runBranchCompare = useCallback(async () => { - if (!activeWorktreeId || !worktreePath || !compareBaseRef || isFolder) { + const runBranchCompare = useCallback( + async (kind: BranchCompareRefreshKind) => { + if (!activeWorktreeId || !worktreePath || !compareBaseRef || isFolder) { + return + } + const requestKey = `${activeWorktreeId}:${compareBaseRef}:${Date.now()}` + const existingSummary = + useAppStore.getState().gitBranchCompareSummaryByWorktree[activeWorktreeId] + // Why: only reset to 'loading' on the first request or a base-ref change; resetting on every poll caused a visible loading→error→loading flicker. + const baseRefChanged = existingSummary && existingSummary.baseRef !== compareBaseRef + const shouldResetToLoading = !existingSummary || baseRefChanged + if (shouldResetToLoading) { + beginGitBranchCompareRequest(activeWorktreeId, requestKey, compareBaseRef) + } else { + beginGitBranchCompareRequest(activeWorktreeId, requestKey, compareBaseRef, { + preserveExistingSummary: true + }) + } + try { + const connectionId = getConnectionId(activeWorktreeId) ?? undefined + const result = await getRuntimeGitBranchCompare( + { + // Why: route the branch compare by the repo OWNER host, not the focused runtime. + settings: activeRepoSettings, + worktreeId: activeWorktreeId, + worktreePath, + connectionId + }, + compareBaseRef, + kind === 'interval' ? 'background' : 'interactive' + ) + setGitBranchCompareResult(activeWorktreeId, requestKey, result) + } catch (error) { + setGitBranchCompareResult(activeWorktreeId, requestKey, { + summary: { + baseRef: compareBaseRef, + baseOid: null, + compareRef: branchName, + headOid: null, + mergeBase: null, + changedFiles: 0, + status: 'error', + errorMessage: error instanceof Error ? error.message : 'Branch compare failed' + }, + entries: [] + }) + } + }, + [ + activeRepoSettings, + activeWorktreeId, + beginGitBranchCompareRequest, + branchName, + compareBaseRef, + isFolder, + setGitBranchCompareResult, + worktreePath + ] + ) + + const clearBranchComparePollTimer = useCallback((): void => { + if (branchComparePollTimerRef.current !== null) { + clearTimeout(branchComparePollTimerRef.current) + branchComparePollTimerRef.current = null + } + }, []) + + const scheduleBranchComparePoll = useCallback((): void => { + if (!branchComparePollEnabledRef.current || branchComparePollTimerRef.current !== null) { return } - const requestKey = `${activeWorktreeId}:${compareBaseRef}:${Date.now()}` - const existingSummary = - useAppStore.getState().gitBranchCompareSummaryByWorktree[activeWorktreeId] - // Why: only reset to 'loading' on the first request or a base-ref change; resetting on every poll caused a visible loading→error→loading flicker. - const baseRefChanged = existingSummary && existingSummary.baseRef !== compareBaseRef - const shouldResetToLoading = !existingSummary || baseRefChanged - if (shouldResetToLoading) { - beginGitBranchCompareRequest(activeWorktreeId, requestKey, compareBaseRef) - } else { - beginGitBranchCompareRequest(activeWorktreeId, requestKey, compareBaseRef, { - preserveExistingSummary: true - }) + const now = Date.now() + const requiredIdleMs = slowTaskRequiredIdleMs( + branchCompareLastRunDurationRef.current, + BRANCH_REFRESH_IDLE_MULTIPLIER, + BRANCH_REFRESH_INTERVAL_MS, + BRANCH_REFRESH_MAX_INTERVAL_MS + ) + const allowedAt = branchCompareLastRunEndedAtRef.current + requiredIdleMs + if (now >= allowedAt) { + void startBranchCompareRef.current('interval') + return } - try { - const connectionId = getConnectionId(activeWorktreeId) ?? undefined - const result = await getRuntimeGitBranchCompare( - { - // Why: route the branch compare by the repo OWNER host, not the focused runtime. - settings: activeRepoSettings, - worktreeId: activeWorktreeId, - worktreePath, - connectionId - }, - compareBaseRef - ) - setGitBranchCompareResult(activeWorktreeId, requestKey, result) - } catch (error) { - setGitBranchCompareResult(activeWorktreeId, requestKey, { - summary: { - baseRef: compareBaseRef, - baseOid: null, - compareRef: branchName, - headOid: null, - mergeBase: null, - changedFiles: 0, - status: 'error', - errorMessage: error instanceof Error ? error.message : 'Branch compare failed' - }, - entries: [] - }) - } - }, [ - activeRepoSettings, - activeWorktreeId, - beginGitBranchCompareRequest, - branchName, - compareBaseRef, - isFolder, - setGitBranchCompareResult, - worktreePath - ]) + branchComparePollTimerRef.current = setTimeout(() => { + branchComparePollTimerRef.current = null + if (branchComparePollEnabledRef.current) { + void startBranchCompareRef.current('interval') + } + }, allowedAt - now) + }, []) - const refreshBranchCompare = useCallback(async () => { - if (branchCompareInFlightRef.current) { - branchCompareRerunRef.current = true - return branchCompareRunPromiseRef.current ?? undefined - } - branchCompareInFlightRef.current = true - const runPromise = (async (): Promise => { - // Why: keep one branch-compare chain in flight and collapse skipped ticks into one trailing refresh instead of stacking git subprocesses. - try { - await runBranchCompare() - } finally { - branchCompareInFlightRef.current = false - if (branchCompareRerunRef.current) { - branchCompareRerunRef.current = false - await refreshBranchCompareRef.current() + const startBranchCompare = useCallback( + async (kind: BranchCompareRefreshKind) => { + if (kind === 'immediate') { + clearBranchComparePollTimer() + } + if (branchCompareInFlightRef.current) { + if (kind === 'immediate' || branchCompareRerunRef.current === null) { + branchCompareRerunRef.current = kind + } + return branchCompareRunPromiseRef.current ?? undefined + } + if (kind === 'interval') { + const requiredIdleMs = slowTaskRequiredIdleMs( + branchCompareLastRunDurationRef.current, + BRANCH_REFRESH_IDLE_MULTIPLIER, + BRANCH_REFRESH_INTERVAL_MS, + BRANCH_REFRESH_MAX_INTERVAL_MS + ) + if (Date.now() < branchCompareLastRunEndedAtRef.current + requiredIdleMs) { + scheduleBranchComparePoll() + return } } - })() - branchCompareRunPromiseRef.current = runPromise - try { - await runPromise - } finally { - if (branchCompareRunPromiseRef.current === runPromise) { - branchCompareRunPromiseRef.current = null + clearBranchComparePollTimer() + branchCompareInFlightRef.current = true + const startedAt = Date.now() + const runPromise = (async (): Promise => { + // Why: keep one branch-compare chain in flight and collapse skipped ticks into one trailing refresh instead of stacking git subprocesses. + try { + await runBranchCompare(kind) + } finally { + const endedAt = Date.now() + branchCompareLastRunEndedAtRef.current = endedAt + branchCompareLastRunDurationRef.current = endedAt - startedAt + branchCompareInFlightRef.current = false + const rerunKind = branchCompareRerunRef.current + branchCompareRerunRef.current = null + if (rerunKind === 'immediate') { + await refreshBranchCompareRef.current() + } else if (rerunKind === 'interval') { + scheduleBranchComparePoll() + } + } + })() + branchCompareRunPromiseRef.current = runPromise + try { + await runPromise + } finally { + if (branchCompareRunPromiseRef.current === runPromise) { + branchCompareRunPromiseRef.current = null + } } - } - }, [runBranchCompare]) + }, + [clearBranchComparePollTimer, runBranchCompare, scheduleBranchComparePoll] + ) + const refreshBranchCompare = useCallback( + () => startBranchCompare('immediate'), + [startBranchCompare] + ) // Why: publish in an effect, not the render body — a discarded render must not install its callback. Declared first so the effects below see the fresh one. useEffect(() => { refreshBranchCompareRef.current = refreshBranchCompare - }, [refreshBranchCompare]) + startBranchCompareRef.current = startBranchCompare + }, [refreshBranchCompare, startBranchCompare]) useEffect(() => { if (!activeWorktreeId || !worktreePath || !isBranchVisible || !compareBaseRef || isFolder) { @@ -197,11 +277,25 @@ export function useSourceControlBranchCompare({ return } // Why: HEAD changes refresh branch compare immediately; keep a visible-window fallback for base/remote updates that don't move HEAD. - return installWindowVisibilityInterval({ - run: () => void refreshBranchCompareRef.current(), + branchComparePollEnabledRef.current = true + const stopInterval = installWindowVisibilityInterval({ + run: () => void startBranchCompareRef.current('interval'), + jitterOnVisible: true, intervalMs: BRANCH_REFRESH_INTERVAL_MS }) - }, [activeWorktreeId, compareBaseRef, isBranchVisible, isFolder, worktreePath]) + return () => { + branchComparePollEnabledRef.current = false + clearBranchComparePollTimer() + stopInterval() + } + }, [ + activeWorktreeId, + clearBranchComparePollTimer, + compareBaseRef, + isBranchVisible, + isFolder, + worktreePath + ]) useEffect(() => { // Why: when compare-base resolves to no base, drop the stale summary (gate on loaded upstream status to avoid flicker). diff --git a/src/renderer/src/components/right-sidebar/source-control/sync/use-status-refresh.ts b/src/renderer/src/components/right-sidebar/source-control/sync/use-status-refresh.ts index 4686b01c750..46db77e99ab 100644 --- a/src/renderer/src/components/right-sidebar/source-control/sync/use-status-refresh.ts +++ b/src/renderer/src/components/right-sidebar/source-control/sync/use-status-refresh.ts @@ -65,7 +65,7 @@ export function useSourceControlStatusRefresh({ setUpstreamStatus, fetchUpstreamStatus }, - ...(signal ? { request: { signal } } : {}) + request: { admissionTier: 'interactive', ...(signal ? { signal } : {}) } }) }, [ diff --git a/src/renderer/src/components/right-sidebar/use-source-control-branch-compare.test.tsx b/src/renderer/src/components/right-sidebar/use-source-control-branch-compare.test.tsx index 3a44177e439..ea32c80039b 100644 --- a/src/renderer/src/components/right-sidebar/use-source-control-branch-compare.test.tsx +++ b/src/renderer/src/components/right-sidebar/use-source-control-branch-compare.test.tsx @@ -231,13 +231,18 @@ describe('useSourceControlBranchCompare scheduler', () => { expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledTimes(2) }) - it('collapses a poll tick that fires while a refresh is in flight', async () => { + it('coalesces M interval ticks into one trailing run after the slowTaskBackoff gap', async () => { vi.useFakeTimers() const first = deferred() mocks.getRuntimeGitBranchCompare.mockReturnValueOnce(first.promise) // Visible mounts run once immediately through the visibility interval. await mount({ isBranchVisible: true }) expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledTimes(1) + expect(mocks.getRuntimeGitBranchCompare).toHaveBeenLastCalledWith( + expect.objectContaining({ worktreeId: 'A' }), + 'origin/main', + 'background' + ) await act(async () => { vi.advanceTimersByTime(BRANCH_REFRESH_INTERVAL_MS * 3) @@ -250,8 +255,22 @@ describe('useSourceControlBranchCompare scheduler', () => { await Promise.resolve() await Promise.resolve() }) - // Three skipped ticks collapse into exactly one trailing run. + // Three skipped ticks collapse into one pending run, but a 90s task must + // idle for its own duration before the trailing run. + expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledTimes(1) + await act(async () => { + await vi.advanceTimersByTimeAsync(89_999) + }) + expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledTimes(1) + await act(async () => { + await vi.advanceTimersByTimeAsync(1) + }) expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledTimes(2) + expect(mocks.getRuntimeGitBranchCompare).toHaveBeenLastCalledWith( + expect.objectContaining({ worktreeId: 'A' }), + 'origin/main', + 'background' + ) }) it('preserves the existing summary on a poll refresh but resets to loading on a base-ref change', async () => { @@ -306,7 +325,8 @@ describe('useSourceControlBranchCompare scheduler', () => { }) expect(mocks.getRuntimeGitBranchCompare).toHaveBeenCalledWith( expect.objectContaining({ worktreeId: 'A' }), - 'origin/dev' + 'origin/dev', + 'interactive' ) }) diff --git a/src/renderer/src/components/right-sidebar/useGitStatusPolling.test.ts b/src/renderer/src/components/right-sidebar/useGitStatusPolling.test.ts index b1c6d3586d1..a6245c0f1f9 100644 --- a/src/renderer/src/components/right-sidebar/useGitStatusPolling.test.ts +++ b/src/renderer/src/components/right-sidebar/useGitStatusPolling.test.ts @@ -4,6 +4,11 @@ import type { FsChangedPayload } from '../../../../shared/filesystem-entry-types import type { GitStatusResult } from '../../../../shared/git-status-types' import type { GitPushTarget } from '../../../../shared/worktree/types' import { DEFAULT_GIT_STATUS_LIMIT } from '../../../../shared/git-status-limit' +import { slowTaskRequiredIdleMs } from './coalesced-poll-runner' +import { + admissionTierForGitStatusRefreshReason, + SLOW_GIT_POLL_BACKOFF +} from './useGitStatusPolling' const worktree = { id: 'repo-1::/repo', repoId: 'repo-1', path: '/repo' } const repo = { id: 'repo-1', path: '/repo', kind: 'git', connectionId: null as string | null } @@ -151,6 +156,22 @@ async function usePollingOnce( } describe('useGitStatusPolling', () => { + it('paces the safety scheduler and stale-conflict fan-out by one run duration', () => { + expect( + slowTaskRequiredIdleMs( + 6_000, + SLOW_GIT_POLL_BACKOFF.idleMultiplier, + 3_000, + SLOW_GIT_POLL_BACKOFF.maxIntervalMs + ) + ).toBe(6_000) + }) + + it('keeps activity admission in status and safety admission in background', () => { + expect(admissionTierForGitStatusRefreshReason('activity')).toBe('status') + expect(admissionTierForGitStatusRefreshReason('safety')).toBe('background') + }) + beforeEach(() => { vi.restoreAllMocks() vi.unstubAllGlobals() @@ -158,7 +179,7 @@ describe('useGitStatusPolling', () => { }) it('uses upstream data from git status instead of spawning a separate upstream refresh', async () => { - const { state } = await usePollingOnce({ + const { state, gitStatus } = await usePollingOnce({ entries: [], conflictOperation: 'unknown', head: 'abc123', @@ -178,6 +199,7 @@ describe('useGitStatusPolling', () => { behind: 0 }) expect(state.fetchUpstreamStatus).not.toHaveBeenCalled() + expect(gitStatus).toHaveBeenCalledWith(expect.objectContaining({ admissionTier: 'status' })) }) it('falls back to the upstream IPC for legacy status payloads', async () => { @@ -258,6 +280,7 @@ describe('useGitStatusPolling', () => { ) expect(gitStatus).toHaveBeenCalledTimes(1) + expect(gitStatus).toHaveBeenCalledWith(expect.objectContaining({ admissionTier: 'status' })) expect(globalThis.setInterval).not.toHaveBeenCalled() }) diff --git a/src/renderer/src/components/right-sidebar/useGitStatusPolling.ts b/src/renderer/src/components/right-sidebar/useGitStatusPolling.ts index 14212586823..ca0bef6be7e 100644 --- a/src/renderer/src/components/right-sidebar/useGitStatusPolling.ts +++ b/src/renderer/src/components/right-sidebar/useGitStatusPolling.ts @@ -30,12 +30,18 @@ const STATUS_ACTIVITY_DEBOUNCE_MS = 125 const STATUS_ACTIVITY_MIN_GAP_MS = 3000 // Why: status scans and remote conflict probes can take longer than their // timers; duration-aware spacing prevents a slow task from running nonstop. -const SLOW_GIT_POLL_BACKOFF = { - idleMultiplier: 5, +export const SLOW_GIT_POLL_BACKOFF = { + idleMultiplier: 1, changeSignalMultiplier: 1, maxIntervalMs: 5 * 60_000 } +export function admissionTierForGitStatusRefreshReason( + reason: GitStatusRefreshReason +): 'status' | 'background' { + return reason === 'safety' ? 'background' : 'status' +} + export function useGitStatusPolling(options: { enabled?: boolean } = {}): void { const enabled = options.enabled ?? true const activeWorktreeId = useAppStore((s) => s.activeWorktreeId) @@ -143,6 +149,7 @@ export function useGitStatusPolling(options: { enabled?: boolean } = {}): void { fetchUpstreamStatus }, request: { + admissionTier: admissionTierForGitStatusRefreshReason(request.reason), ...(request.reason === 'safety' ? { reuseLineStats: true } : {}), signal: request.signal, shouldApply: request.shouldApply, diff --git a/src/renderer/src/components/sidebar/DeleteWorktreeDialog.host-context-boundary.test.ts b/src/renderer/src/components/sidebar/DeleteWorktreeDialog.host-context-boundary.test.ts index 27a5f100654..15f7cc04a98 100644 --- a/src/renderer/src/components/sidebar/DeleteWorktreeDialog.host-context-boundary.test.ts +++ b/src/renderer/src/components/sidebar/DeleteWorktreeDialog.host-context-boundary.test.ts @@ -14,7 +14,7 @@ function sourceBetween(source: string, startPattern: string, endPattern: string) describe('DeleteWorktreeDialog host-context boundaries', () => { it('preloads git status from the selected worktree owner instead of the focused host', () => { - const effect = sourceBetween(SOURCE, 'const targets = deleteTargets.filter(', 'return () => {') + const effect = sourceBetween(SOURCE, 'deleteTargets.filter(', 'return () => {') expect(effect).toContain('getSettingsForWorktreeRuntimeOwner') expect(effect).toContain('worktreesByRepo: useAppStore.getState().worktreesByRepo') @@ -28,7 +28,7 @@ describe('DeleteWorktreeDialog host-context boundaries', () => { expect(SOURCE).not.toContain('useAppStore((state) => state.gitStatusByWorktree)') expect(effect).toContain('useAppStore.getState().gitStatusByWorktree') expect(effect).toContain('const controller = new AbortController()') - expect(effect).toContain('{ signal: controller.signal }') + expect(effect).toContain('signal: controller.signal') expect(effect).toContain('controller.abort()') }) }) diff --git a/src/renderer/src/components/sidebar/DeleteWorktreeDialog.tsx b/src/renderer/src/components/sidebar/DeleteWorktreeDialog.tsx index 5dc53aa064a..f6656118f16 100644 --- a/src/renderer/src/components/sidebar/DeleteWorktreeDialog.tsx +++ b/src/renderer/src/components/sidebar/DeleteWorktreeDialog.tsx @@ -173,6 +173,7 @@ const DeleteWorktreeDialog = React.memo(function DeleteWorktreeDialog() { const gitStatusByWorktreeIdentity = useDeleteWorktreeStatusHydration({ isOpen, deleteTargets, + visibleTargets: worktrees, repoMap }) const dirtyChangeCountsByWorktreeId = useMemo(() => { diff --git a/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.test.ts b/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.test.ts new file mode 100644 index 00000000000..b7e14dcaab9 --- /dev/null +++ b/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from 'vitest' +import type { Worktree } from '../../../../shared/worktree/types' +import { orderDeleteWorktreeStatusHydrationTargets } from './delete-worktree-dirty-change-counts' + +function worktree(id: string, hostId?: Worktree['hostId']): Worktree { + return { + id, + repoId: 'repo', + path: `/${id}`, + displayName: id, + branch: 'refs/heads/main', + head: 'abc123', + isBare: false, + isMainWorktree: false, + comment: '', + linkedIssue: null, + linkedPR: null, + linkedLinearIssue: null, + isArchived: false, + isUnread: false, + isPinned: false, + sortOrder: 0, + lastActivityAt: 0, + ...(hostId ? { hostId } : {}) + } +} + +describe('delete-worktree status hydration ordering', () => { + it('orders the active target first, visible targets next, and descendants last', () => { + const targets = [ + worktree('descendant-a'), + worktree('visible-a'), + worktree('active', 'ssh:builder'), + worktree('visible-b'), + worktree('descendant-b') + ] + + expect( + orderDeleteWorktreeStatusHydrationTargets({ + targets, + visibleTargets: [targets[1], targets[3]], + activeWorktreeId: 'active', + activeExecutionHostId: 'ssh:builder' + }).map((target) => target.id) + ).toEqual(['active', 'visible-a', 'visible-b', 'descendant-a', 'descendant-b']) + }) +}) diff --git a/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.ts b/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.ts index 6bfd2da03d4..88546ae6128 100644 --- a/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.ts +++ b/src/renderer/src/components/sidebar/delete-worktree-dirty-change-counts.ts @@ -1,9 +1,33 @@ import type { Repo } from '../../../../shared/repo-types' import type { Worktree } from '../../../../shared/worktree/types' +import { getWorktreeHostIdentity } from '../../../../shared/worktree/host-qualified-identity' import type { WorktreeDeleteState } from '../../store/slices/worktree-helpers' import { isFolderWorkspaceDelete } from './delete-worktree-dialog-copy' + +export function orderDeleteWorktreeStatusHydrationTargets({ + targets, + visibleTargets, + activeWorktreeId, + activeExecutionHostId +}: { + targets: readonly Worktree[] + visibleTargets: readonly Worktree[] + activeWorktreeId: string | null + activeExecutionHostId: string | null +}): Worktree[] { + const visibleIdentities = new Set(visibleTargets.map(getWorktreeHostIdentity)) + return targets + .map((target, index) => { + const isActive = + target.id === activeWorktreeId && + (!activeExecutionHostId || (target.hostId ?? 'local') === activeExecutionHostId) + const rank = isActive ? 0 : visibleIdentities.has(getWorktreeHostIdentity(target)) ? 1 : 2 + return { target, index, rank } + }) + .sort((left, right) => left.rank - right.rank || left.index - right.index) + .map(({ target }) => target) +} import { getDeleteStateForWorktreeHost } from './worktree-delete-state-host-match' -import { getWorktreeHostIdentity } from '../../../../shared/worktree/host-qualified-identity' export function getDeleteWorktreeDirtyChangeCounts({ deleteTargets, diff --git a/src/renderer/src/components/sidebar/use-delete-worktree-status-hydration.ts b/src/renderer/src/components/sidebar/use-delete-worktree-status-hydration.ts index 487584c6774..475f0f0d1de 100644 --- a/src/renderer/src/components/sidebar/use-delete-worktree-status-hydration.ts +++ b/src/renderer/src/components/sidebar/use-delete-worktree-status-hydration.ts @@ -10,16 +10,19 @@ import type { GitStatusResult } from '../../../../shared/git-status-types' import { parseExecutionHostId } from '../../../../shared/execution-host' import { getWorktreeHostIdentity } from '../../../../shared/worktree/host-qualified-identity' import { isFolderWorkspaceDelete } from './delete-worktree-dialog-copy' +import { orderDeleteWorktreeStatusHydrationTargets } from './delete-worktree-dirty-change-counts' const EMPTY_STATUS_BY_IDENTITY = new Map() export function useDeleteWorktreeStatusHydration({ isOpen, deleteTargets, + visibleTargets, repoMap }: { isOpen: boolean deleteTargets: readonly Worktree[] + visibleTargets: readonly Worktree[] repoMap: ReadonlyMap }): ReadonlyMap { const repos = useAppStore((state) => state.repos) @@ -39,9 +42,15 @@ export function useDeleteWorktreeStatusHydration({ return } const gitStatusByWorktree = useAppStore.getState().gitStatusByWorktree - const targets = deleteTargets.filter( - (target) => !target.isMainWorktree && !isFolderWorkspaceDelete(repoMap, target) - ) + const currentState = useAppStore.getState() + const targets = orderDeleteWorktreeStatusHydrationTargets({ + targets: deleteTargets.filter( + (target) => !target.isMainWorktree && !isFolderWorkspaceDelete(repoMap, target) + ), + visibleTargets, + activeWorktreeId: currentState.activeWorktreeId, + activeExecutionHostId: currentState.activeWorkspaceExecutionHostId + }) const controller = new AbortController() for (const target of targets) { const identity = getWorktreeHostIdentity(target) @@ -72,7 +81,7 @@ export function useDeleteWorktreeStatusHydration({ ? (owner?.connectionId ?? undefined) : (getConnectionId(target.id) ?? undefined) }, - { signal: controller.signal } + { admissionTier: 'background', includeLineStats: false, signal: controller.signal } ) .then((status) => { if (!controller.signal.aborted && generationRef.current === generation) { @@ -86,7 +95,7 @@ export function useDeleteWorktreeStatusHydration({ return () => { controller.abort() } - }, [deleteTargets, generation, isOpen, repoMap, repos, settings]) + }, [deleteTargets, generation, isOpen, repoMap, repos, settings, visibleTargets]) return currentStatusByIdentity } diff --git a/src/renderer/src/components/sidebar/use-worktree-card-lifecycle-effects.ts b/src/renderer/src/components/sidebar/use-worktree-card-lifecycle-effects.ts index 77dfa0331c3..971c7bf0408 100644 --- a/src/renderer/src/components/sidebar/use-worktree-card-lifecycle-effects.ts +++ b/src/renderer/src/components/sidebar/use-worktree-card-lifecycle-effects.ts @@ -90,6 +90,7 @@ export function useWorktreeCardLifecycleEffects({ // Why: PRs created outside Orca (e.g. `gh pr create`) emit no renderer event; poll visible cards to discover them. return installWindowVisibilityInterval({ run: refreshHostedReview, + jitterOnVisible: true, intervalMs: HOSTED_REVIEW_CARD_REFRESH_INTERVAL_MS }) }, [ diff --git a/src/renderer/src/components/status-bar/WorkspaceSpaceManagerPanel.tsx b/src/renderer/src/components/status-bar/WorkspaceSpaceManagerPanel.tsx index 3d3ff980051..6f36caca369 100644 --- a/src/renderer/src/components/status-bar/WorkspaceSpaceManagerPanel.tsx +++ b/src/renderer/src/components/status-bar/WorkspaceSpaceManagerPanel.tsx @@ -96,7 +96,6 @@ import { countWorkspaceSpaceActiveAgents, getLargestWorkspaceSpaceItemSize, getLargestWorkspaceSpaceRowSize, - getWorkspaceSpaceGitStatusRefreshCandidates, isWorkspaceSpaceRowReadyToDelete, pruneWorkspaceSpaceSelectedIds, resolveWorkspaceSpaceInspectedWorktreeId, @@ -105,6 +104,7 @@ import { type WorkspaceSpaceSortDirection, type WorkspaceSpaceSortKey } from './workspace-space-presentation' +import { getWorkspaceSpaceGitStatusRefreshCandidates } from './workspace-space-git-status-order' import { translate } from '@/i18n/i18n' const TREEMAP_FILLS = [ @@ -1490,12 +1490,15 @@ export function WorkspaceSpaceManagerPanel(): React.JSX.Element { return ( owner - ? getRuntimeGitStatus({ - settings: ownerSettings, - worktreeId: worktree.worktreeId, - worktreePath: worktree.path, - connectionId: owner.connectionId ?? undefined - }) + ? getRuntimeGitStatus( + { + settings: ownerSettings, + worktreeId: worktree.worktreeId, + worktreePath: worktree.path, + connectionId: owner.connectionId ?? undefined + }, + { admissionTier: 'background', includeLineStats: false } + ) : Promise.reject(new Error('Workspace owner is no longer available')) ) .then((status) => { @@ -1590,7 +1593,12 @@ export function WorkspaceSpaceManagerPanel(): React.JSX.Element { }, [scanGeneration]) useEffect(() => { - const candidates = getWorkspaceSpaceGitStatusRefreshCandidates(sourceRows) + const visibleWorktreeIdentities = new Set(rows.map(getWorkspaceSpaceWorktreeIdentity)) + const candidates = getWorkspaceSpaceGitStatusRefreshCandidates(sourceRows, { + activeWorktreeId, + activeExecutionHostId: activeWorkspaceExecutionHostId, + visibleWorktreeIdentities + }) if (candidates.length === 0) { return } @@ -1613,7 +1621,13 @@ export function WorkspaceSpaceManagerPanel(): React.JSX.Element { return () => { cancelled = true } - }, [refreshWorkspaceGitStatus, sourceRows]) + }, [ + activeWorkspaceExecutionHostId, + activeWorktreeId, + refreshWorkspaceGitStatus, + rows, + sourceRows + ]) const inspectedWorktree = rows.find((row) => getWorkspaceSpaceWorktreeIdentity(row) === nextInspectedWorktreeId) ?? diff --git a/src/renderer/src/components/status-bar/workspace-space-git-status-order.ts b/src/renderer/src/components/status-bar/workspace-space-git-status-order.ts new file mode 100644 index 00000000000..9c7cf0eb771 --- /dev/null +++ b/src/renderer/src/components/status-bar/workspace-space-git-status-order.ts @@ -0,0 +1,30 @@ +import type { WorkspaceSpaceWorktree } from '../../../../shared/workspace-space-types' +import { getWorkspaceSpaceWorktreeIdentity } from './workspace-space-delete-selection' + +export function getWorkspaceSpaceGitStatusRefreshCandidates( + rows: readonly WorkspaceSpaceWorktree[], + options: { + activeWorktreeId?: string | null + activeExecutionHostId?: string | null + visibleWorktreeIdentities?: ReadonlySet + } = {} +): WorkspaceSpaceWorktree[] { + const candidates = rows.filter( + (worktree) => worktree.canDelete && worktree.status === 'ok' && !worktree.isMainWorktree + ) + const rank = (worktree: WorkspaceSpaceWorktree): number => { + const isActive = + worktree.worktreeId === options.activeWorktreeId && + (!options.activeExecutionHostId || worktree.executionHostId === options.activeExecutionHostId) + if (isActive) { + return 0 + } + return options.visibleWorktreeIdentities?.has(getWorkspaceSpaceWorktreeIdentity(worktree)) + ? 1 + : 2 + } + return candidates + .map((worktree, index) => ({ worktree, index, rank: rank(worktree) })) + .sort((left, right) => left.rank - right.rank || left.index - right.index) + .map(({ worktree }) => worktree) +} diff --git a/src/renderer/src/components/status-bar/workspace-space-presentation.test.ts b/src/renderer/src/components/status-bar/workspace-space-presentation.test.ts index dea91ac7563..67e263b7d8f 100644 --- a/src/renderer/src/components/status-bar/workspace-space-presentation.test.ts +++ b/src/renderer/src/components/status-bar/workspace-space-presentation.test.ts @@ -11,7 +11,6 @@ import { filterWorkspaceSpaceRows, getLargestWorkspaceSpaceItemSize, getLargestWorkspaceSpaceRowSize, - getWorkspaceSpaceGitStatusRefreshCandidates, isWorkspaceSpaceFilterQueryTooLarge, isWorkspaceSpaceRowReadyToDelete, pruneWorkspaceSpaceSelectedIds, @@ -19,6 +18,7 @@ import { resolveWorkspaceSpaceTreemapZoomWorktreeId, sortWorkspaceSpaceRows } from './workspace-space-presentation' +import { getWorkspaceSpaceGitStatusRefreshCandidates } from './workspace-space-git-status-order' import { getWorkspaceDecisionDetails, getWorkspaceSpaceDeleteState, @@ -571,6 +571,27 @@ describe('workspace space presentation helpers', () => { ).toEqual(rows.map((item) => item.worktreeId)) }) + it('orders git-status refreshes active first, then visible, then the rest', () => { + const rows = [ + row({ worktreeId: 'rest-a', executionHostId: 'local' }), + row({ worktreeId: 'visible-a', executionHostId: 'local' }), + row({ worktreeId: 'active', executionHostId: 'ssh:builder' }), + row({ worktreeId: 'visible-b', executionHostId: 'local' }), + row({ worktreeId: 'rest-b', executionHostId: 'local' }) + ] + const visibleWorktreeIdentities = new Set( + [rows[1], rows[3]].map(getWorkspaceSpaceWorktreeIdentity) + ) + + expect( + getWorkspaceSpaceGitStatusRefreshCandidates(rows, { + activeWorktreeId: 'active', + activeExecutionHostId: 'ssh:builder', + visibleWorktreeIdentities + }).map((item) => item.worktreeId) + ).toEqual(['active', 'visible-a', 'visible-b', 'rest-a', 'rest-b']) + }) + it('resolves inspected worktree ids from the current scan rows', () => { const rows = [ row({ worktreeId: 'errored', status: 'error' }), diff --git a/src/renderer/src/components/status-bar/workspace-space-presentation.ts b/src/renderer/src/components/status-bar/workspace-space-presentation.ts index eb76f5056a5..5edad9ec739 100644 --- a/src/renderer/src/components/status-bar/workspace-space-presentation.ts +++ b/src/renderer/src/components/status-bar/workspace-space-presentation.ts @@ -255,14 +255,6 @@ export function isWorkspaceSpaceRowReadyToDelete( ) } -export function getWorkspaceSpaceGitStatusRefreshCandidates( - rows: readonly WorkspaceSpaceWorktree[] -): WorkspaceSpaceWorktree[] { - return rows.filter( - (worktree) => worktree.canDelete && worktree.status === 'ok' && !worktree.isMainWorktree - ) -} - export function resolveWorkspaceSpaceInspectedWorktreeId( rows: readonly WorkspaceSpaceWorktree[], currentIdentity: string | null diff --git a/src/renderer/src/components/terminal-pane/terminal-ime-xterm-transaction-events.test.ts b/src/renderer/src/components/terminal-pane/terminal-ime-xterm-transaction-events.test.ts index dff67620ba5..9d4a88d20f5 100644 --- a/src/renderer/src/components/terminal-pane/terminal-ime-xterm-transaction-events.test.ts +++ b/src/renderer/src/components/terminal-pane/terminal-ime-xterm-transaction-events.test.ts @@ -15,7 +15,11 @@ const { Terminal: CjsTerminal } = requireFromHere('@xterm/xterm') as { Terminal: typeof EsmTerminal } const xtermPackageRoot = dirname(requireFromHere.resolve('@xterm/xterm/package.json')) -const EXPECTED_XTERM_VERSION = '6.1.0-beta.287' +// Read from the installed package rather than hard-coding: the point of the assertions +// below is that the bundle, its sourcemap and the declared version agree, which a literal +// would only restate. A stale literal fails every bump for no reason. +const EXPECTED_XTERM_VERSION = (requireFromHere('@xterm/xterm/package.json') as { version: string }) + .version function nextEventLoop(): Promise { return new Promise((resolve) => window.setTimeout(resolve, 0)) @@ -176,6 +180,36 @@ describe.each([ terminal.dispose() }) + it('cancels an empty composition end so later input is not swallowed', async () => { + const terminal = new TerminalType() + const container = document.createElement('div') + document.body.appendChild(container) + terminal.open(container) + if (!terminal.element || !terminal.textarea) { + throw new Error('xterm input elements were not created') + } + const output: string[] = [] + terminal.onData((data) => output.push(data)) + const textarea = terminal.textarea + + textarea.dispatchEvent(new CompositionEvent('compositionstart', { bubbles: true })) + textarea.dispatchEvent(new CompositionEvent('compositionend', { data: '', bubbles: true })) + await nextEventLoop() + + expect(terminal.element.querySelector('.composition-view')?.classList.contains('active')).toBe( + false + ) + + textarea.value = 'a' + textarea.setSelectionRange(1, 1) + textarea.dispatchEvent( + new InputEvent('input', { data: 'a', inputType: 'insertText', bubbles: true }) + ) + + expect(output).toEqual(['a']) + terminal.dispose() + }) + it('rejects stale composition ends after settlement', async () => { const { terminal, textarea, events, output } = await openComposedTerminal(TerminalType) const forwarder = installTerminalImeNativeTextForwarder({ diff --git a/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.test.ts b/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.test.ts index f0bcc09525c..4f433398b73 100644 --- a/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.test.ts +++ b/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.test.ts @@ -9,9 +9,9 @@ import { const rendererState = { atlasPages: 1, - atlasClearModelGeneration: 0, + atlasPageLayoutVersion: 0, atlasPageVersions: [0], - glyphLastSeenClearModelGeneration: 0, + glyphLastSeenPageLayoutVersion: 0, glyphTextureVersions: [0], modelLineLengths: [1], vertexCount: 1, @@ -76,7 +76,7 @@ describe('measureDivergence', () => { }) describe('reachRenderInternals', () => { - it('reads the generation name emitted by the packaged WebGL bundle', () => { + it('reads the page layout version under the private name the WebGL bundle emits', () => { const terminal = { rows: 2, cols: 3, @@ -85,7 +85,7 @@ describe('reachRenderInternals', () => { _renderer: { value: { _canvas: {} as HTMLCanvasElement, - _charAtlas: { _clearModelGeneration: 7, pages: [] }, + _charAtlas: { _pageLayoutVersion: 7, pages: [] }, _themeService: { colors: { background: { rgba: 0 } } }, dimensions: { device: { cell: { width: 8, height: 16 } } } } @@ -94,6 +94,6 @@ describe('reachRenderInternals', () => { } } - expect(reachRenderInternals(terminal)?.rendererState.atlasClearModelGeneration).toBe(7) + expect(reachRenderInternals(terminal)?.rendererState.atlasPageLayoutVersion).toBe(7) }) }) diff --git a/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.ts b/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.ts index 5098246df9d..a381f56a4ca 100644 --- a/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.ts +++ b/src/renderer/src/components/terminal-pane/terminal-render-desync-frame.ts @@ -7,9 +7,9 @@ export type SentinelDivergence = { export type SentinelRendererState = { atlasPages: number - atlasClearModelGeneration: number | null + atlasPageLayoutVersion: number | null atlasPageVersions: number[] - glyphLastSeenClearModelGeneration: number | null + glyphLastSeenPageLayoutVersion: number | null glyphTextureVersions: number[] modelLineLengths: number[] vertexCount: number | null @@ -56,15 +56,15 @@ export function reachRenderInternals(terminal: unknown): SentinelRenderInternals value?: { _canvas?: HTMLCanvasElement _charAtlas?: { - clearModelGeneration?: number - _clearModelGeneration?: number + pageLayoutVersion?: number + _pageLayoutVersion?: number pages?: { version?: number }[] } _model?: { lineLengths?: number[] | Uint32Array } _glyphRenderer?: { value?: { _activeBuffer?: number - _lastSeenClearModelGeneration?: number + _lastSeenPageLayoutVersion?: number _atlasTextures?: { version?: number }[] _vertices?: { count?: number } } @@ -108,12 +108,10 @@ export function reachRenderInternals(terminal: unknown): SentinelRenderInternals ], rendererState: { atlasPages: renderer._charAtlas.pages?.length ?? -1, - atlasClearModelGeneration: - renderer._charAtlas.clearModelGeneration ?? - renderer._charAtlas._clearModelGeneration ?? - null, + atlasPageLayoutVersion: + renderer._charAtlas.pageLayoutVersion ?? renderer._charAtlas._pageLayoutVersion ?? null, atlasPageVersions: renderer._charAtlas.pages?.map((page) => page.version ?? -1) ?? [], - glyphLastSeenClearModelGeneration: glyphRenderer?._lastSeenClearModelGeneration ?? null, + glyphLastSeenPageLayoutVersion: glyphRenderer?._lastSeenPageLayoutVersion ?? null, glyphTextureVersions: glyphRenderer?._atlasTextures?.map((texture) => texture.version ?? -1) ?? [], modelLineLengths: Array.from(renderer._model?.lineLengths ?? []), diff --git a/src/renderer/src/components/terminal-search-decoration-leak.test.ts b/src/renderer/src/components/terminal-search-decoration-leak.test.ts index 54c241bd8e0..07c4ba998e5 100644 --- a/src/renderer/src/components/terminal-search-decoration-leak.test.ts +++ b/src/renderer/src/components/terminal-search-decoration-leak.test.ts @@ -9,7 +9,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' * closed, until the window was minimized and restored. * * Mechanism, in @xterm/xterm's SortedList (patched in - * config/patches/@xterm__xterm@6.1.0-beta.287.patch): + * config/patches/@xterm__xterm@*.patch, generated from the source patch under + * config/patches/xterm-src/): * * - DecorationService keys its SortedList on `decoration.marker.line`. * - `delete()` only records an index and defers the array compaction, while diff --git a/src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts b/src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts index 9320e0410b4..0c96dbb32a9 100644 --- a/src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts +++ b/src/renderer/src/lib/pane-manager/pane-manager-registry.test.ts @@ -3,12 +3,10 @@ import { collectRendererMemoryProfileCounts } from '../renderer-memory-profile' import { forEachLivePaneForDesyncSentinel, getLivePaneCensus, - presentAllTerminalPanesWithoutAtlasClear, getLivePaneMemoryProfileCounts, refitAndRefreshAllTerminalPanes, registerLivePaneManager, resetAndRefreshAllTerminalWebglAtlases, - resetAllTerminalWebglAtlases, unregisterLivePaneManager } from './pane-manager-registry' @@ -30,41 +28,15 @@ describe('pane manager registry', () => { } }) - it('resets atlases on every registered manager', () => { - const first = registerManager() - const second = registerManager() - - resetAllTerminalWebglAtlases() - - expect(first.resetWebglTextureAtlases).toHaveBeenCalledTimes(1) - expect(second.resetWebglTextureAtlases).toHaveBeenCalledTimes(1) - }) - it('stops resetting managers after they unregister', () => { const manager = registerManager() unregisterLivePaneManager(manager) - resetAllTerminalWebglAtlases() + resetAndRefreshAllTerminalWebglAtlases() expect(manager.resetWebglTextureAtlases).not.toHaveBeenCalled() }) - it('continues resetting later managers when one manager throws', () => { - const broken = { - resetWebglTextureAtlases: vi.fn<() => void>(() => { - throw new Error('pane disposed') - }) - } - registerLivePaneManager(broken) - registeredManagers.push(broken) - const healthy = registerManager() - - expect(() => resetAllTerminalWebglAtlases()).not.toThrow() - - expect(broken.resetWebglTextureAtlases).toHaveBeenCalledTimes(1) - expect(healthy.resetWebglTextureAtlases).toHaveBeenCalledTimes(1) - }) - it('refreshes managers after all atlas resets complete', () => { const order: string[] = [] const first = { @@ -175,29 +147,6 @@ describe('pane manager registry', () => { expect(healthy.refreshAllPanes).toHaveBeenCalledTimes(1) }) - it('presents visible managers without resetting their atlases', () => { - const visible = { - resetWebglTextureAtlases: vi.fn<() => void>(), - scheduleRevealPresent: vi.fn<() => void>(), - isVisibleForAtlasRecovery: () => true - } - const hidden = { - resetWebglTextureAtlases: vi.fn<() => void>(), - scheduleRevealPresent: vi.fn<() => void>(), - isVisibleForAtlasRecovery: () => false - } - registerLivePaneManager(visible) - registeredManagers.push(visible) - registerLivePaneManager(hidden) - registeredManagers.push(hidden) - - presentAllTerminalPanesWithoutAtlasClear() - - expect(visible.scheduleRevealPresent).toHaveBeenCalledOnce() - expect(visible.resetWebglTextureAtlases).not.toHaveBeenCalled() - expect(hidden.scheduleRevealPresent).not.toHaveBeenCalled() - }) - it('fits and refreshes every registered manager', () => { const first = { resetWebglTextureAtlases: vi.fn<() => void>(), diff --git a/src/renderer/src/lib/pane-manager/pane-manager-registry.ts b/src/renderer/src/lib/pane-manager/pane-manager-registry.ts index 34492cd508e..56f79c961bd 100644 --- a/src/renderer/src/lib/pane-manager/pane-manager-registry.ts +++ b/src/renderer/src/lib/pane-manager/pane-manager-registry.ts @@ -12,7 +12,6 @@ type RegisteredPaneManager = { getPanes?: (limit?: number) => { id: number; terminal: unknown }[] getPaneCount?: () => number isVisibleForAtlasRecovery?: () => boolean - scheduleRevealPresent?: () => void } const liveManagers = new Set() @@ -30,26 +29,6 @@ export function unregisterLivePaneManager(manager: RegisteredPaneManager): void liveManagers.delete(manager) } -/** - * Resets the WebGL glyph atlases of every live pane manager, not just one. - * - * Why: @xterm/addon-webgl keeps a module-global atlas cache, so terminals with - * identical font configs share one glyph texture atlas. Clearing it through a - * single manager invalidates the cached glyph coordinates of every other - * sharing terminal without rebuilding their render models, which paints them - * as garbled glyphs. Recovery resets must therefore rebuild all terminals. - */ -export function resetAllTerminalWebglAtlases(): void { - for (const manager of liveManagers) { - try { - manager.resetWebglTextureAtlases() - } catch { - // Why: stale WebGL recovery is best-effort during pane teardown; one - // disposed manager should not prevent sibling terminals from repainting. - } - } -} - export function resetAndRefreshAllTerminalWebglAtlases(reason?: string): void { // Why: the atlas wipe is the heavy recovery path; recording it lets a freeze // report show whether a post-wake repaint actually ran. Silent breadcrumb. @@ -93,19 +72,6 @@ export function resetAndRefreshAllTerminalWebglAtlases(reason?: string): void { } } -export function presentAllTerminalPanesWithoutAtlasClear(): void { - for (const manager of liveManagers) { - if (manager.isVisibleForAtlasRecovery?.() === false) { - continue - } - try { - manager.scheduleRevealPresent?.() - } catch { - // A disposing manager must not block sibling panes from presenting. - } - } -} - /** * Per-pane WebGL renderer state across all live managers, for the one-paste * freeze report. Lets a post-wake garble report show, per pane, whether it diff --git a/src/renderer/src/lib/pane-manager/pane-manager.ts b/src/renderer/src/lib/pane-manager/pane-manager.ts index bc05069bdfe..6e65b2163d9 100644 --- a/src/renderer/src/lib/pane-manager/pane-manager.ts +++ b/src/renderer/src/lib/pane-manager/pane-manager.ts @@ -120,7 +120,7 @@ export class PaneManager { } } // Why: atlas recovery must reach every live manager — see - // resetAllTerminalWebglAtlases for the shared-atlas rationale. + // resetAndRefreshAllTerminalWebglAtlases for the shared-atlas rationale. registerLivePaneManager(this) } diff --git a/src/renderer/src/lib/pane-manager/xterm-user-scrolling-contract.test.ts b/src/renderer/src/lib/pane-manager/xterm-user-scrolling-contract.test.ts index 9fbbdea8f73..2057e530729 100644 --- a/src/renderer/src/lib/pane-manager/xterm-user-scrolling-contract.test.ts +++ b/src/renderer/src/lib/pane-manager/xterm-user-scrolling-contract.test.ts @@ -1,6 +1,6 @@ /** * Contract test for xterm's native user-scrolling ownership (vendored - * 6.1.0-beta.287; @xterm/headless shares BufferService with @xterm/xterm). + * 6.1.0-beta.303; @xterm/headless shares BufferService with @xterm/xterm). * * Orca's live PTY write path performs NO scroll-intent enforcement — it * relies on xterm core keeping a scrolled-up viewport stable and following @@ -10,10 +10,16 @@ * * If an xterm upgrade breaks any assertion here, the live write path loses * its follow/pin semantics silently — fix the write path before bumping. + * + * Since 6.1.0-beta.302 (upstream #6081) xterm clears isUserScrolling on a normal-buffer + * CSI 3 J, so the erase itself releases a pinned reader to the bottom. Orca's pin still + * works because its parser handler observes the erase before xterm's own handler runs, + * capturing the reader's offset while the old viewport is still live. */ import { describe, expect, it, vi } from 'vitest' import { Terminal } from '@xterm/headless' -import packageJson from '../../../../../package.json' +import headlessPackageJson from '@xterm/headless/package.json' +import xtermPackageJson from '@xterm/xterm/package.json' import { clearTerminalScrollbackAndFollowOutput } from './terminal-scrollback-clear' import { installTerminalLiveScrollbackRestore } from './terminal-live-scrollback-restore' import { markTerminalFollowOutput, markTerminalPinnedViewport } from './terminal-scroll-intent' @@ -49,11 +55,14 @@ async function pinnedScrollbackTerminal(): Promise { return term } -describe('xterm native user-scrolling contract (vendored 6.1.0-beta.287)', () => { - it('pins headless and renderer xterm to the same version', () => { - expect(packageJson.dependencies['@xterm/headless']).toBe( - packageJson.devDependencies['@xterm/xterm'] - ) +describe('xterm native user-scrolling contract (vendored 6.1.0-beta.303)', () => { + it('builds headless and renderer xterm from the same upstream commit', () => { + // The shared code is BufferService/BufferLine, so what has to match is the source + // both were built from, not the version string. Upstream bumps each package only + // when its own output changes, so headless legitimately trails core by a beta or + // two while carrying identical code; publish.js stamps the commit on both. + expect(headlessPackageJson.commit).toBe(xtermPackageJson.commit) + expect(xtermPackageJson.commit).toMatch(/^[0-9a-f]{40}$/) }) it('keeps a scrolled-up viewport stable while output is written', async () => { @@ -288,7 +297,9 @@ describe('live scrollback-erase pin (CSI 3 J)', () => { const { term, settle, bottomOffset } = await pinnedTerminalWithRestore() await write(term, `\x1b[?2026h\x1b[2J\x1b[H\x1b[3J${'after\r\n'.repeat(50)}\x1b[?2026l`) - expect(term.buffer.active.viewportY).toBe(0) + // xterm releases isUserScrolling on CSI 3 J, so the redraw carries the reader to + // the bottom. Landing them back at their offset is this module's whole job. + expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY) settle() expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY - bottomOffset) @@ -348,7 +359,7 @@ describe('live scrollback-erase pin (CSI 3 J)', () => { // Each frame lands inside the quiet period, so the pin must not fire yet. for (let frame = 0; frame < 5; frame += 1) { advance(SETTLE_MS - 60) - expect(term.buffer.active.viewportY).toBe(0) + expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY) await write(term, 'after\r\n'.repeat(40)) } advance(SETTLE_MS) @@ -428,11 +439,11 @@ describe('live scrollback-erase pin (CSI 3 J)', () => { it('keeps the original pin when a second erase lands inside the settle window', async () => { const { term, settle, bottomOffset } = await pinnedTerminalWithRestore() - // The first redraw regrows past a screenful, so at the second erase the - // reader reads as detached at line 0. Re-measuring there would capture the - // whole rebuilt height as the offset and strand them at the top. + // The first erase already released the reader to the bottom, so re-measuring at + // the second one would read them as follow-output and drop the pin entirely. + // Only the pin armed by the first erase still knows where they were. await write(term, `\x1b[2J\x1b[H\x1b[3J${'first\r\n'.repeat(160)}`) - expect(term.buffer.active.viewportY).toBe(0) + expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY) expect(term.buffer.active.baseY).toBeGreaterThan(0) await write(term, `\x1b[2J\x1b[H\x1b[3J${'second\r\n'.repeat(160)}`) @@ -467,7 +478,7 @@ describe('live scrollback-erase pin (CSI 3 J)', () => { // reach MAX_PENDING_RESTORE_MS exactly. for (let cycle = 0; cycle < 10; cycle += 1) { await write(term, `\x1b[2J\x1b[H\x1b[3J${'redraw\r\n'.repeat(140)}`) - expect(term.buffer.active.viewportY).toBe(0) + expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY) advance(100) } @@ -658,8 +669,9 @@ describe('live scrollback-erase pin (CSI 3 J)', () => { await write(term, `\x1b[2J\x1b[H\x1b[3J${'after\r\n'.repeat(50)}`) settle() - // Without the pin the reader is stranded where the erase clamped them. - expect(term.buffer.active.viewportY).toBe(0) + // Without the pin the reader keeps xterm's own post-erase behaviour: the erase + // releases the scroll pin, so the redraw leaves them following output. + expect(term.buffer.active.viewportY).toBe(term.buffer.active.baseY) }) it('lands the pin on the real timer when no scheduler is injected', async () => { diff --git a/src/renderer/src/lib/window-visibility-interval.test.ts b/src/renderer/src/lib/window-visibility-interval.test.ts index cb870794cd8..5f097cd7eeb 100644 --- a/src/renderer/src/lib/window-visibility-interval.test.ts +++ b/src/renderer/src/lib/window-visibility-interval.test.ts @@ -127,4 +127,93 @@ describe('installWindowVisibilityInterval', () => { expect(setIntervalMock).toHaveBeenCalledTimes(1) cleanup() }) + + it('staggers visibilitychange runs across per-instance jitter delays', async () => { + vi.useFakeTimers() + let visibilityState: DocumentVisibilityState = 'hidden' + const listeners: (() => void)[] = [] + vi.stubGlobal('document', { + get visibilityState() { + return visibilityState + }, + addEventListener: vi.fn((_event: string, listener: () => void) => listeners.push(listener)), + removeEventListener: vi.fn() + }) + const runs = [vi.fn(), vi.fn(), vi.fn()] + const cleanups = runs.map((run, index) => + installWindowVisibilityInterval({ + run, + intervalMs: 10_000, + jitterOnVisible: true, + jitterFn: () => [0, 100, 400][index] ?? 0 + }) + ) + + visibilityState = 'visible' + listeners.forEach((listener) => listener()) + expect(runs.map((run) => run.mock.calls.length)).toEqual([0, 0, 0]) + + await vi.advanceTimersByTimeAsync(0) + expect(runs.map((run) => run.mock.calls.length)).toEqual([1, 0, 0]) + await vi.advanceTimersByTimeAsync(99) + expect(runs.map((run) => run.mock.calls.length)).toEqual([1, 0, 0]) + await vi.advanceTimersByTimeAsync(1) + expect(runs.map((run) => run.mock.calls.length)).toEqual([1, 1, 0]) + await vi.advanceTimersByTimeAsync(300) + expect(runs.map((run) => run.mock.calls.length)).toEqual([1, 1, 1]) + + cleanups.forEach((cleanup) => cleanup()) + vi.useRealTimers() + }) + + it('does not jitter the install-time first run', () => { + vi.useFakeTimers() + const run = vi.fn() + vi.stubGlobal('document', { + visibilityState: 'visible', + addEventListener: vi.fn(), + removeEventListener: vi.fn() + }) + + const cleanup = installWindowVisibilityInterval({ + run, + intervalMs: 3000, + jitterOnVisible: true, + jitterFn: () => 400 + }) + + expect(run).toHaveBeenCalledTimes(1) + cleanup() + vi.useRealTimers() + }) + + it('cancels a pending visibility jitter run on cleanup', async () => { + vi.useFakeTimers() + let visibilityState: DocumentVisibilityState = 'hidden' + let visibilityListener: (() => void) | undefined + const run = vi.fn() + vi.stubGlobal('document', { + get visibilityState() { + return visibilityState + }, + addEventListener: vi.fn((_event: string, listener: () => void) => { + visibilityListener = listener + }), + removeEventListener: vi.fn() + }) + + const cleanup = installWindowVisibilityInterval({ + run, + intervalMs: 3000, + jitterOnVisible: true, + jitterFn: () => 400 + }) + visibilityState = 'visible' + visibilityListener?.() + cleanup() + + await vi.advanceTimersByTimeAsync(400) + expect(run).not.toHaveBeenCalled() + vi.useRealTimers() + }) }) diff --git a/src/renderer/src/lib/window-visibility-interval.ts b/src/renderer/src/lib/window-visibility-interval.ts index aa1337fc095..35e4d294b60 100644 --- a/src/renderer/src/lib/window-visibility-interval.ts +++ b/src/renderer/src/lib/window-visibility-interval.ts @@ -1,4 +1,7 @@ export type WindowVisibilityIntervalTimer = ReturnType +export type WindowVisibilityJitterTimer = ReturnType + +const MAX_VISIBILITY_JITTER_MS = 400 export function isWindowVisible(): boolean { return ( @@ -17,6 +20,8 @@ export function installWindowVisibilityInterval(args: { intervalMs: number setIntervalFn?: (callback: () => void, intervalMs: number) => WindowVisibilityIntervalTimer clearIntervalFn?: (handle: WindowVisibilityIntervalTimer) => void + jitterOnVisible?: boolean + jitterFn?: () => number }): () => void { const setIntervalFn = args.setIntervalFn ?? @@ -25,19 +30,42 @@ export function installWindowVisibilityInterval(args: { const clearIntervalFn = args.clearIntervalFn ?? ((handle: WindowVisibilityIntervalTimer): void => clearInterval(handle)) let intervalId: WindowVisibilityIntervalTimer | null = null + let visibilityJitterId: WindowVisibilityJitterTimer | null = null + const visibilityJitterMs = args.jitterOnVisible + ? Math.max( + 0, + Math.min( + MAX_VISIBILITY_JITTER_MS, + Math.floor(args.jitterFn?.() ?? Math.random() * (MAX_VISIBILITY_JITTER_MS + 1)) + ) + ) + : 0 const stop = (): void => { - if (!intervalId) { - return + if (visibilityJitterId !== null) { + clearTimeout(visibilityJitterId) + visibilityJitterId = null + } + if (intervalId !== null) { + clearIntervalFn(intervalId) + intervalId = null } - clearIntervalFn(intervalId) - intervalId = null } - const start = (): void => { - if (intervalId || !isWindowVisible()) { + const start = (jitterVisibleRun: boolean): void => { + if (intervalId !== null || !isWindowVisible()) { return } - ;(args.runOnVisible ?? args.run)() + const visibleRun = args.runOnVisible ?? args.run + if (jitterVisibleRun) { + visibilityJitterId = setTimeout(() => { + visibilityJitterId = null + if (isWindowVisible()) { + visibleRun() + } + }, visibilityJitterMs) + } else { + visibleRun() + } // Why: many callers shell out or cross IPC. Keep their interval alive only // while Orca can present the refreshed data, but still refresh a visible // unfocused window so status UI does not go stale on a second display. @@ -45,13 +73,13 @@ export function installWindowVisibilityInterval(args: { } const reconcile = (): void => { if (isWindowVisible()) { - start() + start(args.jitterOnVisible === true) } else { stop() } } - start() + start(false) if (typeof document !== 'undefined' && typeof document.addEventListener === 'function') { document.addEventListener('visibilitychange', reconcile) } diff --git a/src/renderer/src/lib/workspace-browser-tab-open.test.ts b/src/renderer/src/lib/workspace-browser-tab-open.test.ts index 59ce6bac8d8..5ae73fa7c12 100644 --- a/src/renderer/src/lib/workspace-browser-tab-open.test.ts +++ b/src/renderer/src/lib/workspace-browser-tab-open.test.ts @@ -6,6 +6,7 @@ import { } from '../../../shared/execution-host' import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../shared/constants' import { BROWSER_SCREENCAST_RUNTIME_CAPABILITY } from '../../../shared/protocol-version' +import * as clientCreationActionPolicy from './client-creation-action-policy' import { canOpenWorkspaceBrowserTabOnRuntime, canOpenWorkspaceBrowserTabOnSsh, @@ -241,6 +242,65 @@ describe('openWorkspaceBrowserTab', () => { expect(createBrowserTab).not.toHaveBeenCalled() }) + it('keeps an asserted runtime link on its owner when policy selects the local client', async () => { + const createBrowserTab = vi.fn() + mocks.state = { + ...ownerState(toRuntimeExecutionHostId('hub-a')), + ...browserCapableRuntime('hub-a'), + createBrowserTab, + defaultBrowserSessionProfileId: 'client-profile', + defaultBrowserSessionProfileIdByHostId: {} + } + const policySpy = vi + .spyOn(clientCreationActionPolicy, 'getClientCreationActionPolicy') + .mockReturnValue({ + 'managed-browser': { state: 'enabled', provider: 'local-client' }, + 'mobile-emulator': { state: 'enabled', provider: 'local-client' } + }) + + try { + await openWorkspaceBrowserTab({ + workspaceId: WORKSPACE_ID, + url: 'https://example.com/pinned', + intent: { kind: 'url' }, + expectedRuntimeEnvironmentId: 'hub-a' + }) + + expect(mocks.createRemote).toHaveBeenCalledWith( + expect.objectContaining({ + environmentId: 'hub-a', + waitForRegistration: true, + worktreeId: WORKSPACE_ID + }) + ) + expect(createBrowserTab).not.toHaveBeenCalled() + } finally { + policySpy.mockRestore() + } + }) + + it('forwards an explicit server placement for owner-pinned remote panes', async () => { + mocks.state = { + ...ownerState(toRuntimeExecutionHostId('hub-a')), + ...browserCapableRuntime('hub-a'), + createBrowserTab: vi.fn(), + defaultBrowserSessionProfileId: 'client-profile', + defaultBrowserSessionProfileIdByHostId: {} + } + + await openWorkspaceBrowserTab({ + workspaceId: WORKSPACE_ID, + url: 'https://example.com/pinned', + intent: { kind: 'url' }, + expectedRuntimeEnvironmentId: 'hub-a', + placementPreference: 'server' + }) + + expect(mocks.createRemote).toHaveBeenCalledWith( + expect.objectContaining({ placementPreference: 'server' }) + ) + }) + it('fails closed when the workspace route swaps away from the pane runtime before opening', async () => { mocks.state = { ...ownerState(toRuntimeExecutionHostId('hub-a')), diff --git a/src/renderer/src/lib/workspace-browser-tab-open.ts b/src/renderer/src/lib/workspace-browser-tab-open.ts index d159d47aab3..18149a98bbc 100644 --- a/src/renderer/src/lib/workspace-browser-tab-open.ts +++ b/src/renderer/src/lib/workspace-browser-tab-open.ts @@ -8,6 +8,7 @@ import { type ExecutionHostId } from '../../../shared/execution-host' import { SEARCH_ENGINE_LABELS, type SearchEngine } from '../../../shared/browser-url' +import type { BrowserClientHostPlacementPreference } from '../../../shared/browser-client-host-placement' import { FLOATING_TERMINAL_WORKTREE_ID } from '../../../shared/constants' import { BROWSER_SCREENCAST_RUNTIME_CAPABILITY } from '../../../shared/protocol-version' import { @@ -31,6 +32,8 @@ export type OpenWorkspaceBrowserTabRequest = { selectWorktree?: boolean expectedRuntimeEnvironmentId?: string expectedSshConnectionId?: string + /** Override placement for links whose pane explicitly requires server ownership. */ + placementPreference?: BrowserClientHostPlacementPreference } function isExpectedRuntimeBrowserRoute( @@ -272,7 +275,9 @@ export async function openWorkspaceBrowserTab( `host ${route.executionHostId} does not own runtime ${environmentId}` ) } - if (availability.provider === 'local-client') { + // An asserted runtime owns links opened from remote panes; provider policy may describe the + // viewing client's generic browser surface rather than that pane's execution host. + if (expectedEnvironmentId === null && availability.provider === 'local-client') { const localHostId = host && host.kind !== 'runtime' ? host.id : LOCAL_EXECUTION_HOST_ID createClientBrowserTab(state, request, localHostId, presentation) return @@ -286,6 +291,9 @@ export async function openWorkspaceBrowserTab( targetGroupId: request.targetGroupId, // Owner-pinned links need the host tab published before client reconciliation. ...(expectedEnvironmentId !== null ? { waitForRegistration: true } : {}), + ...(request.placementPreference !== undefined + ? { placementPreference: request.placementPreference } + : {}), // Why: the tab is opened from this workspace's tab bar, so surface that // workspace — otherwise a background worktree looks like nothing happened. ...(request.focusOnCreate !== undefined ? { focusOnCreate: request.focusOnCreate } : {}), diff --git a/src/renderer/src/runtime/runtime-git-client.test.ts b/src/renderer/src/runtime/runtime-git-client.test.ts index 8754aee2b23..9b426035b60 100644 --- a/src/renderer/src/runtime/runtime-git-client.test.ts +++ b/src/renderer/src/runtime/runtime-git-client.test.ts @@ -9,6 +9,7 @@ import { fetchRuntimeGit, generateRuntimeCommitMessage, generateRuntimePullRequestFields, + getRuntimeGitBranchCompare, getRuntimeGitDiff, getRuntimeGitHistory, getRuntimeGitIgnoredPaths, @@ -29,6 +30,7 @@ const gitCancelStatus = vi.fn() const gitCheckIgnored = vi.fn() const gitSubmoduleStatus = vi.fn() const gitDiff = vi.fn() +const gitBranchCompare = vi.fn() const gitHistory = vi.fn() const gitBulkStage = vi.fn() const gitBulkDiscard = vi.fn() @@ -53,6 +55,7 @@ beforeEach(() => { gitCheckIgnored.mockReset() gitSubmoduleStatus.mockReset() gitDiff.mockReset() + gitBranchCompare.mockReset() gitHistory.mockReset() gitBulkStage.mockReset() gitBulkDiscard.mockReset() @@ -79,6 +82,7 @@ beforeEach(() => { checkIgnored: gitCheckIgnored, submoduleStatus: gitSubmoduleStatus, diff: gitDiff, + branchCompare: gitBranchCompare, history: gitHistory, bulkStage: gitBulkStage, bulkDiscard: gitBulkDiscard, @@ -99,6 +103,28 @@ beforeEach(() => { }) describe('runtime git client', () => { + it('preserves branch-compare admission through local IPC', async () => { + gitBranchCompare.mockResolvedValue({ summary: {}, entries: [] }) + + await getRuntimeGitBranchCompare( + { + settings: { activeRuntimeEnvironmentId: null }, + worktreeId: 'wt-1', + worktreePath: '/repo', + connectionId: 'ssh-1' + }, + 'origin/main', + 'background' + ) + + expect(gitBranchCompare).toHaveBeenCalledWith({ + worktreePath: '/repo', + baseRef: 'origin/main', + connectionId: 'ssh-1', + admissionTier: 'background' + }) + }) + it('uses local git IPC when no remote runtime is active', async () => { gitStatus.mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) @@ -182,6 +208,30 @@ describe('runtime git client', () => { }) }) + it('forwards a false line-stats request and accepts stats from an older local host', async () => { + const oldHostResult = { + entries: [{ path: 'src/a.ts', status: 'modified', area: 'unstaged', added: 3, removed: 2 }], + conflictOperation: 'unknown' + } + gitStatus.mockResolvedValue(oldHostResult) + + const result = await getRuntimeGitStatus( + { + settings: { activeRuntimeEnvironmentId: null }, + worktreeId: 'wt-1', + worktreePath: '/repo' + }, + { includeLineStats: false } + ) + + expect(gitStatus).toHaveBeenCalledWith({ + worktreePath: '/repo', + connectionId: undefined, + includeLineStats: false + }) + expect(result).toBe(oldHostResult) + }) + it('forwards upstream-negative-cache bypass to local git status only when enabled', async () => { gitStatus.mockResolvedValue({ entries: [], conflictOperation: 'unknown' }) @@ -427,6 +477,36 @@ describe('runtime git client', () => { }) }) + it('forwards a false line-stats request through the active runtime environment', async () => { + const oldHostResult = { + entries: [{ path: 'src/a.ts', status: 'modified', area: 'unstaged', added: 3, removed: 2 }], + conflictOperation: 'unknown' + } + runtimeEnvironmentCall.mockResolvedValue({ + id: 'rpc-1', + ok: true, + result: oldHostResult, + _meta: { runtimeId: 'remote-runtime' } + }) + + const result = await getRuntimeGitStatus( + { + settings: { activeRuntimeEnvironmentId: 'env-1' }, + worktreeId: 'wt-1', + worktreePath: '/repo' + }, + { includeLineStats: false } + ) + + expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ + selector: 'env-1', + method: 'git.status', + params: { worktree: 'id:wt-1', includeLineStats: false }, + timeoutMs: 15_000 + }) + expect(result).toEqual(oldHostResult) + }) + it('forwards upstream-negative-cache bypass through the active runtime environment', async () => { runtimeEnvironmentCall.mockResolvedValue({ id: 'rpc-1', diff --git a/src/renderer/src/runtime/runtime-git-diff-client.ts b/src/renderer/src/runtime/runtime-git-diff-client.ts index ec112e78065..ea44571ecde 100644 --- a/src/renderer/src/runtime/runtime-git-diff-client.ts +++ b/src/renderer/src/runtime/runtime-git-diff-client.ts @@ -31,20 +31,22 @@ export async function getRuntimeGitDiff( export async function getRuntimeGitBranchCompare( context: RuntimeGitContext, - baseRef: string + baseRef: string, + admissionTier: 'interactive' | 'background' = 'interactive' ): Promise { const target = getActiveRuntimeTarget(context.settings) if (target.kind === 'local' || !context.worktreeId) { return window.api.git.branchCompare({ worktreePath: resolveLocalWorktreePath(context), baseRef, - connectionId: context.connectionId + connectionId: context.connectionId, + admissionTier }) } return callRuntimeRpc( target, 'git.branchCompare', - { worktree: toRuntimeWorktreeSelector(context.worktreeId), baseRef }, + { worktree: toRuntimeWorktreeSelector(context.worktreeId), baseRef, admissionTier }, { timeoutMs: 15_000 } ) } diff --git a/src/renderer/src/runtime/runtime-git-status-client.ts b/src/renderer/src/runtime/runtime-git-status-client.ts index 78c8acb6034..048211bd137 100644 --- a/src/renderer/src/runtime/runtime-git-status-client.ts +++ b/src/renderer/src/runtime/runtime-git-status-client.ts @@ -11,7 +11,9 @@ import { toRuntimeWorktreeSelector } from './runtime-worktree-selector' export async function getRuntimeGitStatus( context: RuntimeGitContext, options?: { + admissionTier?: 'interactive' | 'status' | 'background' includeIgnored?: boolean + includeLineStats?: boolean bypassEffectiveUpstreamNegativeCache?: boolean reuseLineStats?: boolean branchLineTotalMergeBase?: string @@ -20,6 +22,9 @@ export async function getRuntimeGitStatus( ): Promise { const target = getActiveRuntimeTarget(context.settings) const includeIgnoredArgs = options?.includeIgnored ? { includeIgnored: true } : {} + const admissionTierArgs = options?.admissionTier ? { admissionTier: options.admissionTier } : {} + const includeLineStatsArgs = + options?.includeLineStats === false ? { includeLineStats: false } : {} const upstreamCacheBypassArgs = options?.bypassEffectiveUpstreamNegativeCache ? { bypassEffectiveUpstreamNegativeCache: true } : {} @@ -32,7 +37,9 @@ export async function getRuntimeGitStatus( { worktreePath: resolveLocalWorktreePath(context), connectionId: context.connectionId, + ...admissionTierArgs, ...includeIgnoredArgs, + ...includeLineStatsArgs, ...upstreamCacheBypassArgs, ...lineStatsReuseArgs, ...branchLineTotalArgs @@ -45,7 +52,9 @@ export async function getRuntimeGitStatus( 'git.status', { worktree: toRuntimeWorktreeSelector(context.worktreeId), + ...admissionTierArgs, ...includeIgnoredArgs, + ...includeLineStatsArgs, ...upstreamCacheBypassArgs, ...lineStatsReuseArgs, ...branchLineTotalArgs diff --git a/src/renderer/src/store/github/pull-request-execution.ts b/src/renderer/src/store/github/pull-request-execution.ts index 3233fc2f40b..72069802064 100644 --- a/src/renderer/src/store/github/pull-request-execution.ts +++ b/src/renderer/src/store/github/pull-request-execution.ts @@ -80,6 +80,7 @@ export function startPullRequestLookup(args: { branch, linkedPRNumber, currentHeadOid: requestHeadOid, + ...(options?.reason ? { reason: options.reason } : {}), ...(fallbackPRNumber !== null ? { fallbackPRNumber, acceptMergedFallbackPR: fallbackPRSource !== null } : {}) @@ -108,7 +109,10 @@ export function startPullRequestLookup(args: { cachedMergeStateStatus: cached?.data?.mergeStateStatus ?? null } const response = window.api.gh.refreshPRNow - ? await window.api.gh.refreshPRNow({ candidate }) + ? await window.api.gh.refreshPRNow({ + candidate, + reason: options?.reason ?? 'manual' + }) : await window.api.gh.prForBranch({ repoPath, repoId, @@ -248,7 +252,8 @@ export function startPullRequestLookup(args: { void get().fetchPRForBranch(repoPath, branch, { force: true, repoId, - worktreeId: options.worktreeId + worktreeId: options.worktreeId, + reason: options.reason }) } } diff --git a/src/renderer/src/store/github/refresh-routing-actions.ts b/src/renderer/src/store/github/refresh-routing-actions.ts index bca0e2020d2..a6854f0ce3c 100644 --- a/src/renderer/src/store/github/refresh-routing-actions.ts +++ b/src/renderer/src/store/github/refresh-routing-actions.ts @@ -33,7 +33,8 @@ export const createRefreshRoutingActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason }) return } @@ -47,7 +48,8 @@ export const createRefreshRoutingActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason }) }) }, @@ -68,7 +70,8 @@ export const createRefreshRoutingActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason: 'visible' }) continue } diff --git a/src/renderer/src/store/github/refresh-sweep-actions.ts b/src/renderer/src/store/github/refresh-sweep-actions.ts index ab28629539d..c2c973c0e92 100644 --- a/src/renderer/src/store/github/refresh-sweep-actions.ts +++ b/src/renderer/src/store/github/refresh-sweep-actions.ts @@ -133,7 +133,8 @@ export const createRefreshSweepActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason: 'swr' }) } else if (shouldEnqueueLocalPRRefresh(candidate)) { enqueueLocalGitHubPRRefresh({ candidate, reason: 'swr', priority: 10 }) @@ -207,7 +208,8 @@ export const createRefreshSweepActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason: 'post-push' }) } else if (shouldEnqueueLocalPRRefresh(candidate)) { enqueueLocalGitHubPRRefresh({ candidate, reason: 'post-push', priority: 100 }) diff --git a/src/renderer/src/store/github/slice-types.ts b/src/renderer/src/store/github/slice-types.ts index 0d1f41c5da6..e1dbd322e44 100644 --- a/src/renderer/src/store/github/slice-types.ts +++ b/src/renderer/src/store/github/slice-types.ts @@ -58,6 +58,7 @@ export type GitHubSlice = { linkedPRNumber?: number | null fallbackPRNumber?: number | null fallbackPRSource?: GitHubPRFallbackSource | null + reason?: GitHubPRRefreshReason } ) => Promise fetchIssue: ( diff --git a/src/renderer/src/store/github/stale-worktree-refresh-actions.ts b/src/renderer/src/store/github/stale-worktree-refresh-actions.ts index 1ead3a5d360..61361907f6c 100644 --- a/src/renderer/src/store/github/stale-worktree-refresh-actions.ts +++ b/src/renderer/src/store/github/stale-worktree-refresh-actions.ts @@ -56,7 +56,8 @@ export const createStaleWorktreeRefreshActions = ( worktreeId: candidate.worktreeId, linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, - fallbackPRSource: candidate.fallbackPRSource ?? null + fallbackPRSource: candidate.fallbackPRSource ?? null, + reason: 'active' }) } else if (shouldEnqueueLocalPRRefresh(candidate)) { enqueueLocalGitHubPRRefresh({ candidate, reason: 'active', priority: 80 }) diff --git a/src/renderer/src/store/slices/github-pr-branch-direct-refresh-scope.test.ts b/src/renderer/src/store/slices/github-pr-branch-direct-refresh-scope.test.ts index 8bbde6cec19..41388aeafa9 100644 --- a/src/renderer/src/store/slices/github-pr-branch-direct-refresh-scope.test.ts +++ b/src/renderer/src/store/slices/github-pr-branch-direct-refresh-scope.test.ts @@ -116,6 +116,7 @@ describe('createGitHubSlice.fetchPRForBranch', () => { ).resolves.toMatchObject({ number: 44 }) expect(mockApi.gh.prForBranch).not.toHaveBeenCalled() expect(mockApi.gh.refreshPRNow).toHaveBeenCalledWith({ + reason: 'manual', candidate: expect.objectContaining({ repoId: 'repo-1', repoPath, diff --git a/src/renderer/src/store/slices/github-pr-branch-fallback-results.test.ts b/src/renderer/src/store/slices/github-pr-branch-fallback-results.test.ts index ea32952a89e..d0c97a87222 100644 --- a/src/renderer/src/store/slices/github-pr-branch-fallback-results.test.ts +++ b/src/renderer/src/store/slices/github-pr-branch-fallback-results.test.ts @@ -409,6 +409,7 @@ describe('createGitHubSlice.fetchPRForBranch', () => { pr ) expect(mockApi.gh.refreshPRNow).toHaveBeenCalledWith({ + reason: 'manual', candidate: expect.objectContaining({ repoId, repoPath, diff --git a/src/renderer/src/store/slices/github-pr-refresh-owner-routing.test.ts b/src/renderer/src/store/slices/github-pr-refresh-owner-routing.test.ts index f78393f62c7..33b3c87437c 100644 --- a/src/renderer/src/store/slices/github-pr-refresh-owner-routing.test.ts +++ b/src/renderer/src/store/slices/github-pr-refresh-owner-routing.test.ts @@ -126,41 +126,53 @@ describe('GitHub PR refresh owner-host routing', () => { resetRuntimeMocks() }) - it('routes explicit PR refresh for a runtime-owned repo to its owner while Local desktop is active', async () => { - runtimeEnvironmentCall.mockResolvedValueOnce({ - id: 'rpc-1', - ok: true, - result: makePR({ number: 23 }), - _meta: { runtimeId: 'remote-runtime' } - }) - const store = createTestStore() - const repoPath = '/runtime/repo' - const branch = 'feature/runtime-owner' - seed(store, { - settings: { activeRuntimeEnvironmentId: null } as AppState['settings'], - repos: [ - makeRepo({ - id: 'repo-runtime', - path: repoPath, - executionHostId: 'runtime:env-1' - }) - ], - worktreesByRepo: { - 'repo-runtime': [makeWorktree('repo-runtime', branch, 'wt-runtime')] - } - }) + it.each([ + ['active', 80], + ['manual', 100] + ] as const)( + 'routes %s PR refresh to the runtime repo owner with its reason', + async (reason, priority) => { + runtimeEnvironmentCall.mockResolvedValueOnce({ + id: 'rpc-1', + ok: true, + result: makePR({ number: 23 }), + _meta: { runtimeId: 'remote-runtime' } + }) + const store = createTestStore() + const repoPath = '/runtime/repo' + const branch = 'feature/runtime-owner' + seed(store, { + settings: { activeRuntimeEnvironmentId: null } as AppState['settings'], + repos: [ + makeRepo({ + id: 'repo-runtime', + path: repoPath, + executionHostId: 'runtime:env-1' + }) + ], + worktreesByRepo: { + 'repo-runtime': [makeWorktree('repo-runtime', branch, 'wt-runtime')] + } + }) - store.getState().enqueueGitHubPRRefresh('wt-runtime', 'active', 80) + store.getState().enqueueGitHubPRRefresh('wt-runtime', reason, priority) - await vi.waitFor(() => expect(runtimeEnvironmentCall).toHaveBeenCalledTimes(1)) - expect(enqueuePRRefresh).not.toHaveBeenCalled() - expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ - selector: 'env-1', - method: 'github.prForBranch', - params: { repo: 'repo-runtime', branch, linkedPRNumber: null, currentHeadOid: 'head-oid' }, - timeoutMs: 30_000 - }) - }) + await vi.waitFor(() => expect(runtimeEnvironmentCall).toHaveBeenCalledTimes(1)) + expect(enqueuePRRefresh).not.toHaveBeenCalled() + expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ + selector: 'env-1', + method: 'github.prForBranch', + params: { + repo: 'repo-runtime', + branch, + linkedPRNumber: null, + currentHeadOid: 'head-oid', + reason + }, + timeoutMs: 30_000 + }) + } + ) it('keeps connected SSH PR refresh on the local coordinator even when a runtime is focused', () => { const store = createTestStore() @@ -230,7 +242,13 @@ describe('GitHub PR refresh owner-host routing', () => { expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ selector: 'env-1', method: 'github.prForBranch', - params: { repo: 'repo-runtime', branch, linkedPRNumber: null, currentHeadOid: 'head-oid' }, + params: { + repo: 'repo-runtime', + branch, + linkedPRNumber: null, + currentHeadOid: 'head-oid', + reason: 'post-push' + }, timeoutMs: 30_000 }) }) @@ -278,7 +296,8 @@ describe('GitHub PR refresh owner-host routing', () => { repo: 'repo-runtime', branch: 'feature/runtime', linkedPRNumber: null, - currentHeadOid: 'head-oid' + currentHeadOid: 'head-oid', + reason: 'visible' }, timeoutMs: 30_000 }) diff --git a/src/renderer/src/store/slices/github-refresh-sweep.test.ts b/src/renderer/src/store/slices/github-refresh-sweep.test.ts index d275f9850a2..35c3e37f3cf 100644 --- a/src/renderer/src/store/slices/github-refresh-sweep.test.ts +++ b/src/renderer/src/store/slices/github-refresh-sweep.test.ts @@ -587,7 +587,13 @@ describe('createGitHubSlice.refreshAllGitHub', () => { expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ selector: 'env-1', method: 'github.prForBranch', - params: { repo: 'repo-1', branch, linkedPRNumber: null, currentHeadOid: null }, + params: { + repo: 'repo-1', + branch, + linkedPRNumber: null, + currentHeadOid: null, + reason: 'swr' + }, timeoutMs: 30_000 }) }) @@ -717,7 +723,13 @@ describe('createGitHubSlice.refreshGitHubForWorktree', () => { expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ selector: 'env-1', method: 'github.prForBranch', - params: { repo: 'repo-1', branch, linkedPRNumber: null, currentHeadOid: null }, + params: { + repo: 'repo-1', + branch, + linkedPRNumber: null, + currentHeadOid: null, + reason: 'post-push' + }, timeoutMs: 30_000 }) }) diff --git a/src/renderer/src/store/slices/github-slice-test-harness.ts b/src/renderer/src/store/slices/github-slice-test-harness.ts index ef7aede802e..93fb6236a02 100644 --- a/src/renderer/src/store/slices/github-slice-test-harness.ts +++ b/src/renderer/src/store/slices/github-slice-test-harness.ts @@ -40,7 +40,8 @@ export const runtimeEnvironmentSubscribe: Mock< export const mockApi = { gh: { prForBranch: stubMock().mockResolvedValue(null), - refreshPRNow: stubMock<[{ candidate: GitHubPRRefreshCandidate }]>(), + refreshPRNow: + stubMock<[{ candidate: GitHubPRRefreshCandidate; reason?: GitHubPRRefreshReason }]>(), enqueuePRRefresh: stubMock< [{ candidate: GitHubPRRefreshCandidate; reason: GitHubPRRefreshReason; priority?: number }] diff --git a/src/renderer/src/store/slices/github-worktree-refresh-if-stale.test.ts b/src/renderer/src/store/slices/github-worktree-refresh-if-stale.test.ts index 430b83db0df..5603b063a5f 100644 --- a/src/renderer/src/store/slices/github-worktree-refresh-if-stale.test.ts +++ b/src/renderer/src/store/slices/github-worktree-refresh-if-stale.test.ts @@ -179,7 +179,10 @@ describe('createGitHubSlice.refreshGitHubForWorktreeIfStale', () => { await Promise.resolve() expect(mockApi.gh.enqueuePRRefresh).toHaveBeenCalledTimes(1) - expect(mockApi.gh.refreshPRNow).toHaveBeenCalledTimes(1) + expect(mockApi.gh.refreshPRNow).toHaveBeenCalledWith({ + candidate: expect.any(Object), + reason: 'active' + }) }) it('bounds rejected active PR refresh IPCs during worktree activation', async () => { @@ -530,7 +533,13 @@ describe('createGitHubSlice.refreshGitHubForWorktreeIfStale', () => { expect(runtimeEnvironmentCall).toHaveBeenCalledWith({ selector: 'env-1', method: 'github.prForBranch', - params: { repo: 'repo-1', branch, linkedPRNumber: 12, currentHeadOid: null }, + params: { + repo: 'repo-1', + branch, + linkedPRNumber: 12, + currentHeadOid: null, + reason: 'active' + }, timeoutMs: 30_000 }) expect(store.getState().hostedReviewCache[hostedReviewCacheKey]).toMatchObject({ @@ -619,6 +628,7 @@ describe('createGitHubSlice.refreshGitHubForWorktreeIfStale', () => { expect(runtimeEnvironmentCall).not.toHaveBeenCalled() expect(mockApi.gh.refreshPRNow).toHaveBeenCalledWith({ + reason: 'manual', candidate: expect.objectContaining({ cacheKey: `ssh:ssh-1::repo-ssh::${branch}`, connectionId: 'ssh-1', diff --git a/src/renderer/src/store/slices/hosted-review-cache-state.ts b/src/renderer/src/store/slices/hosted-review-cache-state.ts index 176a716561f..70b2b4d866b 100644 --- a/src/renderer/src/store/slices/hosted-review-cache-state.ts +++ b/src/renderer/src/store/slices/hosted-review-cache-state.ts @@ -19,6 +19,7 @@ export type HostedReviewCache = Record { expect(store.getState().hostedReviewCache[cacheKey]?.data).toEqual(updatedReview) }) + it('coalesces M card poll ticks into one trailing run after the slowTaskBackoff gap', async () => { + vi.useFakeTimers() + vi.setSystemTime(0) + let resolveRefresh: (value: HostedReviewInfo) => void = () => {} + const slowRefresh = new Promise((resolve) => { + resolveRefresh = resolve + }) + mockApi.hostedReview.forBranch + .mockResolvedValueOnce(review) + .mockReturnValueOnce(slowRefresh) + .mockResolvedValue(review) + const store = makeStore() + const options = { linkedGitHubPR: 42, staleWhileRevalidate: true } + + await store + .getState() + .fetchHostedReviewForBranch('/repo', 'feature/slow-poll', { linkedGitHubPR: 42 }) + vi.setSystemTime(60_001) + await store.getState().fetchHostedReviewForBranch('/repo', 'feature/slow-poll', options) + for (let tick = 0; tick < 5; tick += 1) { + await store.getState().fetchHostedReviewForBranch('/repo', 'feature/slow-poll', options) + } + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(2) + + await vi.advanceTimersByTimeAsync(10_000) + resolveRefresh(review) + await slowRefresh + await Promise.resolve() + await Promise.resolve() + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(2) + + await vi.advanceTimersByTimeAsync(49_999) + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(2) + await vi.advanceTimersByTimeAsync(1) + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(3) + }) + + it('lets a force refresh supersede queued stale-while-revalidate work', async () => { + vi.useFakeTimers() + vi.setSystemTime(0) + let resolveBackground: (value: HostedReviewInfo) => void = () => {} + let resolveForce: (value: HostedReviewInfo) => void = () => {} + const background = new Promise((resolve) => { + resolveBackground = resolve + }) + const force = new Promise((resolve) => { + resolveForce = resolve + }) + const forcedReview = { ...review, title: 'Manual refresh result' } + mockApi.hostedReview.forBranch + .mockResolvedValueOnce(review) + .mockReturnValueOnce(background) + .mockReturnValueOnce(force) + .mockResolvedValue(review) + const store = makeStore() + const branch = 'feature/force-supersedes-poll' + const staleOptions = { linkedGitHubPR: 42, staleWhileRevalidate: true } + + await store.getState().fetchHostedReviewForBranch('/repo', branch, { linkedGitHubPR: 42 }) + vi.setSystemTime(60_001) + await store.getState().fetchHostedReviewForBranch('/repo', branch, staleOptions) + await store.getState().fetchHostedReviewForBranch('/repo', branch, staleOptions) + const forceRefresh = store + .getState() + .fetchHostedReviewForBranch('/repo', branch, { linkedGitHubPR: 42, force: true }) + await store.getState().fetchHostedReviewForBranch('/repo', branch, staleOptions) + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(3) + + await vi.advanceTimersByTimeAsync(10_000) + resolveBackground(review) + await background + await Promise.resolve() + await vi.advanceTimersByTimeAsync(300_000) + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(3) + + resolveForce(forcedReview) + await expect(forceRefresh).resolves.toEqual(forcedReview) + await vi.advanceTimersByTimeAsync(300_000) + expect(mockApi.hostedReview.forBranch).toHaveBeenCalledTimes(3) + }) + it('does not serve stale metadata when a stronger linked PR hint changes the lookup', async () => { vi.useFakeTimers() vi.setSystemTime(0) diff --git a/src/renderer/src/store/slices/hosted-review-card-refresh.ts b/src/renderer/src/store/slices/hosted-review-card-refresh.ts index d211d3be685..a6f9be139bb 100644 --- a/src/renderer/src/store/slices/hosted-review-card-refresh.ts +++ b/src/renderer/src/store/slices/hosted-review-card-refresh.ts @@ -12,6 +12,7 @@ type RefreshHostedReviewCardArgs = { repoPath: string repoId: string branch: string + admissionTier?: 'interactive' | 'status' | 'background' linkedGitHubPR?: number | null fallbackGitHubPR?: number | null linkedGitLabMR?: number | null @@ -29,6 +30,7 @@ export function refreshHostedReviewCard( return fetchHostedReviewForBranch(args.repoPath, args.branch, { force: true, repoId: args.repoId, + ...(args.admissionTier ? { admissionTier: args.admissionTier } : {}), repoOwnerExecutionHostId: args.repoOwnerExecutionHostId, linkedGitHubPR: args.linkedGitHubPR ?? null, ...(fallbackGitHubPR !== null ? { fallbackGitHubPR } : {}), diff --git a/src/renderer/src/store/slices/hosted-review-request-state.ts b/src/renderer/src/store/slices/hosted-review-request-state.ts index 5660bb6918c..15621e378bf 100644 --- a/src/renderer/src/store/slices/hosted-review-request-state.ts +++ b/src/renderer/src/store/slices/hosted-review-request-state.ts @@ -1,4 +1,8 @@ import type { HostedReviewInfo } from '../../../../shared/hosted-review' +import { slowTaskRequiredIdleMs } from '@/components/right-sidebar/coalesced-poll-runner' + +const HOSTED_REVIEW_REVALIDATION_IDLE_MULTIPLIER = 5 +const HOSTED_REVIEW_REVALIDATION_MAX_INTERVAL_MS = 5 * 60_000 export const inflightHostedReviewRequests = new Map< string, @@ -6,11 +10,151 @@ export const inflightHostedReviewRequests = new Map< promise: Promise force: boolean generation: number - linkedReviewHintKey: string + startedAt: number } >() export const hostedReviewRequestGenerations = new Map() +type HostedReviewRevalidationLane = { + inFlight: Promise | null + lastRunDurationMs: number + lastRunEndedAt: number + pendingStartRequest: (() => Promise) | null + timer: ReturnType | null +} +const hostedReviewRevalidationLanes = new Map() + +export function hostedReviewRequestKey(cacheKey: string, hintKey: string): string { + return `${cacheKey}\0${hintKey}` +} + +function requiredHostedReviewRevalidationIdleMs(lane: HostedReviewRevalidationLane): number { + return slowTaskRequiredIdleMs( + lane.lastRunDurationMs, + HOSTED_REVIEW_REVALIDATION_IDLE_MULTIPLIER, + 0, + HOSTED_REVIEW_REVALIDATION_MAX_INTERVAL_MS + ) +} + +function clearHostedReviewRevalidationTimer(lane: HostedReviewRevalidationLane): void { + if (lane.timer !== null) { + clearTimeout(lane.timer) + lane.timer = null + } +} + +function scheduleHostedReviewRevalidationLane( + requestKey: string, + lane: HostedReviewRevalidationLane +): void { + if (lane.inFlight || lane.timer !== null) { + return + } + const allowedAt = lane.lastRunEndedAt + requiredHostedReviewRevalidationIdleMs(lane) + const delayMs = allowedAt - Date.now() + if (delayMs <= 0 && lane.pendingStartRequest) { + startHostedReviewRevalidationLane(requestKey, lane) + return + } + lane.timer = setTimeout( + () => { + lane.timer = null + if (lane.pendingStartRequest) { + startHostedReviewRevalidationLane(requestKey, lane) + } else if (!lane.inFlight) { + hostedReviewRevalidationLanes.delete(requestKey) + } + }, + Math.max(0, delayMs) + ) +} + +function observeHostedReviewRevalidationPromise( + requestKey: string, + lane: HostedReviewRevalidationLane, + promise: Promise, + startedAt: number +): void { + lane.inFlight = promise + const finish = (): void => { + if (lane.inFlight !== promise) { + return + } + lane.inFlight = null + lane.lastRunEndedAt = Date.now() + lane.lastRunDurationMs = lane.lastRunEndedAt - startedAt + scheduleHostedReviewRevalidationLane(requestKey, lane) + } + void promise.then(finish, finish) +} + +function startHostedReviewRevalidationLane( + requestKey: string, + lane: HostedReviewRevalidationLane +): void { + const startRequest = lane.pendingStartRequest + if (!startRequest) { + return + } + clearHostedReviewRevalidationTimer(lane) + lane.pendingStartRequest = null + const startedAt = Date.now() + const promise = startRequest() + if (lane.inFlight !== promise) { + observeHostedReviewRevalidationPromise(requestKey, lane, promise, startedAt) + } +} + +export function supersedeHostedReviewRevalidation( + requestKey: string, + request: { promise: Promise; startedAt: number } +): void { + const lane = hostedReviewRevalidationLanes.get(requestKey) + if (!lane) { + return + } + clearHostedReviewRevalidationTimer(lane) + lane.pendingStartRequest = null + observeHostedReviewRevalidationPromise(requestKey, lane, request.promise, request.startedAt) +} + +export function queueHostedReviewRevalidation( + requestKey: string, + startRequest: () => Promise, + inflightRequest?: { + promise: Promise + startedAt: number + force: boolean + } +): void { + if (inflightRequest?.force) { + supersedeHostedReviewRevalidation(requestKey, inflightRequest) + return + } + let lane = hostedReviewRevalidationLanes.get(requestKey) + if (!lane) { + lane = { + inFlight: null, + lastRunDurationMs: 0, + lastRunEndedAt: -Infinity, + pendingStartRequest: null, + timer: null + } + hostedReviewRevalidationLanes.set(requestKey, lane) + } + lane.pendingStartRequest = startRequest + if (!lane.inFlight && inflightRequest) { + observeHostedReviewRevalidationPromise( + requestKey, + lane, + inflightRequest.promise, + inflightRequest.startedAt + ) + return + } + scheduleHostedReviewRevalidationLane(requestKey, lane) +} /** @internal - exposed for leak-regression tests only */ export function _getHostedReviewRequestGenerationCountForTest(): number { @@ -20,4 +164,26 @@ export function _getHostedReviewRequestGenerationCountForTest(): number { /** @internal - exposed for leak-regression tests only */ export function _clearHostedReviewRequestGenerationsForTest(): void { hostedReviewRequestGenerations.clear() + inflightHostedReviewRequests.clear() + for (const lane of hostedReviewRevalidationLanes.values()) { + clearHostedReviewRevalidationTimer(lane) + } + hostedReviewRevalidationLanes.clear() +} + +/** Records a freshly issued request in the in-flight map and supersedes any queued revalidation for its key. */ +export function registerInflightHostedReviewRequest( + requestKey: string, + entry: { + promise: Promise + force: boolean + generation: number + startedAt: number + } +): void { + inflightHostedReviewRequests.set(requestKey, entry) + supersedeHostedReviewRevalidation(requestKey, { + promise: entry.promise, + startedAt: entry.startedAt + }) } diff --git a/src/renderer/src/store/slices/hosted-review.test.ts b/src/renderer/src/store/slices/hosted-review.test.ts index 17d8cb20e2e..6ada2a4b0d1 100644 --- a/src/renderer/src/store/slices/hosted-review.test.ts +++ b/src/renderer/src/store/slices/hosted-review.test.ts @@ -605,6 +605,23 @@ describe('hosted review slice', () => { }) }) + it('marks an explicit card refresh interactive', async () => { + const fetchHostedReviewForBranch = vi.fn().mockResolvedValue(null) + + await refreshHostedReviewCard(fetchHostedReviewForBranch, { + repoPath: '/repo', + repoId: 'repo-id', + branch: 'feature/test', + admissionTier: 'interactive' + }) + + expect(fetchHostedReviewForBranch).toHaveBeenCalledWith( + '/repo', + 'feature/test', + expect.objectContaining({ admissionTier: 'interactive' }) + ) + }) + it('refetches a fresh null branch result when a linked PR hint is later available', async () => { mockApi.hostedReview.forBranch.mockResolvedValueOnce(null).mockResolvedValueOnce(review) const store = makeStore() diff --git a/src/renderer/src/store/slices/hosted-review.ts b/src/renderer/src/store/slices/hosted-review.ts index f538d78d007..53cdb00db55 100644 --- a/src/renderer/src/store/slices/hosted-review.ts +++ b/src/renderer/src/store/slices/hosted-review.ts @@ -14,7 +14,6 @@ import { type LinkedReviewHints } from './hosted-review-cache-identity' import { - canReuseInflightHint, findHostedReviewRepoByPath, findHostedReviewRepoForFetch, hasNewerHostedReviewCacheEntry, @@ -34,8 +33,11 @@ import { } from './hosted-review-cache-state' import { clearHostedReviewConflictingPrCache } from './hosted-review-pr-cache' import { + hostedReviewRequestKey, hostedReviewRequestGenerations as requestGenerations, - inflightHostedReviewRequests + inflightHostedReviewRequests, + queueHostedReviewRevalidation, + registerInflightHostedReviewRequest } from './hosted-review-request-state' export type HostedReviewSlice = { @@ -168,6 +170,7 @@ export const createHostedReviewSlice: StateCreator => { const generation = (requestGenerations.get(cacheKey) ?? 0) + 1 const requestStartedAt = Date.now() @@ -196,6 +196,7 @@ export const createHostedReviewSlice: StateCreator { worktreeId: wt.id, linkedPRNumber: null, fallbackPRNumber: null, - fallbackPRSource: 'explicit' + fallbackPRSource: 'explicit', + reason: 'active' }) for (let i = 0; i < 6; i++) { await Promise.resolve() @@ -231,7 +232,8 @@ describe('worktree remote runtime mutations', () => { worktreeId: wt.id, linkedPRNumber: null, fallbackPRNumber: null, - fallbackPRSource: 'explicit' + fallbackPRSource: 'explicit', + reason: 'active' }) for (let i = 0; i < 6; i++) { await Promise.resolve() @@ -422,7 +424,8 @@ describe('worktree remote runtime mutations', () => { worktreeId: wt.id, linkedPRNumber: null, fallbackPRNumber: null, - fallbackPRSource: 'explicit' + fallbackPRSource: 'explicit', + reason: 'active' }) for (let i = 0; i < 6; i++) { diff --git a/src/renderer/src/store/slices/worktrees/session/worktree-unread-activity.ts b/src/renderer/src/store/slices/worktrees/session/worktree-unread-activity.ts index 0f20689cb44..72d95b6a0a4 100644 --- a/src/renderer/src/store/slices/worktrees/session/worktree-unread-activity.ts +++ b/src/renderer/src/store/slices/worktrees/session/worktree-unread-activity.ts @@ -129,7 +129,8 @@ export function createObserveTerminalGitHubPullRequestLink( worktreeId, linkedPRNumber: alreadyLinked ? link.number : null, fallbackPRNumber: null, - fallbackPRSource: alreadyLinked ? null : 'explicit' + fallbackPRSource: alreadyLinked ? null : 'explicit', + reason: 'active' }).then((pr) => { if (!alreadyLinked && pr?.number === link.number) { // Why: terminal output can carry arbitrary PR URLs (docs/agents/logs). diff --git a/src/renderer/src/web/preload-api/web-git-api.ts b/src/renderer/src/web/preload-api/web-git-api.ts index f0b0423270a..9b6142f9089 100644 --- a/src/renderer/src/web/preload-api/web-git-api.ts +++ b/src/renderer/src/web/preload-api/web-git-api.ts @@ -44,6 +44,7 @@ export function createGitApi(): NonNullable['git']> { status: async ({ worktreePath, includeIgnored, + includeLineStats, bypassEffectiveUpstreamNegativeCache, reuseLineStats, branchLineTotalMergeBase, @@ -53,6 +54,7 @@ export function createGitApi(): NonNullable['git']> { const params = { worktree: toRuntimeWorktreeSelector(worktree.id), includeIgnored, + includeLineStats, bypassEffectiveUpstreamNegativeCache, reuseLineStats, ...(branchLineTotalMergeBase ? { branchLineTotalMergeBase } : {}) @@ -120,11 +122,12 @@ export function createGitApi(): NonNullable['git']> { compareAgainstHead }) }, - branchCompare: async ({ worktreePath, baseRef }) => { + branchCompare: async ({ worktreePath, baseRef, admissionTier }) => { const worktree = await resolveRuntimeWorktreeByPath(worktreePath) return callRuntimeResult('git.branchCompare', { worktree: toRuntimeWorktreeSelector(worktree.id), - baseRef + baseRef, + ...(admissionTier ? { admissionTier } : {}) }) }, commitCompare: async ({ worktreePath, commitId }) => { diff --git a/src/renderer/src/web/preload-api/web-github-api.ts b/src/renderer/src/web/preload-api/web-github-api.ts index dfc955a0768..330c2a8e11e 100644 --- a/src/renderer/src/web/preload-api/web-github-api.ts +++ b/src/renderer/src/web/preload-api/web-github-api.ts @@ -24,7 +24,7 @@ export function createGitHubApi(): WebGitHubApi { route>(GITHUB_WEB_RPC_METHODS.repoUpstream, args), prForBranch: (args) => route>(GITHUB_WEB_RPC_METHODS.prForBranch, args), - refreshPRNow: async ({ candidate }) => { + refreshPRNow: async ({ candidate, reason }) => { const acceptMergedFallbackPR = candidate.linkedPRNumber == null && candidate.fallbackPRNumber != null && @@ -36,6 +36,7 @@ export function createGitHubApi(): WebGitHubApi { linkedPRNumber: candidate.linkedPRNumber ?? null, fallbackPRNumber: candidate.fallbackPRNumber ?? null, currentHeadOid: candidate.currentHeadOid ?? null, + ...(reason ? { reason } : {}), ...(acceptMergedFallbackPR ? { acceptMergedFallbackPR: true } : {}) }) return pr diff --git a/src/renderer/src/web/web-preload-api-git.test.ts b/src/renderer/src/web/web-preload-api-git.test.ts index e96eceb573b..3ee22a46aa3 100644 --- a/src/renderer/src/web/web-preload-api-git.test.ts +++ b/src/renderer/src/web/web-preload-api-git.test.ts @@ -164,6 +164,15 @@ describe('web git preload API', () => { branchLineTotalMergeBase: TEST_COMMIT_OID }) await globals.window.api.git.status({ worktreePath: '/workspace/repo' }) + await globals.window.api.git.status({ + worktreePath: '/workspace/repo', + includeLineStats: false + }) + await globals.window.api.git.branchCompare({ + worktreePath: '/workspace/repo', + baseRef: 'origin/main', + admissionTier: 'background' + }) const statusCalls = runtimeCalls.filter((call) => call.method === 'git.status') // Why: strict — `toEqual` would pass on a forwarded `branchLineTotalMergeBase: undefined`, @@ -174,6 +183,7 @@ describe('web git preload API', () => { params: { worktree: 'id:wt-1', includeIgnored: undefined, + includeLineStats: undefined, bypassEffectiveUpstreamNegativeCache: undefined, reuseLineStats: undefined, branchLineTotalMergeBase: TEST_COMMIT_OID @@ -184,10 +194,29 @@ describe('web git preload API', () => { params: { worktree: 'id:wt-1', includeIgnored: undefined, + includeLineStats: undefined, + bypassEffectiveUpstreamNegativeCache: undefined, + reuseLineStats: undefined + } + }, + { + method: 'git.status', + params: { + worktree: 'id:wt-1', + includeIgnored: undefined, + includeLineStats: false, bypassEffectiveUpstreamNegativeCache: undefined, reuseLineStats: undefined } } ]) + expect(runtimeCalls.find((call) => call.method === 'git.branchCompare')).toStrictEqual({ + method: 'git.branchCompare', + params: { + worktree: 'id:wt-1', + baseRef: 'origin/main', + admissionTier: 'background' + } + }) }) }) diff --git a/src/shared/child-process/child-termination-reporter.ts b/src/shared/child-process/child-termination-reporter.ts new file mode 100644 index 00000000000..907c98b9405 --- /dev/null +++ b/src/shared/child-process/child-termination-reporter.ts @@ -0,0 +1,16 @@ +export type ChildTerminationReporter = { + report: () => void + reportIf: (confirmed: boolean) => void +} + +export function createChildTerminationReporter(callback?: () => void): ChildTerminationReporter { + let reported = false + const report = (): void => { + if (reported) { + return + } + reported = true + callback?.() + } + return { report, reportIf: (confirmed) => (confirmed ? report() : undefined) } +} diff --git a/src/shared/child-process/process-spec.ts b/src/shared/child-process/process-spec.ts new file mode 100644 index 00000000000..ac705974efe --- /dev/null +++ b/src/shared/child-process/process-spec.ts @@ -0,0 +1,71 @@ +// The public contract for Orca's single child-process entry point. Split from +// run-process.ts so the runner stays under its line cap; import the runtime +// functions from run-process, which re-exports everything here. +import type { ChildProcess, SpawnOptions as NodeSpawnOptions } from 'node:child_process' + +export type ChildProcessHandle = ChildProcess + +export type SpawnedProcess = ChildProcess + +/** + * The single place Orca starts a child process. + * + * Why one place: six decisions have to be made every time a child is spawned, + * POSIX forgives all six, and Windows punishes each of them differently — + * console visibility, argument quoting, `.cmd` interpretation, binary + * resolution, timeout policy, and how the tree is later terminated. Made + * per-call-site, they were right in some files and wrong in others, and the + * wrong ones reached users as stolen keyboard focus, mangled agent prompts and + * orphaned process trees. + * + * Callers outside this directory must not import `node:child_process`; a guard + * test enforces that against a shrinking allowlist. + */ + +export type ProcessSpec = { + /** + * Program to run. On Windows this should already be an absolute path — + * spawning by bare name depends on the child's PATH, which under Group Policy + * or a stripped Electron environment can resolve to nothing. + */ + program: string + args?: readonly string[] + cwd?: string + env?: NodeJS.ProcessEnv + /** Kill the process (and, on Windows, its console) after this long. */ + timeoutMs?: number | null + /** Written to stdin then closed. Omit to leave stdin empty and closed. */ + input?: string + /** Cap on captured stdout/stderr; output past it is discarded. */ + maxOutputBytes?: number + /** Kills the process when aborted; the result still reports the exit. */ + signal?: AbortSignal + /** Keep the child in its own POSIX process group for tree termination. */ + detached?: boolean + /** Preserve a caller-owned Windows command line such as a cmd.exe invocation. */ + windowsVerbatimArguments?: boolean + /** Streaming callers may suppress child output for auxiliary processes. */ + stdio?: NodeSpawnOptions['stdio'] + /** Kill the whole process tree and do not settle until termination is verified. */ + terminationBarrier?: boolean | ProcessTerminationBarrier + /** Called once when the child exits or tree termination is verified. */ + onChildTerminated?: () => void +} + +export type ProcessTerminationBarrier = { + observeStderr?: (chunk: Buffer | string) => void + signal: (child: ChildProcess, signal?: NodeJS.Signals) => Promise + force: (child: ChildProcess) => Promise +} + +export type ProcessResult = { + code: number | null + signal: NodeJS.Signals | null + stdout: string + stderr: string + /** True when the process was killed by `timeoutMs` rather than exiting. */ + timedOut: boolean +} + +export const DEFAULT_PROCESS_TIMEOUT_MS = 30_000 +export const DEFAULT_MAX_OUTPUT_BYTES = 8 * 1024 * 1024 diff --git a/src/shared/child-process/run-process-termination-failure.test.ts b/src/shared/child-process/run-process-termination-failure.test.ts index d608540ee30..3ba2e6b2610 100644 --- a/src/shared/child-process/run-process-termination-failure.test.ts +++ b/src/shared/child-process/run-process-termination-failure.test.ts @@ -38,6 +38,34 @@ describe('runProcess termination failure', () => { vi.clearAllMocks() }) + it('reports ordinary child close exactly once', async () => { + const child = mockChild() + const onChildTerminated = vi.fn() + spawnMock.mockReturnValue(child) + const pending = runProcess({ program: 'git', timeoutMs: null, onChildTerminated }) + + child.emit('close', 0, null) + child.emit('close', 0, null) + + await expect(pending).resolves.toMatchObject({ code: 0 }) + expect(onChildTerminated).toHaveBeenCalledOnce() + }) + + it('does not report a live-child error before its eventual close', async () => { + const child = mockChild() + const onChildTerminated = vi.fn() + spawnMock.mockReturnValue(child) + const pending = runProcess({ program: 'git', timeoutMs: null, onChildTerminated }) + const rejection = expect(pending).rejects.toThrow('delivery failed') + + child.emit('error', new Error('delivery failed')) + expect(onChildTerminated).not.toHaveBeenCalled() + child.emit('close', null, 'SIGKILL') + + await rejection + expect(onChildTerminated).toHaveBeenCalledOnce() + }) + it('holds the result until the barrier deadline when tree termination cannot be verified', async () => { const child = mockChild() spawnMock.mockReturnValue(child) @@ -63,17 +91,31 @@ describe('runProcess termination failure', () => { async () => { forceTerminateProcessTreeMock.mockResolvedValue(true) spawnMock.mockReturnValue(mockChild()) - const pending = runProcess({ program: 'git', timeoutMs: 10, terminationBarrier: true }) + const onChildTerminated = vi.fn() + const pending = runProcess({ + program: 'git', + timeoutMs: 10, + terminationBarrier: true, + onChildTerminated + }) await vi.advanceTimersByTimeAsync(2_010) await expect(pending).resolves.toMatchObject({ timedOut: true }) + expect(onChildTerminated).toHaveBeenCalledOnce() } ) it('settles on the barrier deadline when the root never reports', async () => { - spawnMock.mockReturnValue(mockChild()) - const pending = runProcess({ program: 'git', timeoutMs: 10, terminationBarrier: true }) + const onChildTerminated = vi.fn() + const child = mockChild() + spawnMock.mockReturnValue(child) + const pending = runProcess({ + program: 'git', + timeoutMs: 10, + terminationBarrier: true, + onChildTerminated + }) let settled = false void pending.then(() => { settled = true @@ -81,9 +123,13 @@ describe('runProcess termination failure', () => { await vi.advanceTimersByTimeAsync(2_010) expect(settled).toBe(false) + expect(onChildTerminated).not.toHaveBeenCalled() await vi.advanceTimersByTimeAsync(10_000) await expect(pending).resolves.toMatchObject({ code: null, timedOut: true }) + expect(onChildTerminated).not.toHaveBeenCalled() + child.emit('close', null, 'SIGKILL') + expect(onChildTerminated).toHaveBeenCalledOnce() }) it('retains a root exit observed before barrier shutdown', async () => { diff --git a/src/shared/child-process/run-process.test.ts b/src/shared/child-process/run-process.test.ts index 55ee378c69e..5fad9b5dc70 100644 --- a/src/shared/child-process/run-process.test.ts +++ b/src/shared/child-process/run-process.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { mkdtemp, readFile, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import * as path from 'node:path' @@ -189,12 +189,15 @@ describe('a signal that is already aborted', () => { const controller = new AbortController() controller.abort() const startedAt = Date.now() + const onChildTerminated = vi.fn() const result = await runProcess({ program: path.join(tmpdir(), 'orca-must-not-spawn'), timeoutMs: 30_000, - signal: controller.signal + signal: controller.signal, + onChildTerminated }) expect(result.timedOut).toBe(false) + expect(onChildTerminated).toHaveBeenCalledOnce() expect(Date.now() - startedAt).toBeLessThan(10_000) }, 20_000) }) diff --git a/src/shared/child-process/run-process.ts b/src/shared/child-process/run-process.ts index 781afb30eee..ec83c5beed0 100644 --- a/src/shared/child-process/run-process.ts +++ b/src/shared/child-process/run-process.ts @@ -9,71 +9,18 @@ import { buildWindowsCmdShimCommandLine, isCmdInterpretedProgram } from './windo import { forceTerminateProcessTree, signalProcessTree } from './process-tree-termination' import { createOutputSink } from './bounded-output-sink' +import { createChildTerminationReporter } from './child-termination-reporter' -export type ChildProcessHandle = ChildProcess - -export type SpawnedProcess = ChildProcess - -/** - * The single place Orca starts a child process. - * - * Why one place: six decisions have to be made every time a child is spawned, - * POSIX forgives all six, and Windows punishes each of them differently — - * console visibility, argument quoting, `.cmd` interpretation, binary - * resolution, timeout policy, and how the tree is later terminated. Made - * per-call-site, they were right in some files and wrong in others, and the - * wrong ones reached users as stolen keyboard focus, mangled agent prompts and - * orphaned process trees. - * - * Callers outside this directory must not import `node:child_process`; a guard - * test enforces that against a shrinking allowlist. - */ - -export type ProcessSpec = { - /** - * Program to run. On Windows this should already be an absolute path — - * spawning by bare name depends on the child's PATH, which under Group Policy - * or a stripped Electron environment can resolve to nothing. - */ - program: string - args?: readonly string[] - cwd?: string - env?: NodeJS.ProcessEnv - /** Kill the process (and, on Windows, its console) after this long. */ - timeoutMs?: number | null - /** Written to stdin then closed. Omit to leave stdin empty and closed. */ - input?: string - /** Cap on captured stdout/stderr; output past it is discarded. */ - maxOutputBytes?: number - /** Kills the process when aborted; the result still reports the exit. */ - signal?: AbortSignal - /** Keep the child in its own POSIX process group for tree termination. */ - detached?: boolean - /** Preserve a caller-owned Windows command line such as a cmd.exe invocation. */ - windowsVerbatimArguments?: boolean - /** Streaming callers may suppress child output for auxiliary processes. */ - stdio?: NodeSpawnOptions['stdio'] - /** Kill the whole process tree and do not settle until termination is verified. */ - terminationBarrier?: boolean | ProcessTerminationBarrier -} - -export type ProcessTerminationBarrier = { - observeStderr?: (chunk: Buffer | string) => void - signal: (child: ChildProcess, signal?: NodeJS.Signals) => Promise - force: (child: ChildProcess) => Promise -} - -export type ProcessResult = { - code: number | null - signal: NodeJS.Signals | null - stdout: string - stderr: string - /** True when the process was killed by `timeoutMs` rather than exiting. */ - timedOut: boolean -} - -export const DEFAULT_PROCESS_TIMEOUT_MS = 30_000 -export const DEFAULT_MAX_OUTPUT_BYTES = 8 * 1024 * 1024 +export type { + ChildProcessHandle, + SpawnedProcess, + ProcessSpec, + ProcessTerminationBarrier, + ProcessResult +} from './process-spec' +export { DEFAULT_PROCESS_TIMEOUT_MS, DEFAULT_MAX_OUTPUT_BYTES } from './process-spec' +import type { ProcessSpec, ProcessResult } from './process-spec' +import { DEFAULT_PROCESS_TIMEOUT_MS, DEFAULT_MAX_OUTPUT_BYTES } from './process-spec' /** * Grace between the timeout kill and giving up on the child's exit. * @@ -166,15 +113,18 @@ export function spawnProcess(spec: ProcessSpec): ChildProcessWithoutNullStreams */ export function runProcess(spec: ProcessSpec): Promise { if (spec.signal?.aborted) { + spec.onChildTerminated?.() return Promise.resolve({ code: null, signal: null, stdout: '', stderr: '', timedOut: false }) } const maxOutputBytes = spec.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES return new Promise((resolve, reject) => { + const terminationReporter = createChildTerminationReporter(spec.onChildTerminated) let child: ChildProcess try { child = spawnProcess(spec) } catch (error) { + terminationReporter.report() reject(error) return } @@ -282,6 +232,7 @@ export function runProcess(spec: ProcessSpec): Promise { } barrierAttemptComplete = true barrierTerminationVerified = true + terminationReporter.report() resolveBarrierIfSafe() }) } @@ -297,6 +248,7 @@ export function runProcess(spec: ProcessSpec): Promise { ([initialTerminated, forceTerminated]) => { barrierAttemptComplete = true barrierTerminationVerified = initialTerminated || forceTerminated + terminationReporter.reportIf(barrierTerminationVerified) if (!barrierTerminationVerified) { // The barrier never confirmed the tree died, so the root // would otherwise outlive the abort or timeout. @@ -313,6 +265,7 @@ export function runProcess(spec: ProcessSpec): Promise { } barrierAttemptComplete = true barrierTerminationVerified = terminated + terminationReporter.reportIf(barrierTerminationVerified) resolveBarrierIfSafe() }) return @@ -321,6 +274,7 @@ export function runProcess(spec: ProcessSpec): Promise { ([_initialTerminated, forceTerminated]) => { barrierAttemptComplete = true barrierTerminationVerified = forceTerminated + terminationReporter.reportIf(barrierTerminationVerified) if (!barrierTerminationVerified) { terminate(child, 'SIGKILL') } @@ -356,6 +310,7 @@ export function runProcess(spec: ProcessSpec): Promise { } child.once('error', (error) => { + terminationReporter.reportIf(!child.pid) if (barrierStopping) { deferredError = error resolveBarrierIfSafe() @@ -373,6 +328,7 @@ export function runProcess(spec: ProcessSpec): Promise { } }) child.once('close', (code, signal) => { + terminationReporter.report() if (!barrierStopping) { rootExitedBeforeBarrier = true } diff --git a/src/shared/cross-platform-path.test.ts b/src/shared/cross-platform-path.test.ts index b817459301e..f23892d98e3 100644 --- a/src/shared/cross-platform-path.test.ts +++ b/src/shared/cross-platform-path.test.ts @@ -4,6 +4,7 @@ import { isCaseInsensitiveRuntimeRoot, isPathInsideOrEqual, isRuntimePathAbsolute, + isWslUncPathForCallerLinuxPath, normalizeRuntimePathForComparison, relativePathInsideRoot, resolveRuntimePath @@ -50,6 +51,54 @@ describe('isCaseInsensitiveRuntimeRoot', () => { }) }) +describe('isWslUncPathForCallerLinuxPath', () => { + const UBUNTU = 'Ubuntu-24.04' + + it('matches the Linux path a WSL shell prints against both UNC spellings of its own distro', () => { + expect( + isWslUncPathForCallerLinuxPath( + '\\\\wsl.localhost\\Ubuntu-24.04\\home\\neil\\qa-repo', + '/home/neil/qa-repo', + UBUNTU + ) + ).toBe(true) + expect( + isWslUncPathForCallerLinuxPath( + '//wsl$/ubuntu-24.04/home/neil/qa-repo', + '/home/neil/qa-repo', + UBUNTU + ) + ).toBe(true) + }) + + // The destructive case: this feeds `worktree rm`, so a tail-only match deletes the wrong distro. + it('refuses a Linux path another distro spells identically', () => { + expect( + isWslUncPathForCallerLinuxPath( + '\\\\wsl.localhost\\Debian\\home\\neil\\qa-repo', + '/home/neil/qa-repo', + UBUNTU + ) + ).toBe(false) + }) + + it('keeps the Linux tail case-sensitive and refuses a non-WSL path', () => { + expect( + isWslUncPathForCallerLinuxPath( + '\\\\wsl.localhost\\Ubuntu-24.04\\home\\Neil\\qa-repo', + '/home/neil/qa-repo', + UBUNTU + ) + ).toBe(false) + expect(isWslUncPathForCallerLinuxPath('/home/neil/qa-repo', '/home/neil/qa-repo', UBUNTU)).toBe( + false + ) + expect(isWslUncPathForCallerLinuxPath('C:\\repos\\qa-repo', '/home/neil/qa-repo', UBUNTU)).toBe( + false + ) + }) +}) + describe('cross-platform path containment', () => { it('keeps POSIX sibling prefixes outside the root', () => { expect(isPathInsideOrEqual('/repo/app', '/repo/app')).toBe(true) diff --git a/src/shared/cross-platform-path.ts b/src/shared/cross-platform-path.ts index aad0981c3a1..679ee9e57ba 100644 --- a/src/shared/cross-platform-path.ts +++ b/src/shared/cross-platform-path.ts @@ -56,6 +56,31 @@ export function normalizeRuntimePathForComparison(rawValue: string): string { return isWindowsPath ? normalized.toLowerCase() : normalized } +/** + * Whether `uncPath` is the WSL UNC spelling of `linuxPath` as the caller's own distro sees it. + * + * Why the distro must match and not just the Linux tail: every distro spells + * `/home//repo`, so a tail-only match lets a Debian caller resolve — and + * `worktree rm` then delete — an Ubuntu directory. The distro is proven by the + * caller's UNC cwd, never guessed. + */ +export function isWslUncPathForCallerLinuxPath( + uncPath: string, + linuxPath: string, + callerDistro: string +): boolean { + const parsed = parseWslUncPath(uncPath) + if (!parsed) { + return false + } + // Why the case split: Windows folds the distro name, the Linux tail it fronts is case-sensitive. + return ( + parsed.distro.toLowerCase() === callerDistro.toLowerCase() && + normalizeRuntimePathForComparison(parsed.linuxPath) === + normalizeRuntimePathForComparison(linuxPath) + ) +} + export function areLocalWindowsWslPathAliases(left: string, right: string): boolean { const leftIdentity = getLocalWindowsWslPathIdentity(left) const rightIdentity = getLocalWindowsWslPathIdentity(right) diff --git a/src/shared/github/pull-request-refresh-types.ts b/src/shared/github/pull-request-refresh-types.ts index 261773b327f..2456b59be60 100644 --- a/src/shared/github/pull-request-refresh-types.ts +++ b/src/shared/github/pull-request-refresh-types.ts @@ -74,7 +74,9 @@ export type GitHubPRRefreshCandidate = GitHubPRRefreshAlias & { cachedChecksStatus?: CheckStatus | null cachedMergeable?: PRMergeableState | null cachedMergeStateStatus?: string | null - localGitOptions?: { wslDistro?: string } + localGitOptions?: { + wslDistro?: string + } } export type GitHubPRRefreshSkippedReason = diff --git a/src/shared/hosted-review.ts b/src/shared/hosted-review.ts index 7837c2cc370..719c6d27fa5 100644 --- a/src/shared/hosted-review.ts +++ b/src/shared/hosted-review.ts @@ -55,6 +55,7 @@ export type HostedReviewInfo = { export type HostedReviewForBranchArgs = { repoPath: string repoId?: string + admissionTier?: 'interactive' | 'status' | 'background' /** Desktop IPC-only owner guard; runtime RPC callers omit this field. */ repoOwnerExecutionHostId?: string branch: string diff --git a/src/shared/mobile-web/agent-history-operation-contract.ts b/src/shared/mobile-web/agent-history-operation-contract.ts index d1b78f2d6b6..73b872b2c51 100644 --- a/src/shared/mobile-web/agent-history-operation-contract.ts +++ b/src/shared/mobile-web/agent-history-operation-contract.ts @@ -22,6 +22,7 @@ export const MOBILE_WEB_AGENT_HISTORY_AGENTS = [ 'openclaw', 'devin', 'droid', + 'cline', 'kimi' ] as const diff --git a/src/shared/ssh-pty-id.test.ts b/src/shared/ssh-pty-id.test.ts index b8fcfd8d373..7e105307433 100644 --- a/src/shared/ssh-pty-id.test.ts +++ b/src/shared/ssh-pty-id.test.ts @@ -27,6 +27,24 @@ describe('ssh pty id routing', () => { expect(toAppSshPtyId(HOST_ID, 'pty-7')).toBe('ssh:ssh-1779863656395-57g1q1@@pty-7') }) + // Why: relays mint epoch-scoped ids (`pty2::`) that carry colons, while + // this wrapper — unchanged here, and the version shipped in older clients — splits + // an app id on the FIRST `@@` after `ssh:`. Pin the round trip so a colon-bearing + // relay id stays routable instead of losing its owning connection. + it('round-trips a mint-epoch relay pty id', () => { + const relayPtyId = 'pty2:0f8fad5b-d9cb-469f-a165-70867728950e:12' + const appId = toAppSshPtyId(CONNECTION, relayPtyId) + + expect(appId).toBe(`ssh:${CONNECTION}@@${relayPtyId}`) + expect(parseAppSshPtyId(appId)).toEqual({ connectionId: CONNECTION, relayPtyId }) + expect(toRelaySshPtyId(CONNECTION, appId)).toBe(relayPtyId) + expect(toRelaySshPtyId(HOST_ID, appId)).toBe(relayPtyId) + expect(toAppSshPtyId(CONNECTION, appId)).toBe(appId) + expect(() => toRelaySshPtyId('ssh-other', appId)).toThrow( + `belongs to SSH connection "${CONNECTION}"` + ) + }) + it('still rejects a pty id owned by a genuinely different connection', () => { expect(() => toRelaySshPtyId('ssh-other', APP_ID)).toThrow( `belongs to SSH connection "${CONNECTION}"` diff --git a/src/shared/wsl-paths.ts b/src/shared/wsl-paths.ts index 2835bcb11d2..51e232e357e 100644 --- a/src/shared/wsl-paths.ts +++ b/src/shared/wsl-paths.ts @@ -118,3 +118,11 @@ export function foldWslUncPathCaseInsensitiveParts(path: string): string | null : parsed.linuxPath return `//wsl.localhost/${parsed.distro.toLowerCase()}${linuxPath === '/' ? '' : linuxPath}` } + +/** + * The spelling a WSL-hosted tool answers in for `path`. Git-in-the-distro resolves relative output + * against the Linux path, not the caller's UNC spelling, and realpath cannot bridge the two spaces. + */ +export function toWslExecutionSpace(path: string): string { + return parseWslUncPath(path)?.linuxPath ?? path +} diff --git a/tests/e2e/floating-workspace-shared-glyph-atlas.spec.ts b/tests/e2e/floating-workspace-shared-glyph-atlas.spec.ts index dc2ff23366c..f68dca832d4 100644 --- a/tests/e2e/floating-workspace-shared-glyph-atlas.spec.ts +++ b/tests/e2e/floating-workspace-shared-glyph-atlas.spec.ts @@ -2,6 +2,7 @@ import type { Page } from '@stablyai/playwright-test' import { test, expect } from './helpers/orca-app' import { ensureTerminalVisible, waitForActiveWorktree, waitForSessionReady } from './helpers/store' import { sendToTerminal, waitForActivePanePtyId } from './helpers/terminal' +import { compareTerminalScreenshots } from './terminal-screenshot-diff' // Why: mirrors FLOATING_TERMINAL_WORKTREE_ID in src/shared/constants.ts. // e2e specs avoid importing renderer/shared modules into the Playwright runner. @@ -368,14 +369,58 @@ test.describe('floating workspace shared glyph atlas @headful', () => { const afterSwitch = await captureWorkspaceAfterTrigger(orcaPage, scenario!) await testInfo.attach('baseline', { body: baseline, contentType: 'image/png' }) await testInfo.attach('after-tab-switch', { body: afterSwitch, contentType: 'image/png' }) - console.log(`[shared-atlas] tabSwitchIntact=${afterSwitch.equals(baseline)}`) + // Why: byte equality trips on sub-pixel antialiasing noise that leaves every + // glyph legible. Stale-model corruption blanks the terminal (~3% of pixels), + // far past the helper's 1.5% threshold, so the tolerance keeps the teeth. + const afterSwitchDiff = compareTerminalScreenshots(baseline, afterSwitch) + console.log( + `[shared-atlas] tabSwitchIntact=${afterSwitchDiff.matches} diffRatio=${afterSwitchDiff.diffRatio.toFixed(5)} diffPixels=${afterSwitchDiff.diffPixels}` + ) expect( - afterSwitch.equals(baseline), + afterSwitchDiff.matches, 'workspace terminal must render identically after floating tab switching' ).toBe(true) }) + test('a sibling terminal clearing the shared atlas leaves workspace glyphs intact', async ({ + orcaPage + }, testInfo) => { + // Why this trigger and not a panel reveal: Orca's reveal paths escalate to a + // registry-wide atlas reset, which repaints every pane and would heal the + // corruption before it could be observed — so a reveal-driven test passes whether + // or not xterm propagates the invalidation. Clearing straight through the floating + // manager reproduces the same shared-atlas wipe with none of that recovery in the + // way, which is what makes this the assertion with teeth: it fails if + // ITextureAtlas.pageLayoutVersion stops reaching sibling renderers. + const scenario = await setUpSharedAtlasScenario(orcaPage) + test.skip(!scenario, 'WebGL inactive or terminals do not share a glyph atlas') + const { baseline, workspacePtyId, floatingTabIds } = scenario! + + // The panel stays closed: the workspace terminal must be the only thing repainting. + await resetAtlasOnTab(orcaPage, floatingTabIds[0]) + + // Why refresh and not a full rebuild: xterm skips cells whose content is unchanged, + // so this is the repaint that reuses vertices baked against the wiped atlas pages. + await refreshTerminalOnTab(orcaPage, scenario!.workspaceTabId) + const afterSiblingClear = await captureStableWorkspaceShot(orcaPage, workspacePtyId) + + await testInfo.attach('baseline', { body: baseline, contentType: 'image/png' }) + await testInfo.attach('after-sibling-clear', { + body: afterSiblingClear, + contentType: 'image/png' + }) + const afterSiblingClearDiff = compareTerminalScreenshots(baseline, afterSiblingClear) + console.log( + `[shared-atlas] siblingClearIntact=${afterSiblingClearDiff.matches} diffRatio=${afterSiblingClearDiff.diffRatio.toFixed(5)} diffPixels=${afterSiblingClearDiff.diffPixels}` + ) + + expect( + afterSiblingClearDiff.matches, + 'workspace terminal must rebuild its model after a sibling wipes the shared atlas' + ).toBe(true) + }) + test('reopening the floating workspace keeps workspace terminal glyphs intact', async ({ orcaPage }, testInfo) => { @@ -393,10 +438,13 @@ test.describe('floating workspace shared glyph atlas @headful', () => { const afterReopen = await captureWorkspaceAfterTrigger(orcaPage, scenario!) await testInfo.attach('baseline', { body: baseline, contentType: 'image/png' }) await testInfo.attach('after-reopen', { body: afterReopen, contentType: 'image/png' }) - console.log(`[shared-atlas] reopenIntact=${afterReopen.equals(baseline)}`) + const afterReopenDiff = compareTerminalScreenshots(baseline, afterReopen) + console.log( + `[shared-atlas] reopenIntact=${afterReopenDiff.matches} diffRatio=${afterReopenDiff.diffRatio.toFixed(5)} diffPixels=${afterReopenDiff.diffPixels}` + ) expect( - afterReopen.equals(baseline), + afterReopenDiff.matches, 'workspace terminal must render identically after a floating panel reopen' ).toBe(true) }) diff --git a/tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts b/tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts index fa66a0893c6..288f5934100 100644 --- a/tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts +++ b/tests/e2e/ssh-cold-hydration-gap-tab-seeding.spec.ts @@ -101,6 +101,28 @@ function blockRemoteWorkspaceGet(target: DockerSshRelayTarget, snapshotPath: str return saved } +/** + * Tab ids the relay actually persisted, or null when the bytes are not parseable JSON. + * + * The spec replays this capture verbatim, so bytes that carry no tab make every downstream count + * meaningless: an empty session places nothing, therefore reports nothing unplaced, therefore + * hydrates cleanly and replaces the worktree's tabs with none. That is indistinguishable from the + * regression this test exists to catch, so the capture has to be checked before it is trusted. + */ +function capturedSnapshotTabIds(saved: string): string[] | null { + try { + const parsed = JSON.parse(saved) as { + session?: { tabsByWorktreePath?: Record } + } + return Object.values(parsed.session?.tabsByWorktreePath ?? {}) + .flat() + .map((tab) => tab?.id) + .filter((id): id is string => typeof id === 'string') + } catch { + return null + } +} + function unblockRemoteWorkspaceGet( target: DockerSshRelayTarget, snapshotPath: string, @@ -174,6 +196,18 @@ test.describe('SSH cold hydration gap tab seeding', () => { app = null const saved = blockRemoteWorkspaceGet(target, snapshotPath) + // Precondition, not an expectation about the product: everything below reads the bytes this + // capture holds, so a capture that never recorded the baseline has to fail here and name + // itself rather than surface later as a tab count the product appears to have lost. + const capturedTabIds = capturedSnapshotTabIds(saved) + expect( + capturedTabIds, + `the captured host snapshot ${snapshotPath} is not parseable JSON, so replaying it proves nothing: ${JSON.stringify(saved.slice(0, 200))}` + ).not.toBeNull() + expect( + remote.tabIds.filter((id) => !(capturedTabIds ?? []).includes(id)), + `the captured host snapshot ${snapshotPath} holds ${capturedTabIds?.length ?? 0} tab(s) and is missing part of the ${BASELINE_TAB_COUNT}-tab baseline this test seeded, so the bytes it replays are not the workspace the assertions below describe` + ).toEqual([]) const relaunch = await restart.launch() app = relaunch.app const page = relaunch.page